文章目录
1.什么是keepalived
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
2.工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。
3.keepalived+nginx实现高可用过程
-
初始状态
-
主机宕机
-
主机恢复
4.安装nginx
地址: https://blog.csdn.net/weixin_44792004/article/details/102965061
5.Nginx虚拟主机、反向代理、负载均衡配置和保证集群Session一致性解决方案
地址: https://blog.csdn.net/weixin_44792004/article/details/103001904
6. 安装keepalived
-
下载keeplived包,可以在华为或者阿里镜像下载其他版本
wget https://mirrors.huaweicloud.com/keepalived/keepalived-2.0.9.tar.gz
-
解压到/usr/local目录下
tar -zxvf keepalived-1.3.6.tar.gz -C /usr/local
-
开始configure
./configure --prefix=/usr/local/keepalived
发现报错 缺少安装环境:WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
解决办法:
yum -y install libnl libnl-devel
成功!
-
编译并安装
make && make install
-
将keepalived添加到系统服务中
cp -r /usr/local/keepalived /usr/sbin/
-
将init.d文件拷贝到etc下,加入开机启动项
cp usr/local/keepalived-2.0.9/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
-
将keepalived文件拷贝到etc下
cp usr/local/keepalived-2.0.9/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
-
创建keepalived文件夹
mkdir -p /etc/keepalived
-
将keepalived配置文件拷贝到etc下
cp /usr/local/keepalived-2.0.9/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
-
加为系统服务
chkconfig –add keepalived
-
开机启动
chkconfig keepalived on
-
启动、关闭、重启
service keepalived start service keepalived stop service keepalived restart
-
配置日志文件
vi /etc/sysconfig/keepalived #修改配置文件
KEEPALIVED_OPTIONS=”-D -d -S 0”
vi /etc/rsyslog.conf #修改配置文件
local0.* /var/log/keepalived.log #日志保存位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1loN9snY-1573387866044)(C:\Users\z\AppData\Local\Temp\1573288901654.png)]
7. 配置keepalived
注意:以下配置需要的可以加上去,不必和我的一模一样,按需求来
-
修改主nginx服务器下/etc/keepalived/keepalived.conf文件
! Configuration File for keepalived #全局定义 global_defs { notification_email { #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱 xxx@xxx.com #设置报警邮件地址,可以设置多个,每行一个, 需开启本机的sendmail服务(需要安装sendmail服务) } notification_email_from xxx@xxx.com #keepalived在发生诸如切换操作时需要发送email通知地址 smtp_server 127.0.0.1 #指定发送email的smtp服务器 smtp_connect_timeout 30 #设置连接smtp server的超时时间 router_id HAmaster-130 #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。 } vrrp_script chk_http_port { #检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等 script "/opt/chk_nginx.sh" #这里通过脚本监测 interval 2 #脚本执行间隔,每2s检测一次 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) rise 1 #检测1次成功就算成功。但不修改优先级 } vrrp_instance VI_1 { #keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管 state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER interface eth33 #指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,每个人网卡名字不同 注意修改成自己电脑上网卡的名字 mcast_src_ip 192.168.139.130 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址 virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置验证类型和密码。主从必须一样 auth_type PASS #设置vrrp验证类型,主要有PASS和AH两种 auth_pass 1111 #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 } virtual_ipaddress { #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写 192.168.1.100 } track_script { #执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!! chk_http_port #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 } }
-
修改备nginx服务器下/etc/keepalived/keepalived.conf文件
! Configuration File for keepalived #全局定义 global_defs { notification_email { #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱 xxx@xxx.com #设置报警邮件地址,可以设置多个,每行一个,需开启本机的sendmail服务(需要安装sendmail服务) } notification_email_from xxx@xxx.com #keepalived在发生诸如切换操作时需要发送email通知地址 smtp_server 127.0.0.1 #指定发送email的smtp服务器 smtp_connect_timeout 30 #设置连接smtp server的超时时间 router_id HAmaster-130 #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。 } vrrp_script chk_http_port { #检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等 script "/opt/chk_nginx.sh" #这里通过脚本监测 interval 2 #脚本执行间隔,每2s检测一次 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) rise 1 #检测1次成功就算成功。但不修改优先级 } vrrp_instance VI_1 { #keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管 state BACKUP #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER interface eth33 #指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,每个人网卡名字不同 注意修改成自己电脑上网卡的名字 mcast_src_ip 192.168.139.130 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址 virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 priority 99 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置验证类型和密码。主从必须一样 auth_type PASS #设置vrrp验证类型,主要有PASS和AH两种 auth_pass 1111 #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 track_script { #执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!! chk_http_port #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 } }
为了防止当nginx宕机,主nginx服务器不转移VIP到备nginx服务器,所以在上面配置文件中配置了track_script,监控nginx服务停止时候能自主的切换VIP。
配置中需要脚本文件 (script “/opt/chk_nginx.sh” #这里通过脚本监测)
-
创建监控脚本
vi /opt/chk_nginx.sh
#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /usr/local/nginx/sbin/nginx sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /etc/init.d/keepalived stop fi fi
依次执行:
chmod 755 /opt/chk_nginx.sh sh /opt/chk_nginx.sh
脚本执行方式:如果脚本执行为0的时候,则会在优先级上加上weight配的值,实现VIP的转移,并且脚本中当nginx监控为0的时候,会等待2秒进入到目录重启nginx ,如果重启nginx还是无效会关闭keepalived服务
注意:
如果出了问题可以查看系统日志:
tail -f /var/log/messages
遇到的坑,当配置好后,发现宿主机Ping不通设置的虚拟IP(192.168.1.100)
解决方式:修改nginx下/etc/keepalived/keepalived.conf文件
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
}
重启服务就解决了
systemctl stop keepalived.service
systemctl start keepalived.service
-
使用ip addr检查主备nginx服务器是否配置成功,下图是配置成功实例
主:
备:
8. 测试
-
本次配置环境
主nginx 192.168.1.30
备nginx 192.168.1.90
项目服务器地址:192.168.1.7:8080和192.168.1.7:8081
keepalived VIP:192.168.1.100
-
在浏览器访问VIP
80为项目服务器地址为192.168.1.7:8080的地址 81为项目服务器地址为192.168.1.7:8081的地址
-
当主服务器keepalived宕机
主:systemctl stop keepalived.service
备:
此时已经将VIP转移到备nginx上面,并且能正常实现nginx负载均衡 -
主服务器keepalived恢复
主:systemctl start keepalived.service
备:
当主nginx恢复,VIP又回到主nginx,并且能正常实现nginx负载均衡 -
当主服务器的nginx故障
为了效果明显我将chk_nginx.sh 脚本文件的监控直接改成当nginx故障直接关闭keepalived服务
主:
[外链图片转存失败,源站可能有防盗
备:
主服务器上面nginx故障直接将VIP转移到备服务器
9.Nginx+keepalived配置俩台都是主服务器
1.修改配置文件
nginx下/etc/keepalived/keepalived.conf
在第六步的主服务器(192.168.1.30)上添加
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 8888
}
virtual_ipaddress {
192.168.1.120
}
}
在第六步的备服务器(192.168.1.90)上添加
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 8888
}
virtual_ipaddress {
192.168.1.120
}
}
分别重启俩台服务器的keepalived服务:
192.168.1.90服务器
192.168.1.90服务器
可以发现俩台服务器都有VIP,并且都可以实现nginx的负载均衡和高可用
以上就是个人的配置方式,有什么问题可以留言
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 8888
}
virtual_ipaddress {
192.168.1.120
}
}
``
分别重启俩台服务器的keepalived服务并查看VIP:
192.168.1.90服务器
192.168.1.90服务器
可以发现俩台服务器都有VIP,并且都可以实现nginx的负载均衡和高可用
192.168.1.90服务器keepalived配置
以上就是个人的配置方式,有什么问题可以留言