keepalived03-keepalived示例

  • keepalived,原生设计的目的为了高可用ipvs服务。
    • 基于vrrp协议完成IP地址飘移。
    • 基于ipvs模块生成ipvs规则(在配置文件中预先定义)。
    • 检查器根据后端服务器的状态,动态的调整ipvs规则。
  • keepalived通过调用接口,可以执行外部脚本,并根据外部脚本的执行状态码,可以动态的调整优先级。(可高可用其他服务,例如nginx等)

1、实现VIP飘移(主备模式)

1、主备模式之主节点(10.1.1.11机器)

]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha11
    vrrp_mcast_group4 224.1.1.1
}

vrrp_instance VR_1 {
    state MASTER
    priority 100
    interface ens33
    virtual_router_id 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}

2、主备模式之备节点(10.1.1.12机器)

]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha12       #节点名称,可以是任意字符串
    vrrp_mcast_group4 224.1.1.1
}

vrrp_instance VR_1 {
    state BACKUP             #!
    priority 95              #!
    interface ens33
    virtual_router_id 101    #同一个虚拟路由器的标识要相同
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101      #同一个虚拟路由器的认证密码必须相同
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}

3、测试VIP飘移

#(1)启动备节点,观察VIP(VIP在备节点上)
systemctl start keepalived.service
 
#(2)启动主节点,观察VIP(VIP从备节点飘移到了主节点上)
systemctl start keepalived.service

#(3)停止主节点,观察VIP(VIP从主节点飘移到了备节点上)
systemctl stop keepalived.service

2、双主模型

  • 双主模型其实就是在两台机器上同时创建两个虚拟路由器,一个虚拟路由器是主备,一个虚拟路由器是备主。即一个虚拟路由器是A主B备,另一个虚拟路由器是A备B主。

 

1、第一个节点(10.1.1.11机器)

]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha11
    vrrp_mcast_group4 224.1.1.1
}

#对于第一个虚拟路由器,本机是主节点
vrrp_instance VR_1 {
    state MASTER
    priority 100
    interface ens33
    virtual_router_id 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}

#对于第二个虚拟路由器,本机是备节点
vrrp_instance VR_2 {
    state BACKUP
    priority 96
    interface ens33          #两个虚拟路由器的VIP可以配置在同一个网络接口上
    virtual_router_id 102    #不同的虚拟路由器,virtual_router_id不同
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh102      #不同的虚拟路由器,认证的密码不同
    }
    virtual_ipaddress {
        10.1.1.100/24 dev ens33 label ens33:2    #不同的虚拟路由器,VIP不同,别名也不能相同(或者两个VIP都使用辅助IP)
    }
}

2、第二个节点(10.1.1.12机器)

global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha12
    vrrp_mcast_group4 224.1.1.1
}

#对于第一个虚拟路由器,本机是备节点
vrrp_instance VR_1 {
    state BACKUP
    priority 95
    interface ens33
    virtual_router_id 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}

#对于第二个虚拟路由器,本机是主节点
vrrp_instance VR_2 {
    state MASTER
    priority 100
    interface ens33          #两个虚拟路由器的VIP可以配置在同一个网络接口上
    virtual_router_id 102    #不同的虚拟路由器,virtual_router_id不同
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh102      #不同的虚拟路由器,认证的密码不同
    }
    virtual_ipaddress {
        10.1.1.100/24 dev ens33 label ens33:2    #不同的虚拟路由器,VIP不同,别名也不能相同(或者两个VIP都使用辅助IP)
    }
}

3、通知脚本

  • 通知脚本:在keepalived状态发生变化时要执行的脚本,不但可以进行通知,也可以执行一些其他操作
  • 脚本文件名可以不加引号(如果只有文件名),也可以加引号(如果有参数)。
  • 如果指定username,用户组默认为用户所在组。
  • 如果未指定username,则默认使用全局的script_user和script_group

1、创建通知脚本

]# vim /apps/keepalived/notify.sh
#!/bin/bash
notify(){
    if ! [[ -f /apps/keepalived/notify.log ]]; then
        touch /apps/keepalived/notify.log
    fi
    echo "$(date +'%F %T') $(hostname) to be $1" >> /apps/keepalived/notify.log
}

case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    ;;
fault)
    notify fault
    ;;
stop)
    notify stop
    ;;
*)
    echo "Usage: $(basename $0) {master | backup | faulty | stop}" 
    exit 1
    ;;
esac
  • 添加可执行权限
]# chmod 744 /apps/keepalived/notify.sh

2、主备模式之主节点(10.1.1.11机器)

]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha11
    vrrp_mcast_group4 224.1.1.1
}

vrrp_instance VR_1 {
    state MASTER
    priority 100
    interface ens33
    virtual_router_id 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }

    notify_master "/apps/keepalived/notify.sh master"     #变为master时,要执行的脚本
    notify_backup "/apps/keepalived/notify.sh backup"     #变为backup时,要执行的脚本
    notify_fault  "/apps/keepalived/notify.sh fault"      #变为fault(发现网络接口down了就进入fault状态)时,要执行的脚本
    notify_stop   "/apps/keepalived/notify.sh stop"       #VRRP停止(keepalived停止)时,要执行的脚本
}

3、主备模式之备节点(10.1.1.12机器)

]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha12
    vrrp_mcast_group4 224.1.1.1
}

vrrp_instance VR_1 {
    state BACKUP
    priority 95 
    interface ens33
    virtual_router_id 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }

    notify_master "/apps/keepalived/notify.sh master"     #变为master时,要执行的脚本
    notify_backup "/apps/keepalived/notify.sh backup"     #变为backup时,要执行的脚本
    notify_fault  "/apps/keepalived/notify.sh fault"      #变为fault(发现网络接口down了就进入fault状态)时,要执行的脚本
    notify_stop   "/apps/keepalived/notify.sh stop"       #VRRP停止(keepalived停止)时,要执行的脚本
}

4、测试

#(1)启动10.1.1.12,观察VIP和notify.log文件(tailf /apps/keepalived/notify.log)
systemctl start keepalived.service
 
#(2)启动10.1.1.11,观察VIP和notify.log文件
systemctl start keepalived.service

#(3)停止10.1.1.11,观察VIP和notify.log文件
systemctl stop keepalived.service

#(4)停止10.1.1.12,观察VIP和notify.log文件
systemctl stop keepalived.service

4、通过ipvs实现负载均衡

  • keepalived通过ipvs实现负载均衡:
    • 根据后端服务器的健康情况,keepalived可以动态的调整ipvs规则。
    • 后端服务可以是任何服务,例如httpd、nginx、FTP等。

4.1、实验架构

  • 在10.1.1.11和10.1.1.12上安装LVM_DR模型、keepalived、httpd。
  • 在10.1.1.13和10.1.1.14上安装httpd。

4.2、配置RS和DS

4.2.1、配置RS

1、安装httpd,并创建index.html文件

//安装并启动httpd
]# yum install httpd -y
]# systemctl start httpd.service
  
//创建index.html文件,提供后端主机测试页
]# echo '<h1>RS, 10.1.1.13</h1>' > /var/www/html/index.html
]# echo '<h1>RS, 10.1.1.14</h1>' > /var/www/html/index.html

//创建check.html文件,提供后端主机健康状态检查测试页
]# echo '<h1>check</h1>' > /var/www/html/check.html

2、限制ARP通告和应答级别

//配置arp的内核参数,抑制arp的通告和应答
]# cat > /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
EOF
//使配置生效
]# sysctl -p

3、配置VIP

//将VIP配置到lo:0上
]# cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF
DEVICE=lo:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.1.1.99
PREFIX=32
EOF
//重启网络服务
]# systemctl restart network.service

4、在DS上测试两个RS上的httpd服务是否可用

]# curl 10.1.1.13
<h1>RS, 10.1.1.13</h1>
]# curl 10.1.1.14
<h1>RS, 10.1.1.14</h1>

4.2.2、配置DS

1、安装httpd,并创建index.html文件

//安装并启动httpd
]# yum install httpd -y
]# systemctl start httpd.service
  
//创建index.html文件,提供sorry测试页
]# echo '<h1>RS, 10.1.1.13</h1>' > /var/www/html/index.html
]# echo '<h1>RS, 10.1.1.14</h1>' > /var/www/html/index.html

2、安装keepalivde

  • 见前面的安装章节

3、配置keepalived

(1)主节点(10.1.1.11)

]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha11
    vrrp_mcast_group4 224.1.1.1
}

vrrp_instance VR_1 {
    state MASTER
    priority 100
    interface ens33
    virtual_router_id 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}

#定义一个ipvs虚拟服务
virtual_server 10.1.1.99 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 10.1.1.13 80{    #定义第一个后端服务器(RS)
        weight 1
        HTTP_GET {               #使用http协议进行健康状态检测
            url {
              path /check.html
              digest eb77028700d8705cfae778e12fb7d1df
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 10.1.1.14 80{    #定义第二个后端服务器(RS)
        weight 1
        TCP_CHECK {              #使用tcp协议进行健康状态检测
            retry 3
            delay_before_retry 2
            connect_timeout 3
        }
    }
}

(2)备节点(10.1.1.12)

]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha12
    vrrp_mcast_group4 224.1.1.1
}

vrrp_instance VR_1 {
    state BACKUP
    priority 95 
    interface ens33
    virtual_router_id 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}

#定义一个ipvs虚拟服务
virtual_server 10.1.1.99 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 10.1.1.13 80{    #定义第一个后端服务器(RS)
        weight 1
        HTTP_GET {               #使用http协议进行健康状态检测
            url {
              path /check.html
              digest eb77028700d8705cfae778e12fb7d1df
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 10.1.1.14 80{    #定义第二个后端服务器(RS)
        weight 1
        TCP_CHECK {              #使用tcp协议进行健康状态检测
            retry 3
            delay_before_retry 2
            connect_timeout 3
        }
    }
}

4、测试

  • 启动keepaived后,通过起停后端httpd服务观察ipvs规则。
]# systemctl stop httpd.service 
]# systemctl start httpd.service

]# ipvsadm -l

5、外部脚本

  • keepalived调用外部脚本进行资源监控,并根据监控的结果可以实现优先级的动态调整。进而高可用其他服务,如nginx。

5.1、怎样使用外部脚本

  • 要使用外部脚本,有两个步骤:
//(1)定义外部脚本
vrrp_script <SCRIPT_NAME> {
    #脚本的路径
    script <STRING>|<QUOTED-STRING>
    #周期性地执行脚本,间隔<interval>秒执行一次。(default: 1 second)
    interval <INTEGER>
    #调整优先级的权重(默认:0)。
        #负,执行成功不变,执行失败降权。
        #正,执行成功加权,执行失败不变。
    weight <INTEGER:-253..253> [reverse]
    #执行脚本连续成功n次,状态从fail转换到ok
    rise <INTEGER>
    #执行脚本连续失败n次,状态从ok转换到fail
    fall <INTEGER>
}

//(2)调用外部脚本
vrrp_instance <STRING> {
    track_script {
        <SCRIPT_NAME>
        <SCRIPT_NAME> weight <-253..253> [reverse|no_reverse]
    }
}

5.2、高可用nginx

1、架构图

  • keepalived仅提供高可用(即飘移vip)功能。
  • 负载均衡(向后端代理)是由nginx实现的。

2、编写脚本

]# vim /apps/keepalived/check_nginx.sh
#!/bin/bash
killall -0 nginx && exit 0 || exit 1

]# chmod 645 /apps/keepalived/check_nginx.sh

3、配置keepalive

  • 主节点
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha11
    vrrp_mcast_group4 224.1.1.1

    script_user root
    enable_script_security
}

#定义外部脚本
vrrp_script chk {
    script "/apps/keepalived/check_nginx.sh"
    interval 2
    rise 3
    fall 2
    weight -6
}

vrrp_instance VR_1 {
    state MASTER
    priority 100
    interface ens33
    virtual_router_id 101
    advert_int 1

    #调用外部脚本
    track_script {
        chk
    }

    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}
  • 备节点
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@hengha11
    smtp_server 127.0.0.1
    smtp_connect_timeout 30

    router_id hengha12
    vrrp_mcast_group4 224.1.1.1

    script_user root
    enable_script_security
}

#定义外部脚本
vrrp_script chk {
    script "/apps/keepalived/check_nginx.sh"
    interval 2
    rise 3
    fall 2
    weight -6
}

vrrp_instance VR_1 {
    state BACKUP
    priority 95 
    interface ens33
    virtual_router_id 101
    advert_int 1

    #调用外部脚本
    track_script {
        chk
    }

    authentication {
        auth_type PASS
        auth_pass hh101
    }
    virtual_ipaddress {
        10.1.1.99/24 dev ens33 label ens33:1
    }
}

4、问题

问题1:

  • 报错信息:Jul 30 19:55:15 11 Keepalived_vrrp[65006]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
  • 解决,在全局配置块中填写如下两个指令
script_user root
enable_script_security

6、使用Keepalived+ipvs实现负载均衡RabbitMQ

  • 参见:https://www.cnblogs.com/maiblogs/p/16482831.html

7、使用Keepalived+HAProxy实现负载均衡RabbitMQ

  • 参见:https://www.cnblogs.com/maiblogs/p/16482831.html
#                                                                                                                        #
posted @ 2022-07-29 22:26  麦恒  阅读(36)  评论(0编辑  收藏  举报