[Redundancy] 11. 네트워크 다중화
카테고리: REDUNDANCY
태그: redundancy linux
11-1. 장애 포인트
(1)~(3)은 서버와 스위치 간 접속에 장애가 발생하는 것으로 해당 게시글에서는 『링크 장애』, 스위치 끼리 연결하는 스위치 간 접속에도 (1), (3) 고장은 『스위치 간 접속 장애』, 네트워크 스위치의 고장은 『스위치 장애』라고 하기로 한다.
| 구분 | 장애 포인트 |
|---|---|
| (1) | LAN 케이블 |
| (2) | NIC |
| (3) | 네트워크 스위치 포트 |
| (4) | 네트워크 스위치 |
11-2. 링크 다중화
링크 장애를 회피하기 위해서는 서버와 스위치의 접속을 다중화해야 한다. 즉, 서버의 NIC를 여러개 준비하고 LAN 케이블도 같은 수만큼 연결한다. 그러나, 단순히 여러 NIC를 사용하면 각 NIC에 다른 IP 주소를 할당해야 하며, 이로 인해 통신할 때 마다 어떤 NIC를 사용할지를 결정하며, 그에 따라 송신 주소를 전환해야 한다. 이는 매운 불편한 일이며, 이를 해결하기 위한 구조로 리눅스에는 『Bonding 드라이브』가 마련되어 있다.
■ Bonding 드라이버
-
Bonding 드라이버는 여러 물리적인 NIC를 하나의 논리적인 NIC로 다룰 수 있도록 합니다.
-
이 “논리 NIC”는 주소 할당 및 다양한 기능(IP 엘리어스, VLAN, 브릿지 기능 등)의 대상 NIC로서 사용이 가능합니다.
-
Bonding 드라이버가 여러 개 존재하는 물리 NIC 중에서 통신에 사용할 것을 섵내하는 방법은 다음과 같다.
모드명 동작 balance-rr 송신할 패킷마다 사용할 물리 NIC를 전환(라운드로빈) active-backup 첫 번째 물리 NIC가 사용가능한 동안에는 그 NIC만 사용, 해당 NIC가 고장나면 다른 NIC를 사용 balance-xor 송신처와 목적지 MAC 주소를 XOR해서 사용할 물리 NIC를 결정 broadcast 송신 패킷을 복사해서 모든 물리 NIC에 대해 동일한 패킷을 전송 802.3ad IEEE 802.3ad 프로토콜을 사용해서 스위치와의 사이에서 동적으로 aggregation을 작성 balance-tlb 물리 NIC 중에 가장 부하가 낮은 물리 NIC를 선택해서 송신, 수신은 특정 물리 NIC를 사용해 수신함 balance-alb 송수신 모두 부하가 낮은 물리 NIC를 사용 -
Bonding 드라이버의 물리 NIC의 고장을 검출하는 방법은 『MII(Media Independent Interface) 감시』와 『ARP(Address Resolutin Protocol) 감시』를 선택할 수 있다.
감시 종류 설명 MII 감시 MII 감시는 물리 NIC가 링크 다운되면 고장 난 것으로 간주하는 것으로 저비용에 단시간에 고장여부를 체크할 수 있지만, 반면 NIC가 링크 업임에도 통신할 수 없는 상황에는 대응할 수 없다. ARP 감시 ARP 감시는 ARP 요청을 지정된 머신에 대해 송신해서 응답이 오는지 시험해서 판정하는 것으로 실제 통신해서 확인하므로 고장을 간과할 가능성은 낮은 반면, 확실하게 응답을 보내는 대상에 대해 ARP 요청을 송신하지 않으면 잘못된 진단으로 이어지게 된다. 잘못된 진단을 할 가능성을 낮추기 위해 Bonding 드라이버에서는 ARP를 보내는 장비로 여러 대(최대 16)의 주소를 등록할 수 있다.
■ Bonding 드라이버 설정 (CentOS Stream 8 기준)
# 네트워크 장치 표시
[root@dlp ~]# nmcli device
DEVICE TYPE STATE CONNECTION
enp1s0 ethernet connected enp1s0
enp7s0 ethernet disconnected --
lo loopback unmanaged --
# 기존 네트워크 연결 삭제
[root@dlp ~]# nmcli connection delete enp1s0
Connection 'enp1s0' (c0ab6b8c-0eac-a1b4-1c47-efe4b2d1191f) successfully deleted.
[root@dlp ~]# nmcli device
DEVICE TYPE STATE CONNECTION
enp1s0 ethernet disconnected --
enp7s0 ethernet disconnected --
lo loopback unmanaged --
# 새로운 본딩 장치 [bond0] (원하는 이름 사용 가능) 추가
# 각 모드에 대한 설명은 위 설명 참조 (모드 번호로 지정해도 괜찮음)
[root@dlp ~]# nmcli connection add type bond ifname bond0 con-name bond0 bond.options "mode=balance-rr"
Connection 'bond0' (065773f8-2d6e-4718-88c3-1c4ef2fab8a5) successfully added.
# 본딩 장치에 멤버 장치 추가
[root@dlp ~]# nmcli connection add type ethernet ifname enp1s0 master bond0
Connection 'bond-slave-enp1s0' (f0c5a801-3d3f-431e-a31b-2f296f0ac46f) successfully added.
[root@dlp ~]# nmcli connection add type ethernet ifname enp7s0 master bond0
Connection 'bond-slave-enp7s0' (6368b4fd-8b05-4d2a-978e-58796cf32e16) successfully added.
[root@dlp ~]# nmcli device
DEVICE TYPE STATE CONNECTION
bond0 bond connected bond0
enp1s0 ethernet connected bond-slave-enp1s0
enp7s0 ethernet connected bond-slave-enp7s0
lo loopback unmanaged --
[root@dlp ~]# nmcli connection
NAME UUID TYPE DEVICE
bond0 065773f8-2d6e-4718-88c3-1c4ef2fab8a5 bond bond0
bond-slave-enp1s0 f0c5a801-3d3f-431e-a31b-2f296f0ac46f ethernet enp1s0
bond-slave-enp7s0 6368b4fd-8b05-4d2a-978e-58796cf32e16 ethernet enp7s0
# 본딩 장치에 IP 주소 및 기타 설정을 설정하고 재시작
# IP 주소
[root@dlp ~]# nmcli connection modify bond0 ipv4.addresses 192.168.219.30/24
# 게이트웨이
[root@dlp ~]# nmcli connection modify bond0 ipv4.gateway 192.168.219.2
# DNS - 여러 DNS 서버를 설정하는 경우 공백으로 구분
[root@dlp ~]# nmcli connection modify bond0 ipv4.dns "10.0.0.10 10.0.0.11"
# DNS 검색 베이스 - 여러 도메인을 설정하는 경우 공백으로 구분
[root@dlp ~]# nmcli connection modify bond0 ipv4.dns-search "srv.world"
[root@dlp ~]# nmcli connection modify bond0 ipv4.method manual
[root@dlp ~]# nmcli connection down bond0 && nmcli connection up bond0
Connection 'bond0' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
# 본딩 상태 확인
[root@dlp ~]# 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
Peer Notification Delay (ms): 0
Slave Interface: enp1s0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: 52:54:00:65:52:ca
Slave queue ID: 0
Slave Interface: enp7s0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: 52:54:00:ff:86:42
Slave queue ID: 0
[root@dlp ~]# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UP group default qlen 1000
link/ether 52:54:00:65:52:ca brd ff:ff:ff:ff:ff:ff
3: enp7s0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UP group default qlen 1000
link/ether 52:54:00:65:52:ca brd ff:ff:ff:ff:ff:ff permaddr 52:54:00:ff:86:42
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:65:52:ca brd ff:ff:ff:ff:ff:ff
inet 10.0.0.30/24 brd 10.0.0.255 scope global noprefixroute bond0
valid_lft forever preferred_lft forever
inet6 fe80::1ca1:2d40:b983:545b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 구성 파일은 해당 위치에 저장됨
[root@dlp ~]# ll /etc/sysconfig/network-scripts
total 12
-rw-r--r--. 1 root root 415 Dec 8 14:56 ifcfg-bond0
-rw-r--r--. 1 root root 127 Dec 8 14:48 ifcfg-bond-slave-enp1s0
-rw-r--r--. 1 root root 127 Dec 8 14:48 ifcfg-bond-slave-enp7s0
11-3. 스위치 다중화
스위치와 링크를 이중화한 구성은 다음과 같으며, 각 머신에서는 각각 하나씩 다른 스위치에 링크가 연결되어 있다. 이러한 링크는 Bonding 드라이버의 하위에 있다 게다가 두 대의 스위치 사이에는 스위치 간 접속 LS1-2를 준비한다.
■ 링크 장애시의 동작
ⓑ의 상황(스위치 간 접속 LS1-2가 없는 경우)일 때, Server1에서 Server2로의 패킷은 L1-1을 사용할 수 없으므로 L1-2로 전송되어 문제가 없지만, 반대로 Server2에서 Server1을 향하는 패킷이 L2-1에서 전송될 경우는 Server1로 도달 할 수 없기 때문에 이 패킷을 Switch2로 전송하기 위해서 스위치 간 접속 LS1-2가 필요하다.
■ 스위치 장애시의 동작
Switch1에 장애가 발생하면 Bonding 드라이버가 Switch1로의 링크는 사용할 수 없다고 판단하여 모든 서버는 Switch1에 접속된 링크를 사용하지 않고 Switch2로의 링크를 사용하게 되므로 통신은 정상적으로 수행된다.
■ 스위치 간 접속 장애시의 동작
LS1-2의 장애 대책으로는 서버와 스위치 사이의 접속과 마찬가지로, 여러 접속을 준비해서 묶음으로써 다중화 하는 것이다. 스위치 간 접속을 묶을 방법으로는 스위치 제작업체의 독자적인 규격을 사용하는 방법과 IEEE의 802.3ad를 사용하는 방법이 있다. (이것을 포트 트렁킹(Port Trunking) 또는 링크 집합(Link Aggregation)이라고 한다.)
11-4. 스위치 증설
■ 구성 - 1
해당 구성의 경우, Bonding 드라이버의 NIC 감시방법을 MII으로 설정하면 Switch1/2에서 장애가 발생하면 Switch3/4가 고립되어 Switch3/4에서 Server1/2으로 향하는 경로가 없어서 통신할 수 없다.
이를 피하기 위해서는 Switch1/2에 연결된 Server1/2 뿐만 아니라 Server3/4도 Switch3/4으로의 링크를 장애로 다루도록 해야하는데 이것은 Server3/4에 있어서 물리 NIC의 장애 검출방법으로 ARP 감시를 선택해서 감시대상으로 Server1/2를 지정하면 실현할 수 있다.
ARP 감시를 설절한 이후 Switch1에 장애가 나면 L3-3이나 L4-3에서 ARP 요청을 전송해도 응답이 오지 않으므로 이 링크들은 장애가 난것으로 처리할 수 있게 된다.
■ 구성 - 2
위와 같이 Switch3/4 사이에 LS3-4를 설정해두면, Bonding 드라이버의 ARP 감시에 의존하지 않고도 통신이 멈출 일은 없을 것 같지만 문제가 발생하게 된다. Switch1~4가 모두 상호 연결돼 있어 루프가 형성되어 있음을 알 수 있고, 이더넷에서는 이와 같은 루프가 생기면 “브로드캐스트 스톰(브로드캐스트 패킷이 루프가 생긴 네트워크 내부를 무한히 돌아다니는 상태)”이 발생한다.
평소의 Switch3/4는 LS3-4를 무시하고 있다가 Switch1이나 LS1-3에 장애가 발생한 경우에만 LS3-4를 사용하도록 하면, 브로드캐스트 스톰은 발생하지 않고 경로를 확보할 수 있는데 이를 실현한 것으로는 STP(Spanning Tree Protocol)이 있다.
10-5. RSTP(Rapid Spanning Tree Protocol)
네트워크 토폴로지의 생긴 루프를 검출하고 다중화된 연결을 자동으로 차단하기 위한 프로토콜으로 어떤 연결을 차단할지는 각 스위치에 설정된 우선순위나 스위치 간 접속의 링크 속도 등을 기반으로 결졍된다.
RSTP에서는 스위치 상호 간에 BPDU패킷을 교환함으로써 우선순위 정보 등의 교환과 장애검출을 수행하고, BPDU 패킷이 끊기거나 스위치 간 접속이 다운되면 스위치는 장애가 발생한 것으로 판단해서 대체경로를 찾아서 이용한다.
■ 우선순위 결정
| 순위 | 우선순위 결정 |
|---|---|
| 1 | 루트 브리지라고 인식되고 있는 브리지의 브리지ID |
| 2 | 루트 브리지로의 경로 비용 |
| 3 | 브리지의 브리지ID |
| 4 | 상대 브리지가 BPDU를 송신한 포트의 포트ID |
| 5 | 루트 브리지라고 인식되고 있는 브리지의 브리지ID |
| 용어 | 설명 |
|---|---|
| 루트 브리지 | STP를 수행할 때 기준이 되는 브리지 |
| 브리지ID | 네트워크의 각 브리지에 할당되는 고유한 식별자 ㆍ브리지ID는 네트워크의 루트 브리지를 결정하고 각 브리지와 루트 브리지 사이의 최단 경로를 계산하는데 사용 ㆍ브리지ID의 값은 8바이트이고 상위 2바이트는 우선순위 값, 하위 6바이트는 MAC 주소 두 부분으로 구성됨 |
| 경로비용 | 루트 브리지로 도달하는데 경유하는 각 연결에 설정된 경로 비용을 합산한 것 ㆍ각 연결의 경로 비용은 해당 연결의 링크 속도에 따라 결정되는 값 ㆍ작을수록 우선도가 높다 결국, 루트 브리지로 선택되는 것은 가장 작은 우선순위 값이 설정된 것이 됨 |
| 포트 ID | 브리지 포트마다 부여된 고유한 ID ㆍ번호가 낮을수록 우선순위가 높아짐 |
■ 포트 역할
| 포트 | 설명 |
|---|---|
| 루트 포트(Root Port) | 루트 브리지로의 최단 경로 포트, 브리지 당 하나의 루트 포트를 선출 |
| 지정 포트(Designated Port) | 브리지 or 스위치 간에 서로 연결된 링크 ㆍRoot/Blocking 포트도 아닌 포트, 데이터와 BPDU 프레임을 전송하는 포워딩 포트라고도 한다. ㆍ각 세그먼트(장비와 장비가 연결된 구간) 마다 하나의 지정 포트를 선출 |
| 대체 포트(Alternate Port) | 루트 포트 이외에 상위 브리지에 연결되어 있는 포트 ㆍ이 포트에서는 BPDU 이외의 패킷을 차단 ㆍ루트 포트가 특정 이유로 사용할 수 없게 되면 대체 포트가 사용됨 ㆍ지정 포트는 하나의 세그먼트에는 반드시 하나의 지정 포트가 있어야 한다 남은 세그먼테에서 지정 포트 선출하고 남은 하나의 포트가 블로킹(or 대체) 포트가 된다. |
■ STP 선정 과정
| 과정 | 설명 |
|---|---|
| 1 | 브로드캐스트 도메인에서 Root Bridge를 선정 (브리지ID가 가장 작은 스위치) |
| 2 | Root Bridge가 아닌 포트에서 각 Non-Root Bridge 마다 다음 조건에 따라 하나의 Root Port를 선출함 ㆍPath Cost이 가장 낮은 포트 ㆍ연결된 상대방의 Bridge ID가 가장 낮은 포트 ㆍ연결된 상대방의 Port ID가 가장 낲은 포트 |
| 3 | 각 세그먼트마다 다음 조건에 따라 하나의 Degignated Port를 선출함 ㆍRoot Bridge의 모든 포트 ㆍSwitch 자체의 Path Cost가 가장 낮은 Switch의 포트 ㆍ자신의 Bridge ID가 가장 낮은 Switch의 포트 ㆍ자신의 Port ID가 가장 낮은 Switch의 포트 |
| 4 | 역할을 부여받지 못한 포트는 논리적으로 Blocking 상태(Blocking Port)가 되어 Loop를 방지할 수 있다. |
댓글 남기기