1. RHEL 9 서버 신규 구축 시 네트워크 본딩 구성 방법 (active-backup 구성)
안녕하세요 오늘은 **RHEL 9 서버를 새로 구축하면서 네트워크 본딩(Network Bonding)**을 설정했던 과정을 공유해보려고 합니다. 서버에 네트워크 카드가 2장이 장착되어 있고, 이를 하나의 논리적 인터페이스로 묶어 고가용성과 이중화를 구성하는 게 목표였습니다.
특히 저는 active-backup 모드를 사용하면서 primary_reselect=failure 옵션을 설정해, 장애 복구 시 불필요한 네트워크 스위칭을 방지하고 싶었습니다. 그 과정과 설정 방법을 단계별로 정리해볼게요.
네트워크 본딩은 두 개 이상의 물리적 네트워크 인터페이스를 하나의 논리적 인터페이스로 묶어주는 기술입니다. 이를 통해 다음과 같은 장점을 얻을 수 있습니다:
고가용성(High Availability): 한 쪽 네트워크에 장애가 나도 다른 쪽으로 자동 전환
- 로드 밸런싱: 트래픽을 여러 인터페이스에 분산
- 대역폭 증가: 물리적 인터페이스의 대역폭을 합산
저는 이번 구축에서 고가용성 목적으로 본딩을 설정했습니다.
2. 본딩 모드 종류
본딩에는 여러 가지 모드가 있으며, 각각의 특징과 동작 방식이 다릅니다. 아래 표로 정리해봤습니다.
모드 번호 | 모드 이름 | 설명 |
0 | balance-rr | 라운드 로빈 방식. 모든 인터페이스에 순차적으로 트래픽 전송. |
1 | active-backup | 하나의 인터페이스 active. 장애 시 backup으로 전환. |
2 | balance-xor | 송수신 해시 기반으로 트래픽 분산. |
3 | broadcast | 모든 인터페이스에 동일한 패킷 전송. |
4 | 802.3ad (LACP) | IEEE 802.3ad (LACP) 기반 링크 집계. 스위치 설정 필요. |
5 | balance-tlb | 송신 부하 분산. 수신은 단일 인터페이스로 수신. |
6 | balance-alb | 송수신 모두 부하 분산. |
참고: 일반적으로 스위치 설정 없이 고가용성을 원할 땐 **mode=1 (active-backup)**을 많이 사용합니다.
3. ethtool로 인터페이스 확인
본딩 설정 전에 어떤 인터페이스를 사용할지 정확히 확인해야 합니다. 저는 ethtool 명령어를 사용했습니다.
ethtool eno1
ethtool ensfo1
출력 결과에서 Link detected: yes로 연결 여부를 확인하고, 속도(Speed), 드라이버 정보도 함께 확인했습니다. 이 과정으로 실제 연결된 인터페이스와 속성을 파악할 수 있습니다.
4. primary 인터페이 + primary_reselect 옵션 설정
active-backup 모드에서는 기본적으로 primary_reselect=always 옵션이 적용됩니다. 이 옵션은 primary 인터페이스가 복구되면 무조건 active로 다시 전환되도록 만듭니다.
지만 저는 이렇게 설정하면 복구 시 네트워크 스위칭 과정에서 ping 유실, 순간적 연결 끊김 현상이 발생한다는 문제를 발견했습니다. 이를 방지하기 위해 다음과 같은 설정을 원했습니다:
- eno1: primary (초기 active)
- ensfo1: backup
- eno1 장애 시 → ensfo1 active
- eno1 복구해도 active는 ensfo1 유지
- 이후 ensfo1 장애 시 → eno1로 active 전환
이렇게 하려면 primary_reselect=failure 옵션을 설정해야 합니다.
primary_reselect 옵션 종류 참고로 primary_reselect에는 아래와 같은 값이 있습니다:
옵션 이름 | 설명 |
always | primary가 복구되면 무조건 primary로 active 전환 (기본값) |
better | primary가 복구되고 성능(링크 속도, duplex 등)이 더 좋으면 active 전환 |
failure | primary가 장애 상태였다가 복구될 때만 active 전환 |
저는 failure로 설정하여 불필요한 active 전환을 방지했습니다.
5. nmcli를 이용한 본딩 설정
이제 실제로 nmcli를 이용해 본딩을 설정한 과정을 정리해볼게요.
① 본딩 인터페이스 생성
nmcli connection add type bond con-name bond0 ifname bond0 mode active-backup
bond0이라는 이름으로 본딩 인터페이스를 생성하고, active-backup 모드를 지정했습니다.
② primary, primary_reselect 옵션 지정 `nmcli connection modify bond0 bond.options “primary=eno1 primary_reselect=failure”
이 명령어로 eno1을 primary로 지정하고, primary_reselect=failure를 적용했습니다.
③ IP 주소 설정
nmcli connection modify bond0 ipv4.addresses 192.168.1.100/24
nmcli connection modify bond0 ipv4.gateway 192.168.1.1
nmcli connection modify bond0 ipv4.method manual
IP 주소와 게이트웨이를 수동으로 설정했습니다.
④ 슬레이브 인터페이스 추가
nmcli connection add type ethernet con-name eno1-slave ifname eno1 master bond0
nmcli connection add type ethernet con-name ensfo1-slave ifname ensfo1 master bond0
본딩에 eno1, ensfo1을 슬레이브 인터페이스로 추가합니다.
⑤ 연결 활성화
nmcli connection up eno1-slave
nmcli connection up ensfo1-slave
nmcli connection up bond0
모든 연결을 활성화하여 설정을 적용했습니다.
6. 설정 확인
설정 완료 후 본딩 상태는 아래 명령어로 확인했습니다:
cat /proc/net/bonding/bond0
여기서 현재 active 인터페이스, primary 설정 등을 확인할 수 있습니다.
7. 장애 테스트
설정 테스트를 위해 ethtool로 링크 다운 시뮬레이션을 했습니다:
ethtool -s eno1 down
→ eno1 장애 발생 → ensfo1로 active 전환
ethtool -s eno1 up
→ eno1 복구 → active는 여전히 ensfo1 유지
이렇게 설정하면 불필요한 네트워크 스위칭 없이 안정적으로 failover 동작을 구현할 수 있었습니다.
마치며
이번 구축 과정에서 느낀 점은, 본딩은 단순히 인터페이스를 묶는 것 이상으로 장애 상황 시 네트워크 동작 방식을 어떻게 정의할지에 대한 고민이 필요하다는 점입니다. primary_reselect 같은 세부 옵션 하나로도 실제 장애 대응 방식이 크게 달라질 수 있더라고요