فکر کنید شما یک ماشین DL380-G9 برای نصب سیستم‌عامل و دیتابیس در اختیار دارید. همونطور که می‌دونید این ماشین دارای ۴ پورت شبکه به صورت Onboard هستش و اگه ما به صفحه مشخصات این ماشین در سایت HP مراجعه کنیم (HPE ProLiant DL380 Gen9 Server) می‌بینیم که در قسمت SPECIFICATIONS در مشخصات کنترلر شبکه ۴ پورت رو نوشته که بسته به مدل و سفارش میتونه متفاوت باشه برای اطلاعات بیشتر می‌تونید به راهنمای کاربر این ماشین مراجعه کنید:

 HPE-ProLiant-DL380-Gen9-Server-User-Guide

حجم: 14.9 مگابایت

خب همونطور که در جریان هستید هر پورت شبکه فیزیکی به یک کارت شبکه (Network interface controller) متصل هستش و این کنترلر وظیفه‌اش کنترل چیپ‌ست شبکه و ارتباطات هستش، هر پورت هم دارای یک چیپ‌ست مجزا هستش، از طرفی هر چیپ‌ست شبکه در سیستم‌عامل با یک DeviceDriver قابلیت اتصال به یک Virtual network interface رو در سطح کرنل داره.

خب فرض می‌کنیم یکی از چیپ‌ست‌های سرور ما در حین کارکرد 24*7 ماشین به مشکل یا قطعی برخورد کرد و بیزنس حساسی هم روی این ماشین پیاده‌سازی شده به طوری که هر لحظه قطعی منجر به ضررهای میلیونی میشه خب به عنوان ادمین سیستم یکی از کارهای ما برقراری SLA تعهد داده شده است و یکی از ضعف‌ها برای ما اینجا مشخص شده در حقیقت اگه به هر دلیلی یکی از پورتهای ما از دسترس خارج بشه ارتباط ماشین ما با شبکه‌امون قطع میشه.

الان با توجه به شناختمون از بیزنس و ماشین اقدام به راه‌اندازی سناریوی الحاق یا Link aggregation در سطح سیستم‌عامل می‌کنیم (در لینوکس Network Bonding و در مایکروسافت NIC Team)

Network Bonding در خانواده RHEL 6.X

همونطور که تا الان متوجه شدید Network Bonding یک الحاقی از چند VNI  یا همون(eth0, eth1, eth2, eth3) در یک VNI که Bond Interface خونده میشن هستش. Network Bonding یکی از ویژگی‌های کرنل لینوکس هستش که به صورت رسمی از طرف بنیاد لینوکس پشتیبانی میشه

به طور کلی Bonding یکی از عمومی‌ترین راه‌حل‌ها برای ایجاد HA, FT و سرویس Load Balance هستش

نکته: مطالعه مستند Linux Ethernet Bonding Driver HOWTO به هر ادمینی پیشنهاد میشه

متاسفانه وقت اجازه نمیده این مستند رو باهم مرور کنیم پس سریع یه نگاهی به نحوه کانفیگ این قابلیت در خانواده RHEL 6.X می‌اندازیم

در سناریو من همونطور که با فضای اون آشنا شدید من ۴ شبکه VNI دارم که میخوام یک شبکه Bond شده برای این ۴ تا بسازم

با توجه به بیزنس اپلیکیشن اولین درخواست ما از تیم زیرساخت این هستش که برای این ۴ پورت در سوییچ یک VLAN تعریف بشه تا بتونیم عملیات الحاق VNI ها رو انجام بدیم.

برای پیدا کردن تمام چیپ‌ست‌های شناخته شده ماشین در سطح سیستم‌عامل لینوکس از دستور زیر استفاده می‌کنیم:

lspci | egrep -i --color 'network|ethernet'

03:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)
03:00.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)
03:00.2 Ethernet controller: Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)
03:00.3 Ethernet controller: Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01)

مرحله اول: ساخت فایل پکربندی VNI Bond و اختصاص ip address, netmask, gateway مشخص شده از طرف تیم شبکه.

نکته: توجه کنید این فایل باید دقیقاً با پارمترهای زیر همراه باشه و نیازی به پارمتر اضافه‌ای در این سناریو نیستش

[root@tel ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
IPADDR=192.168.211.102
NETMASK=255.255.255.224
GATEWAY=192.168.211.97
TYPE=Bond
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static

مرحله دوم: ویرایش فایل‌های پیکرندی VNIهای موجود و مشخص کردن ورودی‌های master و slave.

نکته: اگه قبلاً VNIهاتون رو با Network Manager پیکربندی کرده باشید پارامترهای قبلی رو باید به طور کامل پاک کنید و اطمینان حاصل کنید فایلها دقیقاً به شکل زیر پیکربندی شده باشند. نکته‌ای که وجود داره این هستش که اگه ۲ تا VNI (دقیقاً یعنی bond و ethهاتون برای یک ip اشتباهاً کانفیگ شده باشند به IP address conflict می‌خورید)

[root@tel ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
HWADDR=D8:9D:67:25:61:68
LAST_CONNECT=1507163431
MASTER=bond0
SLAVE=yes

[root@tel ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes

[root@tel ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes

[root@tel ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth3
DEVICE=eth3
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes

[root@tel ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth
ifcfg-eth0 ifcfg-eth1 ifcfg-eth2 ifcfg-eth3

مرحله سوم: ساخت فایل پیکربندی عملیات Bond یا همون bonding.conf

نکته: یک پیکربندی پیشفرض به صورت زیر هستش شما باید بسته به سناریو خودتون پیکربندی رو تغییر بدید.

[root@tel ~]# cat /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bond0 mode=0 miimon=100

برای اطلاع از باقی پارامترها می‌تونید به داکیومنت زیر بخش Module parameters مراجعه کنید:

Linux Ethernet Bonding Driver mini-howto

تفاوت modeهای مختلف

-balance-rr or 0 — round-robin mode for fault tolerance and load balancing.
-active-backup or 1 — Sets active-backup mode for fault tolerance.
-balance-xor or 2 — Sets an XOR (exclusive-or) mode for fault tolerance and load balancing.
-broadcast or 3 — Sets a broadcast mode for fault tolerance. All transmissions are sent on all slave interfaces.
-802.3ad or 4 — Sets an IEEE 802.3ad dynamic link aggregation mode. Creates aggregation groups that share the same speed & duplex settings.
-balance-tlb or 5 — Sets a Transmit Load Balancing (TLB) mode for fault tolerance & load balancing.
-balance-alb or 6 — Sets an Active Load Balancing (ALB) mode for fault tolerance & load balancing.

مرحله چهارم: حالا سرویس شبکه رو دوباره راه‌اندازی می‌کنیم:

# service network restart

مرحله پنجم: چک کردن و مانیتورینگ

با استفاده از دسورات زیر می‌تونید وضعیت VNI ساخته شده و باقی VNIها رو مانیتور کنید:

[root@tel ~]# ifconfig bond0
bond0 Link encap:Ethernet HWaddr D8:9D:67:25:61:68
inet addr:192.168.211.102 Bcast:192.168.211.127 Mask:255.255.255.224
inet6 addr: fe80::da9d:67ff:fe25:6168/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:3750069 errors:0 dropped:0 overruns:0 frame:0
TX packets:113092 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:300977536 (287.0 MiB) TX bytes:21671807 (20.6 MiB)

همونطور که متوجه شدید وضعیت کانفیگ Bond من به صورت FT, Load Balance هستش برای چک کردن می‌تونیم به صورت دستی کابلها رو از سرور دونه دونه بکشیم و به استفاده از دستور زیر اقدام به پایین و بالا کردن VNI هامون بکنیم:

[root@tel ~]# ifconfig eth2 down
[root@tel ~]# ifconfig eth2 up
[root@tel ~]# cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: d8:9d:67:25:61:68
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: d8:9d:67:25:61:69
Slave queue ID: 0

Slave Interface: eth2
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: d8:9d:67:25:61:6a
Slave queue ID: 0

Slave Interface: eth3
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: d8:9d:67:25:61:6b
Slave queue ID: 0

پی‌نوشت

یاشار جان ۲ نکته خوب رو اشاره کردن که به مطلب اضافه میکنم:

  • نکته‌اول: یادم رفت اشاره کنم که طبیعتاً باید به هر پورت کارت شبکه کابل شبکه هم وصل بشه تا بتونیم سناریو رو جلو ببریم
  • نکته دوم: کاربرد bonding بیشتر تو چندین ip هست که یک ip ایجاد میکنه برای دسترس پذیری بالا // برای مثال ۲ رنج شبکه داریم که میخوایم همش منتهی بشه به یه ip یا دو پهنا باند ایجاد بشه و ...

منابع

https://www.cyberciti.biz/faq/linux-list-network-cards-command/
http://www.cloudibee.com/network-bonding-modes/
https://www.linuxtechi.com/network-bonding-centos-6-rhel-6/