keepalived03-keepalived示例

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
]# 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机器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
]# 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
2
3
4
5
6
7
8
#(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机器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
]# 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机器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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、创建通知脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
]# 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
  • 添加可执行权限
1
]# chmod 744 /apps/keepalived/notify.sh

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
]# 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机器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
]# 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
2
3
4
5
6
7
8
9
10
11
#(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文件

1
2
3
4
5
6
7
8
9
10
//安装并启动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通告和应答级别

1
2
3
4
5
6
7
//配置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

1
2
3
4
5
6
7
8
9
10
//将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服务是否可用

1
2
3
4
]# 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文件

1
2
3
4
5
6
7
//安装并启动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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
]# 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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
]# 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规则。
1
2
3
4
]# systemctl stop httpd.service
]# systemctl start httpd.service
 
]# ipvsadm -l

5、外部脚本

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

5.1、怎样使用外部脚本

  • 要使用外部脚本,有两个步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//(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、编写脚本

1
2
3
4
5
]# vim /apps/keepalived/check_nginx.sh
#!/bin/bash
killall -0 nginx && exit 0 || exit 1
 
]# chmod 645 /apps/keepalived/check_nginx.sh

3、配置keepalive

  • 主节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
]# 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
    }
}
  • 备节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
]# 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.
  • 解决,在全局配置块中填写如下两个指令
1
2
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
1
#                                                                                                                        #
posted @   麦恒  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示

目录导航