keepalived 简介
vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务
官网:http://keepalived.org/
功能:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
- 用户空间核心组件:
- vrrp stack:VIP消息通告
- checkers:监测real server
- system call:实现 vrrp 协议状态转换时调用脚本的功能
- SMTP:邮件组件
- IPVS wrapper:生成IPVS规则
- Netlink Reflector:网络接口
- WatchDog:监控进程
- 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
实验:
主备模式
四台主机
关闭防火墙和selinux
KA1 : IP 172.25.119.10
KA2 : IP 172.25.119.20
server1 : IP 172.25.119.110
server2 : IP 172.25.119.120
下载Keepalived
yum install keepalived -y
配置文件
vim /etc/keepalived/keepalived.conf
将KA1的配置文件复制到KA2
[root@ka1~]#scp /etc/keepalived/keepalived.conf root@172.25.119.20:/etc/keepalived/keepalived.conf
修改KA2的优先级和主备模式
查看KA1的IP信息
ifconfig
抓包检测
抓包命令
tcpdump -i ens160 -nn host 224.0.0.18
用另一台主机110或120主机登录10主机关掉keepalived看备设备是否启动
[root@server1 ~]# ssh -l root 172.25.119.10
关闭keepalived
[root@ka1 ~]# systemctl stop keepalived.service
查看KA2的IP信息
在开启KA1的keepalived看看抓包的内容
[root@ka1 ~]# systemctl enable --now keepalived.service
当KA1的keepalived再次启动时 IP又变成了10主机的IP ,由于KA1的优先级大于KA2的,又是默认抢占式,所以当KA1再次启动时将服务VIP抢过来了
日志重定向
编辑文件
vim /etc/sysconfig/keepalived
重启服务
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# systemctl restart rsyslog.service
让VIP通信
或者
两种:要开都开
:要关都关
子配置文件
创建子配置文件
mkdir -p /etc/keepalived/conf.d/
cd /etc/keepalived/conf.d/
vim 172.25.119.100.conf
重启服务
[root@ka1 conf.d]# systemctl restart keepalived.service
查看IP信息
非抢占式
将主备服务器的主服务器也改成备服务器,两台服务器都加上nopreempt开启非抢占模式
KA1
KA2
测试
两台服务器正常启动
关闭KA1的keepalived后
在开启KA1的keepalived后
还是KA2在工作
关闭KA2的keepalived后 ,又换回KA1工作
非抢占模式,只要一台服务器不挂掉,另一台服务器是不会抢占VIP的
抢占延时模式
五秒不是很合理,只是为了演示,一般是五分钟到十分钟
KA1
KA2
测试
关闭KA1的keepalived
重启KA1的keepalived后5s才会重新抢占VIP
VIP单播配置
KA1
KA2
测试
VIP在KA1上
VIP在KA2上
开启邮件自动发送
当两台服务器的主备发生变化或者有主机挂掉就会给运维人员发邮件
我们使用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
[root@ka1 ~]# systemctl stop keepalived.service
重启KA1的keepalived
双主架构
分别两个虚拟路由
一个KA1为主KA2为备、一个KA2为主KA1为备 ————————————>互为主备
KA1:
在172.25.119.100 为主 在172.25.119.200为备
KA2:
重启服务测试:
KA1
KA2:
关闭KA1的keepalived后
单主的LVS-DR模式
KA1
下载ipvsadm:
yum install ipvsadm -y
KA2:
下载ipvsadm
yum install ipvsadm -y
server 1
下载 httpd
yum install httpd -y
在 网页文件中写入数据做测试
启动服务
[root@server1 ~]# systemctl enable --now httpd
创建环回地址
ip a a 172.25.119.100/32 dev lo
环回不响应
刷新内核模块
[root@server1 ~]# sysctl --system
server2
下载 httpd
yum install httpd -y
在 网页文件中写入数据做测试
启动服务
[root@server2 ~]# systemctl enable --now httpd
创建环回地址
ip a a 172.25.119.100/32 dev lo
环回不响应
刷新内核模块
[root@server2 ~]# sysctl --system
测试:
清空策略
ipvsadm -C
重启keepalived服务刷新策略
[root@ka1 ~]# systemctl stop keepalived.service
查看策略
在本地主机的cmd上测试
利用脚本实现主从角色切换
写一个自动检测的脚本
如果 /mnt/li文件存在 返回值为1 不存在为0
如果检测到 /mnt/li文件 weight将会加上优先值,原先优先值为100,再加上weight的 -30 就会变成70 ,小于KA2的优先级,VIP将会跑到KA2上,如果没有检测到优先值不会发生变化
测试
在没创建/mnt/li文件时
创建/mnt/li文件后
KA2上
高可用负载均衡集群(keepalived,haproxy)
在上个实验的基础上稍作修改
删掉server1和server2的环回地址
ip a d 172.25.119.100/32 dev lo
在KA1和KA2的内核模块上加入(两个都要做,以KA2为例)
net.ipv4.ip_nonlocal_bind = 1
加载刷新
在KA1和KA2上下载haproxy
yum imstall haproxy -y
在配置文件中写入配置信息
KA1
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
LVS和haproxy冲突所以注释掉LVS
KA2
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
测试
while true; do curl 172.25.119.100 ;sleep 3; done
三秒执行一次
当把远程登录KA1把haproxy关掉后,根据配置,系统链接三次未成功就将vip转移到了KA2上,不影响正常的访问
利用脚本实现当haproxy挂掉后的主从角色切换
写脚本 (KA1和KA2都写)
在配置文件中加入配置 (KA1和KA2都写)
测试
关闭KA1的haproxy程序后
systemctl stop haproxy