Ethernet Bonding บน Linux

ผู้ดูแลระบบคงเคยปวดหัวเมื่อเจอปัญหาการ์ดแลนของเซิร์ฟเวอร์ใช้งานไม่ได้(หมายถึงพัง) ทำให้เครื่องเซิร์ฟเวอร์ต้องหยุดชะงัก โดยต้องรีบให้มีการแก้ไขก็คือ คุณจะต้องรอเปลี่ยนฮาร์ดแวร์ หรือไม่ก็ต้องแก้คอนฟิกต่างๆ ของเครื่องเซิร์ฟเวอร์ เพื่อทำให้เซิร์ฟเวอร์ทำงาน แต่นั่นก็หมายความว่าเซิร์ฟเวอร์ของคุณมีเวลาดาวน์เกิดขึ้นหลายชั่วโมงอย่างไม่ต้องสงสัย อย่างน้อยที่สุดก็ 1 ชั่วโมง คุณจะมีวิธีป้องกันได้อย่างไร

พอร์ตแลน (Ethernet) ของเครื่องเซิร์ฟเวอร์ถือว่าเป็นสิ่งสำคัญอย่างยิ่ง เพราะเป็นส่วนที่จะรับส่งข้อมูลกับเคื่องอื่นๆ ถ้าเซิร์ฟเวอร์มีแค่พอร์ตเดียวเชื่อมต่อเข้าเน็ตเวิร์ก แล้วสายที่เชื่อมต่อหลุดไป หรือไม่สามารถรองรับปริมาณการรับส่งข้อมูลได้เพียงพอ ก็อาจทำให้เกิดปัญหาการใช้งานได้

ในบทความนี้ขอแนะนำการคอนฟิก Ethernet Bonding (หรือ Teaming) เพื่อแก้ปัญหาที่อาจเกิดขึ้น โดยจะมีการจัดกลุ่มพอร์ตแลนเข้าด้วยกัน เพื่อช่วยในการรับส่งข้อมูล รูปแบบการส่งจะมีสองแบบใหญ่ๆ คือ

  • Active-backup พอร์ตหนึ่งจะทำหน้าพอร์ตหลักเพื่อใช้รับส่งข้อมูล (Active) แต่อีกพอร์ตหนึ่งจะสำรอง (Backup) ไว้เฉยๆ ไม่มีการรับส่งข้อมูลใดๆ ผ่านทางพอร์ตสำรอง แต่เมื่อไรที่พอร์ตหลักมีปัญหาพอร์ตนี้จะรับส่งข้อมูลแทน สำหรับ Ethernet Bonding จะเป็นคอนฟิกใน mode 1
  • Load Balance พอร์ตทั้งหมดในกลุ่มจะช่วยกันรับส่งข้อมูล ส่วนเทคนิคในการรับส่งจะมีหลายแบบด้วยกันแล้วแต่ mode ที่คอนฟิก

สามารถระบุว่าจะทำ bonding เพื่อรับส่งข้อมูลแบบไหนได้จากคอนฟิก mode ดังนี้

  • mode=0 (balance-rr) เป็นการส่งข้อมูลแบบ round-robin (load balancing, fault tolerance)
  • mode=1 (active-backup) สถานการณ์ปกติจะมีพอร์ตเดียวเท่านั้นที่ใช้รับส่งข้อมูล (fault tolerance)
  • mode=2 (balance-xor) เป็นการส่งข้อมูลแบบใช้ XOR เพื่อหาพอร์ตที่จะส่ง เช่นคำนวณจาก MAC Address ต้นทางปลายทางเป็นต้น (load balancing, fault tolerance)
  • mode=3 (broadcast)
  • mode=4 (802.3ad) เป็นส่งข้อมูลแบบ Link Aggregation Control Protocol (LACP) / 802.3ad
  • mode=5 (balance-tlb) ส่งข้อมูลแบบ Adaptive transmit load balancing
  • mode=6 (balance-alb) ส่งข้อมูลแบบ Adaptive load balancing

ในตัวอย่างสามารถดูได้ตามลิงค์ต่างๆ คงมีมากมาย นำแค่ตัวอย่างบางตัวอย่างมาให้ดู

การติดตั้งบน Debian Linux 6.0.2 amd64

โครงสร้างการติดตั้งของระบบ Debian Linux ควรมีการติดตั้งตามโครงสร้างนี้แล้ว

Internet
|                  202.54.1.1 (eth0)
ISP Router/Firewall 192.168.1.254 (eth1)
   \
     \                             +—— Server 1 (Debian file server w/ eth0 & eth1) 192.168.1.1

      +——————+         |
      | Gigabit Ethernet |———+—— Server 2 (MySQL) 192.168.1.2
      | with Jumbo Frame |         |
      +——————+         +—— Server 3 (Apache) 192.168.1.3
                                   |
                                   +—–  Server 4 (Proxy/SMTP/DHCP etc) 192.168.1.4                                   |
                                   +—–  Desktop PCs / Other network devices (etc)

การติดตั้งใช้คำสั่งดังนี้

#apt-get install ifenslave-2.6

เมื่อติดตั้งเสร็จ ทำการสร้างไฟล์ /etc/modprobe.d/bonding.conf และแก้คอนฟิกต่างๆให้ตรงตามอุปกรณ์ที่ได้ติดตั้งไป ดังนี้

[router ip] = 192.168.1.2

[ip server]=192.168.1.1

มีการ์ดแลน 2 ใบ คือ eth0,eth1

alias bond0 bonding
  options bonding mode=0 arp_interval=100 arp_ip_target=192.168.1.2, 192.168.1.1

# vi /etc/modprobe.d/bonding.conf

# modprobe -v bonding mode=0 arp_interval=100 arp_ip_target=192.168.1.254, 192.168.1.12
# tail -f /var/log/messages
# ifconfig bond0

# cp /etc/network/interfaces /etc/network/interfaces.bak
# vi /etc/network/interfaces

############ WARNING ####################
# You do not need an "iface eth0" nor an "iface eth1" stanza.
# Setup IP address / netmask / gateway as per your requirements.
#######################################
auto lo
iface lo inet loopback
 
# The primary network interface
auto bond0
iface bond0 inet static
    address 192.168.1.3
    netmask 255.255.255.0
    network 192.168.1.0
    gateway 192.168.1.2

    slaves eth0 eth1
    # jumbo frame support
    mtu 9000
    # Load balancing and fault tolerance
    bond-mode balance-rr
    bond-miimon 100
    bond-downdelay 200
    bond-updelay 200
    dns-nameservers 192.168.1.1

    dns-search test.com
# /etc/init.d/networking start

เตรียมพอร์ตแลนที่จะคอนฟิกเป็น Ethernet Bonding

ในตัวอย่างจะใช้พอร์ตแลน eth2 และ eth3 เพื่อคอนฟิกรวมเป็น bond0 บส Fedora

เริ่มต้นสร้างไฟล์ /etc/sysconfig/network-scripts/ifcfg-bond0 ซึ่งจะเป็นไฟล์คอนฟิกของ bond0 เป็นพอร์ต bonding (ในเครื่องหนึ่งสามารถจัดกลุ่มทำได้หลาย bonding พอร์ตที่คอนฟิกก็จะเป็น bond1, bond2 เป็นต้น) ในไฟล์จะมีคอนฟิก IP Address, Netmask เหมือนที่คอนฟิกพอร์ต ethernet ทั่วไป

ตัวอย่างคอนฟิก ifcfg-bond0

[root@fc9-x1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0
IPADDR=10.1.0.1
NETMASK=255.255.255.0
BROADCAST=10.1.0.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

คอนฟิกพอร์ต (Physical) ให้อยู่ในกลุ่ม bond0 ตามตัวอย่าง

[root@fc9-x1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth2 DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USECTL=no
[root@fc9-x1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth3 DEVICE=eth3
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USECTL=no

แก้ไขไฟล์ /etc/modprobe.conf เพื่อให้โหลด kernel module สำหรับการทำ bonding ตอนที่มีการโหลดคอนฟิก bond0

[root@fc9-x1 ~]# cat /etc/modprobe.conf alias bond0 bonding
options bonding miimon=100 mode=1

หมายเหตุ รายละเอียดเพิ่มเติมดูได้จากไฟล์ /usr/share/doc/kernel-doc-2.6.25/Documentation/networking/bonding.txt จาก kernel-doc-2.6.25-14.fc9.noarch.rpm

ในเริ่มต้นแนะนำให้ทดสอบกับ mode=1 เพื่อทดลอง active-backup ก่อน

หลังจากสร้างไฟล์คอนฟิกทั้งหมดแล้ว รีบูตเครื่องหนึ่งครั้ง เผื่อให้ bond0 ถูกโหลดขึ้นมา

ตรวจสอบสถานะของ Ethernet Bonding

เมื่อเครื่องบูตเสร็จเรียบร้อย ถ้าถูกต้องเมื่อรันคำสั่ง ifconfig จะมีพอร์ต bond0 เพิ่มขึ้นมาตามตัวอย่าง

[root@server ~]# ifconfig bond0     Link encap:Ethernet  HWaddr 00:0C:22:FF:11:55
          inet addr:10.1.0.1  Bcast:10.1.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1160 (1.1 KiB)  TX bytes:1574 (1.5 KiB)
...
eth2      Link encap:Ethernet  HWaddr 00:0C:22:FF:11:55
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1100 (1.0 KiB)  TX bytes:1574 (1.5 KiB)
          Interrupt:16 Base address:0x1824
eth3      Link encap:Ethernet  HWaddr 00:0C:22:FF:11:55
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:60 (60.0 b)  TX bytes:0 (0.0 b)
          Interrupt:17 Base address:0x18a4

ข้อสังเกตจากคำสั่ง ifconfig

  • HWaddr หรือ MAC Address ของแต่ละพอร์ตที่ทำ bonding ด้วยกันจะเป็นค่าเดียวกันหมด ทั้งนี้เพื่อประโยชน์ในการทำ fail over
  • ในโหมด active-backup ปกติจะมีพอร์ตเดียวทำหน้าที่เป็นหลักใช้ในการรับส่งข้อมูล ซึ่งดูได้จากค่า RX, TX packets

หากต้องการรู้ว่าพอร์ตไหนถูกใช้เป็นหลัก (active) ในการส่งข้อมูล สามารถดูได้จากไฟล์ /proc/net/bonding/bond0

ตัวอย่างไฟล์ /proc/net/bonding/bond0

[root@fc9-x1 ~]# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth2
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:22:ff:11:55
Slave Interface: eth3
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:22:ff:11:56

จากตัวอย่างพอร์ตหลักที่ถูกใช้ในโหมด (active-backup) คือพอร์ต eth2 ดูได้จาก Currently Active Slave: eth2

ทดสอบการ fail over

แนะนำว่าก่อนที่จะดึงสายแลนให้รันคำสั่ง ping ทิ้งไว้ เพื่อดูว่าเวลาที่มีการ fail over จะยังส่งข้อมูลต่อไปได้เลยไหม

ทดลองดึงสายออกจากพอร์ต eth2 แล้วตรวจสอบไฟล์ /proc/net/bonding/bond0 อีกครั้ง จะเห็นว่าพอร์ต eth3 จะถูกนำมาใช้เป็นหลักในการรับส่งข้อมูลแทน แล้วคำสั่ง ping ก็ยังคงทำงานอยู่ อาจมีสะดุดไปบ้างเล็กน้อย

[root@fc9-x1 ~]# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth3
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth2
MII Status: down
Link Failure Count: 1
Permanent HW addr: 00:0c:22:ff:11:55
Slave Interface: eth3
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:22:ff:11:56

จากผลลัพธ์จะแสดงสถานะของ bonding ต่างๆ ดังนี้

  • Currently Active Slave: eth3 พอร์ตหลักที่ใช้รับส่งข้อมูลตอนนี้
  • Slave Interface: eth2, MII Status: down สถานะของพอร์ต eth2 down
  • Link Failur Count: 1 แสดงตัวเลขจำนวนครั้งที่พอร์ตมีปัญหา

สุดท้ายทดสอบด้วยการเสียบสายกลับเข้าไปที่พอร์ตที่ 2 จะเห็นว่าไม่มีการ fail over กลับมาที่พอร์ต eth2 พอร์ต eth3 จะยังคงเป็นหลักในการรับส่งข้อมูลอยู่

  1. Play_Thaiman
    กันยายน 8, 2011 ที่ 08:27

    เจอปัญหากับตัวเองแล้วปวดหัวมากๆๆๆคับ ขอบคุณคับ วิธีแก้ไขนี้

  1. No trackbacks yet.

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: