Contents
8.16. keepalived高可用集群¶
8.16.1. 1.1. 高可用集群简介¶
什么是高可用集群¶
高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响降低到最小程度。
高可用集群的衡量标准¶
要保证集群服务100%时间永远完全可用,几乎可以说是一件不可能完成的任务。比如,淘宝在这几年双十一刚开始的时候,一下子进来买东西的人很多,访问量大,都出现一些问题,如下单后却支付不了。所以说只能保证服务尽可能的可用,当然有些场景相信还是可能做到100%可用的。
通常用平均无故障时间(MTTF:mean time to failure)来度量系统的可靠性,用平均故障维修时间(MTTR:mean time to restoration)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%。
自动切换/故障转移(FailOver)¶
自动切换阶段某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。
通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。
通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等)从该不具备法定票数的集群节点转移到故障转移域(Failover Domain,可以接收故障资源转移的节点)。
自动侦测¶
自动侦测阶段由主机上的软件通过冗余侦测线,经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。
常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。
脑裂¶
脑裂简介
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
脑裂产生的原因¶
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
因心跳线间连接的设备故障(网卡及交换机)。
因仲裁的机器出问题(采用仲裁的方案)。
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
常见的解决方案¶
1)添加冗余的心跳线¶
例如:双线条线(心跳线也HA),尽量减少“裂脑”发生几率;
2)启用磁盘锁¶
正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
3)设置仲裁机制¶
例如设置参考IP(如网关IP或某一个服务器),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
4)裂脑的监控报警¶
如邮件及手机短信等或值班
在问题发生时人为第一时间介入仲裁,降低损失。
当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。
当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍的。
其他高可用方案¶
heartbeat、pacemaker、 piranha(web页面)
8.16.2. 1.2. keepalived¶
keepalived是什么¶
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
keepalived工作原理¶
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master
组播¶
IPV4总共三种通信方式:单播,组播,广播。 组播是指以224.0.0.0地址作为通信地址的一种方式。
VRRP协议¶
keepalived主要有三个模块¶
分别是core、check和vrrp。 core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。 check负责健康检查,包括常见的各种检查方式。 vrrp模块是来实现VRRP协议的。
8.16.3. 实战案例1¶
环境:¶
初识keepalived,实现web服务器的高可用集群。
Server1:192.168.0.118
Server2:192.168.0.119
VIP:192.168.0.10
原理示例图¶
相关文档链接:
https://www.cnblogs.com/cxbhakim/p/9068833.html
server1¶
创建etc下的keepalived目录,编辑配置文件
$ yum -y install keepalived
$ vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 1 #设备在组中的标识,设置不一样即可
}
#vrrp_script chk_nginx { #健康检查
# script "/etc/keepalived/ck_ng.sh" #检查脚本
# interval 2 #检查频率.秒
# weight -5 #priority减5
# fall 3 #失败三次
# }
vrrp_instance VI_1 { #VI_1。实例名两台路由器相同。同学们要注意区分。
state MASTER #主或者从状态
interface ens32 #监控网卡
mcast_src_ip 192.168.0.118 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备要一致。同学们注意区分
priority 100 #优先级
advert_int 1 #心跳间隔
authentication { #秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #VIP
192.168.0.10/24
}
# track_script { #引用脚本
# chk_nginx
# }
}
# scp -r /etc/keepalived/keepalived.conf 192.168.0.119:/etc/keepalived/
systemctl enable keepalived.service
# 开机启动keepalived
安装Nginx
$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum -y install nginx
$ systemctl enable nginx.service
$ systemctl start nginx.service
$ vi /usr/share/nginx/html/index.html
$ curl -i localhost
$ systemctl start keepalived.service
server2¶
BACKUP服务器的配置需要几处修改
$ yum -y install keepalived
$ vi /etc/keepalived/keepalived.conf
state MASTER改为 state BACKUP
mcast_src_ip 192.168.0.118改为backup服务器实际的IP mcast_src_ip
192.168.0.119
priority 100改为priority 99
配置文件示例
! Configuration File for keepalived
global_defs {
router_id 2
}
#vrrp_script chk_nginx {
# script "/etc/keepalived/ck_ng.sh"
# interval 2
# weight -5
# fall 3
# }
vrrp_instance VI_1 {
state BACKUP
interface ens32
mcast_src_ip 192.168.0.119
virtual_router_id 55
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.0.10/24
}
# track_script {
# chk_nginx
# }
}
systemctl enable keepalived.service
安装Nginx
$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum -y install nginx
$ systemctl enable nginx.service
$ systemctl start nginx.service
$ vi /usr/share/nginx/html/index.html
$ curl -i localhost
$ systemctl start keepalived.service
client¶
访问VIP http://192.168.0.10
拔掉master的网线。
访问VIP http://192.168.0.10,观察网页已经切换
关于keepalived对nginx状态未知的问题
恢复之前的实验。启动两台主机的keepalived和nginx。确保页面访问正常。
关闭master的nginx服务 。systemctl stop nginx
继续访问VIP,请问页面是否会切换到slave呢?
请思考,nginx服务的状态和keepalived的关系。
原因是keepalived监控的是接口IP状态。无法监控nginx服务状态
编辑监控脚本¶
server1¶
# 添加Nginx监控脚本
vi /etc/keepalived/ck_ng.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
service nginx start
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
service keepalived stop
fi
fi
chmod +x /etc/keepalived/ck_ng.sh
server2¶
# 添加Nginx监控脚本
vi /etc/keepalived/ck_ng.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
service nginx start
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
service keepalived stop
fi
fi
chmod +x /etc/keepalived/ck_ng.sh
启动监控脚本¶
清除掉配置文件中的注释。重启keepalived即可
nginx状态测试¶
因为脚本中有拉起nginx的语句,测试时可以将脚本文件位置进行改变。观察脚本的效果。
8.16.4. 实战案例2¶
环境¶
keepalived+lvs集群
192.168.0.116 dr1 负载均衡器 master
192.168.0.117 dr2 负载均衡器
192.168.0.118 rs1 web1
192.168.0.119 rs2 web2
拓扑¶
master¶
1.在master上安装配置Keepalived:
# yum install keepalived ipvsadm -y
ipvsadm安装并不启动
2.在master上修改配置文件
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Director1 #两边不一样。
}
vrrp_instance VI_1 {
state MASTER #另外一台机器是BACKUP
interface ens32 #心跳网卡
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 150 #优先级
advert_int 1 #检查间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.20/24 dev ens32 #VIP和工作端口
}
}
virtual_server 192.168.0.20 80 { #LVS 配置,VIP
delay_loop 3 #服务论询的时间间隔,#每隔3秒检查一次real_server状态
lb_algo rr #LVS 调度算法
lb_kind DR #LVS 集群模式
protocol TCP
real_server 192.168.0.118 80 {
weight 1
TCP_CHECK {
connect_timeout 3 #健康检查方式,连接超时时间
}
}
real_server 192.168.0.119 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
backup¶
# 在backup上安装keepalived:
# yum install keepalived ipvsadm -y
ipvsadm安装并不启动
# 拷贝master上的keepalived.conf到backup上:
# scp 192.168.0.116:/etc/keepalived/keepalived.conf 192.168.0.117:/etc/keepalived/
#拷贝后,修改配置文件
router_id Director2
state BACKUP
priority 100
配置示例
! Configuration File for keepalived
global_defs {
router_id Director2
}
vrrp_instance VI_1 {
state BACKUP #另外一台机器是BACKUP
interface ens32 #心跳网卡
virtual_router_id 52
priority 100 #优先级
advert_int 1 #检查间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.20/24 dev ens32 #VIP和工作端口
}
}
virtual_server 192.168.0.20 80 { #LVS 配置,VIP
delay_loop 3 #服务论询的时间间隔
lb_algo rr #LVS 调度算法
lb_kind DR #LVS 集群模式
protocol TCP
real_server 192.168.0.118 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.0.119 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
master和backup上启动服务¶
#systemctl enable keepalived
# systemctl start keepalived
#reboot
web服务器配置¶
web1和web2同配置
安装web测试站点
yum install -y httpd && systemctl start httpd && systemctl enable httpd
netstat -antp | grep httpd
# elinks 127.0.0.1
# 自定义web主页,以便观察负载均衡结果
配置虚拟地址¶
#cp /etc/sysconfig/network-scripts/{ifcfg-lo,ifcfg-lo:0}
\#vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.0.20
NETMASK=255.255.255.255
ONBOOT=yes
其他行注释掉
配置路由¶
#vim /etc/rc.local
/sbin/route add -host 192.168.0.20 dev lo:0
在两台机器(RS)上,添加一个路由:route add -host 192.168.0.20 dev lo:0
确保如果请求的目标IP是$VIP,那么让出去的数据包的源地址也显示为$VIP
配置ARP¶
\# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
忽略arp请求
可以回复
###### reboot
测试¶
1)观察lvs路由条目¶
# master上 查询
$ ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.0.124:http Route 1 0 0
2)观察vip地址在哪台机器上¶
# master上 查询
$ ip a
ens32:
inet 192.168.0.120/24 brd 192.168.0.255 scope global dynamic ens32
inet 192.168.0.20/32 scope global ens32
3)客户端浏览器访问vip¶
4)关闭master上的keepalived服务,再次访问vip¶
#master上 关闭
$ systemctl stop keepalived.service
5)关闭web1站点服务,再次访问VIP¶
# web1
$ systemctl stop httpd
思考题¶
1.什么是集群?集群分为哪些类型?列举代表的产品。
2.有些负载均衡集群服务?他们有什么区别?
3.LVS-DR和LVS-NAT的工作原理。
4.keepalived的工作原理。
5.高可用集群有哪些产品。他们的区别。
6.负载均衡集群的策略有哪些?能否举例说明?
8.16.5. 相关参考文献¶
http://www.361way.com/keepalived-framework/5208.html