keepalived搭建HA集群
一、集群服务简述
- 有2个电脑及以上完成的任务
1、集群分类
1、LB集群
- 负载均衡
2、HA集群(高可用)
-
不间断的提供服务,主备模式
-
出现问题,能自动快速切换到另一个节点
-
为了解决单点故障问题
3、HPC集群(高性能集群)
-
软硬件协同工作的系统
-
航天工作,气象局等等
上
二、构建HA集群
1、部署HA集群的软件
-
keepalived,轻量级高可用部署软件,最初是为LVS设计的,随后加入VRRP功能
-
heartbeat
-
pacemaker
2、术语
1、vip
-
虚拟ip,不是固定的,可以切换的
-
vip地址在a主机上,a主机坏了的话,vip地址转移到b主机上
2、地址漂移
- vip从一台主机迁移到另一个主机上
3、心跳
-
主备角色,监控对方的状态。以决定哪台主机提供服务
-
判断是否存活等状态
4、脑裂
-
网络,数据延迟等问题,在做心跳检查时,双方都检查失败,都认为对方是坏的,那么就都要去抢ip地址,强主角色
-
解决方法
- 仲裁,自己配置第三方程序,在发生这种情况的时候,决定哪一个主机关机(类似这种说法),决定哪一个主机充当master
三、实验
1、实验规划
- 实现7*24小时不断为用户提供网站服务
# 主机1 httpd-61 192.168.200.61
# 主机2 httpd-62 192.168.200.62
# 都装上httpd,不同的网站页面
# 思路就是61能提供服务,突然61不提供服务,62提供服务
vip存放在61上面,61坏掉的话,飘移到62上面
vip的地址为192.168.200.201
2、部署HA高可用集群

- 高可用,一个坏了,另一个可以接管,服务正常运行
1、2台机器安装keepalived
- 哪几台机器要配置高可用,就要在几台机器上面安装即可
[root@httpd-61 /]# yum -y install keepalived
[root@httpd-62 /]# yum -y install keepalived
2、备份,删除一些不用的行
- 备份keepalived配置文件
[root@httpd-61 keepalived]# cp keepalived.conf keepalived.conf.bak
# 36行之后的配置没有用,删除掉
[root@httpd-61 keepalived]# sed -i '36,$d' keepalived.conf
[root@httpd-61 keepalived]# wc -l keepalived.conf
35 keepalived.conf
3、配置参数
! Configuration File for keepalived
global_defs { # 全局配置
notification_email {
acassen@firewall.loc # 工作邮箱
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1 # 邮件服务器的ip
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1(vi_1是起的集群名字,可以修改的) { # 调用的是vrrp协议
state MASTER # 状态 master
interface eth0 # 当前的机器的网卡名,vip地址要配置在哪个网卡上面
virtual_router_id 51
priority 100 # 优先级,必须比备用的高
advert_int 1
authentication { # 心跳检查的时候
auth_type PASS # 通过密码类型来检查
auth_pass 1111 # 密码可以修改,2台机器的类型和密码必须是相同的
}
virtual_ipaddress { # 分配的vip地址(公网的ip)
192.168.200.16 # 可以写域名,dns服务写一个A记录绑定即可
192.168.200.17
192.168.200.18
}
}
- master修改完的配置
[root@httpd-61 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance web-group {
state MASTER # 角色
interface ens33 # 网卡名
virtual_router_id 51
priority 150 # 优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.201 # vip地址
}
}
# 重启keepalived服务,就会获取到vip地址
[root@httpd-61 keepalived]# systemctl restart keepalived.service
# 就会发现vip地址配置在ens33上面了
# ip a显示所有的ip地址
[root@httpd-61 keepalived]# ip a | grep 192
inet 192.168.200.61/24 brd 192.168.200.255 scope global noprefixroute ens33
inet 192.168.200.201/32 scope global ens33
- 备用配置
[root@httpd-62 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance web-group {
state BACKUP # 角色
interface ens33 # 网卡名
virtual_router_id 51
priority 100 # 优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.201
}
}
- 优先级高的获取了vip地址
4、测试一下(vip地址漂移)
-
停下master的keepalived服务
-
bakcup就会获取到vip地址
[root@httpd-61 keepalived]# systemctl stop keepalived.service
[root@httpd-62 keepalived]# ip a | grep 192
inet 192.168.200.62/24 brd 192.168.200.255 scope global noprefixroute ens33
inet 192.168.200.201/32 scope global ens33
-
开启原master的keepalived服务,发现vip又获取到了
-
通过优先级来获取到的vip地址
[root@httpd-61 keepalived]# systemctl start keepalived.service
[root@httpd-61 keepalived]# ip a |grep 192
inet 192.168.200.61/24 brd 192.168.200.255 scope global noprefixroute ens33
inet 192.168.200.201/32 scope global ens33
5、发现访问不了vip地址,解决措施(要先做这个)
- 在新版本的中,要添加2个参数
#vrrp_strict # 默认禁止不能接收arp请求,所以访问不了vip地址,作用,接收arp协议
vrrp_iptables # master机器故障后,vip地址会释放,能够迁移到备用机器上 作用,允许vip漂移
# 就能访问vip地址
[root@httpd-61 keepalived]# ping 192.168.200.201
PING 192.168.200.201 (192.168.200.201) 56(84) bytes of data.
64 bytes from 192.168.200.201: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 192.168.200.201: icmp_seq=2 ttl=64 time=0.058 ms
6、访问网站服务
- 在生成环境中,网页内容是一样的,这样才能保持高可用
[root@httpd-61 /]# curl 192.168.200.201
192.168.200.61
# 停止keepalived服务
[root@httpd-61 /]# systemctl stop keepalived.service
[root@httpd-61 /]# curl 192.168.200.201
192.168.200.62
[root@httpd-61 /]# systemctl start keepalived.service
# 重新启动后,vip地址获取到了
[root@httpd-61 /]# curl 192.168.200.201
192.168.200.61
7、认证流程和整个过程
-
正常运行的状态
-
master机器持有vip,并定义发送心跳包
-
backup机器,监听master机器心跳包,不持有vip
-
-
心跳包检查
-
心跳包发送,master定期发送心跳包,包含认证类型和密码
-
心跳包接收,验证其中的认证信息是否与自己的配置一样
-
-
认证的过程
-
Backup机器在一定时间内未收到心跳包,认为Master机器不可用
-
认证信息验证,backup在尝试接管vip之前,Backup机器验证自己的认证信息,确认一致
-
认证都通接管vip,切换为master
-
-
整个过程
-
首先master发送自己的心跳包给backup,然后检测认证信息是否正确
-
当master故障了,backup在一定时间内没有收到心跳包,就会自己校验自己的认证信息是否正确,从而获取到了vip地址,成为了master,然后发送心跳包给其他backup
-
当之前的master恢复后,如果优先级大于backup的话,会重新获取到vip地址,成为master,之前的master会切换为backup
-
发送给其他的backup
-
-
VRRP的工作过程是这样的:
-
虚拟路由器中的路由器根据优先级选举出Master,Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通告给与它连接的设备。
-
Master路由器周期性发送VRRP报文,以公布自己的配置信息(优先级等)和工作状态
-
如果Master故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master
-
虚拟路由器状态切换时,Master路由器由一台设备切换会另外一台设备,新的Master路由器只是简单的发送一个携带虚拟MAC地址和虚拟IP的免费ARP报文,这样就可以更新其他设备中缓存的ARP信息
-
Backup路由器的优先级高于Master时,由Backup的工作方式(抢占式或者非抢占式)决定是否重新选举Master。
-
8、为什么访问vip地址会显示网页了
# vip地址一般是公网ip地址
# 访问vip地址到达了master机器上面后
# httpd就要处理这个请求了,因为httpd监听80或者443端口
# 但是httpd不知道这个请求是通过vip地址到达的master上面的
# vip地址绑定在master网络接口上面在
# master机器的ip用于内部通信
四、keepalived理论知识
1、核心组件
-
watchdog 用于进程监控
-
checkers 对rs进行监看检查
-
vrrp vip消息通告,通过这个协议处理负载均衡集群的故障切换

五、问题
- master上面的keepalived服务是开启的,但是网站服务停止了,backup上面都是正常的运行的,那么vip是否会漂移呢?
# 不会进行漂移,keepalvied服务不会检查对方的80端口是否存活的,只有keepalived服务停止了,心跳检查,vip地址才会漂移
# 那么解决方法就是
# keepalived健康检查,监测本机的网站服务是否正常,或者其他的服务
# 监测到本机的网址服务停掉了,那么就把master上面的keepalvied停掉,vip地址就会转换了


浙公网安备 33010602011771号