目录
一、keepalived.conf
配置文件说明
! Configuration File for keepalived
# 第一部分: 全局块
global_defs {
# 接收邮件的邮箱列表
notification_email {
123@163.com
}
# 指定发件人
notification_email_from eric@qq.com
# 添加邮件服务器地址
smtp_server smtp.exmail.qq.com
# 设置邮件服务器连接超时时长
smtp_connect_timeout 30
# 每个keepalived节点的唯一标识,建议设置为当前主机名,多个节点重名时是不受影响的,用于邮件通知;
router_id keepalived126
# keepalived会以对所有通告报文检查,比较消耗性能,启用此配置后,如果收到的通告报文和上一个是同一个路由器则跳过检查,默认值为全检查
vrrp_skip_check_adv_addr
# 可设置ARP接口之间发送免费报文的延迟时间,可以精确到毫秒,默认是0
vrrp_garp_interval 0
# 设置非请求消息的发送延迟时间,默认为0
vrrp_gna_interval 0
# 表示严格遵守VRRP协议,启用此项后以下状况将无法启动服务——
# a. 未设置VIP地址
# b. 配置了单播邻居
# c. 在VRRP的2版本中带有IPV6地址,如果开启了此项后没有设置vrrp_iptables则会自动开启iptables防火墙规则,导致VIP地址无法访问,建议不加此项
vrrp_strict
# 与vrrp_strict同时设置时可禁止iptables规则的生成,注释或者无vrrp_strict时可不加此项
vrrp_iptables
# 可指定组播IP范围,可选择224.0.0.0到239.255.255.255之间的地址,默认为224.0.0.18
vrrp_mcast_group4 224.0.0.18
}
#第二部分:vrrp_instance,实例名出自实例组group所包含的那些名字。
# 1 vrrp_script checkhaproxy这里是一个执行脚本,定时2S执行一次,可监控haproxy情况,haproxy故障keepalived权重减20(不监控可去掉)
vrrp_script checkhaproxy{
script "/etc/keepalived/check_haproxy.sh"
# 监控时间间隔
interval 2
# 负载参数
weight -20
}
# 2 VRRP协议 实例块
# vrrp_instance模块后面的STRING为VRRP的实例名,一般设置为业务名称
vrrp_instance VI_1{
# 定义当前keepalived的服务器是MASTER还是BACKUP(两台都配置成MASTER和BACKUP暂未发现区别)。
# 两台都设置成BACKUP且没设置nopreempt,VIP漂移到priority大的节点,haproxy故障VIP漂移;
# 两台都设置成BACKUP且设置nopreempt,哪个keepalived先启动,哪个就是主节点,haproxy故障VIP不漂移;
# 两台都设置成BACKUP且一台设置nopreempt另一台没有设置nopreempt,haproxy故障时VIP不漂移到设置nopreempt的服务器。
state BACKUP
# 指定虚拟IP定义在那个网卡上面(本机指定为ens160 网卡)
interface ens160
# 虚拟路由ID,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一,范围是0-255
virtual_router_id 111
# 设置当前节点在此虚拟路由器中的优先级,优先级取值范围为1-254,值越大优先级越高
priority 160
# 设置 nopreempt 防止抢占资源
nopreempt
# 主备服务器之间的通信间隔,单位是秒,默认1秒。
advert_int 1
# 配置单播的源地址,即本机地址
unicast_src_ip 192.168.220.129
# 配置单播的目标地址,即对方节点地址,备有多台就配置多个地址
unicast_peer {
192.168.192.26
}
# 在切换到master状态后,延迟进行gratuitous ARP请求
preempt_delay #抢占延时,默认5分钟
# 服务器之间的认证方式
authentication {
# 认证类型,分为AH和PASS,AH为IPSC互联网安全协议认证,PASS为简单密码认证,推荐PASS认证。
auth_type PASS
# 认证所使用的密码,仅前8位有效,同一虚拟路由器的多个keepalived节点auth_pass值必须一致。
auth_pass 12345678
}
# 定义虚拟IP块。客户通过该ip访问服务器
virtual_ipaddress {
192.168.180.168/24
}
#不监控nginx可去掉
track_script { ######执行监控nginx进程的脚本
check_nginx
}
# 第四部分:虚拟服务器virtual_server定义块,该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在virtual_server模块中的,是子模块。
virtual_server 192.168.180.168 23 { # VIP地址,要和vrrp_instance模块中的virtual_ipaddress地址一致
delay_loop 6 # 健康检查时间间隔
lb_algo rr # lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT # 负载均衡转发规则NAT|DR|RUN
persistence_timeout 50 # 会话保持时间
protocol TCP # 使用的协议
persistence_granularity <NETMASK> # lvs会话保持粒度
virtualhost <string> # 检查的web服务器的虚拟主机(host:头)
sorry_server<IPADDR> <port> # 备用机,所有realserver失效后启用
real_server 192.168.220.129 23 { # RS的真实IP地址
weight 1 # 默认为1,0为失效
inhibit_on_failure # 在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up <string> | <quoted-string> # 在检测到server up后执行脚本
notify_down <string> | <quoted-string> # 在检测到server down后执行脚本
TCP_CHECK { # 常用
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 3 # 重连间隔时间
connect_port 23 # 健康检查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET{ # 不常用
url{ # 检查url,可以指定多个
path /
digest <string> # 检查后的摘要信息
status_code 200 # 检查的返回状态码
}
connect_port <port>
bindto <IPADD>
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}
SMTP_CHECK{ # 不常用
host{
connect_ip <IP ADDRESS>
connect_port <port> # 默认检查25端口
bindto <IP ADDRESS>
}
connect_timeout 5
retry 3
delay_before_retry 2
helo_name <string> | <quoted-string> # smtp helo请求命令参数,可选
}
MISC_CHECK{ # 不常用
misc_path <string> | <quoted-string> # 外部脚本路径
misc_timeout # 脚本执行超时时间
misc_dynamic # 如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
}
}
}
环境
[root@test1 ~]# keepalived -v
Keepalived v1.3.5 (03/19,2017)
HostName | IP | DES |
---|---|---|
test1 | 192.168.180.46 | master |
test2 | 192.168.180.47 | node-1 |
test3 | 192.168.180.48 | node-2 |
test4 | 192.168.181.18 | node-3 |
主节点
一、安装部署
[root@test1 ~]# yum install -y keepalived
二、配置文件
查看当前要指定虚IP的网卡
[root@test1 ~]# ip addr | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.180.46/24 brd 192.168.180.255 scope global noprefixroute ens160
[root@test1 ~]#
[root@test1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
123@163.com
}
notification_email_from 123@163.com
smtp_server smtp.exmail.qq.com
smtp_connect_timeout 30
router_id app46
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx { # 定义监控nginx的脚本
script "/etc/keepalived/check_nginx.sh"
interval 1 # 监控时间间隔
weight -2 # 负载参数
}
vrrp_instance VI_1 {
## 主机配置,从机为BACKUP 这里状态都指定为backup
state BACKUP
## 网卡名称(需要修改)
interface ens160
virtual_router_id 199
## 权重值,值越大,优先级越高,backup设置比master小,这样就能在master宕机后讲backup变为master,而master回复后就可以恢复.
priority 100 ##另一个节点,数值改为90(需要修改)
#nopreempt ###设置 nopreempt 防止抢占资源
advert_int 1 ######服务器之间的存活检查时间
authentication {
auth_type PASS
auth_pass 30099
}
virtual_ipaddress {
## 同一网段虚拟IP(需要修改)
192.168.180.60/24
}
track_script { ######执行监控nginx进程的脚本
check_nginx
}
}
[root@test1 keepalived]# cat check_nginx.sh
#/bin/bash
counter=$(netstat -lntp|grep 30099|wc -l)
if [ "${counter}" = "0" ]; then
exit 1
else
exit 0
fi
三、启动
[root@test1 ~]# systemctl start keepalived.service && systemctl enable keepalived.service && systemctl status keepalived.service
四、查看是否创建成功
[root@test1 ~]# ip add | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.180.46/24 brd 192.168.180.255 scope global noprefixroute ens160
# 发现多了一个虚拟IP就是成功了
inet 192.168.180.60/24 scope global secondary ens160
[root@test1 ~]#
[备节点]
一、安装部署
[root@test2 ~]# yum install -y keepalived
二、配置文件
查看当前要指定虚IP的网卡
[root@test2 ~]# ip add | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.180.47/24 brd 192.168.180.255 scope global noprefixroute ens160
[root@test2 ~]#
[root@test2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
123@163.com
}
notification_email_from 123@163.com
smtp_server smtp.exmail.qq.com
smtp_connect_timeout 30
router_id app47
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx { ##定义监控nginx的脚本
script "/etc/keepalived/check_nginx.sh"
interval 1 ######监控时间间隔
weight -2 ######负载参数
}
vrrp_instance VI_1 {
## 主机配置,从机为BACKUP 这里状态都指定为backup
state BACKUP
## 网卡名称(需要修改)
interface ens160
virtual_router_id 199
## 权重值,值越大,优先级越高,backup设置比master小,这样就能在master宕机后讲backup变为master,而master回复后就可以恢复.
priority 90
#nopreempt ###设置 nopreempt 防止抢占资源
advert_int 1 ######服务器之间的存活检查时间
authentication {
auth_type PASS
auth_pass 30099
}
virtual_ipaddress {
## 同一网段虚拟IP(需要修改)
192.168.180.60/24
}
track_script { ######执行监控nginx进程的脚本
check_nginx
}
}
[root@test1 keepalived]# cat check_nginx.sh
#/bin/bash
counter=$(netstat -lntp|grep 30099|wc -l)
if [ "${counter}" = "0" ]; then
exit 1
else
exit 0
fi
三、启动
[root@test2 ~]# systemctl start keepalived.service && systemctl enable keepalived.service && systemctl status keepalived.service
四、查看是否创建成功
备节点与主节点不同,需要停掉主节点,备节点才可以查到虚拟IP;
由此可见,KeepAlived 高可用是通过动态切换生成虚拟IP地址来达到的高可用!
[root@test2 ~]# ip add | grep ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.180.47/24 brd 192.168.180.255 scope global noprefixroute ens160
# 发现多了一个虚拟IP就是成功了
inet 192.168.180.168/24 scope global secondary ens160
[root@test2 ~]#
常见问题
1 VRID 问题
Dec 4 09:18:45 test1 Keepalived_vrrp[27680]: VRRP_Instance(ERIC_VI_1) ignoring received advertisment...
Dec 4 09:18:46 test1 Keepalived_vrrp[27680]: (ERIC_VI_1): ip address associated with VRID 51 not present in MASTER advert : 192.168.180.47
Dec 4 09:18:46 test1 Keepalived_vrrp[27680]: bogus VRRP packet received on ens160 !!!
# 原因
# virtual_router_id 51 有冲突
# 解决办法
# 修改配置文件中 virtual_router_id 的值 51 改为 56 或其它值
2 虚拟IP 无法ping通
keepalived.conf 配置中默认 vrrp_strict
打开了,需要把它注释掉。重启keepalived即可ping通。
vrrp_script详解
1、vrrp_script能做什么
keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务进程,比如说nginx,keepalived+nginx实现nginx的负载均衡高可用,如果nginx异常,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换。这个时候,我们可以通过编写脚本对业务进程进行检测监控。
例如:编写个简单脚本查看haproxy进程是否存活
#!/bin/bash
count = `ps aux | grep -v grep | grep haproxy | wc -l`
if [ $count > 0 ]; then
exit 0
else
exit 1
fi
在keepalived的配置文件中增加相应配置项
vrrp_script checkhaproxy
{
script "/home/check.sh"
interval 3
weight -20
}
vrrp_instance test
{
...
track_script
{
checkhaproxy
}
...
}
2、优先级更新策略
keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
这里需要注意的是:
1) 优先级不会不断的提高或者降低
2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight
3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。
3、vrrp_script中节点权重改变算法
在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。
3.1、不设置weight
在vrrp_script模块中,如果不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置“weight”值来实现。
3.2、设置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 主依然为主
4、配置不抢占nopreempt带来的问题
例如:A,B两台keepalived
A的配置大概为:
vrrp_script checkhaproxy
{
script "/etc/check.sh"
interval 3
weight -20
}
vrrp_instance test
{
....
state backup
priority 80
nopreempt
track_script
{
checkhaproxy
}
....
}
B的配置大概为:
vrrp_script checkhaproxy
{
script "/etc/check.sh"
interval 3
weight -20
}
vrrp_instance test
{
....
state backup
priority 70
track_script
{
checkhaproxy
}
....
}
A,B同时启动后,由于A的优先级较高,因此通过选举会成为master。当A上的业务进程出现问题时,优先级会降低到60。此时B收到优先级比自己低的vrrp广播包时,将切换为master状态。那么当B上的业务出现问题时,优先级降低到50,尽管A的优先级比B的要高,但是由于设置了nopreempt,A不会再抢占成为master状态。
所以,可以在检测脚本中增加杀掉keepalived进程(或者停用keepalived服务)的方式,做到业务进程出现问题时完成主备切换。