목차/10. 링크 집계 (Link Aggregation)

10링크 집계 (Link Aggregation)Working with Link Aggregation

링크 집계는 인터페이스 본딩(bonding) 이라고도 부르며, 여러 개의 물리 인터페이스를 하나의 가상 인터페이스(bond)로 묶는 기술입니다. 이렇게 묶으면 인터페이스나 링크 장애에 대비한 이중화를 얻거나, 한 물리 인터페이스로는 불가능한 수준으로 처리량을 끌어올릴 수 있습니다.

용어를 먼저 정리하면, bond는 하나의 가상 인터페이스처럼 함께 동작하면서 IP와 MAC을 공유하는 물리 인터페이스 묶음이고 클러스터에서 bond0 같은 Bond ID로 식별됩니다. 그 묶음을 논리적으로 표현한 것이 bond 인터페이스이고, 묶음에 속한 각 물리 인터페이스를 종속 인터페이스(subordinate interface) 라 부르는데 종속 인터페이스는 자기 IP가 없고 경우에 따라 같은 MAC을 공유합니다. 하나의 bond에는 종속 인터페이스를 최소 1개에서 최대 8개까지 넣을 수 있으며, 클러스터 멤버마다 동일한 종속 인터페이스를 같은 수로 두는 것이 권장됩니다.

① 스위치 ② bond 0 ③ 클러스터
① 스위치 ② bond 0 ③ 클러스터

본딩에는 두 가지 전략이 있습니다. High Availability(Active/Backup) 는 인터페이스나 링크가 죽었을 때 이중화를 보장하며 스위치 이중화까지 제공합니다. 반면 Load Sharing(Active/Active) 은 모든 인터페이스가 동시에 활성 상태로 서로 다른 연결을 처리해 처리량을 극대화하는데, 스위치 이중화는 지원하지 않습니다.

High Availability 본딩

클러스터는 그 자체로 VSX Gateway 수준의 이중화를 제공하지만, 링크 집계는 여기에 같은 게이트웨이 안의 예비 인터페이스 카드로 자동 페일오버하는 인터페이스·스위치 이중화를 더합니다. HA 본딩에서는 한 번에 하나의 인터페이스만 활성이며, 활성 인터페이스가 감시 중인 인터페이스에서 링크 장애를 감지하거나 ClusterXL이 CCP(Cluster Control Protocol) keep-alive 패킷의 송수신 실패를 감지하면 예비 종속 인터페이스로 페일오버합니다. 이 모드를 ClusterXL과 함께 풀 메시(fully meshed) 토폴로지로 배포하면 NIC와 스위치 양쪽에 독립적인 백업을 두는 세밀한 이중화를 얻습니다.

① 스위치 1 ② 스위치 2 ③ 네트워크 연결 1 ④ 네트워크 연결 4 ⑤ 네트워크 연결 2 ⑥ 네트워크 연결 3 ⑦ VSX Cluster Member 1 ⑧ VSX Cluster Member 2
① 스위치 1 ② 스위치 2 ③ 네트워크 연결 1 ④ 네트워크 연결 4 ⑤ 네트워크 연결 2 ⑥ 네트워크 연결 3 ⑦ VSX Cluster Member 1 ⑧ VSX Cluster Member 2

설정은 VSX Gateway(VS0) 컨텍스트에서 CLI로 하며, 클러스터라면 각 멤버에서 실행합니다. HA를 위해서는 mode 파라미터에 active-backup 값을 씁니다. 큰 흐름은 본딩 그룹을 만들고, 거기에 종속 인터페이스를 넣고(이때 그 인터페이스들이 다른 설정에 쓰이지 않고 IP도 배정돼 있지 않아야 합니다), 본드가 제대로 구성됐는지 확인한 뒤, SmartConsole에서 클러스터 객체를 설정하는 것입니다. 정확한 명령은 R82 Gaia Administration Guide를 참고합니다.

기존 구성을 본딩으로 바꿀 때는 새로 만든 bond에 연결되도록 Virtual System·Virtual Router·Virtual Switch 객체의 토폴로지를 다시 잡아야 합니다. 객체가 적으면 SmartConsole에서 직접 하면 되지만, Domain과 가상 장치가 많은 대규모 배포에서는 관리 서버에서 vsx_util change_interfaces 명령을 쓰는 편이 훨씬 빠릅니다. 예컨대 200개 Domain에 가상 장치가 잔뜩 있는 MDS 환경이라면 이 명령이 모든 해당 객체의 인터페이스를 새 bond로 자동 교체해 줍니다. 다만 MDS에서는 이 작업이 성공하려면 모든 Domain Management Server의 잠금이 풀려 있어야 하므로, 모든 SmartConsole 클라이언트를 먼저 닫아야 합니다.

Load Sharing 본딩

Load Sharing은 인터페이스 이중화에 더해 여러 종속 인터페이스로 트래픽을 분산합니다. 모든 인터페이스가 항상 활성이고, 트래픽은 IEEE 802.3ad 또는 XOR 표준에 따라 분배됩니다. 개별 연결마다 특정 종속 인터페이스가 지정되어 그 연결은 지정된 인터페이스로만 처리되며, 그 인터페이스가 죽으면 트래픽이 다른 인터페이스로 넘어가되 그 인터페이스도 기존 트래픽을 계속 처리합니다.

Load Sharing 모드는 세 가지입니다. Round Robin은 활성 종속 인터페이스를 순서대로 선택하고, 802.3ad는 LACP 프로토콜로 게이트웨이와 스위치 간 링크를 완전히 감시하면서 활성 인터페이스를 동적으로 활용하며, XOR은 UP 상태의 모든 종속 인터페이스를 활성으로 두고 전송 해시 정책(L2의 MAC XOR 또는 L3+4의 IP·포트)에 따라 트래픽을 배정합니다. 설정 흐름은 HA와 비슷하되, 본딩 그룹과 종속 인터페이스를 더한 뒤 임계(critical) 인터페이스 수를 정의하고 Performance Pack을 쓰면 코어 어피니티를 설정하는 단계가 추가됩니다.

여기서 임계 필수 인터페이스(Critical Required Interfaces) 개념이 중요합니다(ClusterXL에서만 지원). Load Sharing 본드는 살아 있는 종속 인터페이스 수가 임계 최솟값 아래로 떨어지면 다운으로 간주됩니다. 명시하지 않으면 n개 인터페이스 본드의 임계 최솟값은 n-1이라, 인터페이스 두 개만 더 죽어도(n-2가 남으면) 본드 전체가 다운으로 처리됩니다. 더 적은 인터페이스로도 트래픽을 감당할 수 있다면 임계값을 직접 정의해 이중화를 높일 수 있는데, 최대 예상 트래픽 속도를 종속 인터페이스 속도로 나눠 올림한 값이 적절합니다. 이 값은 $FWDIR/conf/cpha_bond_ls_config.conf 파일에 <본드명> <임계 최솟값> 형식으로 적습니다.

# $FWDIR/conf/cpha_bond_ls_config.conf 예시
bond0 5      # 종속 7개 중 3개가 죽으면 다운
bond1 3      # 종속 6개 중 4개가 죽으면 다운

최적 성능을 위해서는 종속 인터페이스를 CPU 코어에 정적으로 고정(affinity) 하는 것이 좋습니다. 가능하면 인터페이스마다 코어 하나를 전담시키되, 물리 인터페이스가 코어보다 많으면 일부 코어가 둘 이상을 맡습니다. 이때 내부 본드와 외부 본드에서 같은 위치에 있는 종속 인터페이스를 한 쌍으로 묶어 같은 코어가 처리하게 하는 것이 요령입니다. 본드 내 종속 인터페이스의 순서는 cat /proc/net/bonding/<본드명>으로 확인할 수 있고, 두 본드에서 같은 위치에 나타나는 인터페이스가 짝입니다.

페일오버는 어떻게 일어나는가

본드 페일오버는 두 경우에 일어납니다. 활성 인터페이스가 감시 중인 다른 인터페이스의 링크 장애를 감지하거나, ClusterXL이 CCP keep-alive 패킷 송수신 실패를 감지하는 경우입니다. 상황에 따라 본드 안의 다른 종속 인터페이스로 넘어가거나 클러스터 멤버 간 페일오버가 일어납니다(이 동작에는 MII 표준을 지원하는 NIC가 필요합니다).

링크 상태로 시작되는 페일오버는 이렇게 진행됩니다. 활성 종속 인터페이스가 다운 링크를 감지하면 본드가 예비 인터페이스로 넘기는데, 이는 본드 내부의 페일오버라 다른 멤버 상태에는 영향이 없습니다. 다만 살아 있는 종속 인터페이스 수가 임계 최솟값 아래로 떨어지면 그때 다른 클러스터 멤버로 페일오버하고, 예비 인터페이스마저 계속 링크 장애를 보이면 멤버 간 페일오버가 일어납니다. CCP로 시작되는 페일오버는 다른 멤버가 죽지 않았을 때만 일어나는데, ClusterXL이 CCP 패킷 문제를 감지해 내부 본드 페일오버를 한 뒤, 3분 안에 추가 문제가 감지되면 다른 멤버로 페일오버합니다.

VLAN에 대해서도 페일오버가 지원됩니다. ClusterXL은 VLAN ID의 연결 실패나 통신 오류를 감시해 필요할 때 페일오버하는데, 기본적으로는 가장 높은 VLAN ID와 가장 낮은 VLAN ID만 감시합니다. 대부분의 배포에서는 트래픽 부담이 가벼워 이 설정이 바람직하지만, 이 경우 최고·최저 VLAN ID에 대한 스위치 설정 문제만 감지된다는 한계가 있습니다. 필요하면 모든 VLAN을 감시하도록 설정할 수 있습니다.

① 클러스터 ② bond 0 ③ VLAN 1 ④ VLAN 2 ⑤ VLAN 3 ⑥ S-1 ⑦ S-2
① 클러스터 ② bond 0 ③ VLAN 1 ④ VLAN 2 ⑤ VLAN 3 ⑥ S-1 ⑦ S-2

Cisco 스위치 설정

Load Sharing 모드를 쓰려면 스위치 쪽도 맞춰야 합니다. 아래는 Cisco 스위치 예시이며(정확한 명령은 모델·OS 버전별 Cisco 문서 참고), 802.3ad(LACP)와 XOR의 차이는 채널 그룹 모드가 activeon이냐입니다.

# 802.3ad (LACP)
Switch(config)# port-channel load-balance src-dst-ip
Switch(config-if)# channel-group 1 mode active
Switch(config-if)# channel-protocol lacp

# XOR
Switch(config)# port-channel load-balance src-dst-ip
Switch(config-if)# channel-group 1 mode on

문제 해결

본드에 문제가 의심되면 Expert 모드에서 cat /proc/net/bonding/<bond id>로 상태를 봅니다. 문제가 있으면 물리 링크가 죽었는지 확인하는데, Gaia Clish에서는 show cluster bond name <본드명>, Expert 모드에서는 cphaprob show_bond <본드명>으로 링크 상태가 no인 종속 인터페이스를 찾아 케이블·하드웨어·스위치 포트 설정을 점검합니다. 클러스터 멤버가 죽었는지는 show cluster state(Clish)나 cphaprob state(Expert)로 확인하고, Active가 아닌 멤버가 있으면 R82 ClusterXL Administration Guide를 참고합니다.

운영상 기억할 점은, 본드 모드를 바꾸거나 종속 인터페이스를 본드에 추가하면 멤버 재부팅이 필요하다는 것입니다(반대로 종속 인터페이스를 제거할 때는 재부팅이 필요 없습니다). 모든 본드 상태 변화와 페일오버는 Logs & Events에 기록됩니다.

cat /proc/net/bonding/<bond id>     # 본드 상태
cphaprob show_bond <bond_name>      # 종속 인터페이스 링크 상태 (Expert)
cphaprob state                      # 클러스터 멤버 상태 (Expert)

마지막으로 스위치 쪽 주의가 하나 있습니다. 일부 스위치에서는 내부 본드 페일오버 시 연결 지연이 생기는데, 해당 인터페이스의 auto-negotiation을 끄거나 일부 Cisco 스위치에서 PortFast를 켜면 시작 시간을 줄일 수 있습니다. 다만 PortFast는 다른 스위치나 허브로 연결되는 포트에는 절대 쓰면 안 됩니다. 그런 경우 STP 초기화가 완료되어야 하는데, PortFast를 쓰면 물리 루프가 생겨 패킷이 계속 돌거나 증식해 결국 네트워크가 마비될 수 있기 때문입니다(본드가 스위치에서 Trunk로 설정된 경우엔 PortFast가 적용되지 않습니다).