四、Keepalived
【1】、keepalived运行原理
- Keepalived检测每个服务器接节点状态
- 服务器节点异常或出现工作故障,keepalived将故障节点从集群系统中剔除
- 故障节点恢复后,Keepalived再将其加入到集群系统中
- 所有工作自动完成,无需人工干预
keepalived用于实现高可用集群
它的工作原理就是VRRP(虚拟冗余路由协议)
【2】、配置高可用集群
1、安装keepalived
yaml
# 通过剧本安装
---
- name: install ipvsadm
hosts: webservers
vars:
pkg: keepalived
roles:
- pkgs
# 或者是不通过剧本安装
yum install -y keepalived
配置keepalived
只需修改如下添加注释的内容
sh
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id web1 # 修改router_id
vrrp_iptables # 让keepalived自动添加iptables规则
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER # web1是主,state是master,web2是备份,state是BACKUP
interface eth0
virtual_router_id 51
priority 100 # 优先级,web1为主,优先级高。web2是备份,优先级要比web1低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
重启keepalived
sh
[root@web1:192.168.4.110 ~]$systemctl start keepalived.service
[root@web1:192.168.4.110 ~]$systemctl enable keepalived.service
2、检查IP
正确的结果应该是
web1上有虚拟IP:192.168.4.80
web2上没有
在web1挂掉后,web2上会出现虚拟IP地址
sh
[root@web1:192.168.4.110 ~]$ip a s eth0 | grep 80
inet 192.168.4.80/24 scope global secondary eth0
# web1挂掉后
[root@web2:192.168.4.120 ~]$ip a s eth0 | grep 80
inet 192.168.4.80/24 scope global secondary eth0
3、测试
sh
[root@ansible:192.168.4.66 ~]$curl http://192.168.4.80
Welcome to web1 on 192.168.4.110
# 将web1挂掉,虚拟IP就会回到web2上
[root@ansible:192.168.4.66 ~]$curl http://192.168.4.80
Welcome to web2 on 192.168.4.120
【3】、编写监控脚本
上面的配置虽然可以实现主备切换功能,但是存在一个bug,上面的配置实现主备切换的前提是web1(MASTER)关机、挂掉后才可以实现的切换
如果仅仅是将web1上的web服务关掉,那并不会实现主备之间的切换
因此我们需要编写一个监控脚本去实现当web服务停掉后,也可以实现主备切换
我们可以让keepalived监视80端口,如果80端口没有了,就切换主备
- 配置高可用集群时,keepalived只为服务器提供了VIP
- keepalived不知道服务器上运行了哪些服务
- MASTER服务器可以通过跟踪脚本监视本机的80端口,一旦本机80端口失效,则将VIP切换到BACKUP服务器
- keepalived对脚本的要求是,退出码为0表示访问成功,退出码为1则表示失效
sh
# shell脚本,实现了端口开启返回0,端口不开启返回1
#!/bin/bash
# 检查80端口是否开启
if netstat -tuln | grep -q :80; then
exit 0 # 端口开启,返回0
else
exit 1 # 端口未开启,返回1
fi
sh
# 修改keepalived配置文件,修改如下内容
vrrp_script chk_http_port
{
script "/home/check.sh"
interval 3
weight -20
}
vrrp_instance VI_1
{
...
track_script
{
chk_http_port
}
...
}
1、优先级更新的策略
keepalived会定时执行脚本 并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
如果脚本执行结果为0 ,并且weight 配置的值大于0 ,则优先级相应的增加
如果脚本执行结果非0 ,并且weight 配置的值小于0 ,则优先级相应的减少
其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
这里需要注意的是:
1) 优先级不会不断的提高或者降低
2) 可以编写多个检测脚 本并为每个检测脚本设置不同的weight
3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
2、vrrp_script中节点权重改变算法
在Keepalived集群中,其实并没有严格意义上的主、备节点
虽然可以在Keepalived配置文件中设置"state"选项为"MASTER"状态,但是这并不意味着此节点一直就是Master角色。
控制节点角色的是Keepalived配置文件中的"priority"值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的"weight"值,这两个选项对应的都是一个整数值
其中"weight"值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。
不设置weight在vrrp_script模块中,如果不设置"weight"选项值,那么集群优先级的选择将由Keepalived配置文件中的"priority"值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置"weight"值来实现
设置weight
vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败;
- weight 为正时 ,脚本检测成功时此weight会加到priority上 ,检测失败时不加;
- 主失败:
- 主 priority < 从 priority + weight 时会切换。
- 主成功:
- 主 priority + weight > 从 priority + weight 时,主依然为主
- weight 为负时 ,脚本检测成功时此weight不影响priority,检测失败时priority -- abs(weight)
- 主失败:
- 主 priority -- abs(weight) < 从priority 时会切换主从
- 主成功:
- 主 priority > 从priority 主依然为主