目录
5.1.1 安装ipvsadm并开启、安装keepalived
5.2.1 关闭防火墙,安装ipvsadm和keepalived服务
5.2.2 调整proc 相应参数,关闭Linux内核的重定向参数响应
一、Keepalived工具介绍
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
Keepalived是专为LVS和HA设计的一款健康检查工具:
-
支持故障自动切换(Failover)
-
支持节点健康状态检查(Health Checking)
- 判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务重新切换回master节点。
-
官方网站: www.keepalived.orgl
二、Keepalived原理
2.1 Keepalived采用VRRP热备份协议
Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能。
VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案:
- 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务。
- 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态。
- 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务。
- 在配置时设置优先级,优先级高的那一方为master。master节点承载着VIP地址。
2.2 Keepalived多机热备
Keepalived可实现多机热备,每个热备组可有多台服务器。(由于服务器的成本较高,一般使用2~3台服务器做热备组,大部分公司都是1主1备两台服务器)
双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器。
2.3 Keepalived工作原理
- ① Keepalived 是一个基于VRRP 协议来实现的 LVS服务高可用方案,可以解决静态路由出现的单点故障问题
- ② 在一个LVS服务集群中通常有 主服务器(MASTER)和 备份服务器(BACKUP) 两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送 VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
- ③ 在Keepalived 服务之间,只有作为主的服务器会一直发送VRRP广播包,告诉备还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。
2.4 Keepalived 体系主要模块及其作用
keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
- core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
- vrrp模块:是来实现VRRP协议的。
- check模块:负责健康检查,常见的方式有端口检查及URL检查。
三、Keepalived 服务主要功能
3.1 管理LVS负载均衡软件
Keepalive可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动、停止功能。
3.2 支持故障自动切换(Failover)
Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器。
Keepalived 高可用功能实现的简单原理为,两台主机同时安装好 Keepalived 软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为 Master 主机的热备;当角色为Master 的主机失效或出现故障时,角色为Backup 的主机将自动接管 Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放 Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
3.3 实现LVS集群中节点的健康检查
Keepalived 可以通过在自身的 Keepalived.conf 文件里配置 LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived 服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived 服务又会自动地把它们加入到正常转发队列中,对客户提供服务。
3.4 实现LVS负载调度器、节点服务器的高可用性
一般企业集群需要满足三个特点: 负载均衡、健康检查、故障切换 ,使用 LVS+Keepalived 完全可以满足需求。
keepalived的检查方式
① ping方式检查(不全面)
② 基于脚本检查(周期检查master服务器的服务是否停止,停止之后使用停止keepalived,进行漂移,并邮件告警)
3.5 keepalived 高可用故障切换转移原理
keepalived 高可用服务对集群之间的故障切换转移,是通过 VRRP(虚拟路由器冗余协议)来实现的。
在 keepalived 服务正常工作时,主(Master)节点会不断地向备(Backup)节点发送(多播的方式)心跳消息,用以告诉备节点自己还活看,当主节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主节点的心跳了,于是调用自身的接管程序,接管主节点的 IP 资源及服务。而当主节点恢复时,备节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。
3.6 VRRP通信原理
① VRRP也就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障。
② VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
③ VRRP用IP多播的方式(默认多播地址(224.0.0.18))实现高可用之间通信。
④ 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
⑤ VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
四、脑裂的形成和解决办法
4.1 什么是脑裂
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
4.2 脑裂产生的原因
- 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
- 因心跳线坏了(包括断了,老化)。
- 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
- 因心跳线间连接的设备故障(网卡及交换机)。
- 因仲裁的机器出问题(采用仲裁的方案)。
- 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
- 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
- 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
- ...............
4.3 常见的解决方案
- 添加冗余的心跳线,例如:双线条线(心跳线也HA)
- 启动“智能”磁盘锁,只有正在提供服务的MASTER节点才能锁住或者解锁共享磁盘,当MASTER节点出现了短暂的网络堵塞等情况时会自动加锁,BACKUP节点也无法接管资源,只有当MASTER出现故障无法提供服务时才会自动解锁共享磁盘,并交由BACKUP节点接管
- 设置仲裁机制,例如出现检测不到心跳线的情况时,MASTER节点和BACKUP节点都去ping一下网关IP,如果ping不通则主动释放资源或者放弃抢占资源
- 通过脚本来监控和监测节点是否处于正常工作状态,如果MASTER节点出现了异常,并在脚本设定的期限内无法恢复正常,则杀死当前MASTER的服务进程,将资源交由BACKUP节点来接管
五、LVS-DR模式+keepalived 高可用集群部署
实验环境:
主DR调度器:
备DR调度器:
web1:
web2:
VIP:
客户端:
5.1 配置主负载调度器(LVS-DR)
5.1.1 安装ipvsadm并开启、安装keepalived
yum -y install ipvsadm keepalived 下载ipvsadm keepalived
modprobe ip_vs 加载ip_vs模块
cat /proc/net/ip_vs 查看模块版本信息
ipvsadm-save > /etc/sysconfig/ipvsadm 生成文件 保存策略
systemctl start ipvsadm 开启
5.1.2 调整LVS中proc响应参数
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 加载内核配置参数生效
5.1.3 修改配置文件keeplived.conf
修改配置文件keeplived.conf
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
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
#vrrp_strict
}
vrrp_instance VI_1 { 定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state MASTER
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
#nopreempt 如果设置非抢占模式,两个节点state必须为bakcup,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
priority 110
advert_int 1 通告间隔秒数(心跳频率)
authentication { 定义认证信息,每个热备组保持一致
auth_type PASS 认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass 123456
}
virtual_ipaddress { 指定群集vip地址
192.168.100.22
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.100.22 80 {
delay_loop 6 健康检查的间隔时间(秒)
lb_algo rr 指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 6 连接保持时间(秒)
protocol TCP 应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
real_server 192.168.100.40 80 {
weight 1 节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 添加检查的目标端口
connect_timeout 3 添加连接超时(秒)
nb_get_retry 3 添加重试次数
delay_before_retry 3 添加重试间隔
}
}
real_server 192.168.100.50 80 { 添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
删除后面多余的配置##
配置文件内容
5.1.4 配置vip (虚拟子接口IP)
5.1.5 开启keepalived服务,查看虚拟IP
systemctl start keepalived 开启 keepalived 服务
ip addr 查看ip
5.1.6 配置负载分配策略(ipvsadm)
ipvsadm -C #清除规则
ipvsadm -A -t 192.168.114.120:80 -s rr #添加虚拟VIP,分流模式为轮询
ipvsadm -a -t 192.168.114.120:80 -r 192.168.114.100:80 -g
ipvsadm -a -t 192.168.114.120:80 -r 192.168.114.250:80 -g
systemctl start ipvsadm 开启ipvsadm
ipvsadm 启用策略
ipvsadm-save > /etc/sysconfig/ipvsadm 保存策略
ipvsadm -ln 查看节点状态
如没有VIP 的分发策略,则重启 keepalived 服务,systemctl restart keepalived
systemctl restart keepalived.service 重启服务
5.2 配置备用负载调度器(LVS-DR)
5.2.1 关闭防火墙,安装ipvsadm和keepalived服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
modprobe ip_vs 加载ip_vs模块
cat /proc/net/ip_vs 查看模块版本信息
ipvsadm-save > /etc/sysconfig/ipvsadm 生成文件 保存策略
systemctl start ipvsadm 开启
5.2.2 调整proc 相应参数,关闭Linux内核的重定向参数响应
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 加载内核配置参数生效
5.2.3 修改配置文件keeplived.conf
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak 备份配置文件
vim keepalived.conf
5.2.4 配置vip (虚拟子接口IP)
5.2.5 开启keepalived服务,查看虚拟IP
systemctl start keepalived 开启 keepalived 服务
ip addr 查看ip
备用服务器不会显示虚拟 ip
未完待续--------