이 기사에서는 회사 LAN에서 인터넷에 액세스하기 위해 두 대의 오징어(Linux) 프록시 서버의 고가용성 장애 조치 구성을 고려할 것입니다. 장애 조치 구성을 구축하기 위해 keepalived를 사용하여 HA 클러스터를 만들 것입니다. .
HA 클러스터는 그룹에 있는 서버의 하드웨어 또는 소프트웨어 문제가 발생할 경우 앱 다운타임을 최소화하기 위해 내장된 중복성을 가진 서버 그룹입니다. 이 정의에 따르면 HA 클러스터의 올바른 작동을 위해 다음을 구현해야 합니다.
- 서버 상태 확인
- 서버 장애 시 리소스 자동 전환
Keepalived는 이 두 가지를 모두 활성화합니다. 보존 서비스 장애 조치 및 로드 밸런싱을 가능하게 하는 Linux 시스템의 시스템 데몬입니다. 주 서버가 실패할 경우 다른 서버로 전환되는 유동 IP 주소에 의해 장애 조치가 제공됩니다. 서버 간에 IP 주소를 자동으로 전환하기 위해 keepalive는 VRRP를 사용합니다. (가상 라우터 중복 프로토콜 – https://www.ietf.org/rfc/rfc2338.txt).
VRRP의 원칙
우선 몇 가지 이론과 주요 VRRP 정의를 살펴보겠습니다.
- VIP — 가상 IP, 오류 발생 시 서버 간에 자동으로 전환할 수 있는 가상 IP 주소
- 마스터 — VIP가 현재 활성화된 서버
- 백업 — 마스터 장애가 발생한 경우 VIP가 전환할 서버
- VRID — 가상 IP(VIP)를 공유하는 서버가 소위 가상 라우터를 형성하며 고유 식별자는 1에서 255 사이의 값을 가질 수 있는 가상 라우터 ID입니다. 서버는 한 번에 여러 VRID에 속할 수 있습니다. 그러나 모든 VRID에는 고유한 가상 IP 주소가 있어야 합니다.
기본 연산 알고리즘:
- 고정된 간격으로 마스터 서버는 VRRP 패킷(하트비트 s) 특정 멀티캐스팅 주소 224.0.0.18로 이동하고 모든 슬레이브 서버는 이 주소를 수신합니다. 멀티캐스팅은 한 명의 발신자와 여러 명의 수신자가 있음을 의미합니다.힌트 . 서버가 멀티캐스팅 모드에서 작동하도록 하려면 네트워크 장비가 멀티캐스트 트래픽을 지원해야 합니다.
- 슬레이브 서버는 하트비트 패킷을 수신하지 않으면 마스터 선택 절차를 시작합니다. 서버가 우선 순위에 따라 마스터가 되면 VIP를 활성화하고 무료 ARP를 보냅니다. . 무상 ARP는 네트워크 스위치의 MAC 테이블을 업데이트하여 트래픽을 리디렉션할 MAC 주소와 가상 IP 주소 소유자의 변경 사항을 알리는 특수한 유형의 ARP 응답입니다.
CentOS에 keepalive 설치 및 구성
Squid가 설치된 CentOS 7을 실행하는 두 개의 Linux 서버(proxy-serv01 및 proxy-serv02)에 연결 유지를 설치하고 구성합니다. 이 계획에서는 가장 간단한 로드 밸런싱 방법인 라운드 로빈 DNS를 사용합니다. . 이 방법은 단일 DNS 이름에 여러 개의 등록된 IP 주소가 있고 클라이언트가 이러한 주소를 하나씩 가져오는 것을 제안합니다. 따라서 하나의 DNS 이름(proxy-serv)에 대해 등록된 두 개의 가상 IP 주소가 필요합니다. 다음은 네트워크 다이어그램입니다.
각 Linux 서버에는 두 개의 물리적 네트워크 인터페이스가 있습니다. eth1 공개(흰색) IP 주소 및 eth0 로컬 네트워크에서.
다음 서버 IP 주소는 실제 주소로 사용됩니다.
192.168.2.251 — proxy-server01192.168.2.252용 — proxy-server02용
다음 IP 주소는 장애가 발생할 경우 서버 간에 자동으로 전환되는 가상 주소로 사용됩니다.
192.168.2.101192.168.2.102중요 . VRRP를 구성할 때 실제 서버 IP 주소를 가상 주소로 사용하지 마십시오. 서버에 장애가 발생할 경우 주소가 다음 서버로 이동하고 장애 복구 후 첫 번째 서버가 네트워크에서 격리될 수 있기 때문입니다. 문제는 IP 주소를 다시 얻으려면 서버가 VRRP 패킷을 네트워크로 보내야 하지만 이를 수행할 IP 주소가 없다는 것입니다.
yum 패키지 관리자(또는 dnf
)를 사용하여 두 서버에 연결 유지를 설치할 수 있습니다. CentOS 8):
# yum install keepalived
두 서버에서 설치가 완료된 후 두 서버에서 연결 유지 구성 파일을 변경하십시오.
# nano /etc/keepalived/keepalived.conf
다른 매개변수가 있는 행이 강조 표시됩니다.
proxy-serv01 | 프록시-serv02 |
1 | 2 |
옵션을 더 자세히 설명하겠습니다.
- vrrp_instance
— VRRP 인스턴스를 정의하는 섹션입니다. - state
— 시작 시 초기 노드 상태입니다. - 인터페이스 <인터페이스 이름> — VRRP가 실행 중인 인터페이스입니다.
- virtual_router_id <0에서 255까지의 숫자> — 고유한 VRRP 인스턴스 식별자이며 모든 서버에서 동일해야 합니다.
- 우선 순위 <0에서 255 사이의 숫자> — 서버 우선 순위를 설정하고 우선 순위가 더 높은 서버가 마스터가 됩니다.
- virtual_ipaddress — MASTER 상태의 서버에서 활성화된 가상 IP 주소 블록입니다. VRRP 인스턴스 내부의 모든 서버에서 동일해야 합니다.
현재 네트워크 구성이 멀티캐스트 사용을 허용하지 않는 경우 keepalived는 유니캐스트 옵션을 제공합니다. i. 이자형. VRRP 하트비트 패킷은 목록에 따라 서버로 직접 전송됩니다. 유니캐스트를 사용하려면 다음 옵션이 필요합니다.
- unicast_src_ip — VRRP 패키지의 소스 주소입니다.
- unicast_peer — VRRP 패킷이 전송될 서버 IP 주소 블록입니다.
따라서 우리의 구성은 두 개의 VRRP 인스턴스, proxy_ip1 및 proxy_ip2를 정의합니다. 일반 작업에서 proxy-serv01은 가상 IP 192.168.2.101에 대한 마스터가 되고 BACKUP은 192.168.2.102에 대해 마스터가 되고, 그 반대의 경우 proxy-serv02는 가상 IP 192.168.2.102에 대한 마스터가 되고 BACKUP은 192.168.2.101.
서버에서 방화벽이 활성화된 경우 iptables를 사용하여 멀티캐스트 트래픽 및 VRRP에 대한 허용 규칙을 추가해야 합니다.
# iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
시스템 부팅 시 자동 시작을 위해 유지된 서비스를 활성화하고 두 서버에서 모두 실행
# systemctl enable keepalived
# systemctl start keepalived
연결 유지가 시작된 후 가상 IP 주소는 구성 파일에서 인터페이스에 할당됩니다. 서버의 현재 eth0 IP 주소를 보겠습니다.
# ip a show eth0
proxy-serv01에서:
proxy-serv02:
Keepalived로 앱 또는 인터페이스의 상태 확인을 수행하는 방법은 무엇입니까?
VRRP 프로토콜은 서버 상태 모니터링을 제공합니다. 예를 들어, 이는 물리적 서버 오류 또는 스위치/서버 NIC 포트의 경우에 유용합니다. 그러나 다음과 같은 다른 문제도 발생할 수 있습니다.
- 프록시 서버(또는 기타 앱) 오류 — 서버의 가상 주소에 액세스하는 클라이언트는 브라우저에서 프록시 서버를 사용할 수 없다는 오류 메시지를 받습니다.
- 두 번째 인터페이스의 인터넷 액세스 실패 — 서버의 가상 주소에 액세스하는 클라이언트는 연결을 설정할 수 없다는 오류 메시지가 브라우저에 표시됩니다.
위에서 설명한 상황을 처리하려면 다음 옵션을 사용하십시오.
- track_interface — 인터페이스 상태를 모니터링하고 나열된 인터페이스 중 하나가 DOWN에 있는 경우 VRRP 인스턴스에 대한 FAULT 상태를 설정합니다.
- 트랙_스크립트 — 0을 반환하는 스크립트를 사용하여 HA 앱의 상태 확인을 수행합니다. 확인이 성공한 경우 1, 확인이 실패한 경우 1.
eth1 인터페이스 모니터링을 추가하여 구성을 업데이트합니다(기본적으로 VRRP 인스턴스는 바인딩된 인터페이스를 확인합니다. 현재 구성에서는 eth0입니다).
track_interface { eth1}
track_script 지시문은 다음 형식의 vrrp_script 블록에 의해 결정된 매개변수를 사용하여 스크립트를 실행합니다.
vrrp_script{ script <"실행 파일 경로"> 간격 <숫자, 초> - 스크립트 실행 주기, 기본적으로 1초 가을 <숫자> - 스크립트가 반환된 횟수 FAULT 상태로 전환하기 위해 0이 아닌 다른 값 상승 <숫자> - 스크립트가 FAULT 상태(장애 복구)를 벗어나기 위해 0 값을 반환한 횟수 타임아웃 <숫자> - 스크립트가 완료될 때까지 기다리는 시간 결과를 반환합니다(시간이 다 되면 스크립트는 0이 아닌 값을 반환합니다. weight <숫자> - FAULT 상태가 될 경우 서버 우선 순위가 낮아지는 값입니다. 기본값은 0입니다. 즉, 서버는 가을 매개변수에 설정된 횟수만큼 스크립트가 실패한 후 FAULT 상태를 얻습니다.}
Squid 프록시 상태 확인을 구성해 보겠습니다. 이 명령을 사용하여 오징어 프로세스가 활성 상태인지 확인할 수 있습니다.
# squid -k check
3초마다 실행되는 vrrp_script를 만듭니다. 이 블록은 vrrp_instance 블록 외부에 정의되어 있습니다.
vrrp_script chk_squid_service { 스크립트 "/usr/sbin/squid -k 체크" 간격 3}
두 vrrp_instance 블록의 모니터링에 이 스크립트를 추가합니다.
track_script { chk_squid_service}
Squid가 실패하면 가상 IP 주소가 다른 서버로 전환됩니다.
추가 작업을 지정할 수 있습니다. 서버 상태가 변경되면 수행됩니다.
Squid가 모든 인터페이스에서 연결을 허용하도록 구성된 경우 i. 이자형. http_port 0.0.0.0:3128
, 가상 IP 주소가 전환될 때 문제가 발생하지 않으며 Squid는 새 주소에 대한 연결을 수락합니다. 그러나 특정 IP 주소가 구성된 경우 e. 예:
http_port 192.168.2.101:3128http_port 192.168.2.102:3128
Squid는 클라이언트 요청을 수신 대기할 새 주소가 시스템에 나타났는지 알지 못합니다. 가상 IP 주소가 전환되었을 때 몇 가지 추가 작업이 필요한 상황을 처리하기 위해 keepalive는 서버 상태가 예를 들어 MASTER에서 BACKUP으로 또는 그 반대로 변경되는 경우 스크립트를 실행할 수 있도록 합니다. 다음 옵션을 사용하여 구현됩니다.
"실행 파일 경로" 알림
실패 시 Keepalive 장애 조치 테스트
가상 IP를 구성한 후 오류가 올바르게 처리되었는지 확인하십시오. 첫 번째 검사는 서버 장애 시뮬레이션입니다. proxy-serv01에서 eth0을 비활성화하면 VRRP 하트비트 패킷 전송이 중지됩니다. proxy-serv02는 가상 IP 주소 192.168.2.101을 활성화해야 합니다. 다음 명령으로 확인하십시오:
# ip a show eth0
proxy-serv01에서:
proxy-serv02:
예상대로 proxy-serv02는 가상 IP 주소 192.168.2.101을 활성화했습니다. 다음 명령을 사용하여 로그에 기록된 내용을 살펴보겠습니다.
cat /var/log/messages | grep -i keepalived
proxy-serv01 | proxy-serv02에서 |
Keepalived_vrrp[xxxxx]:커널 보고:interface eth0 DOWNKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) FAULT STATEKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 프로토콜 제거[xxxxx]:VRRP_Instance(proxy_ip1) (proxy_ip1) 현재 FAULT 상태 | Keepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 마스터 상태로 전환 |
Keepalived는 eth0이 DOWN 상태에 있다는 신호를 수신하고 proxy_ip1 VRRP 인스턴스에 대해 FAULT 상태를 설정하여 가상 IP 주소를 해제합니다. | Keepalived는 proxy_ip1 VRRP 인스턴스에 대한 MASTER 상태를 설정하고 eth0에서 IP 주소 192.168.2.101을 활성화하고 무상 ARP를 보냅니다. |
그리고 proxy-serv01에서 eth0을 다시 활성화할 때 가상 IP 주소 192.168.2.101이 다시 전환되는지 확인하십시오.
proxy-serv01 | proxy-serv02에서 |
Keepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 강제로 새 MASTER 선택Keepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) MASTER STATEKeepalived_vrrp[xxxxx]로 전환 VRRP_Instance(proxy_ip1) 설정 프로토콜 VIPs.Keepalived_vrrp[xxxxx]:eth0에서 192.168.2.101에 대한 무상 ARP 전송 | Keepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 우선 순위가 더 높은 255, 당사 100Keepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 프로토콜을 제거하는 광고를 수신했습니다.> |
Keepalived는 eth0이 돌아왔다는 신호를 수신하고 proxy_ip1 VRRP 인스턴스에 대한 MASTER를 선택하기 시작합니다. MASTER 상태가 된 후 서버는 eth0의 IP 주소 192.168.2.101을 활성화하고 무상 ARP를 보냅니다. | Keepalived는 proxy_ip1 VRRP 인스턴스에 대해 더 높은 우선 순위를 가진 패킷을 가져오고 proxy_ip1을 BACKUP 상태로 전환하고 IP 주소를 해제합니다. |
두 번째 검사는 외부 네트워크 인터페이스 오류의 시뮬레이션입니다. 이를 수행하려면 proxy-serv01에서 외부 네트워크 인터페이스 eth1을 비활성화하십시오. 로그에서 결과를 봅니다.
proxy-serv01 | proxy-serv02에서 |
Keepalived_vrrp[xxxxx]:커널 보고:interface eth1 DOWNKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) FAULT STATEKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 프로토콜 제거[xxxxx]:VRRP_Instance(proxy_ip1) (proxy_ip1) 현재 FAULT 상태 | Keepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) MASTER STATEKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) MASTER STATEKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 프로토콜로 전환 eth0에서 192.168.2.101 |
Keepalived는 eth1이 DOWN이라는 신호를 받고 proxy_ip1 VRRP 인스턴스에 대한 FAULT 상태를 설정하여 가상 IP 주소를 해제합니다. | Keepalived는 proxy_ip1 VRRP 인스턴스에 대한 MASTER 상태를 설정하고 eth0에서 IP 주소 192.168.2.101을 활성화하고 무상 ARP를 보냅니다. |
세 번째 검사는 Squid 실패 시뮬레이션입니다. 이를 수행하려면 다음 명령을 사용하여 서비스를 수동으로 중지하십시오.
# systemctl stop squid
로그에서 결과 보기:
proxy-serv01 | proxy-serv02에서 |
Keepalived_vrrp[xxxxx]:VRRP_Script(chk_squid_service) failedKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) FAULT STATEvrrp_Instance_ipxxx 입력 중 FAULT STATEKeepalived_vrrp[xxxxx]:VRRP_Instance(proxys.ip1) ) 현재 FAULT 상태 | Keepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) MASTER STATEKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) MASTER STATEKeepalived_vrrp[xxxxx]:VRRP_Instance(proxy_ip1) 프로토콜로 전환 eth0에서 192.168.2.101 |
Squid 프록시 서비스의 활동을 확인하는 스크립트가 오류를 반환합니다. Keepalived는 proxy_ip1 VRRP 인스턴스에 대한 FAULT 상태를 설정하여 가상 IP 주소를 확보합니다. | Keepalived는 proxy_ip1 VRRP 인스턴스에 대한 MASTER 상태를 설정하고 eth0에서 IP 주소 192.168.2.101을 활성화하고 무상 ARP를 보냅니다. |
세 가지 검사가 모두 성공적으로 통과되었으며 keepalive가 올바르게 구성되었습니다. 나중에 Pacemaker를 사용하여 HA 클러스터를 구성하고 기능에 대해 설명하겠습니다.
최종 구성 파일 /etc/keepalived/keepalived.conf proxy-serv01용 :
vrrp_script chk_squid_service { 스크립트 "/usr/sbin/squid -k check" 간격 3} vrrp_instance proxy_ip1 { state MASTER interface eth0 virtual_router_id 1 priority 255 virtual_ipaddress { 8.24. track_kep_script { chk_squid_service }}vrrp_instance proxy_ip2 { state BACKUP 인터페이스 eth0 virtual_router_id 2 우선순위 100 virtual_ipaddress { 192.168.2.102/24 구성 dev_eth0 라벨 eth0:2 /keepalived.conf proxy-serv02용 :
vrrp_script chk_squid_service { 스크립트 "/usr/sbin/squid -k check" 간격 3}vrrp_instance proxy_ip1 { state BACKUP interface eth0 virtual_router_id track_interface 1 우선순위 100 virtual_ipaddress {01eth24.eth16.192. { chk_squid_service }}vrrp_instance proxy_ip2 { 상태 MASTER 인터페이스 eth0 virtual_router_id 2 우선순위 255 virtual_ipaddress { 192.168.2.102/24 dev eth0 레이블 track eth1 :2}