目录
前言
一、Keepalived工具介绍
1、Keepalived的作用
2、 Keepalived体系主要模块
二、keepalived工作原理
1、VRRP (虚拟路由冗余协议)
2、VRRP (虚拟路由冗余协议)
(1)keepalived.conf是主配置文件
(2)配置Keepalived slave服务器
三:LVS+keepalived的部署
1、配置负载调度器(主、备相同192.168.238.10、192.168.238.20、VIP:192.168.238.66)
2、配置节点服务器(192.168.238.30、192.168.238.40)
3、配置keeplived (主、备DR服务器上都要设置)
4、测试验证
四、keepalived脑裂
1、 什么是裂脑?
2、 keepalived脑裂产生的原因
3、常见的解决方案
企业应用中,单台服务器承担应用存在单点故障的危险单点故障一旦发生,企业服务将发生中断,造成极大的危害。
Keepalived一个基于VRRP 协议来实现的 LVS 服务高可用方案,可以利用其来解决单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
■专为LVS和HA设计的一款健康检查工具
●支持故障自动切换(Failover)
●支持节点健康状态检查(Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务重新切换回master节点。
●官方网站: http://www.keepalived.org/
双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
■实现基于Web服务的双机热备
Keepalived 提供了很好的高可用性保障服务,它可以检查服务器的状态,如果有服务器出现问题,Keepalived 会将其从系统中移除,并且同时使用备份服务器代替该服务器的工作,当这台服务器可以正常工作后,Keepalived 再将其放入服务器群中,这个过程是 Keepalived 自动完成的,不需要人工干涉,我们只需要修复出现问题的服务器即可。
Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能
keepalived体系架构中主要有三个模块,分别是
core、check和vrrp
。
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance、virtual_server。
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
- Keepalived可实现多机热备,每个热备组可有多台服务器。
- 双机热备的故障切换是由
虚拟P地址的漂移来实现
,适用于各种应用服务器。- Keepalived配置目录位于
/etc/keepalived/
global_defs {...}区段指定全局参数
vrrp_instance 实例名称{...}区段指定VRRP热备参数
注释文字以"∵"符号开头
目录samples,提供了许多配置样例作为参考
常用配置选项
router_id HA_TEST_R1:本路由器(服务器)的名称、主备名称要不一样
vrrp_instance Vl_1∶定义VRRP热备实例
state MASTER:热备状态,MASTER表示主服务器
interface ens33:承载VIP地址的物理接口
virtual_router_id 1 :虚拟路由器的ID号,每个热备组保持一致
priority 100:优先级,数值越大优先级越高
advert_int 1:通告间隔秒数(心跳频率)
auth_type PASS:认证类型
auth_pass 123456:密码字串
virtual_ipaddress { vip}:指定漂移地址(VIP),可以有多个
router_id:设为自有名称
state:设为BACKUP
priority:值低于主服务器
其他选项与master相同
router_id:设为自有名称
state:设为BACKUP
priority:值低于主服务器
主DR服务器:192.168.238.10
备DR服务器:192.168.238.20
Web服务器1:192.168.238.30
Web服务器2:192.168.238.40
漂移地址vip:192.168.238.66
客户端:192.168.238.195
systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm
modprobe ip_vs
cat /proc/net/ip_vs
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
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.238.66
NETMASK=255.255.255.255
service network restart 或systemctl restart network
ifup ens33:0
ifconfig ens33:0
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 192.168.238.66:80 -s rr
ipvsadm -a -t 192.168.238.66:80 -r 192.168.238.30:80 -g
ipvsadm -a -t 192.168.238.66:80 -r 192.168.238.40:80 -g
ipvsadm
ipvsadm -ln
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
--192.168.238.30---
echo 'this is xyw web! ' > /var/www/html/index.html
--192.168.238.40---
echo 'this is abc web! ' > /var/www/html/index.html
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.238.66
NETMASK=255.255.255.255
service network restart 或systemctl restart network
ifup lo:0
ifconfig lo:0
route add -host 192.168.238.66 dev lo:0
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
yum -y install keepalived
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1
-- 12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
router_id LVS_01
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state MASTER
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为99
priority 100
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型,
--27行--修改,指定验证密码,主备服务器保持--致
auth_pass abc123
}
virtual_ipaddress { #指定群集vip地址
192.168.238.66
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.238.66 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.238.30 80 {
weight 1 #节点的权重
45行--删除,添加以下健康检查方式
TCP CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 4 #添加重试间隔
}
}
real_server 192.168.238.40 80 { #添加第二个Web节点的地址、端口
weight 1
TCP_CHECK{
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
##删除后面多余的配置##
}
systemctl start keepalived
ip addr show dev ens33 #查看虚拟网卡vip
在客户端访问http://192.168.238.66/ ,默认网关指向192.168.238.66
再在主服务器禁用网卡后再测试,ifdown ens33:0
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
当两台高可用服务器在指定的时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源以及服务的所有权,而此时的两台高可用服务器对都还活着并作正常运行,这样就会导致同一个服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址(类似双端导入概念),当用户写入数据的时候可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据的丢失,这种情况就称为裂脑,也有的人称之为分区集群或者大脑垂直分隔。
发生脑裂,导致互相竞争同一个IP资源,就如同我们局域网内常见的IP地址冲突一样,两个机器就会有一个或者两个不正常,影响用户正常访问服务器。如果是应用在数据库或者是存储服务这种极重要的高可用上,那就导致用户发布的数据间断的写在两台服务器上的恶果,最终数据恢复及困难或者是难已恢复。
脑裂(split-brain): 指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。
对于无状态服务的HA,无所谓脑裂不脑裂;但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂。
脑裂产生的原因:
一般来说,裂脑的发生,有以下几种原因:
优先考虑心跳线路上的问题,在可能是心跳服务,软件层面的问题
1)高可用服务器对之间心跳线路故障,导致无法正常的通信。原因比如:
2)高可用服务器对上开启了防火墙阻挡了心跳消息的传输;
3)高可用服务器对上的心跳网卡地址等信息配置的不正确,导致发送心跳失败;
4)其他服务配置不当等原因,如心跳的方式不同,心跳广播冲突,软件出现了BUG等。
5)Keepalived配置里同一 VRRP实例如果virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:
多节点集群中,可以通过增加仲裁的机制,确定谁该获得资源,这里面有几个参考的思路:
1——增加一个仲裁机制。例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。
2——通过第三方软件仲裁谁该获得资源,这个在阿里有类似的软件应用