Keepalived部署使用
###
1、 keepalived软件能干什么?
Keepalived软件起初是专为LVS负载均衡软件设计的,
用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能
①. 管理LVS负载均衡软件
②. 实现对LVS集群节点健康检查功能
③. 作为系统网络服务的高可用功能
2、keepalived软件工作原理?
1)VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。 2)VRRP是通过一种竞选协议机制来讲路由任务交给某台VRRP路由器的 3)VRRP是用过IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信的。 4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。 5)VRRP使用了加密协议加密数据,但keepalived官方目前还是推荐使用铭文的方式配置认证类型和密码 keepalived服务工作原理: keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过精选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,
然后顶替主节点对外提供服务。 在keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管速度
最快可以小于1秒。
3、服务器规划
服务器 | IP |
master(keepalived主节点) | 10.19.150.37 |
backup(keepalived备节点) | 10.19.150.38 |
virtual_ipaddress(虚拟IP) | 10.19.150.210 |
4、部署、启动keepalived
4.1、yum部署keepalived
yum install -y keepalived cd /etc/keepalived/ cp keepalived.conf{,.ori}
4.2、 keepalived.conf文件详解
基础参数说明: 第1行:注释,!号开头和#号开头一样,都是注释 第2行:是空行 第3~8行:定义服务故障报警的Email地址。作用是当服务发生切换或RS节点等有故障时,发报警邮件,这几行是可选配置,notification_email指定在keepalived发生事件时,需要发送Email地址,可以有多个,每行一个。 第9行:指定发送邮件的发送人,即发件人地址,也是可选的配置。 第10行:smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。 第11行:smtp_connect_timeout是连接smtp的超时时间,也是可选配置。 第12行:keepalived服务器的路由标识(router_id),在一个局域网内,这个标识(router_id)应该是唯一的。 大括号"{}":用来分隔区块,要成对出现。如果漏写了半个大括号,keepalived运行时,不会报错,但也不会得到预期的结果。另外,由于区块间存在多层嵌套关系,因此很容易遗漏区块结尾处的大括号,要特别注意。 更多参数信息请执行man keepalived.conf获得。
4.3、主服务器keepalive配置文件 #master服务器
cat > /etc/keepalived/keepalived.conf<<EOF ! Configuration File for keepalived global_defs { router_id LVS_01 } # vrrp_instance,实例名出自实例组group所包含的那些名字。 vrrp_instance VI_1 { # 定义keepalived实例信息,主备节点实例标识相同 state MASTER # 定义实例中主备状态角色(MASTER/BACKUP) interface eth0 # 设置主备服务器IP地址防止网卡位置 virtual_router_id 51 # 虚拟路由ID标识,不同实例不同,主备相同 priority 150 # 优先级,高优先级竞选为master advert_int 1 # 检查间隔,默认1秒 authentication { # 主备之间通过认证建立连接 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 定义主备服务器之间使用的虚拟IP,可多设,每行一个 10.19.150.210/24 } } #虚拟服务器virtual_server定义块 ,虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。
#该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在viyual_server模块中的,是子模块。 virtual_server 10.19.150.210 80 { # 定义对外提供服务的LVS的VIP以及port delay_loop 6 # 设置健康检查时间,单位是秒 lb_algo wrr # lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR # 负载均衡转发规则NAT|DR|RUN nat_mask 255.255.255.0 persistence_timeout 50 # 会话保持时间 protocol TCP # 指定转发协议类型,有TCP和UDP两种 real_server 10.19.150.37 80 { # 指定real server1的IP地址 weight 1 TCP_CHECK { connect_timeout 8 # 连接超时时间 nb_get_retry 3 # 重连次数 delay_before_retry 3 # 重连间隔时间 connect_port 80 #健康检查的端口 } } real_server 10.19.150.38 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
EOF
4.4、备服务器keepalive配置文件 #backup服务器配置文件
cat > /etc/keepalived/keepalived.conf<<EOF ! Configuration File for keepalived global_defs { router_id LVS_02 } 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.19.150.210/24 } } virtual_server 10.19.150.210 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 10.19.150.37 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.19.150.38 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } EOF
4.5、启动keepalived
systemctl start keepalived.service
5、master服务器查看虚ip
[root@rd keepalived]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 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 1e:00:14:00:00:23 brd ff:ff:ff:ff:ff:ff inet 10.19.150.37/24 brd 10.19.150.255 scope global dynamic eth0 valid_lft 1894001sec preferred_lft 1894001sec inet 10.19.150.210/24 scope global secondary eth0 valid_lft forever preferred_lft forever inet6 fe80::1c00:14ff:fe00:23/64 scope link valid_lft forever preferred_lft forever
6、keepalived脑裂
6.1、什么是脑裂
由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP 或服务在两端同时
存在而发生冲突,最严重的是两台主机占用同一个VIP 地址,当用户写入数据时可能会分别写入到两端 ,这可能会导致服务器两端的数据不一致或造成数据丢失 ,这种情况就被称为裂脑。
6.2、脑裂出现的原因
一般来说,裂脑的发生,有以下几种原因∶ 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。 心跳线坏了(包括断了,老化)。、 网卡及相关驱动坏了, IP 配置及冲突问题(网卡直连)。
心跳线间连接的设备故障(网卡及交换机)。
仲裁的机器出问题(采用仲裁的方案)。。 高可用服务器上开启了iptables 防火墙阻挡了心跳消息传输。 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件 Bug 等。 提示∶Keepalived配置里同一VRRP实例如果virtual_router_id 两端参数配置不一致,也会导致裂脑问题发生。
模拟keepalived脑裂情况: 1、 防火墙开启状态 开启防火墙即可模拟出脑裂的情况 /etc/init.d/iptables start 2、 心跳线断掉 3、 nginx 关闭
6.3、脑裂情况解决方案
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生∶
1、同时使用串行电缆和以太网电缆连接 ,同时用两条心跳线路 ,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。
2、当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如 Stonith、fence )。相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源。
3、做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警信息发送到管理员手机上,管理员可以通过手机
回复对应数字或简单的字符串操作返回给服务器 ,让服务器根据指令自动处理相应故障,这样解决故障的时间更短。
当然 ,在实施高可用方案时 ,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务,这个损失是可容忍的。
监控备服务器,及时关注是否发生脑裂:
告警条件:
只要被服务器上出现了VIP
备服务器出现VIP情况
脑裂情况出现
正常主备切换也会在备服务器出现VIP
编写监控脑裂脚本:
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
###