目录
5.1.5调整proc响应参数,关闭Linux内核的重定向参数响应
5.2.5调整proc响应参数,关闭Linux内核的重定向参数响应
5.3配置节点服务器web1(192.168.137.20)
5.4配置节点服务器web2(192.168.137.30)
前言:我们要理解Keepalived实现原理,掌握Keepalived的部署,掌握LVS+Keepalived高可用集群部署
一:Keepalived
专为LVS和HA设计的一款健康检查工具
-
支持故障自动切换(Failover)
-
支持节点健康状态检查(Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点
二:keepalived实现原理剖析
keepalived采用vrrp热备份协议实现linux服务器的多机热备功能
vrrp(虚拟路由冗余协议)是针对路由器的一种备份解决方案
-
是针对路由器的一种备份解决方案
-
由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
-
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
-
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
三:vrrp虚拟路由冗余协议
vrrp会把多台路由组成一个虚拟路由组vrid,vrrp会生成一个虚拟路由(包含虚拟ip和虚拟mac,局域网内用户不关心哪个是主哪个是备,他们只用虚拟路由器的虚拟ip作为他们的网关)实际上虚拟ip是承载在master路由器,也就是说实际的数据通过master进行转发backup是通过优先级来决定哪个是master路由,优先级最大的那台就是master,backup只是用来监听master定时发送的vrrp报文,如果超时未收到master发来的vrrp报文backup就会抢占master虚拟ip也会飘移到backup上
四:Keepalived体系主要模块及其作用
keepalived体系架构中主要有三个模块:core、check和vrrp
4.1core模块
为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析
4.2vrrp模块
是来实现vrrp协议的
4.3check模块
负责健康检查,常见的方式有端口检查及url检查
五:LVS+Keepalived高可用群集的搭建
#环境
主DR服务器:192.168.137.10 ipvsadm、keepalived
备DR服务器:192.168.137.15 ipvsadm、keepalived
web服务器1:192.168.137.20 httpd
web服务器2:192.168.137.30 httpd
VIP(虚拟ip):192.168.137.60
客户端:192.168.137.100
5.1配置主负载均衡调度器(192.168.137.10)
5.1.1关闭防火墙、增强机制和下载httpd服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install httpd -y
5.1.2安装 ipvsadm和keepalived服务
yum -y install ipvsadm keepalived
5.1.3修改配置文件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
}
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 123456
}
virtual_ipaddress { #指定群集vip地址
192.168.137.60
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.137.60 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.137.20 80 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.137.30 80 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
##删除后面多余的配置##
5.1.4启动服务、查看虚拟网卡VIP
#启动服务、查看虚拟网卡vip
systemctl start keepalived
ip addr show dev ens33
5.1.5调整proc响应参数,关闭Linux内核的重定向参数响应
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
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.6配置负载分配策略,并启动服务
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
5.1.7清空ipvsadm,并做策略
ipvsadm -C
ipvsadm -A -t 192.168.137.60:80 -s rr
ipvsadm -a -t 192.168.137.60:80 -r 192.168.137.20:80 -g
ipvsadm -a -t 192.168.137.60:80 -r 192.168.137.30:80 -g
5.1.8保存设置
ipvsadm
ipvsadm -ln
ipvsadm-save > /etc/sysconfig/ipvsadm
5.2配置备负载均衡调度器(192.168.137.15)
5.2.1关闭防火墙、增强机制和下载httpd服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install httpd -y
5.2.2安装ipvsadm、keepalived服务
yum -y install ipvsadm keepalived
5.2.3修改配置文件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
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state BACKUP
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
--23行--修改,指定优先级,数值越大优先级越高,主为100,备为99
priority 99
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass 123456
}
virtual_ipaddress { #指定群集vip地址
192.168.137.60
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.137.60 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.137.20 80 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.137.30 80 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
##删除后面多余的配置##
5.2.4启动服务、查看虚拟网卡VIP
systemctl start keepalived
ip addr show dev ens33
5.2.5调整proc响应参数,关闭Linux内核的重定向参数响应
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
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.6配置负载分配策略,并启动服务
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
5.2.7清空ipvsadm,并做策略
ipvsadm -C
ipvsadm -A -t 192.168.137.60:80 -s rr
ipvsadm -a -t 192.168.137.60:80 -r 192.168.137.20:80 -g
ipvsadm -a -t 192.168.137.60:80 -r 192.168.137.30:80 -g
5.2.8保存设置
ipvsadm
ipvsadm -ln
ipvsadm-save > /etc/sysconfig/ipvsadm
5.3配置节点服务器web1(192.168.137.20)
5.3.1关闭防火墙、增强机制和下载httpd服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install httpd -y
5.3.2配置站点文件
vim /var/www/html/index.html
ming zhen tan ke nan
5.3.3配置虚拟VIP
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.137.60
NETMASK=255.255.255.255
5.3.4重启网络服务,开启虚拟网卡
systemctl restart network
ifup lo:0
ifconfig lo:0
5.3.5设置路由
route add -host 192.168.137.60 dev lo:0
route -n
5.3.6调整proc响应参数
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
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
5.3.7刷新proc参数
sysctl -p
5.4配置节点服务器web2(192.168.137.30)
5.4.1关闭防火墙、增强机制和下载httpd服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install httpd -y
5.4.2配置站点文件
vim /var/www/html/index.html
gui mie zhi ren
5.4.3配置虚拟vip
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.137.60
NETMASK=255.255.255.255
5.4.4重启网络服务,开启虚拟网卡
systemctl restart network
ifup lo:0
ifconfig lo:0
5.4.5设置路由
route add -host 192.168.137.60 dev lo:0
route -n
5.4.6调整proc响应参数
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
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
5.4.7刷新proc参数
sysctl -p
5.5进行测试
5.5.1当前使用的为主DR服务器
5.5.2断开主DR服务器的Keepalived测试
systemctl stop keepalived.service
5.5.3在客户端进行测试
六:Keepalived脑裂及解决办法
6.1Keepalived脑裂
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)
6.2脑裂的原因
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
因心跳线间连接的设备故障(网卡及交换机)。
因仲裁的机器出问题(采用仲裁的方案)。
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
vrrp实例名字不一致、优先级一致。
6.3对应策略
添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少“裂脑”发生几率
启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了
设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
利用脚本检测、报警
vim check_keepalived.sh
#!/bin/bash
$ip=192.168.233.9
while true
do
if [ `ip a show ens33 |grep $ip|wc -l` -ne 0 ]
then echo "keepalived is error!"
else echo "keepalived is OK !"
fi
done
七:总结
通过本章内容的学习,我们了解了Keepalived的主要功能,在生产环境中我们会经常使用到,我们需要知道Keepalived主服务器与从服务器的区别,其原理和vrrp差不多。知道如何构建负载均衡、高可用群集。