HA高可用服务搭建
1、HA Cluster高可用集群
HA是High Available缩写。 HA Cluster是指高可用性集群,是保证业务连续性的有效解决方案,一般 有两个或两个以上的节点,且分为活动节点及备用节点。
FailOver:故障自动切换,MASTER/BACKUP,MASTER宕机了,BACKUP 充当主机使用。
2、为什么要引入HA高可用
答:主要是为了解决Web服务的单点故障。 HA高可用软件架构原理:keepalived/mha
3、Keepalived软件概述
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功 能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务 (例如:Nginx、HAproxy、MySQL等)的高可用解决方案软件。
4、Keepalived组成和原理
Keepalived软件主要是通过VRRP协议实现高可用功能的(故障切换方 式)。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协 议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它 能够保证当个别节点宕机时,整个网络可以不间断地运行。 (FailOver+VIP漂移)
使用Keepalived进行VIP(虚拟的IP地址),所有服务器共享一个虚拟的 VIP的实现。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供 相同功能的路由器组成一个路由器组,这个组里面有一个master和多个 backup,master上面有一个对外提供服务的vip(该路由器所在局域网内 其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp 包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个 backup当master。这样的话就可以保证路由器的高可用了。
Keepalived的功能体系结构,大致分两层:用户空间(user space)和内 核空间(kernel space)。
内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均 衡)和NETLINK(提供高级路由及其他相关的网络功能)两个部份。
用户空间:
WatchDog:负则监控checkers和VRRP进程的状况
VRRP Stack:负载均衡器之间的失败切换FailOver,如果只用一个负载均衡
器,则VRRP不是必须的。
Checkers:负责真实服务器的健康检查healthchecking,是keepalived
最主要的功能。换言之,可以没有VRRP Stack,但健康检查
healthchecking是一定要有的。
IPVS wrapper:用户发送设定的规则到内核ipvs代码.
Netlink Reflector:用来设定vrrp的vip地址等。
keepalived主要使用三个模块,分别是core、check和vrrp。core模块为 keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和 解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现 VRRP协议的。
5、安装Keepalived软件
第一步:关闭防 火墙与SELinux、关闭NetworkManager、时间同步。
第二步:在Web01与Web02(两台机器组建高可用集群)使用yum命令安 装Keepalived软件
yum install keepalived -y
第三步:了解keepalived配置文件与日志信息输出的位置
配置文件:
vim /etc/keepalived/keepalived.conf
日志文件:
cat /var/log/messages
6、设置Keepalived配置文件
Web01与Web02同时操作:
vim /etc/keepalived/keepalived.conf
第一步:使用冒号:末行模式,切换光标到35行,然后按dG,删除35行以 后的所有内容
第二步:了解一下配置文件中每一行的含义19~34行
vrrp_instance #组建vrrp实例组的组名(Web01与Web02要保持一致) {
state #角色名称(MASTER/BACKUP)
interface #网卡名称(eth0=>ens33)
virtual_router_id #vrrp组的编号(Web01与Web02要保持一致)
priority #权重(选举=>权重高=>当选几率大)
advert_int 1 #心跳间隔时间
authentication {
auth_type PASS #=> 授权类型(PASS密码)
auth_pass 1111 #=> 组密码(想组建集群,其密码必须一致)
}
virtual_ipaddress {
10.1.1.100 #=> VIP,虚拟的IP地址,需要与集群中的机器保持在同一网段
}
}
设置完成后,保存并退出
第三步:启动Keepalived软件
systemctl start keepalived
systemctl status keepalived
分别在Web01/Web02中使用ip a命令,查看网卡上是否挂载VIP地址:
ip a
7、解析www.shop.com到VIP虚拟IP地址
Windows中找到hosts文件:
ip 域名
例如:
192.168.1.100 www.baidu.com
8、让VIP可以ping通
把域名解析到VIP,通过VIP访问到提供服务的服务器。
特别注意:1.3以后版本要注释vrrp_strict,否则虚拟IP无法ping通
设置完成后,重启keepalived软件
systemctl restart keepalived
9、模拟服务器故障,VIP漂移
MASTER:网络无法连接,keepalived软件关闭
Web01 # systemctl stop network
10、让Keepalived可以监测Nginx服务
问题:当我们在MASTER服务器中,手工停止Nginx,VIP会发生漂移么?
答:不会,因为keepalived软件主要检测keepalived服务状态以及网络情 况。只要这两者正常,这个VIP就不会发生漂移。
这个时候就产生了一个问题:Nginx都已经停止了,实际上这台MASTER服 务器就无法对外提供Web服务了,所以这个时候VIP也应该正常发生漂移。
第一步:编写nginx.sh脚本,自动检测Nginx的运行状态 (Web01/Web02)
# mkdir /scripts
# vim /scripts/nginx.sh
#!/bin/bash
nginx_status=`ps -C nginx --no-header |wc -l`
if [ $nginx_status -eq 0 ]; then
systemctl stop keepalived
fi
第二步:给nginx.sh文件添加一个可执行权限
chmod +x /scripts/nginx.sh
设置完成后,不要着急继续向下操作。首先测试一下nginx.sh脚本是否可用
/scripts/nginx.sh
第三步:在Web01/Web02两台机器的keepalived.conf文件中配置 nginx.sh脚本
vim /etc/keepalived/keepalived.conf
vrrp_script 健康检测脚本对象名称 {
script STRING | QUOTED-STRING ## 指定:<外部脚本>的<调用路径>
interval INTEGER ## 设置:<健康跟踪检测>的<时间间隔>,默认为 1 秒
}
以上只是在keepalived配置文件中定义了一个检测脚本,但是还没有真正 的调用。
第四步:在vrrp_instance标签中真正调用check_nginx这个检测脚本
vrrp_instance VI_1 {
...
track_script {
check_nginx
}
...
}
第五步:设置完成后,重启keepalived
systemctl restart keepalived
二、Keepalived配置补充
1、抢占与非抢占模式
☆ 什么是抢占模式
MASTER:权重100
BACKUP:权重90
当MASTER发生故障时(宕机),VIP会自动从MASTER漂移到BACKUP服 务器。但是当MASTER维修完毕后,启动keepalived的瞬间,其就会把VIP 从BACKUP服务器中抢占过来。我们把这种情况就称之为“抢占模式”。
扩展:keepalived中,到底是如何决定谁是MASTER?
答:主要通过权重配置以及IP地址的大小
① 如果Web01与Web02其权重不同,当我们同时启动keepalived的时候, 其默认会选择权重比较大的服务器充当MASTER。
② 如果Web01与Web02其权重相同,则IP地址大的,优先成为MASTER Web02(10.1.1.13) > Web01(10.1.1.11)
☆ 非抢占模式
问题:如果让我们的HA Cluster集群成为非抢占模式呢?
答:一共分三步
第一步:更改keepalived.conf配置文件
vrrp_instance VI_1 {
virtual_router_id 51
------------------------ 华丽的分割线 ------------------
nopreempt => 非抢占模式
------------------------ 华丽的分割线 ------------------
priority 100
}
第二步:配置state角色都为BACKUP
vrrp_instance VI_1 {
------------------------ 华丽的分割线 ------------------
state BACKUP => 所有服务器都设置为BACKUP,没有MASTER/BACKUP之分
------------------------ 华丽的分割线 ------------------
virtual_router_id 51
nopreempt
priority 100
}
第三步:重启keepalived软件
systemctl restart keepalived