Profile picture

[Linux] 본딩(Bonding)을 이해하고 실습해보기

JaehyoJJAng2023년 07월 15일

Bonding 이란?

image
'Bonding'은 송수신 데이터를 처리할 수 있는 능력을 가진 네트워크 장비에서 해당 장비가 가지고 있는 물리적인 NIC(Network Interface Card)를 논리적으로 묶어
대역폭을 늘리거나 가용성을 위해 사용하는 방법이다.


다른 말로는 Etherchannel 이라고도 부르는데, 표준어로는 Link Aggregation 이라고 한다.


또한 몇몇 본딩 모드는 스위치의 Etherchannel 기능이 지원되어야 한다.
(Etherchannel이 off 되어있거나, 지원하지 않는다면 특정 모드는 사용이 불가능하거나 기능이 떨어짐)


Bonding 종류

mode 0

mode 0: Round-Robin

  • 첫번째로 가능한 슬레이브부터 마지막 슬레이브까지 순차적으로 전송함. 이 모드는 부하분산과 failover를 제공한다.
  • active-active, 이론상 슬레이브 수 만큼의 배수대로 대역폭 확장이 가능하다. 스위치에서 지원한다면 hashing 없이 로드 밸런싱이 가능
    • 예를 들어, 2개의 NIC가 장착 중이라면 2개의 NIC에 순차적으로 패킷을 분배한다.
    • A nic -> B nic -> A nic -> B nic 순으로 패킷을 분산하고 한쪽 네트워크의 연결이 끊어지더라도 장애 허용으로 인하여 이를 보완하는 기능이 존재한다.

mode 1

mode 1 : Active-Backup

  • bond에서 하나의 슬레이브만 활성화된다. 다른 슬레이브는 standby 상태로 대기하다 활성화된 슬레이브가 fail이 된 경우 standby 슬레이브가 활성화되며 fail된 슬레이브는 standby로 넘어가게 된다.
  • 대역폭의 경우 활성화된 슬레이브의 대역폭을 갖는다.
    • primary를 설정하지 않으면 failback이 되지 않음.
  • 실제 사용시에는 2개의 스위치나 백본에 2개의 NIC이 연결되며, IDC 같은 곳에서는 하나의 스위치에 2회선을 물려 사용하기도 한다.

mode 2

mode 2 : balance-xor (load balancing + failover)

  • mode 0과 비슷하지만 xor 연산을 사용하여 목적지 MAC과 근원지 MAC을 이용하여 분배함.
    • (출발지 mac XOR 목적지 mac) modula 슬레이브 개수
    • fault tolerance와 load balancing을 위한 XOR으로 설정

mode 3

mode 3 : broadcast (failover)

  • 모든 슬레이브 인터페이스로 전송
  • 하나의 슬레이브만큼 대역폭을 갖는다
  • 특별한 경우에서만 사용
    • 랜카드가 절대로 죽어서는 안되고 패킷이 절대로 손실되면 안되는 서버에서 사용함.
    • 스위치에서 Etherchannle이 지원되지 않아도 상관 없음.

mode 4

mode 4 / LACP : 802.3ad (Link Aggregation)

  • Dynamic Link Aggregation 정책으로 동작됨.
  • 동일한 speed와 duplex 설정을 공유하는 aggregation group을 스위치에서 생성해야 함.
    • 스위치에서 802.3ad를 지원해야 생성이 가능함.
  • 송/수신은 active aggregator 안에서 모든 슬레이브에서 수행됨.
  • 이론상 슬레이브 수 만큼의 배수대로 대역폭 확장 가능
  • 그룹화에 따라 회선 정책이 변경되며 무단절 네트워크 연결을 가능하게 만드는 방식임.

mode 5

mode 5 : balance-tlb

  • 스위치에서 Etherchannel이 지원되지 않아도 상관 없음.
  • 이 모드는 특별한 지원이 OS 자체적으로 구동 가능한 방법으로 각 링크의 현재 로드에 따라 보내는 데이터가 분산되어 전송됨.
  • 데이터의 수신은 슬레이브쪽으로만 가게되고, 해당 슬레이브가 fail시 다른 슬레이브가 MAC 주소를 넘겨받아 수신함.
  • 데이터를 보낼 때 드라이버가 MAC address를 링크의 것으로 바꿔 보내지만 수신 시에는 그냥 남겨둠.
  • 송신 패킷만 로드밸런싱하며 동일한 스위치에 NIC들이 연결되어 있어야 함.

mode 6

mode 6 : balance-alb

  • mode 4를 사용하고 싶으나 스위치가 802.3ad를 지원하지 않는 상황이라면 해당 모드(mode 6)를 사용하면 된다.
  • 스위치에서 Etherchannel이 지원되지 않아도 상관 없음.
  • 이 모드는 mode 5와 같이 동작하지만 데이터 수신 시 load-balancing 및 두 개의 링크에서 ARP negotiation을 통하여 동작함.
  • 송수신 패킷을 로드밸런싱하며 동일한 스위치에 NIC들이 연결되어 있어야 함.

본딩 실습

  • 이번 게시글에서는 mode 0(balance-rr)를 사용하지만 다른 모드를 사용하고 싶은 경우 모드만 바꿔서 참고하면 된다.

사전 준비

  • 최소 2개의 NIC(Network Interface Card)가 존재하는 Ubuntu 22.04 또는 Debian 계열 리눅스 서버
  • root 계정 또는 sudo 권한을 가진 사용자에 대한 액세스

bonding 구성도

image


패키지 설치

  • 본딩을 구성하기 위해서는 ifenslave, ethtool 패키지가 필요하다.

A. ifconfig 명령을 통하여 네트워크 인터페이스 확인

# net-tools가 설치되지 않은 경우 net-tools 설치 후 실행
sudo apt-get install -y net-tools

ifconfig -a

image
ens3, ens4, ens5 총 세 개의 네트워크 인터페이스가 확인된다. 해당 인터페이스들을 bond0로 구성할 것이다.


B. ifenslave, ethtool 패키지 설치

sudo apt-get install ifenslave ethtool

bonding 모듈 적재

A. lsmod 명령을 통하여 본딩 모듈이 적재 되었는지 확인하도록 하자.
(아무런 모듈이 출력되지 않는 경우 modprobe bonding 명령어를 통하여 본딩 모듈을 올려주어야 한다.)
모듈 적재 후 lsmod 명령을 통하여 bonding 모듈이 잘 적재되었는지 확인하자.

lsmod | grep -i "bonding"

# bonding 모듈이 적재 되지 않은 경우 아래 명령어 실행
modprobe bonding
lsmod | grep -i "bonding"

image


B. cat 명령어를 통하여 /etc/modules 파일을 수정하도록 하자.
하기와 같이 'bonding' 열을 삽입

sudo sh -c 'cat >> /etc/modules << EOF
bonding
EOF'

image


mode 0 (STATIC)

  • /etc/netplan 경로에 존재하는 YAML 파일의 이름은 사용자 환경에 따라 달라질 수 있습니다.

A. 하기와 같이 기존 인터페이스(ens3,ens4,ens5)의 DHCP 설정을 false로 변경하고 bonds 이하 내용들을 추가하도록 하자.
(해당 섹션에서는 bond0 를 STATIC로 설정하여 진행)

sudo sh -c 'cat >> /etc/netplan/00-installer-config.yaml << EOF
network:
  ethernets:
    ens3:
      dhcp4: false
    ens4:
      dhcp4: false
    ens5:
      dhcp4: false

  bonds:
    bond0:
      dhcp4: false
      interfaces: [ens3, ens4, ens5]
      addresses: [172.16.0.40/27]  # 여기에 사용할 IP 주소 및 서브넷 마스크를 입력하세요
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]  # 필요에 따라 DNS 서버 주소를 입력하세요
      parameters:
        mode: balance-rr # mode 0 채택
        mii-monitor-interval: 1 # 본딩 인터페이스의 링크 모니터링 간격
      routes:
        - to: default
          via: 172.16.0.33 # 네트워크 게이트웨이 IP 주소를 입력하세요

  version: 2
  renderer: networkd
EOF'

mode 0 (DHCP)

  • /etc/netplan 경로에 존재하는 YAML 파일의 이름은 사용자 환경에 따라 달라질 수 있습니다.

A. 하기와 같이 기존 인터페이스(ens3,ens4,ens5)의 DHCP 설정을 false로 변경하고 bonds 이하 내용들을 추가하도록 하자.
(해당 섹션에서는 bond0 를 DHCP로 설정하여 진행)

sudo sh -c 'cat > /etc/netplan/00-installer-config.yaml << EOF
network:
  ethernets:
    ens3:
      dhcp4: false
    ens4:
      dhcp4: false
    ens5:
      dhcp4: false
  version: 2
  renderer: networkd

  bonds:
    bond0:
      dhcp4: true
      interfaces: [ens3,ens4,ens5]
      parameters:
        mode: balance-rr # mode 0 채택
        mii-monitor-interval: 1 # 본딩 인터페이스의 링크 모니터링 간격
EOF'

B. netplan apply 명령어로 변경사항을 적용하자.

sudo netplan apply

bond 적용 확인

A. ifconfig -a 명령으로 bond0 인터페이스가 생성된 것을 확인해보자.

ifconfig -a | grep -A6 -i "^bond"

image


A-a. ethtool bond0 명령을 통해 bond0 인터페이스의 정보를 확인해볼 수 있다.

ethtool bond0

image


A-b. 추가적으로 하기의 명령을 통해서도 본딩 상태를 확인할 수 있다.

cat /proc/net/bonding/bond0

image


bonding mode 종류

  • 본딩 모드는 여러가지가 있지만 대표적으로는 mode 0과 mode 1을 가장 많이 사용한다.
  • 현업에서는 mode 1: active-backup 방식을 가장 많이 사용한다고 함.
MODE NAME
mode=0 balance-rr
mode=1 active-backup
mode=2 balance-xor
mode=3 broadcast
mode=4 802.3ad
mode=5 balance-tlb
mode=6 balance-alb

Loading script...