Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了能够实现高可用的VRRP功能。所以,Keepalived除了可以管理LVS软件外,还能够做为其余服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。html
Keepalived软件主要是经过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它可以保证当个别节点宕机时,整个网络能够不间断地运行。nginx
因此,Keepalived 一方面具备配置管理LVS的功能,同时还具备对LVS下面节点进行健康检查的功能,另外一方面也可实现系统网络服务的高可用功能。web
keepalived官网http://www.keepalived.org数据库
管理LVS负载均衡软件vim
实现LVS集群节点的健康检查中windows
做为系统网络服务的高可用性(failover)后端
Keepalived高可用服务对之间的故障切换转移,是经过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。浏览器
在 Keepalived服务正常工做时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点本身还活看,当主 Master节点发生故障时,就没法发送心跳消息,备节点也就所以没法继续检测到来自主 Master节点的心跳了,因而调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。bash
那么,什么是VRRP呢?服务器
VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是经过一种竞选机制来将路由的任务交给某台VRRP路由器的。
Keepalived的工做原理:
Keepalived高可用对之间是经过VRRP通讯的,所以,咱们从 VRRP开始了解起:
1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2) VRRP是经过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。
3) VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通讯。
4) 工做时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点能够有多个,经过优先级竞选,但通常 Keepalived系统运维工做中都是一对。
5) VRRP使用了加密协议加密数据,但Keepalived官方目前仍是推荐用明文的方式配置认证类型和密码。
介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工做原理:
Keepalived高可用对之间是经过 VRRP进行通讯的, VRRP是遑过竞选机制来肯定主备的,主的优先级高于备,所以,工做时主会优先得到全部的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,而后顶替主节点对外提供服务。
在 Keepalived服务对之间,只有做为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快能够小于1秒。
yum install keepalived -y
/etc/keepalived /etc/keepalived/keepalived.conf #keepalived服务主配置文件 /etc/rc.d/init.d/keepalived #服务启动脚本 /etc/sysconfig/keepalived /usr/bin/genhash /usr/libexec/keepalived /usr/sbin/keepalived
第二个里程碑: 进行默认配置测试
1-13行表示全局配置
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 LVS_DEVEL #定义路由标识信息,相同局域网惟一 }
15-30行 虚拟ip配置 brrp
vrrp_instance VI_1 { #定义实例 state MASTER #状态参数 master/backup 只是说明 interface eth0 #虚IP地址放置的网卡位置 virtual_router_id 51 #同一家族要一直,同一个集群id一致 priority 100 # 优先级决定是主仍是备 越大越优先 advert_int 1 #主备通信时间间隔 authentication { # ↓ auth_type PASS #↓ auth_pass 1111 #认证 } #↑ virtual_ipaddress { #↓ 192.168.200.16 设备之间使用的虚拟ip地址 192.168.200.17 192.168.200.18 } }
配置管理LVS
主负载均衡服务器配置
[root@lb01 conf]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id 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 } }
备负载均衡服务器配置
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id 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 } }
[root@lb02 ~]# /etc/init.d/keepalived start Starting keepalived: [ OK ]
测试连通性. 后端节点
[root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.8 web01 www [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.7 web02 www [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.9 web03 www [root@lb01 conf]# curl -H host:bbs.etiantian.org 10.0.0.9 web03 bbs [root@lb01 conf]# curl -H host:bbs.etiantian.org 10.0.0.8 web01 bbs [root@lb01 conf]# curl -H host:bbs.etiantian.org 10.0.0.7 web02 bbs
[root@lb01 conf]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:90:7f:0d brd ff:ff:ff:ff:ff:ff inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.3/24 scope global secondary eth0:1 inet6 fe80::20c:29ff:fe90:7f0d/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:90:7f:17 brd ff:ff:ff:ff:ff:ff inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1 inet6 fe80::20c:29ff:fe90:7f17/64 scope link valid_lft forever preferred_lft forever
Keepalived主备配置文件区别:
01. router_id 信息不一致
02. state 状态描述信息不一致
03. priority 主备竞选优先级数值不一致
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,原本为一总体、动做协调的HA系统,就分裂成为2个独立的个体。因为相互失去了联系,都觉得是对方出了故障。两个节点上的HA软件像“裂脑人”同样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,致使数据损坏(常见如数据库轮询着的联机日志出错)。
对付HA系统“裂脑”的对策,目前达成共识的的大概有如下几条:
1)添加冗余的心跳线,例如:双线条线(心跳线也HA),尽可能减小“裂脑”发生概率;
2)启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方彻底“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,若是占用共享盘的一方不主动“解锁”,另外一方就永远得不到共享磁盘。现实中假如服务节点忽然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。因而有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线所有断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
3)设置仲裁机制。例如设置参考IP(如网关IP),小心跳线彻底断开时,2个节点都各自ping一下参考IP,不通则代表断点就出在本端。不只“心跳”、还兼对外“服务”的本端网络链路断了,即便启动(或继续)应用服务也没有用了,那就主动放弃竞争,让可以ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以完全释放有可能还占用着的那些共享资源。
通常来讲,裂脑的发生,有如下几种缘由:
😶 高可用服务器对之间心跳线链路发生故障,致使没法正常通讯。
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
因心跳线间链接的设备故障(网卡及交换机)。
因仲裁的机器出问题(采用仲裁的方案)。
😶 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
😶 高可用服务器上心跳网卡地址等信息配置不正确,致使发送心跳失败。
😶 其余服务配置不当等缘由,如心跳方式不一样,心跳广插冲突、软件Bug等。
提示: Keepalived配置里同一 VRRP实例若是 virtual_router_id两端参数配置不一致也会致使裂脑问题发生。
在实际生产环境中,咱们能够从如下几个方面来防止裂脑问题的发生:
🎑 同时使用串行电缆和以太网电缆链接,同时用两条心跳线路,这样一条线路坏了,另外一个仍是好的,依然能传送心跳消息。
🎑 当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。至关于备节点接收不到心跳消患,经过单独的线路发送关机命令关闭主节点的电源。
🎑 作好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,下降损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员能够经过手机回复对应数字或简单的字符串操做返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
固然,在实施高可用方案时,要根据业务实际需求肯定是否能容忍这样的损失。对于通常的网站常规业务.这个损失是可容忍的。
在备服务器上进行监控,可使用zabbix监控,参考http://www.cnblogs.com/clsn/p/7885990.html
备上面出现vip状况:
1)脑裂状况出现
2)正常主备切换也会出现
[root@lb02 scripts]# vim check_keepalived.sh #!/bin/bash while true do if [ `ip a show eth0 |grep 10.0.0.3|wc -l` -ne 0 ] then echo "keepalived is error!" else echo "keepalived is OK !" fi done
编写完脚本后要给脚本赋予执行权限
[root@lb01 ~]# curl -H Host:www.etiantian.org 10.0.0.5 web01 www [root@lb01 ~]# curl -H Host:www.etiantian.org 10.0.0.6 web01 www [root@lb01 ~]# curl -H Host:bbs.etiantian.org 10.0.0.6 web02 bbs [root@lb01 ~]# curl -H Host:www.etiantian.org 10.0.0.5 web03 www
1)利用负载均衡服务器,在服务器上curl全部的节点信息(web服务器配置有问题)
2)curl 负载均衡服务器地址,能够实现负载均衡
3)windows上绑定虚拟IP,浏览器上进行测试
keepalived日志文件位置 /var/log/messages
修改nginx监听参数 listen 10.0.0.3:80;
修改内核参数,实现监听本地不存在的ip
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf sysctl -p [root@lb02 conf]# cat /proc/sys/net/ipv4/ip_nonlocal_bind
ps -ef |grep nginx |grep -v grep |wc -l
编写执行脚本
#!/bin/bash while true do if [ `ps -ef |grep nginx |grep -v grep |wc -l` -lt 2 ] then /etc/init.d/keepalived stop exit fi done
注意脚本的受权
[root@lb01 scripts]# chmod +x check_www.sh
说明 执行的脚本名称尽可能不要和服务名称相同或类似
[root@lb01 scripts]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lb01 } vrrp_script check { #定义脚本 script "“/server/scripts/check_web.sh" --- 表示将一个脚本信息赋值给变量check_web interval 2 --- 执行监控脚本的间隔时间 weight 2 ---利用权重值和优先级进行运算,从而下降主服务优先级使之变为备服务器(建议先忽略) } 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 } track_script { #调用脚本 check } }
[root@lb01 scripts]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lb01 } vrrp_script check { script "/server/scripts/check_www.sh" interval 2 weight 2 } 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 } track_script { check } } 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 } }
[root@lb02 conf]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id 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 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 dev eth0 label eth0:2 } }
修改nginx配置文件,让bbs 与www分别监听不一样的ip地址
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream server_pools { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } server { listen 10.0.0.3:80; server_name www.etiantian.org; location / { proxy_pass http://server_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } } server { listen 10.0.0.4:80; server_name bbs.etiantian.org; location / { proxy_pass http://server_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } } }
lb01
[root@lb01 scripts]# netstat -lntup |grep nginx tcp 0 0 10.0.0.3:80 0.0.0.0:* LISTEN 84907/nginx tcp 0 0 10.0.0.4:80 0.0.0.0:* LISTEN 84907/nginx
lb02
[root@lb02 conf]# netstat -lntup |grep nginx tcp 0 0 10.0.0.3:80 0.0.0.0:* LISTEN 12258/nginx tcp 0 0 10.0.0.4:80 0.0.0.0:* LISTEN 12258/nginx
本文出自“惨绿少年”,欢迎转载,转载请注明出处!http://blog.nmtui.com