[Redundancy] 08. HAProxy 구성 (3) - Active/Stendby 클러스터링(Keepalived)
카테고리: REDUNDANCY
태그: redundancy linux
08-1. 시작 전 - VRRP, Keepalived 등…
■ VRRP(Virtual Router Redundancy Protocol)?
게이트웨이 이중화 프로토콜(FHRP : First Hop Redundancy Protocol) 중 하나로 VRRP는 주로 Failover를 목적으로 하는 라우터의 고가용성을 제공하기 위한 프로토콜이다. 하나의 라우터가 고장 나더라도 다른 라우터가 자동으로 그 역할을 대신하면서 서비스의 중단을 방지할 수 있다.
▶ VRRP의 동작 방식
| 순서 | 설명 |
|---|---|
| ① | VRRP는 Master와 Slave 역할을 가진 라우터 그룹을 만든다. 이 그룹은 하나의 가상 IP(Virtual IP, VIP) 주소로 묶이며, 각 라우터는 실제 IP(Real IP, RIP) 주소를 가진다. |
| ② | 두 장비의 VIP를 누가 소유하고 있느냐에 따라 Master/Slave 장비를 구분할 수 있으며, Master 장비의 “VIP와 RIP가 같은 장비”, “우선 순위가 큰 장비”, “RIP의 주소가 큰 장비”을 기준으로 선출된다. (VIP를 누가 가지고 있는지가 중요한 이유는 VIP를 소유하고 있는 Master 장비로만 패킷이 전송되기 때문이다.) |
| ③ | Master 장비가 장애가 발생하여 서비스가 중단된다면 Slave 장비가 VIP를 가져와 Master 역할을 수행한다. 이 과정에서 네트워크 패킷은 중단 없이 스무스하게 전달됩니다. |
▶ Master가 살아있는지 어떻게 알까?
Master 장비가 살아있는지 죽었는지 확인하는 방법은 헬스 체크와 같이 반복적으로 패킷을 보내는 것이다. VRRP에서는 라우터 간의 통신을 유지하고 Master 라우터의 상태를 모니터링하기 위해 “VRRP 광고 패킷(Advertisement Packet)”을 사용한다.
| 순서 | 설명 |
|---|---|
| ① | Master 장비는 VRRP Advertisement Packet을 주기적으로 가상 그룹에 전송한다. |
| ② | 그룹에 속한 Slave 장비들은 Master의 VRRP Advertisement Packet을 받는 동안 Master 장비가 살아있는 상태임을 확인하며, 이 동안은 Stand-By 상태를 유지한다. |
| ③ | 만약 Slave 장비가 Master의 Advertisement Packet을 일정 시간(Master Down Timer=Dead Timer) 동안 수신하지 못한다면, Master 장비의 동작이 중단된 것으로 간주한다. |
| ④ | 이에 따라 Slave 장비 중에서 우선순위가 가장 높거나, VIP와 RIP가 같거나, RIP 주소가 큰 장비가 Master로 선출된다. 이러한 선출 과정에서 VRRP Advertisement Packet에 포함된 우선순위와 IP 주소 정보가 사용한다. |
| ⑤ | Master가 변경되면, 새로운 Master 장비는 자신이 Master로 승격하였음을 알리기 위해 VRRP Advertisement Packet과 함께 GARP(Gratuitous ARP) Packet을 전송한다. |
| ⑥ | 다른 네트워크 장비들은 이 GARP를 수신하여 해당 IP와 MAC 주소를 갱신하고 자신의 ARP 테이블에 저장합니다. 이를 통해 올바른 라우팅과 데이터 전송이 가능해진다. |
■ hapee-extras-vrrp?
hapee-extras-vrrp는 HAProxy Enterprise Edition(HAPEE)의 부가 기능 중 하나로, VRRP를 구현하여 서버나 라우터의 고가용성을 제공한다.
hapee-extras-vrrp는 HAProxy 환경에서 VRRP를 사용하여 IP 주소를 여러 서버 간에 공유하고 장애 조치를 수행할 수 있도록 해준다. (단, HHAProxy Enterprise Edition을 사용하기 위해서는 라이선스 구매가 필요로하며, 14일간의 무료 체험판을 신청할 수 있다고 한다.)
■ Keepalived?
Keepalived는 ‘로드밸런싱’과 ‘고가용성(HA)’를 제공하는 프레임워크로, VRRP 프로토콜을 사용하여 두 대의 서버 또는 장비가 하나의 가상 IP 주소를 공유한다. 이를 통해 한 대의 장비가 고장 날 경우 자동으로 다른 장비가 해당 역할을 대신 수행하여 고가용성을 유지한다.
Keepalived는 VRRP의 구현뿐만 아니라 다양한 기능(health check, load balancing 등)을 포함하고 있어 네트워크의 고가용성 및 로드 밸런싱을 효과적으로 관리하는 데 사용됩니다.(단, 로드밸런싱은 L4 수준을 제공하며, HAProxy와 함께 사용하면 L7 로드밸런싱도 가능하다.)
08-2. HAProxy + Keepalived 구성 (CentOS Stream 8 기준)
■ 서버 구성
-----------+----------------------------------------------+-----------------------+---
| | |
|192.168.219.134 |192.168.219.135 |
+----------+-----------+ +----------+-----------+ |
| [ dlp1.test.srv ] | VRRP | [ dlp2.test.srv ] | |
| HAProxy |-----------------------| HAProxy | |
| Keepalived | vip: 192.168.219.100 | Keepalived | |
+----------------------+ +----------------------+ |
|
------------+------------------------------------+----------------------------+---
| |
|192.168.219.136 |192.168.219.137
+-----------+----------+ +-----------+----------+
| [ node01.test.srv ] | | [ node02.test.srv ] |
| Web Server#1 | | Web Server#2 |
+----------------------+ +----------------------+
■ HAProxy 서버 - HAProxy 설치 및 구성
{
dnf -y install haproxy
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.org
sed -i '/^frontend main/,/^server app4 127.0.0.1:5004 check/ s/^/#/' /etc/haproxy/haproxy.cfg
cat <<EOF >> /etc/haproxy/haproxy.cfg
frontend http-in
bind 192.168.219.100:80
default_backend backend_servers
option forwardfor
backend backend_servers
balance roundrobin
server node01 192.168.219.136:80 check
server node02 192.168.219.137:80 check
EOF
systemctl enable --now haproxy
sed -i 's/^#module(load="imtcp")/module(load="imudp")/; s/#input(type="imtcp" port="514")/input(type="imudp" port="514")\n$AllowedSender UDP, 127.0.0.1/' /etc/rsyslog.conf
sed -i '/\*.info;mail.none;authpriv.none;cron.none/s/\*.info;mail.none;authpriv.none;cron.none/\*.info;mail.none;authpriv.none;cron.none;local2.none/; /\*.info;mail.none;authpriv.none;cron.none;local2.none/a local2.\* \/var\/log\/haproxy.log' /etc/rsyslog.conf
systemctl restart rsyslog
}
■ WEB 서버 - httpd 설치 및 설정
{
dnf -y install httpd
sed -i 's/LogFormat "%h %l %u %t \\"%r\\" %>s %b \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined/LogFormat "\\"%{X-Forwarded-For}i\\" %l %u %t \\"%r\\" %>s %b \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined/' /etc/httpd/conf/httpd.conf
systemctl restart httpd
systemctl enable httpd
cat <<EOF >> /var/www/html/index.html
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;">
node01.test.srv # node02 서버는 node02.test.srv로 변경
</div>
</body>
</html>
EOF
}
■ HAProxy 서버 - Keepalived 설치 및 설정
# 1) "net.ipv4.ip_nonlocal_bind=1" 설정
{
echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
}
▶ “net.ipv4.ip_nonlocal_bind=1” 설정을 하는 이유
해당 설정은 특정 프로세스가 로컬 IP 주소 외의 IP 주소에도 바인딩(bind)할 수 있도록 허용하는 것을 의미한다.
“net.ipv4.ip_nonlocal_bind=1” 설정은 고가용성 솔루션인 Keepalived와 같이 여러 서버 간에 IP 주소를 공유하거나 이동할 때, 서로 다른 서브넷의 IP 주소에 대한 바인딩을 허용하기 위해 사용됩니다. (해당 옵션이 비활성화 되어 있어도 서비스가 시작하면서 인터페이스에 특정 IP를 바인딩할 수 있으나 장애극복(Failover)시 문제 발생한다.)
# 2) Keepalived 설정 - Master 서버(192.168.219.134) 설정
{
dnf -y install keepalived
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org
cat <<EOF >> /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.219.100/24
}
}
EOF
systemctl enable keepalived
systemctl restart keepalived
}
# 3) Keepalived 설정 - Slave 서버(192.168.219.134) 설정
{
dnf -y install keepalived
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org
cat <<EOF >> /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.219.100/24
}
}
EOF
systemctl enable keepalived
systemctl restart keepalived
}
■ 결과 확인
# dlp1.test.srv 서버
[root@dlp1 ~]# ip addr
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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:56:1f:a5 brd ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.219.134/24 brd 192.168.219.255 scope global dynamic noprefixroute ens32
valid_lft 1292sec preferred_lft 1292sec
inet 192.168.219.100/24 scope global secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe56:1fa5/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# dlp2.test.srv 서버
[root@dlp2 ~]# ip addr
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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:46:59:31 brd ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.219.135/24 brd 192.168.219.255 scope global dynamic noprefixroute ens32
valid_lft 1300sec preferred_lft 1300sec
inet6 fe80::20c:29ff:fe46:5931/64 scope link noprefixroute
valid_lft forever preferred_lft forever
■ Failover/Failback 확인 - MAC 주소 확인
▶ Failover 확인
▶ Failback 확인
댓글 남기기