好文一 https://www.cnblogs.com/dazhidacheng/p/8028474.html
keepalive起初专门为lvs负载均衡软件设计的,用来管理监控lvs集群系统中各个服务节点的状态,后来又加入了可以实现高可用的vrrp功能。
keepalive软件通过vrrp协议实现高可用功能的。VRRP(虚拟路由器冗余协议)目的就是为了解决静态路由单点故障问题,竞选机制来将路由的任务交给某台VRRP路由器的,保证节点宕机,整个网络可以不间断的运行
Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。
Keepalived高可用简单原理
master端的vrrp路由器会一直发送vrrp广播包,buckup会一直收到广播包,buckup不会抢占master资源,在backup上会一直监听,一旦收不到master的包,在多台backup中优先级最高的就会抢占为master
keepalive服务的三个重要功能
1、 管理LVS负载均衡软件
2、 实现对LVS集群节点健康检查功能
3、 作为系统网络服务的高可用功能
1、keepalive的配置文件
! Configuration File for keepalived global_defs { #全局定义 notification_email { #出问题了收件人 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Cassen@firewall.loc #发件人 smtp_server 192.168.200.1 #发件服务器地址 smtp_connect_timeout 30 #超时时间 router_id LVS_DEVEL #唯一标识,不同机器不能一样 } vrrp_instance VI_1 { #vrrp实例,名字可以自定义,与前面关键字空格隔开 state MASTER #标识是主还是备,一定要大写 interface eth0 #默认的通信的接口,当vip不指定时,默认绑定它 virtual_router_id 51 #实例的ID(主备必须一样,同一文件唯一,0-255) priority 100 #真正确定谁优先地方,数字越大,级别越高,越先获取资源,建议隔50 advert_int 1 #心跳间隔 authentication { #实例认证,主备一样 auth_type PASS auth_pass 1111 } virtual_ipaddress { #VIP地址 192.168.200.16 192.168.200.18/24 dev eth0 label eth0:1 } }
2、keepalive+nginx双主实战
2.1、nginx配置
在实际工作中有三个域名
www.etiantian.org blog.etiantian.org bbs.etiantian.org
它们的访问量都很大,可以配置不同的ip来结合keepalived进行负载,先用两个域名来测试:
10.0.0.3 www.etiantian.org 10.0.0.4 blog.etiantian.org
目地:在初始阶段,两不不同域名的服务跑在不同的机器上,(实际是互为主备的配置)
lb1: 10.0.0.3 www.etiantian.org lb2: 10.0.0.4 blog.etiantian.org
keepaived沿用上面互为主备的配置
以下是nginx的配置(分别在两台lb上做)
所需要做的就是监听ip
[root@LB01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream backend { server 172.16.1.8:80 weight=1; server 172.16.1.7:80 weight=1; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } server { listen 10.0.0.3:80; #这里要监听ip server_name blog.etiantian.org; location / { proxy_pass http://backend; #这加一定要加这个抛的字段,否则访问就访问成负载的主页了 include proxy.conf; } location /status { check_status; access_log off; } } server { listen 10.0.0.4:80; server_name blog.etiantian.org; location / { proxy_pass http://backend; include proxy.conf; } location /status { check_status; access_log off; } } }
2.2、keepalive配置文件
LB01:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { notification_email { 490238852@qq.com } notification_email_from 490238852@qq.com smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:2 } }
LB02:
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { 490238852@qq.com } notification_email_from 490238852@qq.com smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:2 } }
3、脑裂原因
一般来说脑裂问题有以下这几种原因:
- 高可用服务器对之间心跳线链路发生故障,导致无法正常通信
心跳线坏了(包括断了,老化)、
网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
心跳线之间的设备故障(网卡及交换机)、
仲裁的机器出现问题(才用仲裁的方案)
- 高可用服务器上开启了iptables防火墙,阻止了心跳传消息输
- 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
- 其他服务配置不当的原因,如心跳方式不同,心跳广播冲突,软件bug等
提示keepalive配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致脑裂问题
4、脑裂方案
在实际生产环境中,我们从以下方面防止脑裂:
- 同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息
- 当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源
- 做好对脑裂的监控报警
解决常见方案:
- 如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
- 可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
- 开发检测程序通过监控软件检测脑裂
5、nginx配置文件监听的网卡上不存在IP地址问题
报错:
[root@LB01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 10.0.0.4:80 failed (99: Cannot assign requested address) nginx: configuration file /application/nginx-1.6.3/conf/nginx.conf test failed
配置好后,出现无法绑定ip10.0.0.4:80,这是由于本地没有这个ip造成的,而这个ip是需要keepalived来生的,这样就无法进行配置nginx。
解决方法:
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p #生效
通过这个命令,系统就允许配置一个当前不存在的辅助ip
[root@LB01 ~]# /application/nginx/sbin/nginx -s stop #平滑重启没用,要关掉重启 [root@LB01 ~]# /application/nginx/sbin/nginx [root@LB01 ~]# netstat -ntpl|grep nginx tcp 0 0 10.0.0.4:80 0.0.0.0:* LISTEN 7431/nginx tcp 0 0 10.0.0.3:80 0.0.0.0:* LISTEN 7431/nginx
用来访问的机器上做解析访问检查
vim /etc/hosts
10.0.0.3 www.etiantian.org
10.0.0.4 blog.etiantian.org
用户在进行访问体验是没有什么不同的,web服务器也没有一点变动,只是实现了负载均衡器流量的分流,
这样做的好处是平均负载的压力,但是注意的是负载的能力,因为当其中一台宕机了,另一台马上起另一个vip接管资源,压力太大就是雪崩。
6、开发监听脑裂的脚本
keepalived是服务器级别的,只监控服务器,nginx宕机了,是没有办法接管的
cat /server/scripts/check_nginx_by_keep.sh #!/bin/sh while true do if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done
当负载器上出现nginxr的监听ip大于1时(或写做-eq 0 ,即等于0时),就杀掉keepalived进程,这样来实现web服务如nginx挂掉接管资源
7、指定日志输出文件
1、/etc/sysconfig/keepalived
修改为 KEEPALIVED_OPTIONS="-D -d -S 0"
2、/etc/rsyslog.conf
修改为 *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
最后加 local0.* /var/log/keepalived.log
3、重启
/etc/init.d/rsyslog restart
/etc/init.d/keepalived restart
好文二 https://www.cnblogs.com/chenlifan/p/13773723.html
centos 7 防止及解决keepalive脑裂现象(主备均有vip)
关于ARP信息介绍:
ARP表是一个动态表,存储在计算机当中,目的是做一个ip地址与mac地址的对应。假设在同一子网段,计算机A与计算机B通信
计算机A的ip地址: 192.168.0.11 MAC地址AA-AA-AA-AA-AA-AA
计算机B的ip地址: 已知192.168.0.12 MAC地址未知
那么计算机A就要发起一个ARP查询,“谁能告诉我,192.168.0.12的MAC地址是多少?”
很显然通过交换机的时候,交换机并不能看懂ip地址,所以要广播这个信息,就把这个查询信息发到除发送端的其它所有端口。(当然,交换机还要记住192.168.0.11主机的mac地址)
其它所有的计算机看到这个广播发现目的ip不是自己,就把这个数据丢弃,只有192..168.0.12的计算机B会响应,并发送回执,告诉计算机A,“我是192.168.0.12,我的MAC地址是AA-AA-AA-AA-AA-AB”当通过交换机,交换机记住从计算机B端口过来的MAC地址,并通过已知的A计算机MAC地址,发动到连接计算机A的端口。(此时不再广播)计算机A与计算机B都知道对方的ip和MAC地址,开始通信。 服务器网络环境中,因为路由交换层禁用了ARP的广播限制,造成KEEPALIVE主备协议无法通过广播的方式进行通信,造成主备两台服务器都强占HAVIP地址,出现同时两台服务器都有VIP地址的情况出现,必须通过配置来指定IP的两台服务器间进行通讯。 解决方法: 一 防火墙设置: a) firewalld 开启vrrp 协议
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
注释: eth0 为设备网卡, 224.0.0.18 为vrrp组播地址
firewall-cmd --reload
b)iptables
master(本地:192.168.0.11)
-A INPUT -i em1 -p vrrp -s 192.168.0.12 -j ACCEPT #(192.168.0.12 对端IP)
backup (本地:192.168.0.12)
-A INPUT -i em1 -p vrrp -s 192.168.0.11 -j ACCEPT #(192.168.1.11 对端IP)
二 keepalived 来指定IP的两台服务器间进行通讯。
添加配置如下: priority 100 ##主服务100 备服务90只要小于100就可以unicast_src_ip 192.168.0.11##(本地IP地址)
unicast_peer {
192.168.0.12##(对端IP地址)此地址一定不能忘记
}
好文三 https://www.cnblogs.com/fangxinxin/p/14802780.html
基于zabbix的监控keepalive脑裂
环境
主机 | ip | 应用 |
---|---|---|
master(node1) | 192.168.94.141 | keepalive,nginx |
slave(node2) | 192.168.94.143 | keepalived,nginx |
zabbix(node3) | 192.168.94.129 | zabbix,lamp |
zabbix部署详见这篇文章 https://www.cnblogs.com/fangxinxin/p/14630804.html
脑裂
在高可用系统中,联系节点“心跳线”断开时,作为整体的高可用系统,分裂为2个独立个体,他们会相互争夺资源。针对无状态服务则还好,有状态服务(如mysql)的高可用,脑裂会损坏数据,则必须防止。
产生的原因
- 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
- 因心跳线坏了(包括断了,老化)。
- 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
- 因心跳线间连接的设备故障(网卡及交换机)。
- 因仲裁的机器出问题(采用仲裁的方案)。
- 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
- 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
- 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
- Keepalived配置里同一 VRRP实例如果virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
常见解决方案
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:
-
同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。
-
当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。
-
做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍
实例监控
思路:判断标准为查看从服务器的vip是否存在,是则报警:可能主挂掉了或发生脑裂。
//从服务器上编写脚本
[root@node2 ~]# mkdir /script
[root@node2 ~]# cd /script
[root@node2 script]# vim chkvip.sh
#!/bin/bash
ip address show dev ens160 |grep 192.168.94.250/32
if [ $? -eq 0 ];then
echo '1'
else
echo '0'
fi
[root@node2 script]# chmod +x chkvip.sh
[root@node2 ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf
...
//自定义监控
UnsafeUserParameters=1
UserParameter=check_slave,/script/chkvip.sh
//zabbix监控机查看能否接受
[root@node3 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.94.143 -k check_slave
0