首先实现简单的 harproxy 负载均衡
node1 and node4:安装 httpd 服务,提供测试页
node 2 and node3:安装 haproxy,安装 keepalived
haproxy 的简单配置:
frontend webserver bind *:80 use_backend websrvs backend websrvs balance roundrobin server web1 192.168.2.11:80 check server web2 192.168.2.14:80 check
下面我们来实现高可用 haproxy:
node3配置:
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node3.ckh.com vrrp_skip_check_adv_addr #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_haproxy { # harproxy 健康状态检测 script "killall -0 haproxy" interval 3 weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.18/32 dev eth0 label eth0:1 } track_script { chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
node2 配置:
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node2.ckh.com vrrp_skip_check_adv_addr #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 3 weight -2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.18/32 dev eth0 label eth0:1 } track_script { chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
notify.sh 脚本:
#! /bin/bash # Author: ckh # Description: An example of notiry script # vip="192.168.2.18" contack="root@localhost" notify() { mailsubject="$(hostname) to be $1:$vip floating" mailbody="$(date +'%F %H:%M:%S'): vrrp transition,$(hostname) changed to be $1" echo $mailbody | mail -s "$mailsubject" $contack } case $1 in master) notify master systemctl restart haproxy # active-active 方式运行的话,我们可以让 haproxy 成为 主备时都重启haproxy
exit 0 ;; backup) notify backup
systemctl restart haproxy # active-active 方式运行的话,我们可以让 haproxy 成为 主备时都重启haproxy exit 0 ;; fault) notify fault exit 0 ;; *) echo "Usage:$(basename $0) {master|backup|fault}" exit 1 ;; esac
以上是单主高可用的实现,下面我们实现双主高可用的实现:
增加一个 vip,添加一个 实例 即可,和 高可用 nginx 类似。
node2 添加一个实例:
vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1122 } virtual_ipaddress { 192.168.2.28/32 dev eth0 label eth0:2 } track_script { chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
node3 添加一个实例:
vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 52 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1122 } virtual_ipaddress { 192.168.2.28/32 dev eth0 label eth0:2 } track_script { chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
以上就是 keepalived 高可用 haproxy 的方式,而且是双主模式的实现。