一.高可用集群
1.1 集群类型
- LB:Load Balance 负载均衡
- LVS/HAProxy/nginx(http/upstream, stream/upstream)
- HA:High Availability 高可用集群
- 数据库、Redis
- SPoF: Single Point of Failure,解决单点故障
- HPC:High Performance Computing 高性能集群
1.2 系统可用性
99.95%:(60*24*30)*(1-0.9995)=21.6 分钟 # 一般按一个月停机时间统计
1.3 keepalived 简介
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
1.4 Keepalived 架构
![](https://i-blog.csdnimg.cn/direct/5ae1944ae02f4e90b2ac576be92e9a1a.png)
- 用户空间核心组件:
vrrp stack : VIP 消息通告checkers :监测 real serversystem call :实现 vrrp 协议状态转换时调用脚本的功能SMTP :邮件组件IPVS wrapper :生成 IPVS 规则Netlink Reflector :网络接口WatchDog :监控进程
- 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
二、Keepalived 环境准备
2.1 实验准备配置
四台红帽7的虚拟机
KA1 | ip | 172.25.254.10 |
KA2 | ip | 172.25.254.20 |
server1 | ip | 172.25.254.110 |
server2 | ip | 172.25.254.120 |
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信(非必须)
- 建议使用/etc/hosts文件实现(非必须)
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(非必须)
2.2 Keepalived 相关文件
软件包名:keepalived
主程序文件:/usr/sbin/keepalived
主配置文件:/etc/keepalived/keepalived.conf
配置文件示例:/usr/share/doc/keepalived/
Unit File:/lib/systemd/system/keepalived.service
Unit File的环境配置文件:/etc/sysconfig/keepalived
2.3 安装keepalived
在10和20两台主机里下载Keepalived
yum install keepalived -y
配置文件
vim /etc/keepalived/keepalived.conf
KeepAlived 配置说明
配置文件:/etc/keepalived/keepalived.conf
- GLOBAL CONFIGURATION
Global definitions: 定义邮件配置, route_id , vrrp 配置,多播地址等
- VRRP CONFIGURATION
VRRP instance(s): 定义每个vrrp虚拟路由器
- LVS CONFIGURATION
Virtual server group(s)
Virtual server(s): LVS集群的VS 和 RS
保存退出后,启动keepalived服务,vip出现
systemctl enable --now keepalived.service
对ka2同样进行配置,这里直接将ka1的配置文件传输给ka2一份并进行修改
scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf
修改KA2的优先级和主备模式
抓包检测
抓包命令
tcpdump -i eth0 -nn host 224.0.0.18
用另一台主机110或120主机登录10主机关掉keepalived看备设备是否启动
# ssh -l root 172.25.254.10
关闭keepalived
systemctl stop keepalived.service
此时在ka1内的抓包消息变成
20备机上线,查看KA2的IP信息
再重新开启ka1的keepalived
systemctl enable --now keepalived.service
当KA1的keepalived再次启动时 IP又变成了10主机的IP ,由于KA1的优先级大于KA2的,又是默认抢占式,所以当KA1再次启动时将服务VIP抢过来了
让VIP通信
或者
注意:要么两种都开,要么两种都不开
两个方法都可以使vip通信
日志分离
编辑文件
vim /etc/sysconfig/keepalived
vim /etc/rsyslog.conf
重启服务
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# systemctl restart rsyslog.service
独立子配置文件
创建子配置文件
mkdir -p /etc/keepalived/conf.d/
vim /etc/keepalived/conf.d/172.25.254.100.conf
重启服务
systemctl restart keepalived.service
查看IP信息
2.4 非抢占模式和延迟抢占
非抢占式
将主备服务器的主服务器也改成备服务器,两台服务器都加上nopreempt开启非抢占模式
ka1
ka2
此时的vip在ka2机子上
测试
两台服务器正常启动关闭KA2的keepalived后
重新打开ka2的keepalived后
还是ka1在工作,关闭KA1的keepalived后 ,又换回KA2工作
非抢占模式,只要一台服务器不挂掉,另一台服务器是不会抢占VIP的
抢占延时模式
五秒只是为了演示,一般是五分钟到十分钟
ka1
ka2
测试关闭KA1的keepalived
重启KA1的keepalived后5s才会重新抢占VIP
2.5 VIP单播配置
KA1
ka2
测试
VIP在KA1上VIP在KA2上
2.6 邮件通知
当两台服务器的主备发生变化或者有主机挂掉就会给运维人员发邮件
我们使用qq邮箱做实验
在浏览器上登录qq邮箱
点击右上角的账号与安全
在KA1和KA2主机上下载mailx
yum install mailx -y
在KA1和KA2上编辑邮件的配置文件
vim /etc/mail.rc
测试发送邮件
在KA1和KA2上编写发邮件的脚本
给脚本执行权限
chmod +x /etc/keepalived/mail.sh
在KA1和KA2的keepalived的配置文件加上该配置
重启服务
systemctl restart keepalived.service
测试
停掉KA1的keepalived
systemctl stop keepalived.service
重启KA1的keepalived
2.7 双主架构
分别两个虚拟路由
一个KA1为主KA2为备、一个KA2为主KA1为备 ————————————>互为主备
在172.25.254.100 为主 在172.25.254.200为备
KA2:
重启服务测试:
KA1
ka2
关闭KA1的keepalived后
2.8 ipvs设定
在server1和server2中设定
vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
单主的LVS-DR模式
KA1:
下载ipvsadm:
yum install ipvsadm -y
KA2:
下载ipvsadm
yum install ipvsadm -y
下载 httpd
yum install httpd -y
在 网页文件中写入数据做测试
启动服务
systemctl enable --now httpd
创建环回地址
ip a a 172.25.254.100/32 dev lo
环回不响应
刷新内核模块
[root@server1 ~]# sysctl --system
下载 httpd
yum install httpd -y
在 网页文件中写入数据做测试
启动服务
systemctl enable --now httpd
创建环回地址
ip a a 172.25.254.100/32 dev lo
环回不响应
刷新内核模块
sysctl --system
测试:
清空策略
ipvsadm -C
重启keepalived服务刷新策略
[root@ka1 ~]# systemctl stop keepalived.service
查看策略
ipvsadm -Ln
2.9 vrrp Script 配置 脚本控制vip
利用脚本实现主从角色切换
示例:先用例子测试一下:
检测文件是否存在,存在为真(1),ka1就降低优先级,vip飘到ka2上面,不存在为假(0),vip就按兵不动
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/ding ] ---- 取反
chmod +x /etc/keepalived/test.sh ---- 给上可执行权限
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_file {
script "/etc/keepalived/test.sh" ------shell命令或脚本的路径
interval 1 ------ 检测的间隔时间,默认为1s
weight -30 ------ 默认为零,这里测试设置-30,当运行脚本检测到之后,为非0,就会与VIP的优先级相加,优先 降低,实现VIP飘移,为0时就VIP就按兵不动。
fall 2 ------ 脚本连续几次都执行失败,则转换为失败,建议设置为2以上
rise 2 ------ 执行脚本连续几次都成功,把服务器标记为成功
timeout 2 ------ 设置的超时时间。
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
track_script { ------ 调用这个script配置参数
check_file
}
}
[root@ka1 ~]# systemctl restart keepalived.service
sh /etc/keepalived/test.sh
echo $?
0
此时/mnt底下没有ding这个文件,运行脚本输出0,VIP就按兵不动
此时在/mnt底下创建ding这个文件,输出为非0,执行脚本,此时vip飘到ka2上面
touch /mnt/ding
sh /etc/keepalived/test.sh
echo $?1
ka1上面: ka2上面:
删除这个文件之后,VIP就自动飘回来了
rm -rf /mnt/ding
systemctl restart keepalived.serviceifconfig
3.0 keepalived-haproxy实现高可用
还原状态
两台ka1和ka2上安装haproxy
yum install haproxy -y
把两台server机上面的VIP和arp响应给去掉:
[root@realserver1 ~]# ip a d 172.25.254.100/32 dev lo
[root@realserver2 ~]# ip a d 172.25.254.100/32 dev lo
arp响应:
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
sysctl --system ---- 查看
ka1和ka2上都开启内核路由:
[root@ka1 ~]# vim /etc/sysctl.conf
[root@ka2 ~]# vim /etc/sysctl.conf
et.ipv4.ip_nonlocal_bind=1 ---- 两台都开启内核路由
sysctl -p ----- 刷新一下
记住要把之前做的LVS给注释掉,lvs和haproxy不能同时使用!!!!
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind 172.25.254.100:80
mode http
balance roundrobin
server web1 172.25.254.110:80 check inter 3 fall 2 rise 5
server web1 172.25.254.120:80 check inter 3 fall 2 rise 5
查看端口是否开启:
[root@ka1 ~]# netstat -antlupe | grep haproxy
tcp 0 0 172.25.254.100:80 0.0.0.0:* LISTEN 0 2636800 5709/haproxy
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 0 2636798 5709/haproxy
udp 0 0 0.0.0.0:35424 0.0.0.0:* 0 2636799 5708/haproxy
[root@ka1 ~]#
实现haproxy高可用
如何检测haproxy的存活状态:
killall -0 haproxy
写入之前示例的那个脚本:
[root@ks2 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
[root@ka2~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
track_script {
check_haproxy
}
}
systemctl restart keepalived.service
测试
复制一个ka1出来,写个死循环:
while true
>do
>curl 172.25.254.100;sleep 0.5
>done把ka1上的haproxy挂掉,这边不会受影响,一直循环,VIP会飘到ka2上面
把ka1上面的haproxy给挂掉:
systemctl stop haproxy.service
此时ka1上面没有VIP了查看ka2上面:
把ka1上面的haproxy重新启动,VIP又回来了
systemctl start haproxy.service
死循环也不会受影响,因为ka1上面haproxy挂掉了,ka1上的VIP优先级降低,飘到ka2上面去了,ka2上面的haproxy还存活,也有VIP,所以死循环会一直能访问。最终不会影响架构的最终访问。