keepalived实战案例

keepalived实战案例

例1:简单keepalived集群(主备模式)

节点 ip
node1 1.1.1.10
node2 1.1.1.20

1)先改/etc/hosts文件,添加ip和主机名

echo -e '1.1.1.10 node1\n1.1.1.20 node2' >> /etc/hosts

2)node1、node2安装keepalived

yum install -y keepalived
cp /etc/keepalived/keepalived.conf{,_bak}

3)改node1的配置文件

需要删除virtual server以下的配置段

cd /etc/keepalived

vim keepalived.conf 
global_defs {
   notification_email {
       root@localhost
   }
   notification_email_from keep@localhost
   smtp_server 127.0.0.1		#邮件服务器改本地
   smtp_connect_timeout 30
   router_id node1			#虚拟路由器的名称
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.1		#组播地址,同一组内的虚拟路由器要统一
}

vrrp_instance VI_1 {
   state BACKUP		#状态要改
   interface eth1	#设置的网卡
   virtual_router_id 1		#虚拟路由器的标识符要统一
   priority 90			#优先级要一个node高一个node低
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass qwe123		#认证密码要改
   }
   virtual_ipaddress {
       1.1.1.100 dev eth1 label eth1:0		#设置VIP
   }
}

systemctl start keepalived		#启动服务即可
scp keep@localhost.conf root@1.1.1.20:/etc/keepalived/

4)改node2的配置文件:

#只需改唯一性的参数即可
vim /etc/keepalived/keepalived.conf 
router_id node2
state MASTER
priority 100

systemctl start keepalived		启动服务即可
tcpdump -i ens160 -nn host 224.0.0.1		#抓包查看,可看到本地ip网卡一直向组播ip通告,且带有优先级

image

image

例2:简单集群(主/主模式)

节点 ip
node1 1.1.1.10,vip:1.1.1.100、1.1.1.200
node2 1.1.1.20 ,vip:1.1.1.300、1.1.1.400

1)node1复制keepalived.conf内容中的

在第一个案例的配置文件上改

vim keepalived.conf 
vrrp_instance web1 {
    state MASTER
    virtual_router_id 2
    priority 100
    virtual_ipaddress {
        1.1.1.100 dev ens160 label ens160:1
        1.1.1.200 dev ens160 label ens160:2
    }
}
vrrp_instance web2 {
    state BACKUP
    virtual_router_id 3
    priority 80
    virtual_ipaddress {
        1.1.1.300 dev ens160 label ens160:3
        1.1.1.400 dev ens160 label ens160:4
    }
}

systemctl restart keepalived

2)node2复制相同的内容,做修改

vim keepalived.conf
vrrp_instance web1 {
    state BACKUP
    virtual_router_id 2
    priority 100
    virtual_ipaddress {
        1.1.1.100 dev ens160 label ens160:1
        1.1.1.200 dev ens160 label ens160:2
    }
}
vrrp_instance web2 {
    state MASTER
    virtual_router_id 3
    priority 80
    virtual_ipaddress {
        1.1.1.300 dev ens160 label ens160:3
        1.1.1.400 dev ens160 label ens160:4
    }
}

systemctl restart keepalived

例3:抢占模式和非抢占模式

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,造成网络抖动

建议设置为非抢占模式nopreempt,即高优级主机恢复后,并不会抢占低优先级主机的master角色。生产模式建议使用

抢占模式:

注意:

  • 尽量把各keepalived服务器state设为BACKUP
  • 必须禁用vrrp_strict或者strict_mode

1)node1主机配置

global_defs {
   notification_email {
       root@localhost
   }
   notification_email_from keep@localhost
   smtp_connect_timeout 30
   router_id node1
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.1
}

vrrp_instance VI_1 {
   state BACKUP
   interface eth1
   virtual_router_id 1
   priority 90
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass qwe123
   }
   virtual_ipaddress {
       1.1.1.100 dev eth1 label eth1:0
   }
}

2)node2主机配置

global_defs {
   notification_email {
       root@localhost
   }
   notification_email_from keep@localhost
   smtp_connect_timeout 30
   router_id node2
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.1
}

vrrp_instance VI_1 {
   state MASTER
   interface eth1
   virtual_router_id 1
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass qwe123
   }
   virtual_ipaddress {
       1.1.1.100 dev eth1 label eth1:0
   }
}

非抢占模式:

注意:必须将各keepalived 服务器state配置为BACKUP

node1配置

#其他配置不变
vrrp_instance web1 {
    state BACKUP
    priority 100
    nopreempt
    ...
}

node2配置

#其他配置不变
vrrp_instance web1 {
    state BACKUP
    priority 100
    nopreempt
    ...
}

例4:单播通信

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
在云环境中,默认云平台是不允许使用广播的,必须腾讯云、阿里云需要单独申请使用广播

注意:

  • 启用 vrrp_strict 时,不能启用单播
  • 在所有节点vrrp_instance语句块中设置对方主机的IP
  • 建议设置为专用于对应心跳线网络的地址,而非使用业务网络

node1设置

vim keepalived.conf
vrrp_instance VI_1 {
    ...
    unicast_src_ip 1.1.1.25
    unicast_peer {
        1.1.1.10
        1.1.1.20
    }
}

node2配置

vrrp_instance VI_1 {
    unicast_src_ip 1.1.1.10
    unicast_peer {
        1.1.1.25
        1.1.1.20
    }
}

例5:邮件通知脚本

当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户keepalived_script身份执行脚本,如果此用户不存在,以root执行脚本
可以用指令指定脚本执行用户的身份:

script_user user

1)改keepalived配置文件

global_defs {
    enable_script_security		#启用脚本执行安全,必须开启
    script_user root			#脚本执行用户,默认keepalived_script用户,可不写但要创建user
}
vrrp_instance web1 {
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

2)写通知脚本,给所有node

vim notify.sh
#!/bin/bash

rpm -q mailx && rpm -q postfix
if [ $? != 0 ] ;then
  yum install mailx postfix -y &>/dev/null
  systemctl start postfix
fi
#contact='root@localhost'
contact='1137127273@qq.com'
notify() {
  mailsubject="$(hostname) to be $1, vip floating"
  mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
  echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
  master)
      notify master
      ;;
  backup)
      notify backup
      ;;
  fault)
      notify fault
      ;;
  *)
      echo "Usage: $(basename $0) {master|backup|fault}"
      exit 1
      ;;
esac

scp notify.sh root@1.1.1.20:/etc/keepalived/

3)邮箱设置

vim /mail.rc
set bsdcompat
set from=1137127273@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=1137127273@qq.com
set smtp-auth-password=mjebocrqrmgmbadf
set smtp-auth=login

例6:高可用lvs-dr模型

节点 ip
VS1 1.1.1.25,VIP:1.1.1.100
VS2 1.1.1.35,VIP:1.1.1.100
RS1 1.1.1.10
RS2 1.1.1.20

1)RS主机设置arp、ip。使用之前写的lvs脚本

参考文章中lvs-dr:lvs集群案例

2)VS1主机安装keepalived

yum install -y keepalived 

cd /etc/keepalived/
vim keepalived.conf
virtual_server 1.1.1.100 80 {
    delay_loop 1
    lb_algo wrr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80
    
    real_server 1.1.1.10 80 {
        weight 1
        HTTP_GET {
            url {
                path /index.html
                status_code 200
                #使用digest 校验码,生成方法为:
                #1. curl -s 1.1.1.10 |md5sum
                #2. genhash -s 1.1.1.10 -p 80 -u /index.html
            }
            retry 3
            delay_before_retry 2
            connect_timeout 3
        }
    }
    real_server 1.1.1.20 80 {
        weight 1
        HTTP_GET {
            url {
                path /index.html
                status_code 200
            }
            retry 3
            delay_before_retry 2
            connect_timeout 3
        }
    }
}

scp keepalived.conf root@1.1.1.35:/etc/keepalived/

3)RS2主机安装、设置keepalived

RS1和RS2的notify.sh脚本用前面的案例,再修改优先级、主机名、状态就可以了

yum install -y keepalived
bash -x notify.sh start 		#先测试运行一遍,脚本是否可用,并安装邮件服务

4)所有VS主机都安装nginx,默认的页面做sorry页面,再启动keepalived

yum install -y nginx
systemctl start keepalived

例7:脚本实现主从切换

配合nginx使用

1)所有keepalived主机添加脚本

vim keepalived.conf
vrrp_script check_down {
    script "/usr/bin/test ! -e /etc/keepalived/down"
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}
vrrp_script check_down {
    script "pidof nginx || touch /etc/keepalived/ngx && [ ! -e /etc/keepalived/ngx ]"
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}
vrrp_instance web1 {
    ...
    track_script {
        chk_down
    }
}

例8:高可用NGINX

节点 ip
nginx1 2.2.2.25(外网) 1.1.1.25(内网)
nginx2 2.2.2.15(外网) 1.1.1.35(内网)
后端服务 1.1.1.10(内网)

1)两个nginx主机,配置keepalived

vim keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keep@localhost 
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id gw
    vrrp_skip_check_adv_addr
    vrrp_garp_interval 1
    vrrp_gna_interval 1
    vrrp_mcast_group4 224.0.0.1
    script_user root
}
vrrp_script chk_dw {
    script "/etc/keepalived/chk_dw.sh"
    weight -10
    interval 1
    fail 1
    rise 1
    user root		
}
vrrp_script chk_ngx {
    script "/etc/keepalived/chk_ngx.sh"
    weight -10			#脚本退出码1时,降权
    interval 2
    fail 3
    rise 3
    user root
}
vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qwe123
    }
    virtual_ipaddress {
        1.1.1.200 dev ens160 label ens160:0
    }
    track_script {
        chk_dw
    }
    #生产环境可用,监听网卡是否可用
    track_interface {
        ens160
        ens224
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

cd  /etc/keepalived/
cat > /etc/keepalived/chk_dw.sh <<eof
#!/bin/bash
[[ -f /etc/keepalived/down ]] && exit 1||exit 0 '
eof

chmod +x chk_dw.sh

cat > /etc/keepalived/chk_ngx.sh <<eof
#!/bin/bash
pidof nginx &> /dev/null ||systemctl restart nginx
eof

chmod +x *.sh
systemctl restart keepalived
systemctl is-active nginx

2)编写notify.sh脚本,backup节点的

vim notify.sh
#!/bin/bash

rpm -q mailx && rpm -q postfix
if [ $? != 0 ] ;then
    yum install mailx postfix -y &>/dev/null
    systemctl start postfix
fi
#contact='root@localhost'
#contact='1137127273@qq.com'
notify() {
    mailsubject="$(hostname) to be $1, vip floating"
    mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
    master)
        systemctl start nginx
        notify master
        ;;
    backup)
        systemctl stop nginx
        #systemctl start nginx	backup节点要启用起来,否则主节点挂了,备也没有,权限比较后还是在主节点
        notify backup
        ;;
    fault)
        systemctl stop nginx
        notify fault
        ;;
    *)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
esac

例9:云环境搭建keepalived

腾讯云文档:https://cloud.tencent.com/document/product/215/20186
阿里云文档:https://help.aliyun.com/zh/vpc/user-guide/use-highly-available-virtual-ip#233a9d0442yvt

借鉴腾讯云的监听脚本:

#!/bin/bash
#/etc/keepalived/notify_action.sh
log_file=/var/log/keepalived.log
log_write()
{
    echo "[`date '+%Y-%m-%d %T'`] $1" >> $log_file
}
[ ! -d /var/keepalived/ ] && mkdir -p /var/keepalived/

case "$1" in
    "MASTER" )
        echo -n "$1" > /var/keepalived/state
        log_write " notify_master"
        echo -n "0" /var/keepalived/vip_check_failed_count
        ;;
    "BACKUP" )
        echo -n "$1" > /var/keepalived/state
        log_write " notify_backup"
        ;;
    "FAULT" )
        echo -n "$1" > /var/keepalived/state
        log_write " notify_fault"
        ;;
    "STOP" )
        echo -n "$1" > /var/keepalived/state
        log_write " notify_stop"
        ;;
    *)
        log_write "notify_action.sh: STATE ERROR!!!"
        ;;
esac
posted @ 2023-11-26 00:50  suyanhj  阅读(178)  评论(0)    收藏  举报