分类: LINUX
2015-01-17 23:30:57
談完了區網內硬體連線的方式,加上以 LACP 的手段來處理 switch 間的頻寬合併功能後,接下來我們得要談談區網內最重要的一部設備,那當然就是 NAT + 防火牆設備! 但是大家都會忘記,其實區網內還有兩個很重要的服務,那就是自動發派 IP 的 DHCP 服務以及私有領域名稱解析的 DNS 服務!咦!不是只要 DHCP 就好嗎? 不要忘記了,現在很多服務都會主動的去查詢『反解』的,因此,這個 DNS 真的很重要!不要忽略他~
另外,既然連 switch 之間的頻寬都增加了,那如果 server 還是僅有區區那 1Gbits/s 的流量,不是很可笑嗎?這時有用的 Linux bonding 技術就得要來討論討論才行呦!不過, bonding 的使用還是有限制的喔!並不是加了更多張網卡對於區域網路的速度就一定會有幫助的! 那就讓我們來談談如何使用吧! ^_^
承接上一章的內容,在區域網路裡面,如果考量用戶端彼此之間的流量,以及整體區域網路的效能頻頸,那麼 LACP 是不可或缺的好幫手! 但是,一般企業或者是學校的電腦教室環境,還有後續章節我們會持續介紹的 DRBL 無碟環境中,其實大家存取最頻繁的應該是伺服器才對吧! 尤其是電腦教室環境中,常常需要做為用戶端復原的映象檔提供者 (Server),在大家都來取得映象檔的時刻,網路說有多忙就有多忙! 所以啦,當然就得要增加伺服器的頻寬才行啊!
增加頻寬?能不能將伺服器的網卡變換成為 10Gbits/s 呢?當然不行!因為區域網路內各網路媒體如果要達成連線功能, 那麼網路傳輸的速度必須要相同才行!如果只是將 server 的網卡改成 10Gbits/s 的情況,其他的設備通通不變,那麼這張 10Gbits/s 網卡將必須要向其他 Gbits/s 妥協,所以他的速度將會降到 1Gbits/s 來跟大家連線才行!真是浪費錢了~
那我能不能用數張 Gbits/s 的網卡組合起來,讓這些網卡的頻寬通通綁在同一個 IP 底下,這樣不就能夠放大頻寬了嗎?OKOK!這樣想才有通! 這就是 Linux kernel 裡面談到的 bonding 技術囉!
早期由於乙太網路卡的速度還不夠快,那如果妳的伺服器需要比較大的頻寬使用時,就得要購買更昂貴的設備才行。 那為什麼不能將幾張網卡合併成為一張來擴大頻寬呢?此外,對於重要的服務來說,網路是不能中斷的!所以,能不能使用兩條以上的線路連接到我的伺服器呢? 因此,(1)合併網路卡的頻寬與 (2)讓網路具有容錯能力 (fault tolerance) 就成了 Linux bonding 最主要的考量了!目前 Linux bonding 功能已經加入核心,所以妳只要啟動它即可!不需要額外安裝其他軟體呦!
另外得要注意的是,如果妳的伺服器想要使用 bonding 來增加合併頻寬的話,那就不能使用 hub 了!因為 hub 是共享媒體,總頻寬是不變的! 要使用 switch 才行!這樣才能夠增加伺服器的整體頻寬使用喔!不過還是有些限制的~後面會再來講一講。
既然 Linux bonding 主要的任務是將多張網卡合併頻寬或者是作為備援與容錯,那麼妳的伺服器上面當然就得要有多張網卡才行!那這麼多張網路卡組合起來使用, 到底可以怎麼用呢?這時候就得要考慮到妳想要達成什麼功能啦!底下就來談談~
根據 wiki 的文件以及相關核心文件的說明, Linux 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)最後重新啟動網路就成功了!就讓我們來實際測試看看吧!
[root@centos ~]# vim /etc/modprobe.d/bonding.conf alias bond0 bonding # bond0 為我們需要的介面, bonding 則是 Linux 的核心模組之意! |
[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 則是依樣畫葫蘆,這裡就不示範囉!自行修訂即可。 |
[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 秒就偵測一次每張網卡的狀態!據以進行網路容錯測試! |
[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 |
[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 ....(底下省略).... |
雖然說 Linux bonding 有很多好處,但是它並不是萬靈丹!某些場合底下還是無法增加頻寬的!很多文件都沒有寫到這點,或者是雖然有帶到,但是卻沒有特別強調! 因此,鳥哥一開始利用 bonding 來增加虛擬機器的頻寬時,曾經遭遇到非常多的問題,導致有一陣子有點厭惡 bonding 哩~就是沒有搞清楚的原因啦! 那就來讓大家搞清楚一點好了!來看看吧!
另外,鳥哥用過最簡單而且效能最好的應該是 mode 6 這個模式!簡單好用,又不用重新設定 switch,缺少網卡就疊上去,非常簡單! 所以,有興趣的伙伴們,可以使用這個模式來製作一下,應該可以得到不錯的效果呦!
我們知道 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 到底有沒有效果,你可以這樣實驗看看:
這個測試中,因為伺服器的大檔案僅提供用戶端讀取,並沒有寫入。如果你的記憶體夠大 (超過 4G 以上),這個檔案將被記憶體快取住!此時,所有傳輸將不會再次的讀取硬碟了。 而你在用戶端使用 dd 讀入大檔案後直接丟入垃圾桶 (/dev/null) ,這樣用戶端也沒有用到磁碟讀寫,如此就可以單純的去測試網路效能了。
在鳥哥的測試中,四部主機同時跑時,由於鳥哥用了三 GB 網卡作 bonding,此時將會有兩部主機共用一張網卡,所以有兩部主機速度可達 80~90Mbytes/s,另外兩部僅能到達 60Mbytes/s 而已。 不過,這樣也差不多有 70~80% 的理論速度啦!還算很 OK 的啦!