文章目录
高可用集群:keepalived
只要不是云主机,就可以直接使用keepalived,因为有VIP,如果是云主机的话,就需要买slb,slb是一个服务具有负载均衡和高可用的功能。
1.keepalived高可用介绍
keepalived官网
keepalived高可用指的是比如有俩台主机作为调度器,分别连接着n台服务器,当主调度器上发生问题,备用调度器的这台机器立马替换上去进行工作。(其中客户访问的vip是由keepalived生成的)
keepalived 最初是为LVS负载软件设计的,用来管理lvs集群的各个节点的状态,后加入实现高可用的VRRP协议功能,所以Keepalived既可以管理lvs软件,还可以作为其它服务(nginx,Haproxy,MYSQL等)高可用解决方案。
VRRP(virtual route redundancy)虚拟路由器冗余协议,主要解决静态路由单点故障问题,保障少许服务器出现宕机时,整个网络仍然正常运行。
2.keepalived功能
- 管理LVS负载均衡软件
- 管理检查LVS集群节点的状态
- 保证系统网络服务的高可用性
3.keepalived高可用故障转移原理
keepalived高可用故障转移是通过VRRP协议实现的,主要解决静态路由故障,通过一种竞选机制将路由的任务交给某个vrrp路由器,保证网络正常运行。
keepalived工作时,主节点会不断的向备节点发送(多个广播信号方式)称心跳信息,告诉备节点自己还在工作,不要想我不要自己工作,如果突然主节点发送了故障后,就不能发送心跳信息,备节点就不能收到来着主节点的信息了,开始调用接管程序,接管ip资源以及服务,代替主节点的工作,而当主节点恢复正常后,备节点释放所有的ip资源和服务,恢复之前的备用节点状态。
4.keepalived工作原理
4.1想要深入了解keepalived,就要从vrrp通信来看
- VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
- VRRP是通过一种竟选协议机制来将路由任务交给某VRRP路由器的。
- VRRP用 ip协议广播的方式(默认多播地址:224.0.0.18)实现高可用对之间通信。
- 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。
- VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
4.2Keepalived服务的工作原理
在 Keepalived 服务之间,只有作为主节点会一直发送 VRRP 广播包,告诉备它还活着,此时备节点不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。
5.keepalived配置文件
#keepalived的主配置文件:/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 #路由器id(每台路由器不一样)
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { //定义实例
state MASTER //初始化状态,可选{MASTER|BACKUP}
interface eth0 //VRRP绑定的接口名称,用来发送VRRP包
virtual_router_id 51 //虚拟路由器id(同集群类型服务才能设置一样)
priority 100 //优先级
nopreempt //设置不抢占
advert_int 1 //检查的间隔(发送心跳包信息的时间)
authentication {
auth_type PASS //认证用户和密码
auth_pass 1111
}
virtual_ipaddress { //配置要使用的VIP地址
192.168.200.16
}
}
#以下是配置虚拟服务器
virtual_server 192.168.200.16 443 { //虚拟VIP(也就是上面配置的VIP,)
delay_loop 6 //443:代表https,这里可以修改为其它的服务,如mysql,nginx等,来进行高可用
lb_algo rr //rr轮循算法
lb_kind NAT //默认nat模式,进行端口映射,
persistence_timeout 50 //数据写到硬盘的超时时间,单位秒
protocol TCP //四层协议
sorry_server 192.168.200.200 1358 //定义备用服务器,当所有RS都故障时用sorry_server来响应
real_server 192.168.201.100 443 { //真实服务器ip和端口,只有是nat模式才可以进行端口映射
weight 1 //服务器设置权重
SSL_GET { #httpd服务的话就是HTTP_GET,https服务则是SSL_GET
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 //连接超时的时间
retry 3 //get尝试次数
delay_before_retry 3 //尝试之前延迟多长时间
}
}
}
#配置文件至少存在俩个real_server,分别指的是主和备服务器
[root@master ~]# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf //主配置目录
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service //服务控制文件
5.2自定义keepalived主配置文件
vrrp_instance字段配置
nopreempt //设置为不抢占,默认是抢占状态的,使用此功能,状态必须为BACKUP,就是主和备均为backup。
preempt_delay //设置延迟抢占,单位为秒,范围0-1000,默认为0,多少秒后开始抢占
vrrp_script字段配置
//添加的脚本为周期性执行,静态码会被调用它的vrrp instance记录
vrrp_script <script_name>{
script "/path/...." #脚本的路径
interval <INTEGER> #脚本执行的间隔,单位秒,默认为1s
timeout <INTEGER> #指定的 多少秒后,脚本被认为执行失败
weight <-254 --- 254> #调整优先级,默认为2,在用来的优先级情况下进行操作
rise <INTEGER> #执行多少次才认为成功
fall <INTEGER> #执行多少次才认为失败
user <USERNAME> [GROUPNAME] #运行脚本的用户和组
init_fail #设置初始化脚本状态为失败
}
real_server字段配置
weight <INT> #服务器设置权重,默认为1
inhibit_on_failure //当服务器健康检查失败时,将其weight设置为0, \
//而不是从Virtual Server中移除
notify_up <STRING> //当服务器健康检查成功时,执行的脚本
notify_down <STRING> //当服务器健康检查失败时,执行的脚本
uthreshold <INT> //到这台服务器的最大连接数
lthreshold <INT> //到这台服务器的最小连接数
tcp_check字段配置
connect_ip <IP ADDRESS> //连接的IP地址。默认是real server的ip地址
connect_port <PORT> //连接的端口。默认是real server的端口
bindto <IP ADDRESS> //发起连接的接口的地址。
bind_port <PORT> //发起连接的源端口。
connect_timeout <INT> //连接超时时间。默认是5s。
fwmark <INTEGER> //使用fwmark对所有出去的检查数据包进行标记。
warmup <INT> //指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry <INIT> //重试次数。默认是1次。
delay_before_retry <INT> //默认是1秒。在重试之前延迟多少秒。
5.3自定义keepalived实例
global_defs {
router_id LVS_Server //实例名字
}
vrrp_instance VI_1 {
state BACKUP //状态
interface ens33 //接口
virtual_router_id 51 //虚拟id(同一集群保证一样)
priority 150 //优先级
nopreempt //不抢占
advert_int 1 //刷新间隔
authentication { //认证
auth_type PASS
auth_pass wangqing
}
virtual_ipaddress {
192.168.136.250 dev ens33 //虚拟vip可指定网卡
}
}
virtual_server 192.168.136.250 80 {
delay_loop 3
lvs_sched rr //算法
lvs_method NAT //NAT模式
protocol TCP
real_server 192.168.136.129 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.136.130 8080 {
weight 1
TCP_CHECK {
connect_port 8080
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
6.脑裂
6.1HA脑裂
HA脑裂:在高可用(HA)系统中,心跳线正常的情况下,俩个节点会互相发送信息,感知对方是否还存在,如果一旦感知不到了对方的信息,就认为对方发生故障,从而抢占资源和应用服务,心跳线断开的情况下,如果俩边服务均正常或均异常,就会发生严重的后果,资源的抢夺,导致数据损坏日志出错。
针对HA脑裂的决策:
- 添加心跳线,减少脑裂几率,一条坏了,还有多条
- 启动磁盘锁,让正在服务的机器锁住共享磁盘,让对方不能进行抢占磁盘资源,当服务的一方发现心跳线全部断开则开启磁盘锁,一般情况下不上锁
- 设置参考的ip(网关),当心跳线全部断开后,2个节点分别ping参考ip,一端ping不通则证明本端的网络链路出现问题,主动放弃争夺权,让能够ping通的一端去跑服务
6.2脑裂产生的原因
1.心跳线链路(网络)发生故障,导致无法通信
心跳线(断了,老化了)
网卡以及驱动坏了,ip配置冲突
设备故障,交换机,路由器
2.高可用服务器开启了iptable防火墙导致信息传输
3.高可用服务器心跳网卡地址配置不正确,(比如不在一个网段)
4.高可用服务器的配置不正确,心跳方式不同,软件bug,广播冲突等
5.keepalived配置的virtual_router_id同一集群配置的id不同,也会发生故障
6.3脑裂的常见解决方案
在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:
同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息
当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源
做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍的
6.4脑裂的监控
脑裂的监控是针对于备用服务器,添加zabbix自定义监控
监控的主角是 VIP
VIP存在于备用服务器上的俩种情况:
- 正常的主服务器和备用服务器之间的切换
- 发生了脑裂
因此只要备用服务器上存在VIP,则证明主服务器挂掉了
利用zabbix监控脑裂见文章:
7.keepalived实现nginx负载均衡高可用
高可用虚拟VIP:192.168.136.250(公司内应为公网)
系统 | ip | 名称 |
---|---|---|
centos8 | 192.168.136.232 | master(主) |
centos8 | 192.168.136.233 | slave(备) |
关闭防火墙
[root@master ~]# systemctl disable --now firewalld.service
[root@master ~]# setenforce 0
[root@slave ~]# systemctl disable --now firewalld
[root@slave ~]# setenforce 0
keepalived安装
[root@master ~]# yum list all|grep keepalived
keepalived.x86_64 2.1.5-6.el8 appstream
[root@master ~]# yum -y install keepalived
[root@slave ~]# yum -y install keepalived
master和slave服务器上分别安装nginx
[root@master ~]# yum -y install nginx
[root@slave ~]# yum -y install nginx
master和slave服务器上配置nginx网页
[root@master ~]# cd /usr/share/nginx/html/
[root@slave html]# ls
404.html 50x.html index.html nginx-logo.png poweredby.png
[root@master html]# mv index.html{,.back}
[root@master html]# echo 'SLAVE' > index.html
[root@master html]# ls
404.html 50x.html index.html index.html.back nginx-logo.png poweredby.png
[root@master html]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@master html]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
[root@slave ~]# cd /usr/share/nginx/html/
[root@slave html]# ls
404.html 50x.html index.html nginx-logo.png poweredby.png
[root@slave html]# mv index.html{,.back}
[root@slave html]# echo 'SLAVE' > index.html
[root@slave html]# ls
404.html 50x.html index.html index.html.back nginx-logo.png poweredby.png
[root@slave html]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@slave html]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
主keepalived配置
#先备份主配置文件
[root@master ~]# cd /etc/keepalived/
[root@master keepalived]# ls
keepalived.conf
[root@master keepalived]# mv keepalived.conf{,.back}
[root@master keepalived]# ls
keepalived.conf.back
#配置文件
[root@master keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01 #第一个
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #网络接口名称
virtual_router_id 99 #俩边服务器的id必须要一样
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass caicai666 #密码最好8位数
}
virtual_ipaddress {
192.168.136.250 #vip
}
}
virtual_server 192.168.136.250 80 { #同vip一样,80服务端口
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.136.232 80 { #主keepalived主机ip地址
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.136.233 80 { #备keepalived主机ip地址
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备keepalived配置
#先备份主配置文件
[root@slave ~]# cd /etc/keepalived/
[root@slave keepalived]# ls
keepalived.conf
[root@slave keepalived]# mv keepalived.conf{,.back}
[root@slave keepalived]# ls
keepalived.conf.back
#配置文件
[root@slave keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02 #第二个
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 #网络接口名称
virtual_router_id 99 #俩边服务器的id必须要一样
priority 90 //优先级90
advert_int 1
authentication {
auth_type PASS
auth_pass caicai666 #密码
}
virtual_ipaddress {
192.168.136.250 #vip
}
}
virtual_server 192.168.136.250 80 { #同vip一样,80服务端口
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.136.232 80 { #主keepalived主机ip地址
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.136.233 80 { #备keepalived主机ip地址
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
启动keepalived服务,查看VIP
#master服务器上启动服务,查看vip
[root@master ~]# systemctl enable --now keepalived.service
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:b4:c8:df brd ff:ff:ff:ff:ff:ff
inet 192.168.136.232/24 brd 192.168.136.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.136.250/32 scope global ens33 #VIP自动生成了出来
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feb4:c8df/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:be:03:cf brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:be:03:cf brd ff:ff:ff:ff:ff:ff
#slave服务器上启动服务,查看vip
[root@slave ~]# systemctl enable --now keepalived.service
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
[root@slave ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:90:1f:fa brd ff:ff:ff:ff:ff:ff
inet 192.168.136.233/24 brd 192.168.136.255 scope global dynamic noprefixroute ens33
valid_lft 1260sec preferred_lft 1260sec
inet6 fe80::314b:11d8:7c1b:d9bb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
//只有当主服务器挂了后,备上才会有VIP
#把master服务器的keepalived服务关了
[root@master ~]# systemctl stop keepalived.service
#自然master服务器没有了vip,而slave服务器有了VIP
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:90:1f:fa brd ff:ff:ff:ff:ff:ff
inet 192.168.136.233/24 brd 192.168.136.255 scope global dynamic noprefixroute ens33
valid_lft 1540sec preferred_lft 1540sec
inet 192.168.136.250/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::314b:11d8:7c1b:d9bb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
客户访问的是主服务器上的VIP地址,因此主机器和备机器的keepliaved的服务保证开启,
主服务器的nginx要保证运行中,而备服务器的nginx服务要关闭。
当主上的nginx服务挂掉后keepalived也要相应的关闭,这时VIP会转到备用主机上,这时备用的nginx服务则要开启保证服务的正常运行。
但是问题来了,我们不会一直盯着它出现问题再手动进行配置。
针对上述描述,因此脚本是最好的选择!!!
修改内核参数,开启监听VIP功能
[root@master ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
[root@master ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
[root@master ~]# cat /proc/sys/net/ipv4/ip_nonlocal_bind
1
[root@slave ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
[root@slave ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
[root@slave ~]# cat /proc/sys/net/ipv4/ip_nonlocal_bind
1
keepalived通过脚本来控制nginx负载均衡
master服务器上编写脚本
[root@master ~]# cd /scripts/
[root@master scripts]# chmod +x check_n.sh
[root@master scripts]# vim check_n.sh
#!/bin/bash
#!/bin/bash
nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep -c "nginx")
if [ $nginx_status -lt 1 ];then
systemctl stop keepalived
fi
//check_n.sh脚本的功能:当检查nginx的进程没有则代表nginx服务已经挂掉,自动会把keepalived服务关闭
[root@master scripts]# chmod +x notify.sh
[root@master scripts]# cat notify.sh
#!/bin/bash
#!/bin/bash
VIP=$2
sendmail (){
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to master"
echo $content | mail -s "$subject" xxxxxx@qq.com
}
case "$1" in
master)
nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
if [ $nginx_status -lt 1 ];then
systemctl start nginx
fi
sendmail
;;
backup)
nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
if [ $nginx_status -gt 0 ];then
systemctl stop nginx
fi
;;
*)
echo "Usage:$0 master|backup VIP"
;;
esac
#notify.sh脚本功能:当本机器为master主机时如果nginx服务关闭则会开启nginx服务,当本机器为backup主机时(也就是没有了keepalived服务时)会关闭nginx服务,发生故障的状态信息,会发送邮件
[root@master ~]# systemctl enable --now postfix
[root@master ~]# yum -y install maix postfix
slave服务器上编写脚本
#同master服务器的notify脚本一样
[root@slave ~]# mkdir /scripts
[root@slave ~]# cd /scripts/
[root@slave scripts]# chmod +x notify.sh
[root@slave scripts]# cat notify.sh
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to master"
echo $content | mail -s "$subject" 1481583607@qq.com
}
case "$1" in
[root@slave ~]# systemctl enable --now postfix
[root@slave ~]# yum -y install maix postfix
check_x.sh中的x代表服务,如chck_m.sh代表mysql的服务脚本
配置keepalived加入监控脚本的配置
master服务器上(添加俩处内容)
[root@master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script nginx_check { //定义检查的脚本
script "/scripts/check_n.sh" //指定脚本路径
interval 1 //刷新间隔
weight -20 //优先级减20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 99
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass caicai666
}
virtual_ipaddress {
192.168.136.250
}
track_script {
nginx_check
}
notify_master "/scripts/notify.sh master 192.168.136.250" //通知脚本的方式
notify_backup "/scripts/notify.sh backup 192.168.136.250"
}
virtual_server 192.168.136.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.136.232 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.136.233 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
#可以多重启俩次
[root@master scripts]# systemctl start nginx.service keepalived.service
[root@master scripts]# systemctl start nginx.service keepalived.service
slave服务器上(添加一处内容)
backup时无需检测nginx是否正常,当升级为MASTER时启动nginx,当降级为BACKUP时关闭
[root@slave ~]# vim /etc/keepalived/keepalived.conf
[root@slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 99
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass caicai666
}
virtual_ipaddress {
192.168.136.250
}
notify_master "/scripts/notify.sh master 192.168.136.250" //添加此处
notify_backup "/scripts/notify.sh backup 192.168.136.250" //添加此处
}
virtual_server 192.168.136.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.136.232 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@slave ~]# systemctl restart keepalived.service
效果流程:
1.查看主和备服务器的服务情况
#master服务器开启了nginx服务和keepalived服务,存在VIP
[root@master ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 32 192.168.122.1:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 5 [::1]:631 [::]:*
LISTEN 0 128 [::]:111 [::]:*
LISTEN 0 128 [::]:80 [::]:*
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:b4:c8:df brd ff:ff:ff:ff:ff:ff
inet 192.168.136.232/24 brd 192.168.136.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.136.250/32 scope global ens33 //vip
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feb4:c8df/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:be:03:cf brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:be:03:cf brd ff:ff:ff:ff:ff:ff
[root@master ~]#
#slave服务器开启了keepalived服务,nginx处于关闭,没有vip
[root@slave ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:90:1f:fa brd ff:ff:ff:ff:ff:ff
inet 192.168.136.233/24 brd 192.168.136.255 scope global dynamic noprefixroute ens33
valid_lft 1298sec preferred_lft 1298sec
inet6 fe80::314b:11d8:7c1b:d9bb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2.模拟主服务器上的nginx发生宕机
[root@master ~]# systemctl stop nginx
[root@master ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 32 192.168.122.1:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 5 [::1]:631 [::]:*
LISTEN 0 128 [::]:111 [::]:*
3.查看vip是否出现在备用主机上
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:90:1f:fa brd ff:ff:ff:ff:ff:ff
inet 192.168.136.233/24 brd 192.168.136.255 scope global dynamic noprefixroute ens33
valid_lft 1116sec preferred_lft 1116sec
inet 192.168.136.250/32 scope global ens33 //VIP
valid_lft forever preferred_lft forever
inet6 fe80::314b:11d8:7c1b:d9bb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4.slave服务器上的nginx服务自动开启了服务
[root@slave ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
[root@slave ~]#
进行访问
当master的nginx服务修复之后,关闭slave上的nginx服务,则恢复到了之前的状态。