리눅스 본딩(Bonding) 개념
리눅스에서 본딩 (bonding)은 여러 네트워크 인터페이스 카드(NICs)를 결합하여 하나의 가상 인터페이스로 동작하도록 하는 프로세스입니다.
이를 통해 대역폭을 늘리고 부하 분산을 위해 여러 물리적 네트워크 연결을 하나의 논리적으로 연결하여 다룰 수 있습니다.
이러한 본딩은 일반적으로 서버나 네트워크 장비에서 사용되며, 중요한 가용성과 성능을 제공하는 데 도움이 됩니다.
본딩을 설정하면 네트워크 장애나 장애 시에 여러 경로를 통해 통신할 수 있으며, 데이터 전송을 더 효율적으로 분산시킬 수 있습니다.
리눅스에서는 bonding 또는 teaming이라는 용어로 알려져 있으며, 이를 구성하기 위해 특정 네트워크 관리 도구를 사용하게 됩니다.
일반적으로는 ifenslave 패키지를 사용하거나, 네트워크 관리자 도구에 기능이 포함되어 있을 수 있고, 설정은 /etc/network/interfaces 파일이나 /etc/sysconfig/network-scripts/ifcfg-bondX 파일과 같은 네트워크 설정 파일에서 이루어집니다.
본딩은 다양한 모드로 구성될 수 있으며, 주요한 모드에는 로드 밸런싱, 무결성 및 페일오버 등이 포함되며, 본딩을 사용하여 여러 네트워크 인터페이스를 결합하면 시스템의 네트워크 성능과 신뢰성을 향상시킬 수 있습니다.
리눅스 본딩 작업 순서
- 네트워크 본딩 모듈 로드 확인
- 네트워크 본딩 모듈 로드
- 네트워크 설정 파일 수정
- 네트워크 서비스 재시작 또는 재부팅
- 본딩 설정 확인
본딩 옵션 모드 종류
본딩 옵션 모드 요약표
모드 | 이름 | 로드 밸런싱 | 고가용성 | 스위치 설정 필요 | 특징 |
0 | balance-rr | O (송신만) | O | X | 라운드 로빈 방식, 송신만 부하 분산 |
1 | active-backup | X | O | X | 활성/백업 방식, 장애 시 백업 활성화 |
2 | balance-xor | O (송신) | O | O (링크 집계 필요) | XOR 기반 송신 인터페이스 선택 |
3 | broadcast | X | O | X | 모든 인터페이스로 패킷 브로드캐스트 |
4 | 802.3ad (LACP) | O (송신/수신) | O | O (LACP 설정 필요) | 표준 기반 링크 집계 (802.3ad) |
5 | balance-tlb | O (송신) | O | X | 송신 부하 분산, 수신은 단일 링크 |
6 | balance-alb | O (송신/수신) | O | X | 적응형 부하 분산, ARP 조정 |
로드 밸런싱(Load Balancing) (mode=0)
패킷을 라운드 로빈 방식으로 순차적으로 각 인터페이스에 전송하며, 로드 밸런싱과 중복성을 제공하지만 스위치나 네트워크 장비의 추가 설정은 필요하지 않습니다.
성능 향상을 기대할 수 있으나 패킷 순서가 어긋날 수 있어 일부 애플리케이션에서 문제가 발생할 수 있습니다. 주로 대역폭 증가가 필요한 환경에서 사용됩니다.
BONDING_OPTS="mode=0"
액티브–패시브(Active-Passive) (mode=1) or (active-backup)
하나의 활성 인터페이스만 사용되며, 장애가 발생하면 백업 인터페이스가 활성화되는 액티브-백업 방식입니다. 스위치나 네트워크 장비의 추가 설정이 필요하지 않고 고가용성을 제공하지만, 로드 밸런싱은 지원되지 않으며 대역폭은 하나의 링크 속도로 제한됩니다. 주로 고가용성이 중요한 환경에서 사용됩니다.
BONDING_OPTS="mode=1"
balance-xor (mode=2)
XOR(Exclusive OR) 해시 정책을 기반으로 송신 인터페이스를 결정하며, 동일한 송신-수신 주소 쌍은 항상 같은 인터페이스를 사용합니다.
로드 밸런싱과 고가용성을 제공하지만 스위치에서 링크 집계(802.3ad)가 필요하고 대역폭을 최적화할 수 있으므로 대역폭 사용 최적화가 필요한 환경에서 사용됩니다.
BONDING_OPTS="mode=2"
broadcast (mode=3)
모든 패킷을 모든 네트워크 인터페이스로 브로드캐스트하여 신뢰성을 극대화하지만, 네트워크 트래픽이 중복되어 대역폭 효율이 낮아집니다.
스위치나 네트워크 장비의 추가 설정이 필요하지 않으며, 데이터 전송의 신뢰성이 절대적으로 중요한 환경에서 사용됩니다.
BONDING_OPTS="mode=3"
802.3ad / LACP (mode=4)
IEEE 802.3ad 표준 기반으로 링크 집계 제어 프로토콜(LACP)을 사용해 여러 네트워크 인터페이스를 하나로 묶으며, 로드 밸런싱과 고가용성을 동시에 제공합니다.
스위치와 서버 양쪽에서 LACP 설정이 필요하며, 동일한 속도와 설정의 인터페이스만 사용할 수 있고 대규모 네트워크에서 높은 대역폭과 고가용성이 필요한 경우 사용됩니다.
BONDING_OPTS="mode=4"
balance-tlb (mode=5)
송신 부하를 각 인터페이스에 분산하는 Transmit Load Balancing(TLB) 방식을 사용하며, 수신 트래픽은 하나의 인터페이스만 사용합니다.
스위치나 네트워크 장비의 설정이 필요하지 않고 자동으로 트래픽을 분산하지만, 수신 트래픽이 단일 링크로 제한됩니다. 송신 부하가 많은 서버 환경에 적합합니다.
BONDING_OPTS="mode=5"
balance-alb (mode=6)
송신 부하를 각 인터페이스에 분산하는 Transmit Load Balancing(TLB) 방식을 사용하며, 수신 트래픽은 하나의 인터페이스만 사용합니다.
스위치나 네트워크 장비의 설정이 필요하지 않고 자동으로 트래픽을 분산하지만, 수신 트래픽이 단일 링크로 제한됩니다. 송신 부하가 많은 서버 환경에 적합합니다.
BONDING_OPTS="mode=6"
본딩(Bonding) 모듈 구성 [작업환경 : Centos 7.9]
본딩(Bonding) 모듈 구성 명령어
[root@localhost]# modprobe bonding
본딩(Bonding) 모듈 영구적 구성
재부팅 이후에 모듈이 동작하지 않는 것을 방지하여 영구적 모듈 설정을 합니다.
아래의 명령어를 사용하게 되면 /etc/modules-load.d/ 경로에 bonding.conf 이라는 파일이 생성되면서 파일 내용에는 bonding 이라고 기재 됩니다.
[root@localhost]# sh -c 'echo "bonding" >> /etc/modules-load.d/bonding.conf'
본딩(Bonding) 모듈 구성 확인 명령어
lsmod | grep bonding 명령어를 사용하여 확인할 시 제대로 구성이 되었다면 bonding 152979 0와 같이 나와야 합니다.
[root@localhost]# lsmod | grep bonding
bonding 152979 0
본딩(Bonding) 모듈 설치
본딩 모듈이 없을 시에는 아래와 같이 설치합니다.
[root@localhost]# yum install -y kmod-bonding
본딩(Bonding) 구성 방법 [환경 : Centos7.9]
Bonding Master Setup
아래 예시는 BONDING_OPTS=”mode=1 miimon=100″으로 설정하여 액티브-패시브(Active-Backup) 모드로 설정하고, MIIM간격을 100밀리초로 설정합니다.
MIIM(Medium Independent Interface Monitoring)은 네트워크 인터페이스의 연결 상태를 감지하는 데 사용합니다.
#bonding할 파일 구성
[root@localhost]# vi /etc/sysconfig/network-scripts/ifcfg-bond0
#아래와 같이 작성 후 저장
DEVICE=bond0 IPADDR=192.168.1.100 # 본인의 IP 주소로 변경
NETMASK=255.255.255.0 # 본인의 IP 주소로 변경
GATEWAY=192.168.1.100
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="mode=1 miimon=100"
Bonding Slave Setup
이 예시에서는 본딩할 대상을 ifcfg-eth0와 ifcfg-eth1 대상으로 진행하고 있습니다.
기존 파일을 수정하기 전에 백업하는 습관을 들이는 것이 좋습니다.
[root@localhost]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/BK_ifcfg-eth0
[root@localhost]# cp /etc/sysconfig/network-scripts/ifcfg-eth1 /etc/sysconfig/network-scripts/BK_ifcfg-eth1
#bonding할 eth0 파일 수정
[root@localhost]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
#bonding할 eth1 파일 수정
[root@localhost]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
본딩(Bonding) 자동구성 스크립트
아래 스크립트는 이 일련의 과정을 자동으로 구성한 스크립트 입니다.
사용 시에는 반드시 자신의 환경에 맞게 수정하시길 바랍니다
#!/bin/bash # 스크립트 루트 권한 실행 if [[ $EUID -ne 0 ]]; then echo "이 스크립트는 루트 권한으로 실행되어야 합니다." >&2 exit 1 fi # 본딩 모듈이 없을 상황을 대비하여 패키지 설치 yum install -y kmod-bonding # 인터페이스 변수 정의 BOND_DEVICE="bond0" ETH0_DEVICE="eth0" ETH1_DEVICE="eth1" IP_ADDRESS="192.168.1.100" NETMASK="255.255.255.0" GATEWAY="192.168.1.1" # 본딩 대상을 백업 cp /etc/sysconfig/network-scripts/ifcfg-$ETH0_DEVICE /etc/sysconfig/network-scripts/BK_ifcfg-$ETH0_DEVICE cp /etc/sysconfig/network-scripts/ifcfg-$ETH1_DEVICE /etc/sysconfig/network-scripts/BK_ifcfg-$ETH1_DEVICE # 네트워크 본딩 모듈 로드 modprobe bonding # 네트워크 본딩 모듈 영구적 로드 echo "bonding" >> /etc/modules-load.d/bonding.conf # 네트워크 본딩 모듈 로드 확인 lsmod | grep bonding # 본딩 설정 파일 생성 cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$BOND_DEVICE DEVICE=$BOND_DEVICE IPADDR=$IP_ADDRESS NETMASK=$NETMASK GATEWAY=$GATEWAY ONBOOT=yes BOOTPROTO=none USERCTL=no EOF # 각 인터페이스에 대한 설정 파일 생성 cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$ETH0_DEVICE DEVICE=$ETH0_DEVICE TYPE=Ethernet BOOTPROTO=none ONBOOT=yes MASTER=$BOND_DEVICE SLAVE=yes EOF cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$ETH1_DEVICE DEVICE=$ETH1_DEVICE TYPE=Ethernet BOOTPROTO=none ONBOOT=yes MASTER=$BOND_DEVICE SLAVE=yes EOF # 네트워크 서비스를 재시작합니다. systemctl restart network
본딩(Bonding) 구성 확인 방법
ifconfig를 이용한 확인 방법
bond0 라고 표기되면 됩니다.
[root@localhost ~]# ifconfig
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::42a6:b7ff:fe95:a834 prefixlen 64 scopeid 0x20<link>
ether 50:a7:b8:96:a7:a4 txqueuelen 1000 (Ethernet)
RX packets 4099023 bytes 4424022695 (4.1 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4275361 bytes 4702819354 (4.3 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 55196 bytes 3423944 (3.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 55196 bytes 3423944 (3.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 50:a7:b8:96:a7:a4 txqueuelen 1000 (Ethernet)
RX packets 7150145 bytes 9147494848 (8.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5403282 bytes 4804168018 (4.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 50:a7:b8:96:a7:a4 txqueuelen 1000 (Ethernet)
RX packets 9025002 bytes 9881743018 (9.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5411204 bytes 4815783690 (4.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ethtool 이용하여 확인하는 방법
NIC를 묶어서 설정한 만큼 Speed: 2000Mb/s가 늘어나고 잘 표기된 것을 확인 할 수 있습니다.
[root@localhost ~]# ethtool bond0
Settings for bond0:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: 2000Mb/s
Duplex: Full
Port: Other
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
Link detected: yes
proc 확인하는 방법
아래 사진은 예시입니다.
[root@localhost ~]# 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: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 55:a6:b7:98:a8:34
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 55:a6:b7:98:a8:35
Slave queue ID: 0