一。Keepalived工具
集群需要满足的特点:负载均衡,健康检查,故障切换
在应用中单台服务器承担负载应用存在单点故障的危险,一旦发生故障,企业服务将发生中断,造成损失
Keepalived工具专为LVS和HA(高可用)设计的一款健康检查工具
(1)支持故障自动切换(Failover)
(2)支持节点健康状态检查(Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障即时切换到backup节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务重新切回master节点
(3)官方网站:http://www.keepalived.org/
二。Keepalived及工作原理
Keepalived是一个基于底层协议是VRRP热备份协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
2.1)工作原理
在一个LVS服务集群中通常有主服务器 (MASTER)和备份服务器(BACKUP) 两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器, 当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
2.2)Keepalived体系主要模块及其作用
keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
core模块∶为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
vrrp模块∶是来实现VRRP协议的。
check模块∶负责健康检查,常见的方式有端口检查及URIL检查。
2.3)VRRP(虚拟路由冗余协议)
1. 是针对路由器的一种备份解决方案
2. 多台路由器组成一个热备组,通过共用的,虚拟IP地址对外提供服务
3. 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
4. 若当前在线的路由器失效,则其他路由器会,根据设置的优先级自动接替虚拟IP地址,继续提供服务
工作原理
(1)VRRP会把多台路由器组成一个虚拟路由器组vrid,VRRP会生成一个虚拟路由器 (包含虚拟IP和虚拟mac)
(2)局域网内的用户不关心哪个是主哪个是备,他们只用虚拟路由器的虚拟IP作为他们的网关实际上虚拟IP是承载在master路由器,也就是说实际的数据包是通过master进行转发
(3)master和backup是通过优先级来决定哪个是master,优先级最大的那台就是 master,其余小的都是backup
(4)backup只是用来监听Master定时发来的vrrp报文,如果超时未收到 master 发来的vrrp报文,backup就会抢占master地位,虚拟IP也会一起漂移到backup 上
三。keepalived 脑裂现象是如何产生的?那又如何解决?
在某一次故障切换后,原来的master并没有真正的挂掉 ,VIP还在,而backup 则已经抢占master地位,并也在本地配置了VIP,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。这时客户端发送请求都能够做出响应造成资源的争夺
解决思路
1. 网络的层面来解决 再加一条链路,需要一定的成本
2. 通过第三方监控软件的方式来解决 zabbix
既监控服务器的状态,也监控网络的流量
3. 在本地通过脚本方式来解决
在master主机通过if判断是否能够ping通backup主机,ping不通2种可能性,中间链路断掉了或backup宕机,再使用if判断使用ssh跳到某一台节点服务器ping backup主机 ,如果也ping 不通则判断backup宕机,如果Ping通则说明是中间链路问题,链路问题就手动关闭maseter的keepalived工具,让backup主机顶上
4. 编写监控脑裂脚本
vim check_keepalived.sh
#!/bin/bash
state=$(ip addr show ens33 | grep 192.168.150.200 | wc -l)
while true
do
if [ $state -ne 0 ]
then
echo "建立VIP"
else
echo "未建立VIP"
fi
done
5. 命令测试确保两台负载均衡能够正常负载
例如:
[root@dd ~]# curl -H Host:www.kgc.com 192.168.150.15
<h1>this is first 1 web!</h1>
四。实验搭建LVS+Keepalived高可用群集
主DR服务器:192.168.150.5
备DR服务器:192.168.150.10
web服务器1:192.168.150.15
web服务器2:192.168.150.20
VIP:192.168.150.200
客户端:192.168.150.100
1. 配置负载调度器 (主、备相同)
systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
(1)需要关闭icmp的重定向,不充当路由器
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
(2)启动ipvsadm工具
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C #清空规则
(3)配置keeplived(主、备DR服务器上都要设置)
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak #备份一下配置文件
vim keepalived.conf
。。。。。。。
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1 #该IP是本机回环地址
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,例如主为LVS_01,备为LVS_02
router_id LVS_01
--14行--注释或删除,取消严格遵守VRRP协议功能,否则VIP无法被连接
#vIrp_strict
}
vrrp_ instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state MASTER
--21行--修改,指定承载vip地址的物理接口
interface ens33
-22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
#如果设置非抢占模式,两个节点都必须加上配置nopreempt,抢占模式主机宕机,备机顶上,主机恢复则抢回master位,非抢占不会主动抢回
nopreempt
-23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
priority 100
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass abc123
}
virtual_ipaddress { #指定群集vip地址
192.168.150.200
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual server 192.168.150.200 80 {
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 50 #连接保持时间(秒)
protocol TCP #应用服务采用的是TCP协议
-43行--修改,指定第一个Web节点的地址、端口
real server 192.168.150.15 80 {
weight 1 #节点的权重
-45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 5 #添加连接超时(秒)
nb_get_retry 4 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
#添加第二个web节点的地址,端口以及健康检查方式
real server 192.168.150.20 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 4
delay_before_retry 3
}
}
###删除后面多余配置项
}
systemctl start keepalived
ip addr #查看虚拟网卡vip
*注意删除多余配置项后括号是否都补全,少括号依然可以启动成功但无法加载出虚拟网卡ip
2. 节点服务器配置
systemctl stop firewalld.service
setenforce 0
(1)配置承载VIP的虚拟口
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.150.200
NETMASK=255.255.255.255
ifup lo:0
ifconfig
#临时添加路由指定该接口承载VIP地址
route add -host 192.168.150.200 dev lo:0
或添加到开机自启
vim /etc/rc.d/rc.local
/usr/sbin/route add -host 192.168.150.200 dev lo:0
chmod +x /etc/rc.d/rc.local
(2)调整内核的ARP响应参数
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
(3)设置首页文件启动web服务
yum -y install httpd
192.168.150.15服务器
echo ‘<h1>this is first 1 web!</h1>’ > /var/www/html/index.html
192.168.150.20服务器
echo ‘<h1>this is first 2 web!</h1>’ > /var/www/html/index.html
systemctl start httpd
3. 测试验证
客户端访问http://192.168.150.200
再在主服务器关闭Keepalived进行测试
手动停止master上的keepalived服务,查看是否进行主备切换