介绍:Keppalived高可用技术,防止服务的单点故障造成不可避免地影响,增强服务的高可用性、安全性。比如:中间件 rabbitmq、mysql、mycat、Haproxy等这种服务器,一旦发生故障,将影响整套服务系统的运作过程。将因软件、硬件、人为造成的故障对业务的影响降低到最小程度。
特性
问题
脑裂:两台主机(主从),各有着Apache与keepalive,当我们的主服务出现问题时,从服务器会代替服务(政变)
但两台服务器无法进行通信时,分成两个独立的节点,两边都以为对面挂了,就会出现争抢(资源共享),
会导致两边服务器都起不来,但起来了也会造成读写(资源共享),导致数据损坏(数据库轮询的联机日志)。
解决方案
组播:对同一局域网内的主机发送消息,主机组接收到消息,其他主机当作没收到
组播是指以224.0.0.0地址作为通信地址的一种方式。
原理
将N台功能相同的服务器组成一个服务器组,组里有一个主(master)与多个从(backup)
master上有一个对外提供服务的VIP(该服务器所在局域网默认的路由为该服务器的VIP)
master会发送组播信息,当backup服务收不到消息时,会认为master宕机了
backup会根据VRRP的优先级来选择一个backup来充当master。
作用: 集群管理中心保证服务的高可用的一个服务软件,防止单点的故障。
#将web服务于keepalived部署在同一台机器上
web1/keepalived:192.168.178.60
web2/keepalived:192.168.178.61
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
1、两台主机同时进行
# yum -y install keepalived httpd
2、往 Web1 中添加:
# echo "web1" > /var/www/html/index.html
3、往 Web2 中添加:
# echo "web2" > /var/www/html/index.html
4、两台主机启动:
# systemctl start httpd
# cd /etc/keepalived/
# cp keepalived.conf keepalived.conf.bak
# vim keepalived.conf
! Configuration File for keepalived
global_defs { #全局配置
router_id web1 #设备在组中的标识,设置不一样即可
}
vrrp_script chk_httpd { #健康检查
script "/etc/keepalived/ck_httpd.sh" #检查脚本
interval 2 #检查频率.秒(每隔两秒去执行脚本)
weight -5 #priority减5
fall 3 #失败三次(尝试三次,每隔两秒去执行脚本,如果脚本失败,就记下来,等检查三次后,将优先级减5)
}
vrrp_instance VI_1 { #VI_1(组号)。实例名两台路由器相同。
state MASTER #主或者从状态
interface ens33 #监控网卡(心跳网卡)
mcast_src_ip 192.168.178.60 #心跳源IP
virtual_router_id 55 #虚拟路由编号(组编号),主备要一致。
priority 100 #优先级 (主要应用与1主多从)
advert_int 1 #心跳间隔S (对方主机运行状态的监控)/可以为毫秒级监控
authentication { #秘钥认证(1-8位)
auth_type PASS #密码认证类型
auth_pass 123456 #密码
}
virtual_ipaddress { #VIP
192.168.178.200/24
}
track_script { #引用脚本,监控脚本
chk_httpd
}
}
1、编写监控脚本:
# vim ck_httpd.sh
#!/bin/bash
#检查httpd进程是否存在
counter=$(ps -C httpd --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
service httpd start
sleep 5 #尝试启动一次httpd,停止5秒后再次检测
counter=$(ps -C httpd --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived #如果启动没成功,就杀掉keepalive触发主备切换
fi
fi
2、赋予执行权:
# chmod +x ck_httpd.sh
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# scp -r ck_httpd.sh 192.168.178.61:/etc/keepalived/
# cd /etc/keepalived/
# ls
ck_httpd.sh keepalived.conf
# vim keepalived.conf
#找到进行修改
route_id web2 #路由标识符
state BACKUP #身份为从
mcast_src_ip 192.168.178.61 #心跳源,为本机IP
priority 99 #优先级,从 比 主 设置少点
1、自启动服务:
# systemctl --now enable keepalived
2、查看虚拟IP在那台主机:
# ip a | grep ens33
3、也可以观察日志,查看虚拟IP绑定情况:
# cat /var/log/messages | grep 'Sending gratuitous ARP'
1、可以看到,此时的虚拟IP在Web1上,访问到Web1的服务:
# curl 192.168.178.200
web1
**解析:**将Web1的服务宕机,查看虚拟IP的转移,转移到Web2服务器上,实现访问到Web2服务
1、关闭Web1上的http服务,过2秒再去观察httpd状态,可以发现服务被重新拉起,脚本的效果:
# systemctl stop httpd
# systemctl status httpd
2、修改httpd配置,让httpd服务起不来,实现VIP的转移:
# mv /etc/httpd/conf /opt/
# systemctl stop httpd
3、再次访问服务,VIP转移成功,
# curl 192.168.178.200
web2
解析:增加 LVS 数量,组成LVS集群,对LVS之间进行Keepalived高可用,事实上就是用户还是通过keepalived的虚拟IP访问,虚拟IP对应后方的Web服务器,keepalived本质是使用LVS-DR模式。
架构:Client > LVS1(HA)LVS2 > Web
LVS1:192.168.178.60
LVS2:192.168.178.61
Web1:192.168.178.7
Web2:192.168.178.16
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
LVS1:
# yum -y install ipvsadm keepalived
LVS2:
# yum -y install keepalived
[root@192 ~]# cd /etc/keepalived/
[root@192 keepalived]# cp -r keepalived.conf keepalived.conf.bak
[root@192 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS1 #名称,自定义
}
vrrp_instance VI_1 {
state MASTER #另外一台机器是BACKUP
interface ens33 #心跳网卡
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 150 #优先级
advert_int 1 #检查间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.178.200/24 dev ens33 #VIP和工作接口
}
}
virtual_server 192.168.178.200 80 { #LVS 配置,VIP
delay_loop 3 #服务论询的时间间隔,#每隔3秒检查一次real_server状态
lb_algo rr #LVS 调度算法
lb_kind DR #LVS 集群模式
protocol TCP
real_server 192.168.178.7 80 { #Web1服务器
weight 1
TCP_CHECK {
connect_timeout 3 #健康检查方式,连接超时时间 (每隔三秒去连接Web,如果超时,就认为Web服务down机)
}
}
real_server 192.168.178.16 80 { #Web2服务器
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# systemctl --now enable keepalived
# reboot
# vim /etc/keepalived/keepalived.conf
#找到进行修改
router_id LVS2
state BACKUP
priority 145
# systemctl --now enable keepalived
# reboot
两台主机同时操作
1、安装httpd服务
# yum -y install httpd
2、编写测试网页
# Web1: echo web1 > /var/www/html/index.html
# Web2: echo web2 > /var/www/html/index.html
3、启动与开机自启httpd
# systemctl --now enable httpd
# cd /etc/sysconfig/network-scripts/
# cp -r ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0
DEVICE=lo:0 #接口名
IPADDR=192.168.178.200 #虚拟IP
NETMASK=255.255.255.255 #地址唯一性
ONBOOT=yes #自启
#其他的注释
# vim /etc/rc.local
#添加
# 开机生效 确保如果请求的目标IP是$VIP,那么让出去的数据包的源地址也显示为$VIP
/sbin/route add -host 192.168.178.200 dev lo:0
1、忽略arp请求,可以回复
# 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
# reboot
# curl 192.168.178.200
web2
# curl 192.168.178.200
web1
1、LVS1关闭keepalived,实现VIP转移:
# systemctl stop keepalived
2、再次访问服务,访问成功,可以发现VIP转移到LVS2上
# curl 192.168.178.200
web2
# curl 192.168.178.200
web1