Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418681
  • 博文数量: 121
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 540
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-16 16:28
文章分类

全部博文(121)

文章存档

2021年(3)

2018年(1)

2017年(5)

2016年(9)

2015年(23)

2014年(80)

我的朋友

分类: LINUX

2015-01-17 23:30:57

談完了區網內硬體連線的方式,加上以 LACP 的手段來處理 switch 間的頻寬合併功能後,接下來我們得要談談區網內最重要的一部設備,那當然就是 NAT + 防火牆設備! 但是大家都會忘記,其實區網內還有兩個很重要的服務,那就是自動發派 IP 的 DHCP 服務以及私有領域名稱解析的 DNS 服務!咦!不是只要 DHCP 就好嗎? 不要忘記了,現在很多服務都會主動的去查詢『反解』的,因此,這個 DNS 真的很重要!不要忽略他~

另外,既然連 switch 之間的頻寬都增加了,那如果 server 還是僅有區區那 1Gbits/s 的流量,不是很可笑嗎?這時有用的 Linux bonding 技術就得要來討論討論才行呦!不過, bonding 的使用還是有限制的喔!並不是加了更多張網卡對於區域網路的速度就一定會有幫助的! 那就讓我們來談談如何使用吧! ^_^

2.1 透過 Linux bonding 技術合併多張網卡的頻寬

承接上一章的內容,在區域網路裡面,如果考量用戶端彼此之間的流量,以及整體區域網路的效能頻頸,那麼 LACP 是不可或缺的好幫手! 但是,一般企業或者是學校的電腦教室環境,還有後續章節我們會持續介紹的 DRBL 無碟環境中,其實大家存取最頻繁的應該是伺服器才對吧! 尤其是電腦教室環境中,常常需要做為用戶端復原的映象檔提供者 (Server),在大家都來取得映象檔的時刻,網路說有多忙就有多忙! 所以啦,當然就得要增加伺服器的頻寬才行啊!

增加頻寬?能不能將伺服器的網卡變換成為 10Gbits/s 呢?當然不行!因為區域網路內各網路媒體如果要達成連線功能, 那麼網路傳輸的速度必須要相同才行!如果只是將 server 的網卡改成 10Gbits/s 的情況,其他的設備通通不變,那麼這張 10Gbits/s 網卡將必須要向其他 Gbits/s 妥協,所以他的速度將會降到 1Gbits/s 來跟大家連線才行!真是浪費錢了~

那我能不能用數張 Gbits/s 的網卡組合起來,讓這些網卡的頻寬通通綁在同一個 IP 底下,這樣不就能夠放大頻寬了嗎?OKOK!這樣想才有通! 這就是 Linux kernel 裡面談到的 bonding 技術囉!

  • 什麼是 bonding ?()

早期由於乙太網路卡的速度還不夠快,那如果妳的伺服器需要比較大的頻寬使用時,就得要購買更昂貴的設備才行。 那為什麼不能將幾張網卡合併成為一張來擴大頻寬呢?此外,對於重要的服務來說,網路是不能中斷的!所以,能不能使用兩條以上的線路連接到我的伺服器呢? 因此,(1)合併網路卡的頻寬與 (2)讓網路具有容錯能力 (fault tolerance) 就成了 Linux bonding 最主要的考量了!目前 Linux bonding 功能已經加入核心,所以妳只要啟動它即可!不需要額外安裝其他軟體呦!

另外得要注意的是,如果妳的伺服器想要使用 bonding 來增加合併頻寬的話,那就不能使用 hub 了!因為 hub 是共享媒體,總頻寬是不變的! 要使用 switch 才行!這樣才能夠增加伺服器的整體頻寬使用喔!不過還是有些限制的~後面會再來講一講。

既然 Linux bonding 主要的任務是將多張網卡合併頻寬或者是作為備援與容錯,那麼妳的伺服器上面當然就得要有多張網卡才行!那這麼多張網路卡組合起來使用, 到底可以怎麼用呢?這時候就得要考慮到妳想要達成什麼功能啦!底下就來談談~

  • Bonding 的模式與功能:

根據 wiki 的文件以及相關核心文件的說明, Linux bonding 共有七種模式!不過我們僅說說常見的幾種模式而已:

  • 模式 0,循環負載平衡合併頻寬 (Round-robin, balance-rr):
    Linux bonding 會將要發送的封包循序的從任何可用的網卡上面循環發送,因為是循環發送的,所以每張網卡就能夠被充分利用~ 這種模式可以提供負載平衡來合併頻寬並具有網路容錯的能力。不過,由於 switch 是會自動學習每個埠口所對應的網卡卡號 (MAC),但同一個目標的連續封包,可能會經由不同的網卡來傳送(循環傳送的方式)~這時可能會造成 switch 的誤判問題。雖然 bonding 可以處理這些問題,不過,就鳥哥的經驗來看,這種模式的負載平衡方面似乎沒有想像中的好!所以鳥哥不建議使用。

  • 模式 1,自動備援模式 (Active-backup):
    假設有三個網路卡做成這種 bonding 模式的話,那麼永遠都只有一個網路卡會運作,我們稱之為主要網卡 (primary)!除非這個主要網卡連線失敗了, 另一張網卡 (slave) 才會扶正而成為下一個主要網卡,並持續提供服務。這種模式並不會合併頻寬,只會用在連線的容錯而已。 所以如果妳想要同時合併頻寬,這種模式並不可行。

  • 模式 4,LACP 鏈路聚合模式 (IEEE 802.3ad Dynamic link aggregation):
    這種模式算是業界的標準支援吧!上一小節我們才剛剛談過 LACP,妳應該不會忘記吧?妳的 bonding 網卡啟動在這種模式下, 然後讓串接到這些網卡的 switch 埠口設定好 LACP 群組,這樣就能夠達成與 LACP 相同的頻寬倍增功能!當然啦,既然連 switch 都要支援 LACP, 所以這種模式不能用在普通的 switch 上頭~得要有支援網管且提供 LACP 設定的 switch 才行!這種模式可以同時提供合併頻寬與網路容錯! 唯一傷腦筋的,就是必須要有網管的 switch 支援才行!

  • 模式 5,自動調整傳輸負載平衡 (Adaptive transmit load balancing, balance-tlb):
    從字面上的意思來看,這種模式主要就是針對『傳送』合併頻寬所設計的,但是接收恐怕就沒有辦法做到合併頻寬了。這種模式得要分傳送與接收來說明。 在傳送方面,這種模式會將封包分散在各個可用的 bonding 網卡上送出,因此傳送才能夠達到合併頻寬。不過在接收封包時,由於考慮到 switch 的 MAC 記憶能力,因此僅有一個網卡的 MAC 會被紀錄於 switch 上頭,簡單的說,就是僅有一張網卡會用於接收!除非該接收網卡掛點, 否則其他網卡不會被用在接收上。

    因為一般伺服器就是服務提供者,主要負責餵資料給用戶,至於接收部分,又由於 switch 僅要負責一張網卡的 MAC 記憶,伺服器透過 switch 接收是相對穩定的。所以這種模式也很適合於服務提供者的角度上。但如果考慮到區域網路的雙向溝通,這種模式總覺得好像缺少了些什麼的感覺~

  • 模式 6,自動調整全負載平衡 (Adaptive load balancing, balance-alb):
    這個模式包括了模式 5,除了傳送可以合併頻寬之外,連接收也可以合併頻寬了。當伺服器要傳資料出去給用戶端時,bonding 模組會主動的攔截封包, 並透過 ARP 協商機制 (ARP 就是透過 IP 去找出 MAC 的通訊協定),將不同的網卡要送出到同一個用戶端的封包,都改寫成單一一個固定的發送端 MAC 位址, 如此一來,發送有合併頻寬的功能了,但接收卻還是只有一個 MAC 而已對吧?那怎麼說接收有合併頻寬的負載平衡機制呢?

    原因是這樣的:當有資料封包要送出到多個不同的用戶端時,此模式的 bonding 模組就會透過 ARP 協商機制,找出 bonding 管理的比較閒置的網卡 MAC 分配給下個用戶端,如此一來,不同的用戶端回傳給伺服器的資料,就可以透過不同的網卡來接收,就能達到接收也合併頻寬的功能了。

    這個模式不需要特別的 switch 支援,而且設定簡單,可以在接收、傳送都達成合併頻寬的能力,且也具有基本的網路容錯功能, 是目前鳥哥最愛使用的 bonding 模式啦!
  • 一個實際設定成 mode=6 的 bonding 範例:

讓我們回到 的環境下,所有的 switch 之間的連線已經改成 LACP 了! 這個圖示中,我們是可以使用 LACP 的 mode=4 的方式來處理 bonding,不過,鳥哥比較建議使用 mode=6 這個簡單的設定方式!效能其實沒有差很多, 設定與使用上則更簡便!圖 1.2-3 裡面的那部主機,其實是 2009 年左右的產品,裡頭僅有一張內建的網卡而已。鳥哥在上頭額外安插了三張網卡 (所以共有 4 張), 一張作為 Gateway 對外提供 Internet 連線,三張 (連同內建網卡) 則做為內部的區網環境使用。

設定 bonding 的方法其實很簡單,首先,(1)妳必須要載入 bonding 模組,且將妳的 bonding 介面取個名字,通常最常取的名字就是 bond0。 如果妳想要做成兩個 bonding 的話,那就得要有 bond0, bond1.. 依此類推。再來,(2)妳得要修改歸這個 bonding 介面管理的網路卡設定檔, 就是在 /etc/sysconfig/network-scripts/ifcfg-ethX 的檔案內容,改完之後,(3)接下來就是建立 bond0 這個新的介面的網路設定檔, (4)最後重新啟動網路就成功了!就讓我們來實際測試看看吧!

  1. 載入 bonding 模組,並將介面取名為 bond0
    在 CentOS 5.x 以後,Linux 的模組對應表已經寫入到 /etc/modprobe.d/*.conf 檔案內了~這個目錄內的檔名是可以自己取的,不過副檔名必須是 .conf 就是了。 我們取個名為 bonding.conf 的檔案好了,內容這樣寫即可:
    [root@centos ~]# vim /etc/modprobe.d/bonding.conf alias bond0 bonding # bond0 為我們需要的介面, bonding 則是 Linux 的核心模組之意! 
  2. 修改 bond0 所管理的各個實體網卡設定檔:
    在鳥哥的這個案例中,Linux 系統的 eth0 為對 Internet 連線的介面,所以 bond0 管理的介面有 eth1, eth2, eth3 這 3 個!那這三張網卡的設定檔該如何修改呢? 很簡單,如底下這樣設定即可。(注意,被 bonding 所管理的各張網卡,習慣上,我們都會稱之為 slave 網卡!)
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE="eth1"
    HWADDR="00:1B:21:3E:8C:47" <==某些情況下,可能要對應好網卡卡號,才能夠讓網卡正確取得代號 NM_CONTROLLED="yes"
    ONBOOT="yes" MASTER=bond0
    SLAVE=yes USERCTL=no # 最重要的是那個 MASTER 與 SLAVE 兩個設定項目。且因為是受 bond0 管理,所以不需要網路參數。
    # 至於 eth2, eth3 則是依樣畫葫蘆,這裡就不示範囉!自行修訂即可。 
  3. 建立 bond0 新介面的設定檔:
    現在開始,這 eth1~eth3 這 3 張網卡都是歸 bond0 所管,那當然要建立一個名為 ifcfg-bond0 的網路參數設定檔囉!鳥哥目前管理的這個教室的網域參數為 192.168.42.0/24 這一段,因此這樣設定我的伺服器:
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 USERCTL=no
    BOOTPROTO=none
    ONBOOT=yes
    IPADDR=192.168.42.254
    NETMASK=255.255.255.0 BONDING_OPTS="miimon=100 mode=6" TYPE=Unknown
    IPV6INIT=no # 重點是 BONDING_OPTS 這一串!mode=6 不用談,當然就是各個模式!這裡我們用 6 ,
    # 至於那個 miimon 指的是『多久偵測一次各個 slave 網卡的連線狀態』的意思,
    # 這個值的單位是『毫秒』,就是 10 的 -3 次方秒~1000毫秒為一秒~
    # 也就是說,我們大約 0.1 秒就偵測一次每張網卡的狀態!據以進行網路容錯測試! 
  4. 重新啟動網路與觀察 bond0 介面狀態:
    重新啟動很簡單,但如何觀察 bond0 呢?這就得要直接觀察記憶體內的 bond0 相關參數了!如下所示:
    [root@centos ~]# /etc/init.d/network restart [root@centos ~]# ifconfig bond0     Link encap:Ethernet HWaddr 00:1B:21:3E:8C:47 inet addr:192.168.42.254  Bcast:192.168.42.255  Mask:255.255.255.0
              inet6 addr: fe80::21b:21ff:fe3e:8c47/64 Scope:Link
              UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1 ....(中間略過).... eth1      Link encap:Ethernet  HWaddr 00:1B:21:3E:8C:47 UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1 ....(中間略過).... eth2      Link encap:Ethernet  HWaddr 00:07:E9:5E:2D:76
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1 ....(中間略過).... eth3      Link encap:Ethernet  HWaddr 00:07:E9:5E:09:8D
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
    
    上表中觀察的重點有幾個:(1)你會看到 bond0 所使用的網卡卡號與底下的某個 slave 介面相同~這代表目前正在使用當中的網卡主要是以該 MAC 的實體網卡為主。 (2)你也會發現 bond0 的啟動資訊為 MASTER 而其他的介面為 SLAVE 的顯示!再來,我們想要看一下完整的每個網卡的資訊時,可以這樣做:
    [root@centos ~]# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009) Bonding Mode: adaptive load balancing <== 注意到,是否為 mode 6 才行! Primary Slave: None Currently Active Slave: eth1 <== 目前以哪張網卡為主要網路服務提供者! MII Status: up MII Polling Interval (ms): 100 <== 多久偵測一次網卡連線有問題否 (單位毫秒) Up Delay (ms): 0
    Down Delay (ms): 0
    
    Slave Interface: eth1
    MII Status: up Speed: 1000 Mbps <== 這張網卡的速度有多快? Duplex: full <== 是否為全雙工/半雙工 Link Failure Count: 0 <== 這張網卡連線曾發生過幾次錯誤? Permanent HW addr: 00:1b:21:3e:8c:47
    Slave queue ID: 0
    
    Slave Interface: eth2
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 00:07:e9:5e:2d:76
    Slave queue ID: 0 ....(底下省略).... 
    如果你可以看到上面的訊息顯示,那就表示你的 bonding 已經開始順利運作了!接下來你就可以 (1)開始在用戶端同時連線到這部主機來測試看看,到底頻寬的增加有多少囉! 並且可以 (2)拔除某一條網路卡上面的線路,再來查詢一下 /proc/net/bonding/bond0 這個檔案內的變化,看看能不能有容錯的情況發生啊!^_^
  • bonding 的使用限制:

雖然說 Linux bonding 有很多好處,但是它並不是萬靈丹!某些場合底下還是無法增加頻寬的!很多文件都沒有寫到這點,或者是雖然有帶到,但是卻沒有特別強調! 因此,鳥哥一開始利用 bonding 來增加虛擬機器的頻寬時,曾經遭遇到非常多的問題,導致有一陣子有點厭惡 bonding 哩~就是沒有搞清楚的原因啦! 那就來讓大家搞清楚一點好了!來看看吧!

  • 連接的網路媒體必須使用 switch 不能使用 hub:
    這是因為 hub 是共享頻寬,只有 switch 才具有每個埠口獨立頻寬的功能!另外,除了 mode=4 的 bonding 需要用到支援 802.3ad (LACP) 協定的有網管 switch 之外,其他模式的 bonding 都可以使用無網管低階的 switch 來達成喔!

  • 兩部主機之間,只會有一個 NIC 有作用:
    想像一個狀況,你有兩部主機需要很頻繁的進行網路交換,因此需要超高頻寬!那我能不能在兩部主機上面都安裝三張網卡,然後將各自的三張網卡都做成 bonding 合併頻寬, 讓兩部主機之間可以透過各自的一個 bonding IP 來達成流量的倍增呢?答案是『不可能!』因為不論是 LACP 還是 bonding ,主要還是透過乙太網路的 MAC 來進行收發! 因此,兩者之間最多還是僅能透過一張網卡來進行接收~所以,這種 bonding 行為只能增加容錯的好處,並無法增加頻寬喔!很多文件這點都沒有寫好, 害鳥哥之前花了好幾個月去測試這東西~結果是『杯具』啊!準備喝茶去 @_@~

  • 針對 Internet 的服務而言,頻寬卡在對外的傳輸,因此 bonding 不會有合併頻寬的好處:
    如果考慮你的伺服器主要是針對 Internet 提供服務,那麼由於你的伺服器還是得要透過網際網路來傳送~而網際網路的速度應該不可能超過 Gbits/s 的速度! 加上你的 Gateway 通常也只是 1Gbits/s 的速度而已,因此針對 Internet 所設計的 bonding 僅有網路容錯的功能,合併頻寬在現階段應該是不可能達成的! 也就是說, bonding 通常僅使用於區網或者是需要大頻寬的內部網路,不會用在 Internet 上。

  • Bonding 不見得會增加傳輸量,需考慮伺服器的檔案系統:
    如果你的伺服器主要是針對區網提供用戶端映像檔的存取,而你的磁碟機並沒有使用較新的機制,因此最快的效能僅達到 80Mbytes/s 的速度時,那麼 bonding 對你的系統來說, 並沒有什麼幫助!因為用戶端透過網路到你的系統後,你還是得要從自己的伺服器將資料讀出來才能傳出去!但讀取的速度就已經受限於 80Mbytes/s (還不到 1Gbits/s 呢!), 所以 bonding 當然只有容錯而沒有增加頻寬的可能性!也就是說,如果用在磁碟 I/O 很頻繁的主機狀態,則速度的頻頸將會發生於磁碟讀寫上而不是網路。

  • 虛擬化所附掛的橋接 (bridge) 網卡,不建議使用 bonding:
    所謂的虛擬機器,指的是讓你的 Linux 透過類似 KVM 的軟體在你的系統上模擬出一個獨立的硬體主機,這個虛擬的獨立的硬體主機當然就得要分享你的實體硬體囉。 由於一部實體主機可以產生多部虛擬機器,過去鳥哥以為,那麼透過 bonding 來做成分享給虛擬機器使用的網路橋接器之後,那虛擬機就可以增加頻寬的使用量了。 結果非常『杯具』 (又喝茶去)~

    因為 bonding 常常會去改變 MAC ,其中 mode 6 甚至會去分析與變更 MAC,如此一來,虛擬機器的虛擬 MAC 將會附掛於變更後的網卡上~ 但是實體主機的 bonding 並不會去調整虛擬機器的虛擬網卡卡號,這時就會造成時通時不通困擾~雖然使用 mode 5 等其他類型可以克服這個問題~但是,對於同時的收/發來說, 就沒有兩者均增加頻寬的功效。因此,對於虛擬化附掛的橋接設備 (bridge) 來說,bonding 最好不要使用,鳥哥的經驗是『很容易出問題』。

另外,鳥哥用過最簡單而且效能最好的應該是 mode 6 這個模式!簡單好用,又不用重新設定 switch,缺少網卡就疊上去,非常簡單! 所以,有興趣的伙伴們,可以使用這個模式來製作一下,應該可以得到不錯的效果呦!

  • 用於 bonding 上面的 GB 網卡介面選擇與效能測試:

我們知道 gigabit 網路卡的理論極限速度可以到達大約 120Mbytes/s 的檔案傳輸量。不過,由於 gigabit 網路卡設計的插槽介面的差異,速度落差非常大喔! 鳥哥去年 (2012) 為了研究上面的需求,又因為要買比較便宜的 GB 網卡 (沒有錢作大量研究啦),因此購買了數十張的 Intel PCI 介面的網卡,原本想說,PCI 的傳輸率為 32bit * 33MHz => 1000 Mbits/s ,這與 GB 網卡的速度應該是差不多才對!沒想到實際應用之後,可能 PCI 介面的傳輸已經快要飽和, 所以測試出最快的 PCI 傳輸率大約只到 70Mbytes/s 而已,與理論值也差太多了...

後來還是為了經費,所以還是買了比較便宜的 PCI-E 1X 一倍數的網卡,只是沒想到,這個 PCI-E 的 GB 網卡 (用的是螃蟹卡晶片組) ,效能隨隨便便就可以上 90~100 Mbytes/s,與 Intel 的 PCI-E 1X 的 105~110 Mbytes/s 差異沒很大,但跟 PCI 介面也差太多了!因此,建議如果想要使用 bonding 時,最好所有的網卡速度能夠差不多比較妥當!不要使用 PCI-E, PCI 介面混插,不然好像效果會沒很好,因為這與 bonding 的主控 slave 網卡找到哪一張有關~

那怎麼測試效能呢?過去鳥哥都習慣使用 NFS 然後一堆用戶端掛載伺服器後,用力的 dd 下去!後來發現,這樣的測試方法不太準確,因為都卡在磁碟的效能上~測不出網路效能。 因此,如果想要測試 bonding 到底有沒有效果,你可以這樣實驗看看:

  • 先在做好 bonding 的那部伺服器上面,使用 dd 建立一個大約 2GB 的大檔案 (dd if=/dev/zero of=somefile bs=1M count=2048) ;
  • 將上述建立檔案的目錄,使用 NFS 分享出來給區域網路用戶讀取;
  • 開啟至少三部 Linux 用戶端,並且掛載剛剛來自伺服器的 NFS 目錄;
  • 跑到掛載點,利用『 dd if=somefile of=/dev/zero 』指令,測試一下網路速度。

這個測試中,因為伺服器的大檔案僅提供用戶端讀取,並沒有寫入。如果你的記憶體夠大 (超過 4G 以上),這個檔案將被記憶體快取住!此時,所有傳輸將不會再次的讀取硬碟了。 而你在用戶端使用 dd 讀入大檔案後直接丟入垃圾桶 (/dev/null) ,這樣用戶端也沒有用到磁碟讀寫,如此就可以單純的去測試網路效能了。

在鳥哥的測試中,四部主機同時跑時,由於鳥哥用了三 GB 網卡作 bonding,此時將會有兩部主機共用一張網卡,所以有兩部主機速度可達 80~90Mbytes/s,另外兩部僅能到達 60Mbytes/s 而已。 不過,這樣也差不多有 70~80% 的理論速度啦!還算很 OK 的啦!


阅读(1110) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~