간단하다.
keepalived 설치 및 설정 후 haproxy를 설치하고 설정을 마치면 된다.
위 그림과 같은 구조를 만들었을 경우 master 노드로 설정된 호스트가 가상 IP를 가지고 있다가
마스터노드의 keepalived가 다운되거나, 호스트 자체가 다운되는 경우 자연스레 백업 노드로 연결이 넘어가게된다.
알아도 삶에 도움 1도 안되는 얕고 잡스러운 지식, 그리고 쓸데 없는 이야기.
간단하다.
keepalived 설치 및 설정 후 haproxy를 설치하고 설정을 마치면 된다.
위 그림과 같은 구조를 만들었을 경우 master 노드로 설정된 호스트가 가상 IP를 가지고 있다가
마스터노드의 keepalived가 다운되거나, 호스트 자체가 다운되는 경우 자연스레 백업 노드로 연결이 넘어가게된다.
HAProxy는 여러 서버에 대해 요청을 확산시키는 TCP 및 HTTP 기반 애플리케이션들을 위해 고가용성 로드밸런서와 리버스 프록시를 제공하는 자유-오픈 소스 소프트웨어이다. C 프로그래밍 언어로 개발되어 있으며 빠르고 효율적인 것으로 유명하다.
공식 사이트 참조
haproxy를 통해 부하를 분산하는 등의 용도로 서비스 효율을 높일 수 있다.
여기에서 다운 받아도 되며, yum epel-release에 포함되어 있으므로 epel-release 리포지터리 추가 후 yum 이나 dnf 명령 등을 통해 설치할 수 있다.
sudo dnf install -y haproxy 마지막 메타자료 만료확인 7:58:42 이전인: 2022년 07월 28일 (목) 오전 12시 23분 23 초. 종속성이 해결되었습니다. ================================================================================ 꾸러미 구조 버전 레포지터리 크기 ================================================================================ 설치 중: haproxy x86_64 1.8.27-4.el8 appstream 1.4 M 연결 요약 ================================================================================ 설치 1 꾸러미 총계 내려받기 크기: 1.4 M 설치된 크기 : 4.2 M ...중략... 설치되었습니다: haproxy-1.8.27-4.el8.x86_64 완료되었습니다!
서비스가 구동 될 모든 서버에 설치해준다.
자동으로 서비스가 구동될 수있도록 서비스를 등록 해준다.
sudo systemctl enable haproxy.service 또는 sudo service haproxy start
기본적으로 /etc/haproxy/haproxy.cfg 가 존재한다.
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- # status web 설정 # haproxy 서비스 상태, 백엔드 서비스의 상태 등을 웹을 통해 확인할 수 있다. # 필수는 아니다. #--------------------------------------------------------------------- listen hastats mode http bind *:8088 stats enable stats show-legends stats uri /hastat # 서버 주소가 192.168.0.1이라면 http://192.168.0.1/hastat으로 접속한다. stats auth admin:admin # hastats 웹에 접속 시 인증으로 제한하려면 계정과 패스워드를 지정한다. #--------------------------------------------------------------------- # 프론트 엔드 설정 # 프론트 엔드에서 설정한 포트로 연결이 들어올 경우 백엔드로 보낸다 #--------------------------------------------------------------------- # 외부에서 haproxy를 통해 연결을 시도할 때 사용하는 포트 frontend kubeproxy bind *:16443 default_backend kubeproxy mode tcp #--------------------------------------------------------------------- # 백엔드 설정 # 프론트엔드에서 defaultbackend 타겟으로 설정 된 백엔드 정보 #--------------------------------------------------------------------- backend kubeproxy balance roundrobin # Balance Option # Roundrobin : 순차적으로 분배 # static-rr : 서버에 부여된 가중치에 따라서 분배 # leastconn : 접속수가 가장 적은 서버로 분배 # source : 운영중인 서버의 가중치를 나눠서 접속자 IP 해싱(hashing)해서 분배 # uri : 접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠서 분배 (URI의 길이 또는 depth로 해싱) # url_param : HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배 (조건 없는 경우 round_robin으로 처리) # hdr : HTTP 헤더에서 hdr(<name>)으로 지정된 조건이 있는 경우에 대해서만 분배 (조건없는 경우 round robin 으로 처리) # rdp-cookie : TCP 요청에 대한 RDP 쿠키에 따른 분배 mode tcp option tcp-check option tcplog # 외부에서 16443 포트로 연결을 시도하면 아래의 서버에 순차적으로 연결해준다. server storage01 192.168.0.1:6443 check server storage02 192.168.0.2:6443 check server storage03 192.168.0.3:6443 check frontend web-console bind *:18080 default_backend web-console mode tcp backend web-console balance roundrobin mode tcp option tcp-check option tcplog server storage01 192.168.1.1:8080 check server storage02 192.168.1.2:8080 check server storage03 192.168.1.3:8080 check
백엔드로 동작할 모든 서버에 동일한 설정 파일을 넣어준다.
haproxy 웹 서비스를 통해 정보 확인이 가능한다.
keepalive 참조
keepalive는 Linux 시스템 혹은 Linux 기반 인프라에서의 로드밸런싱 및 고가용성을 위한 기능을 제공한다.
단순하게 설명하면, 두 개 이상의 Linux 시스템이 존재할 경우, virtual IP 를 생성하고 시스템의 상태에 따라 해당 virtual IP를 할당해주는 기능을 한다.
# CentOS (Redhat 계열) $ sudo isntall -y keepalived # Ubuntu (Devian 계열) $ sudo apt-get install -y keepalived
/etc/keepalived/keepalived.conf 를 환경에 맞도록 수정한다.
Master server
! Configuration File for keepalived Master global_defs { router_id rtr_0 # Master와 Backup 구분 } vrrp_instance VI_0 { # Master와 Backup과 구분 state MASTER # 또는 BACKUP interface eth0 # 노드에서 실제 사용할 인터페이스 지정 virtual_router_id 10 # Master와 Backup 모두 같은 값으로 설정. priority 200 # 우선순위, 값이 높은 쪽인 Master가 된다. advert_int 1 authentication { auth_type PASS # Master와 Backup 모두 같은 값으로 설정. auth_pass P@ssW0rd # Master와 Backup 모두 같은 값으로 설정. } virtual_ipaddress { 192.168.0.100 # Master와 Backup 동일하게 설정한 VIP } } # #으로 시작하는 내용은 모두 삭제한다.
Backuo(slave)
! Configuration File for keepalived global_defs { router_id rtr_1 } vrrp_instance VI_1 { state BACKUP # MASTER가 아니므로 수정 interface eth0 virtual_router_id 10 priority 100 # 낮은 우선순위를 위해 수정 advert_int 1 authentication { auth_type PASS auth_pass P@ssW0rd } virtual_ipaddress { 192.168.0.100 } }
각각의 서버에서 서비스를 구동한다.
sudo systemctl enable keepalived --now # BACKUP 서버들에서도 동일하게 서비스를 구동해준다.
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 4e:be:1a:32:52:04 brd ff:ff:ff:ff:ff:ff inet 192.168.1.41/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 192.168.1.40/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::4cbe:1aff:fe32:5204/64 scope link valid_lft forever preferred_lft forever
192.168.1.40/32가 virtual IP. backup 노드로 설정된 서버에는 해당 ip가 보이지 않는다.
다른 시스템에서 가상아이피를 이용하여 ssh 접속, 혹은 ping 명령등을 수행해서 확인하면 된다.
댓글을 달려면 로그인해야 합니다.