如何理解keepalived
是Linux下一个轻量级别的高可用解决方案,通过虚拟路由冗余协议来实现服务或者网络的高可用.
简单点说,例如你有个nginx集群,如何保证某台nginx出现问题,能自动剔除有问题的nginx,访问到正常的nginx?以及多台nginx向外界提供一个公共的ip供大家访问?
在每个nginx的服务器上都部署keepalived,通过keepalived的健康检查查看nginx是否正常。当nginx正常运行时,由 keepalived 选举的master这台服务器提供服务,这台服务器有会把虚拟IP(VIP)绑定在这条机器上。外界访问到的也是这台机器。如果这台机器健康检查失败后,会解绑虚拟ip,并剔除自己,其他backup机器会选举成为master,并绑定虚拟ip对外提供服务。因此即做到了故障后自动转移。上述的虚拟ip即是集群公共访问的ip。
总结:keepalived的核心功能为健康检查、故障转移、虚拟路由冗余协议(VRRP协议)。
keepalived容易出现的问题
当backup这台机器没接受到master的信号,然后自己成为了master,导致出现两个master,且两台机器绑定过了同一个虚拟ip,这种现象简称为脑裂
最常容易导致这种想象的是心跳检测出了问题,virtual_router_id两端参数配置,翻火墙端口被屏蔽了,实例名字不一致,优先级一致等问题。
一般解决方案为增加脑裂监控脚本,出现问题是可以先强行关闭一个节点,修改仲裁机制等。
下载安装
yum install keepalived –y
修改配置文件
/etc/keepalived/keepalivec.conf
启动
systemctl start keepalived.service
keepalived.conf配置注释
! Configuration File for keepalived
#全局配置
global_defs {
notification_email { #指定切换时需要发送eamil到收件人,一行一个
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
smtp_server 192.168.200.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtpl连接超时时间
router_id LVS_DEVEL #运行keepalived机器的标识
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#vrrp_instance模块配置
vrrp_instance VI_1 {
state MASTER #设置角色MASTER 或者BACKUP
interface eth0 #设置VIP的网卡
virtual_router_id 51 #虚拟路由ID,在一个VRRP实例中,主备服务器ID必须一样
priority 100 #优先级值设定:MASTER
advert_int 1 #通告时间间隔:单位秒,主备要一致
authentication { #认证机制,主从节点保持一致即可
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #VIP,可配置多个
192.168.200.16
192.168.200.17
192.168.200.18
}
}
#virtual_server模块配置
virtual_server 192.168.200.100 443 { #定义realServer对应的VIP及服务端口,ip和端口用空格隔开
delay_loop 6 #每隔6秒查询realServer状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind NAT #LVS调度算法 NAT/DR/TUN
persistence_timeout 50 #同一IP的连接60秒内被分配到同一台realServer
protocol TCP #用TCP协议检查realServer状态
real_server 192.168.201.100 443 {
weight 1 #权重越高,lvs就越优先访问
SSL_GET { #keepalived的健康检查方式HTTP_GET/SSL_GET/TCP_CHECK/SMTP_CHECK/MISC
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #10秒无响应超时
retry 3 #重连次数
delay_before_retry 3 重连间隔时间
}
}
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}