Keepalived(LV)의 HA+ 부하 평형기 구조를 활용한 연구

7512 단어 LinuxkeepalivedLVS
서버 대수를 저장하는 등 분배 원본과 분배 목적지가 같은 서버에서 제공할 수 없을 때의 설정을 기록해야 한다.
결론적으로는 가능하지만 예산이 허락된다면 직무를 분리하고 분배지와 원래 다른 노드로 구성하는 것을 권장한다.
또 포트 번호도 알 수 있듯이 원래는 레디스의 이중화를 염두에 뒀다.Redis 이중화에 대해서는 다른 항목에 기재될 수 있습니다.

시스템 구성


시스템 구성을 먼저 표시합니다.
keepalived의 VIP를 통해client에서 프로그램에 접근합니다.VIP도 load balance를 진행해 2대를 적절히 배정한다.

또 1대 하락 시 VIP는 다른 노드로 이동해 계속 처리한다.

각 설정


기본적으로 서버 1, 서버 2의 설정은 모두 같다.모든 서버에서 설정하십시오.

keepalived 설정


/etc/keepalived/keepalived.conf
! Configuration File for keepalived

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 51
    priority 50
    advert_int 1
    notify_master "/usr/local/scripts/notify-master.sh"
    notify_backup "/usr/local/scripts/notify-backup.sh"
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.33.20
    }
    unicast_peer {
        192.168.33.11
        192.168.33.12
    }
}

virtual_server 192.168.33.20 26379 {
    delay_loop 5
    lvs_sched wrr
    lvs_method DR
    protocol TCP
    real_server 192.168.33.11 6379 {
        weight 1
        inhibit_on_failure
        TCP_CHECK {
            connect_port 6379
            connect_timeout 5
        }
    }
    real_server 192.168.33.12 6379 {
        weight 1
        inhibit_on_failure
        TCP_CHECK {
            connect_port 6379
            connect_timeout 5
        }
    }
}
virtual_server의 포트는 26379로 설정되어 원래의 포트 번호와 다르지만 고의로 이렇게 한다.이따가 설명할게요.

loopback 주소 설정


VIP를 방문할 때 자신을 식별할 수 있도록 loopback 주소를 만듭니다.
/etc/sysconfig/networkd-scripts/ifcfg-lo0
DEVICE=lo:0
IPADDR=192.168.33.20
NETMASK=255.255.255.255
ONBOOT=yes
생성 후 반영.
sudo service network restart

kerner parameter 변경


맥 주소를 저장하고 IP forwarding 설정을 추가하지 않도록 커널 파라미터를 변경합니다.
/etc/sysctl.d/keepalived
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.eth1.arp_ignore = 1
net.ipv4.conf.eth1.arp_announce = 2
net.ipv4.conf.eth1.rp_filter= 0
net.ipv4.ip_forward = 1
여러 가지 검증을 거친 후 시행착오를 일으킨 설정이라 필요 없는 것이 있을 수 있다.sysctl.d 디렉토리가 없으면 를 만듭니다.
CentOS 6도 읽을 수 있습니다.1
설정 후 반영.
sudo sysctl -p /etc/sysctl.d/keepalived

keepalived에서 발매한 스크립트


keepalived에도 마스터/BACKUPState가 있어 각자state가 될 때 스크립트를 발매할 수 있습니다.
/usr/local/scripts/notify-master.sh
#!/bin/bash -u

### Change vip port in keepalived
sed -i -e "s/virtual_server 192.168.33.20 .* {/virtual_server 192.168.33.20 6379 {/g" /etc/keepalived/keepalived.conf
service keepalived reload
/usr/local/scripts/notify-backup.sh
#!/bin/bash -u

### Change vip port in keepalived
RELOAD_FLG=0
grep "virtual_server 192.168.33.29 26379 {" /etc/keepalived/keepalived.conf > /dev/null
if [ $? -ne 0 ] ; then
  RELOAD_FLG=1
fi
sed -i -e "s/virtual_server 192.168.33.20 .* {/virtual_server 192.168.33.20 26379 {/g" /etc/keepalived/keepalived.conf
# reloadのタイミングでBACKUP STATEに移行して再度このスクリプトが実行されるため、無限実行を防ぐためにチェックを行う
if [ ${RELOAD_FLG} -eq 1 ] ;then
  service keepalived reload
fi

### delete master vip (if exist)
ip addr show eth1 | grep "inet 192.168.33.20/32" > /dev/null
if [ $? -eq 0 ] ; then
  sudo ip addr del 192.168.33.20/32 dev eth1
fi

결실


마지막으로 각자의keepalived를 시작한 후client에서 VIP를 방문하면 잘 분배될 것 같습니다.
또한look back 인터페이스에 IP 주소가 기재되어 있기 때문에 서버 1, 서버 2 자체는 분배를 확인할 수 없습니다.(항상 자신만 방문)

주안점


이 설정에서keepalived의 MASTER state 측면에서만 notify_master 스크립트에 따라 VIP의 포트를 올바르게 변경합니다.결과는 다음과 같다.
keepalived.conf
# MASTER state
virtual_server 192.168.33.20 6379 {
keepalived.conf
# BACKUP state
virtual_server 192.168.33.20 26379 {
MASTER state 측의keepalived가 떨어지면 다른 노드의keepalived에서도 이것을 검출하여 virtual_server의 포트 번호를 정확하게 변경한 다음 다시 불러옵니다.
이 설정을 하지 않으면client 분배 목적지(이번에 말한 서버 1server2) 사이에서 통신을 할 때 간혹 네트워크 순환을 일으켜 서버 1/server2 사이에서 무한 통신을 할 수 있습니다.(tcpdump에서 보면 너무 안 좋아요)
한 번, 몇 번, 한 번이 싫은 곳에서는 한 번, 한두 번 하면 잘 풀리기 때문에 좋지 않은...
각주2에도 있지만,vagrant에서 하면 문제가 생길 수 있으니 아마도 이것이 문제일 것이다.게다가 내가 확인한 곳은vagrant만 문제가 아니라 실황 중계에서도 평범하게 발생했다...
마찬가지로 BACKUPState로 옮기면 가상 포트 번호로 다시 변경해야 하기 때문에 상기 내용에서 설정된 경우reload를 하지 마십시오.이 제어를 하지 않으면'BACKUPState로 변해'→'notify backup 스크립트 실행'→'스크립트의keepalived reload'→'reload를 통해 BACKUpstate 재인식'→'notify backup 스크립트 실행'→ 이하의 무한 순환에 빠질 수 있습니다.

총결산


대체로 위 설정에 따라 HA를 구성하면서 로드 밸런스를 진행하는 것으로 구성할 수 있다.LB 노드와 LB를 모아 목표 노드를 분배할 수 있기 때문에 서버 대수를 절약할 수 있다.
따라서keepalived에서keepalived.conf를 고쳐 이런 복잡한 구조를 다시 불러올 필요가 있고 분배 목표를 자신으로 만들기 위해서는 더 많은 설정을 해야 하기 때문에 상당히 복잡하고 민감한 구성이라고 생각합니다.
따라서 서버 대수절 이외의 목적은 일반적으로 분배원과 선노드를 분리하여 관리하면 유지보수성이 많이 높아진다.

reference


중앙 OS 6에서d/ 사용 가능 (ipv6 무효화 등)  
Linux로 L4의 로드 밸런스를 간단하게 만들려면  

좋은 웹페이지 즐겨찾기