리눅스 본딩(Bonding) 개념

리눅스에서 본딩 (bonding)은 여러 네트워크 인터페이스 카드(NICs)를 결합하여 하나의 가상 인터페이스로 동작하도록 하는 프로세스입니다.
이를 통해 대역폭을 늘리고 부하 분산을 위해 여러 물리적 네트워크 연결을 하나의 논리적으로 연결하여 다룰 수 있습니다.

이러한 본딩은 일반적으로 서버나 네트워크 장비에서 사용되며, 중요한 가용성과 성능을 제공하는 데 도움이 됩니다.
본딩을 설정하면 네트워크 장애나 장애 시에 여러 경로를 통해 통신할 수 있으며, 데이터 전송을 더 효율적으로 분산시킬 수 있습니다.

리눅스에서는 bonding 또는 teaming이라는 용어로 알려져 있으며, 이를 구성하기 위해 특정 네트워크 관리 도구를 사용하게 됩니다.
일반적으로는 ifenslave 패키지를 사용하거나, 네트워크 관리자 도구에 기능이 포함되어 있을 수 있고, 설정은 /etc/network/interfaces 파일이나 /etc/sysconfig/network-scripts/ifcfg-bondX 파일과 같은 네트워크 설정 파일에서 이루어집니다.

본딩은 다양한 모드로 구성될 수 있으며, 주요한 모드에는 로드 밸런싱, 무결성 및 페일오버 등이 포함되며, 본딩을 사용하여 여러 네트워크 인터페이스를 결합하면 시스템의 네트워크 성능과 신뢰성을 향상시킬 수 있습니다.

 

리눅스 본딩 작업 순서

  1. 네트워크 본딩 모듈 로드 확인
  2. 네트워크 본딩 모듈 로드
  3. 네트워크 설정 파일 수정
  4. 네트워크 서비스 재시작 또는 재부팅
  5. 본딩 설정 확인

 

본딩 옵션 모드 설명

액티브패시브(Active-Passive) (mode=1)

이미 설명한 대로, 하나의 인터페이스가 활성화되고 나머지는 백업 역할을 하며, 활성화된 인터페이스가 실패하면 자동으로 다른 인터페이스로 전환 됩니다.

BONDING_OPTS="mode=1"

 

로드 밸런싱(Load Balancing) (mode=0 또는 mode=6)

데이터를 각 인터페이스에 균등하게 분배하여 네트워크 부하를 분산 시키며,  mode=0과 mode=6은 기본적으로 동일한 모드입니다.

BONDING_OPTS="mode=0"
BONDING_OPTS="mode=6"

 

발란싱 라운드로빈(Round Robin) (mode=2)

데이터를 순서대로 각 인터페이스에 전송하여 부하를 분산합니다.

BONDING_OPTS="mode=2"

 

발란싱 XOR (mode=3)

소스 MAC 주소를 기반으로 한 XOR 연산을 사용하여 특정 연결에 대한 네트워크 트래픽을 분산합니다.

BONDING_OPTS="mode=3"

 

 

액티브액티브, XOR LACP (mode=4, mode=5, mode=802.3ad)

다양한 액티브액티브 모드와 LACP(Link Aggregation Control Protocol)를 통한 본딩 모드도 있습니다.

LACP(Link Aggregation Control Protocol)는 여러 개의 네트워크 인터페이스를 결합하여 하나의 논리적인 고대역폭 인터페이스로 동작하게 하는 표준 프로토콜입니다.

BONDING_OPTS="mode=4"
BONDING_OPTS="mode=5"
BONDING_OPTS="802.3ad"

 

본딩(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-eth0ifcfg-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