Keepalived结合Nginx实现WEB高可用服务

news2024/10/7 16:26:12

前言

随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx,Nginx高性能、稳定性成为IT人士青睐的HTTP和反向代理服务器。
Nginx负载均衡一般位于整个网站架构的最前端或者中间层,如果为最前端时单台Nginx会存在单点故障,也就是一台Nginx宕机,会影响用户对整个网站的访问。所以需要加入Nginx备份服务器,Nginx主服务器与备份服务器之间形成高可用,一旦发现Nginx主宕机,能快速将网站恢复至备份主机。

一. 使用脚本实现高可用

这种方式是通过两台服务器都绑定同一个VIP结合服务一起使用,通过判断服务是否正常,若服务不正常或者关闭了,这时在主服务器上的VIP会漂移到备服务器上,以达到高可用的方案。

1. 需要准备2台服务器
2. 将防火墙提前关闭
3. 两台服务器都装好nginx
4. 两台服务器都部署相同的VIP IP地址
5. 两台服务器通过启动脚本的方式进行判断服务是否正常

服务器系统服务IPVIP IP
CentOS7.9Nginx192.168.154.128192.168.154.188
CentOS7.9Nginx192.168.154.23192.168.154.188

1. 部署nginx服务

这里就直接使用yum install 的方式快速安装好nginx服务(以下步骤,两台服务器都要操作)
如果要用其他方式安装,可以参考这篇:部署安装Nginx服务实例

yum install -y epel-release; yum install -y nginx  

这里需要先安装epel-release,安装好这个扩展源,才会有nginx的软件包。

为了让两台服务器的网页看着有区别,重新设置index.html页面文件。
第一台服务器:

[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# rm -rf *
[root@localhost html]# echo "This is 154.128 WebServer " > index.html

第二台服务器:

[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# rm -rf *
[root@localhost html]# echo "This is 154.23 WebServer " > index.html

启动nginx服务

[root@localhost html]# systemctl start nginx

在网页上查看
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/c5482f8615f443ffae852f5575eda272.png

2. 配置VIP的子网卡

切换到对应的目录进行创建子网卡(两台服务器都需要配置)

[root@localhost html]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-ens32:0
[root@localhost network-scripts]# cat ifcfg-ens32:0
TYPE="Ethernet"
BOOTPROTO="static"
DEVICE="ens32:0"
ONBOOT="yes"
IPADDR="192.168.154.188"
NETMAST="255.255.255.0"

这里就不需要加上网关,可以查看默认已有的网关

[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.154.1   0.0.0.0         UG    100    0        0 ens32
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

配置好之后,可以用ifup命令启动下网卡,看下有没有问题;可以在两台服务器都试下,如果第一台服务器启动测试了没问题,需要先将网卡使用ifdown ens32:0 停止,再到另外一台服务器上启动。

[root@localhost network-scripts]# ifup ens32:0
[root@localhost network-scripts]# echo $?
0
[root@localhost html]# ifconfig |grep -wi "inet"|awk 'NR==2,NR==3{print $2}'
192.168.154.23
192.168.154.188

3. SHELL编程实现Nginx高可用脚本

部署两台Nginx服务器,发布WEB测试页面
通过两台IP均可以实现访问WEB网页
增加第三个IP,称为VIP,可以绑定至某一台0.188
实现访问VIP(域名)即可访问一台Nginx WEB服务
当该Nginx WEB服务宕机,VIP自动切换至另外一台WEB
时刻保证不管哪台Nginx WEB宕机,VIP均可以访问WEB

有了思路就可以开始写脚本,可以将脚本分成几步来实现

[root@localhost ~]# vim auto_nginx_status.sh
#!/bin/bash
#2023年5月10日15:47:28
#auto nginx status 
#####################
NGINX_NUM=$(ps -ef|grep nginx|grep -Ev "grep|auto_nginx"|wc -l)
if [ $NGINX_NUM -gt 0 ];then
        ping -c3 192.168.154.188 >>/dev/null 2>&1
        if [ $? -ne 0 ];then
                cd /etc/sysconfig/network-scripts/
                cat>ifcfg-ens32:0<<-EOF
                TYPE="Ethernet"
                BOOTPROTO="static"
                DEVICE="ens32:0"
                ONBOOT="yes"
                IPADDR="192.168.154.188"
                NETMAST="255.255.255.0"
                EOF
                ifup ens32:0
        fi
else
        cd /etc/sysconfig/network-scripts/
        ifdown ens32:0 >>/dev/null 2>&1
        rm -rf /etc/sysconfig/network-scripts/ifcfg-ens32:0
fi

第一版的脚本将Nginx服务与VIP关联起来,通过判断脚本进程是否正常来添加VIP网卡;添加之前先ping这个IP是否能通信,可以通信说明这个VIP正在使用,若这个网卡不能通信,说明处于一个释放的状态,这时另外一台服务器才会添加VIP的网卡。

当然这个脚本还是有缺陷的,因为只能判断后就退出脚本了,我们要让这个脚本可以一直运行。就需要加上while循环语句了。

[root@localhost ~]# vim auto_nginx_status.sh
#!/bin/bash
#2023年5月10日15:47:28
#auto nginx status 
#####################
while true
do
        sleep 5
        date
        NGINX_NUM=$(ps -ef|grep nginx|grep -Ev "grep|auto_nginx"|wc -l)
        if [ $NGINX_NUM -gt 0 ];then
                ping -c3 192.168.154.188 >>/dev/null 2>&1
                if [ $? -ne 0 ];then
                        cd /etc/sysconfig/network-scripts/
                        cat>ifcfg-ens32:0<<-EOF
                        TYPE="Ethernet"
                        BOOTPROTO="static"
                        DEVICE="ens32:0"
                        ONBOOT="yes"
                        IPADDR="192.168.154.188"
                        NETMAST="255.255.255.0"
                        EOF
                        ifup ens32:0
                fi
        else
                cd /etc/sysconfig/network-scripts/
                ifdown ens32:0 >>/dev/null 2>&1
                rm -rf /etc/sysconfig/network-scripts/ifcfg-ens32:0
        fi
done

第二版就出来了,加上while循环可以让脚本一直在后台执行,并且可以给它限定多少秒执行一次,并且显示出时间。但是这样看的话,有很多字段是重复的,我们可以将它定义成变量,这样就显示简洁很多。

#!/bin/bash
#2023年5月10日15:47:28
#auto nginx status 
#####################
ENS_FILE="ens32:0"
ENS_VIP="192.168.154.188"
ENS_DIR="/etc/sysconfig/network-scripts"
while true
do
        sleep 5
        date 
        NGINX_NUM=$(ps -ef|grep nginx|grep -Ev "grep|auto_nginx"|wc -l)
        if [ $NGINX_NUM -gt 0 ];then
                ping -c3 ${ENS_VIP} >>/dev/null 2>&1
                if [ $? -ne 0 ];then
                        cd ${ENS_DIR}/
                        cat>ifcfg-${ENS_FILE}<<-EOF
                        TYPE="Ethernet"
                        BOOTPROTO="static"
                        DEVICE="${ENS_FILE}"
                        ONBOOT="yes"
                        IPADDR="${ENS_VIP}"
                        NETMAST="255.255.255.0"
                        EOF
                        ifup ${ENS_FILE}
                fi
        else
                cd ${ENS_DIR}/
                ifdown ${ENS_FILE} >>/dev/null 2>&1
                rm -rf ifcfg-${ENS_FILE}
        fi
done

基本上就能实现所有功能了,下面来进行测试

4. 测试脚本的功能实现

检测第一台Nginx服务出现问题的时候,VIP是否会漂移到第二台服务器上,让网站可以实现高可用的方案。
在两台服务器上都运行这个脚本

[root@localhost ~]# /bin/bash auto_nginx_status.sh 
2023年 05月 10日 星期三 16:08:27 CST
2023年 05月 10日 星期三 16:08:34 CST
2023年 05月 10日 星期三 16:08:41 CST
2023年 05月 10日 星期三 16:08:48 CST
2023年 05月 10日 星期三 16:08:55 CST
2023年 05月 10日 星期三 16:09:02 CST
2023年 05月 10日 星期三 16:09:09 CST
2023年 05月 10日 星期三 16:09:16 CST
[root@localhost ~]# ifconfig |grep -wi "inet"|awk 'NR==1,NR==2{print $2}'
192.168.154.128
192.168.154.188

当前VIP在128这台服务器上
在这里插入图片描述
这时我们将第一台上的Nginx服务给关了,看下VIP是否会跳到第二台服务器上,让网页显示的内容是23的index.html文件的信息。

[root@localhost ~]# pkill nginx
[root@localhost ~]# ifconfig |grep -wi "inet"|awk 'NR==1,NR==2{print $2}'
192.168.154.128
127.0.0.1

杀死nginx进程时,在查看网卡的IP,发现VIP 188已经被释放了,那么接下来在网页上查看VIP是否显示的是第二台服务器上的内容。
在这里插入图片描述
已经变成第二台上的index.html文件的信息了,当然VIP也被绑到第二台服务器上了。

[root@localhost ~]# ifconfig |grep -wi "inet"|awk 'NR==2,NR==3{print $2}'
192.168.154.23
192.168.154.188

测试结果是没有什么问题的,但是仔细思考会发现这样的方式显然不够自动化,脚本需要人工去执行,而且过程比较繁琐,需要多配置一个子网卡。
接下来要讲的keepalived会简单很多,只需要将服务给部署好后,keepalived会检测服务是否正常,不正常的情况下会将VIP漂移到备用服务器上,同时移除主服务器,待主服务器上的服务正常后,重新让服务器回到服务器集群中。

二. 使用Keepalived服务实现高可用

概念======>《Keepalived概念与安装部署过程》
需要先把服务部署好之后,配置对应的参数
这里就直接使用yum安装服务

服务系统IP角色
Keepalived,NginxCentOS7.9172.17.0.2Master
Keepalived,NginxCentOS7.9172.17.0.3Backup

2.1 部署Keepalived

yum install keepalived -y

编写Keepalived与Nginx关联的脚本,需要在两台服务器上配置

cat auto_config_nginx_status.sh
#!/bin/bash
NGINX_NUM=$(ps -ef|grep nginx|grep -Ev "grep|auto_config"|wc -l)
if [ $NGINX_NUM -eq 0 ];then
        systemctl stop keepalived.service
fi   
#还需要将脚本权限设置成可执行权限
chmod +x auto_config_nginx_status.sh

将脚本加入到keepalived的配置文件中

第一台服务器设置成主master:

vim /etc/keepalived/keepalived.conf 
  1 ! Configuration File for keepalived
  2 
  3 global_defs {
  4    notification_email {
  5      sysadmin@firewall.loc
  6    }
  7    notification_email_from Alexandre.Cassen@firewall.loc
  8    smtp_server 127.0.0.1
  9    smtp_connect_timeout 30
 10    router_id LVS_DEVEL
 11 }
 12 
 13 vrrp_script check_nginx {
 14         script "/root/auto_config_nginx_status.sh"  #脚本的路径
 15         interval 5     #每隔5秒执行脚本
 16 
 17 vrrp_instance VI_1 {
 18     state MASTER
 19     interface eth0
 20     virtual_router_id 151
 21     priority 100
 22     advert_int 5
 23     authentication {
 24         auth_type PASS
 25         auth_pass 1111
 26     }
 27     virtual_ipaddress {
 28         172.17.0.188
 29     }
 30     track_script {
 31         check_nginx
 32     }
 33 }

第二台服务器:

vim /etc/keepalived/keepalived.conf 
  1 ! Configuration File for keepalived
  2 
  3 global_defs {
  4    notification_email {
  5      acassen@firewall.loc
  6    }
  7    notification_email_from Alexandre.Cassen@firewall.loc
  8    smtp_server 127.0.0.1
  9    smtp_connect_timeout 30
 10    router_id LVS_DEVEL
 11 }
 12 
 13 vrrp_script check_nginx {
 14         script "/root/auto_config_nginx_status.sh"
 15         interval 5
 16 }
 17 
 18 vrrp_instance VI_1 {
 19     state BACKUP
 20     interface eth0
 21     virtual_router_id 151
 22     priority 90
 23     advert_int 5
 24     authentication {
 25         auth_type PASS
 26         auth_pass 1111
 27     }
 28     virtual_ipaddress {
 29         172.17.0.188
 30     }
 31     track_script {
 32         check_nginx
 33    }
 34 }

然后两台服务器都启动服务就搞定了

systemctl restart keepalived.service

2.2 查看内核日志

在系统内核日志中查看启动服务的状态

[root@Master-02 ~]# tail -Fn 30 /var/log/messages
May 11 05:41:25 8be7506dd805 Keepalived_vrrp[1652]: Opening file '/etc/keepalived/keepalived.conf'.
May 11 05:41:30 8be7506dd805 Keepalived_vrrp[1652]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 11 05:41:35 8be7506dd805 Keepalived_vrrp[1652]: VRRP_Instance(VI_1) Entering MASTER STATE
May 11 05:41:35 8be7506dd805 Keepalived_vrrp[1652]: VRRP_Instance(VI_1) setting protocol VIPs.
May 11 05:41:35 8be7506dd805 Keepalived_vrrp[1652]: Sending gratuitous ARP on eth0 for 172.17.0.188
May 11 05:41:35 8be7506dd805 Keepalived_vrrp[1652]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 172.17.0.188
May 11 05:41:35 8be7506dd805 Keepalived_vrrp[1652]: Sending gratuitous ARP on eth0 for 172.17.0.188
May 11 05:41:35 8be7506dd805 Keepalived_vrrp[1652]: Sending gratuitous ARP on eth0 for 172.17.0.188

目前VIP地址在Master服务器上,且当前172.17.0.2是为MASTER状态

[root@localhost ~]# curl 172.17.0.188
0.2IP server 

当前VIP显示的网页信息也是0.2机器上的,再来看下backup服务器的日志信息

[root@Backup-03 ~]# tail -Fn 30 /var/log/messages
May 11 05:41:44 b31c0155f7d0 Keepalived_healthcheckers[1441]: Opening file '/etc/keepalived/keepalived.conf'.
May 11 05:41:44 b31c0155f7d0 Keepalived_vrrp[1442]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
May 11 05:41:44 b31c0155f7d0 Keepalived_vrrp[1442]: VRRP_Instance(VI_1) removing protocol VIPs.
May 11 05:41:44 b31c0155f7d0 Keepalived_vrrp[1442]: Using LinkWatch kernel netlink reflector...
May 11 05:41:44 b31c0155f7d0 Keepalived_vrrp[1442]: VRRP_Instance(VI_1) Entering BACKUP STATE

backup服务器显示也是启动了keepalived.conf这个文件,当前状态为BACKUP。

可以通过查看VIP配置到哪台服务器上可以知道谁是MASTER状态。

2.3 查看网卡IP

这里要注意的是keepalived的VIP使用ifconfig命令是查看不到的

[root@Master-02 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 4462  bytes 975851 (952.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2738  bytes 376935 (368.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

需要在ip addr 命令中查看,VIP IP只能在服务器集群中的一个,如果VIP存在在多台服务器那就说明配置的时候出现问题了。

[root@Master-02 ~]# ip addr|grep -Eio "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
172.17.0.2
172.17.255.255
172.17.0.188

当然也可以通过抓包的方式来查看谁是MASTER。

VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP组播(multicast)包(组播地址 224.0.0.18)形式发送。

2.4 使用tcpdump抓包

如果没有这个命令可以使用yum下载

[root@localhost ~]# which tcpdump
/usr/sbin/tcpdump
[root@localhost ~]# rpm -qf /usr/sbin/tcpdump
tcpdump-4.9.2-4.el7_7.1.x86_64
[root@Backup-03 ~]#yum install -y  tcpdump-4.9.2-4.el7_7.1.x86_64

由172.17.0.2服务器每个5秒发送组播包(224.0.0.18)到服务器集群中。

[root@Backup-03 ~]# tcpdump -i eth0 -nn host 172.17.0.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
06:09:26.728428 IP 172.17.0.2 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 100, authtype simple, intvl 5s, length 20
06:09:31.728754 IP 172.17.0.2 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 100, authtype simple, intvl 5s, length 20
06:09:36.729083 IP 172.17.0.2 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 100, authtype simple, intvl 5s, length 20
06:09:41.729403 IP 172.17.0.2 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 100, authtype simple, intvl 5s, length 20
06:09:46.729751 IP 172.17.0.2 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 100, authtype simple, intvl 5s, length 20

接下来我们模拟0.2服务器的服务宕机,看下VIP地址会不会漂移到另外一台服务器上。

2.5 模拟服务宕机

将172.17.0.2上的nginx给kill掉,由于脚本上的设置,当nginx服务关闭的时候,keepalived也会关闭。

[root@Master-02 ~]# pkill nginx
[root@Master-02 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: inactive (dead) since Thu 2023-05-11 06:19:37 UTC; 12s ago
  Process: 2952 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2953 (code=exited, status=0/SUCCESS)
   CGroup: /docker/8be7506dd805cc8dab483ae8954e61f78629d981094ef138546ad1328fa489af/system.slice/keepalived.service

查看0.2的日志信息

May 11 06:19:36 8be7506dd805 Keepalived[2953]: Stopping
May 11 06:19:36 8be7506dd805 systemd: Stopping LVS and VRRP High Availability Monitor...
May 11 06:19:36 8be7506dd805 Keepalived_vrrp[2955]: VRRP_Instance(VI_1) sent 0 priority
May 11 06:19:36 8be7506dd805 Keepalived_vrrp[2955]: VRRP_Instance(VI_1) removing protocol VIPs.
May 11 06:19:36 8be7506dd805 Keepalived_healthcheckers[2954]: Stopped
May 11 06:19:37 8be7506dd805 Keepalived_vrrp[2955]: Stopped
May 11 06:19:37 8be7506dd805 Keepalived[2953]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
May 11 06:19:37 8be7506dd805 systemd: Stopped LVS and VRRP High Availability Monitor.

0.2上的keepalived服务停止了;继续查看0.3的日志信息

May 11 06:19:37 b31c0155f7d0 Keepalived_vrrp[1442]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 11 06:19:42 b31c0155f7d0 Keepalived_vrrp[1442]: VRRP_Instance(VI_1) Entering MASTER STATE
May 11 06:19:42 b31c0155f7d0 Keepalived_vrrp[1442]: VRRP_Instance(VI_1) setting protocol VIPs.
May 11 06:19:42 b31c0155f7d0 Keepalived_vrrp[1442]: Sending gratuitous ARP on eth0 for 172.17.0.188
May 11 06:19:42 b31c0155f7d0 Keepalived_vrrp[1442]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 172.17.0.188
May 11 06:19:42 b31c0155f7d0 Keepalived_vrrp[1442]: Sending gratuitous ARP on eth0 for 172.17.0.188

0.3的状态转变成了MASTER,同时VIP也漂移到0.3机器上。

[root@Backup-03 ~]# ip addr |grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
172.17.0.3
172.17.255.255
172.17.0.188

以上部署的过程,第一台服务器上的服务若出现宕机的情况,在第一台服务器上的VIP会释放,Keepalived的VRRP路由冗余技术会将VIP配置到第二台服务器; 假如第一台服务器的服务经过运维人员恢复正常后,重新启动keepalived服务时,由于第一台的优先级高于第二台服务器,那么keepalived的VRRP会通过竞选的方式,100>90 ,将第二台的VIP重新漂移到第一台服务器上;
这种方式显然在企业中受影响会比较大,因为从第一台服务器到第二台服务器 ,VRRP会将VIP给释放,然后绑定到另外一台服务器,这个期间,会有3-5秒的时间,用户是访问不了网页的;第一台服务恢复后,VIP又会漂移回来,这时又会有几秒钟的用户访问不了;当前在keepalived中可以设置不抢占的方式,这样即使第一台服务恢复了,优先级也比第二台的高的情况下,也不会重新漂移回来到第一台服务器上。

需要在配置文件中重新设置,要注意的点是,设置成不抢占,需要将状态修改成BACKUP,因为MASTER状态无视不抢占这个设定。

#此时VIP在172.17.0.3的服务器中
[root@Backup-03 ~]# ip addr |grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
172.17.0.3
172.17.255.255
172.17.0.188

#在172.17.0.2的配置文件中将实例1的VIP设置成不抢占,并且将状态修改成BACKUP
! Configuration File for keepalived

global_defs {
   notification_email {
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_nginx {
        script "/root/auto_config_nginx_status.sh"
        interval 5
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 151
    priority 100
    nopreempt  		#不抢占
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.188
    }
    track_script {
        check_nginx
    }
}

可以看到第一台服务器优先级高于第二台服务器时,也不会出现抢占VIP的情况。

[root@Master-02 ~]# tail -Fn 30 /var/log/messages
May 11 07:27:08 8be7506dd805 Keepalived_vrrp[11506]: VRRP_Instance(VI_1) removing protocol VIPs.
May 11 07:27:08 8be7506dd805 Keepalived_vrrp[11506]: Using LinkWatch kernel netlink reflector...
May 11 07:27:08 8be7506dd805 Keepalived_vrrp[11506]: VRRP_Instance(VI_1) Entering BACKUP STATE
May 11 07:27:08 8be7506dd805 Keepalived_vrrp[11506]: VRRP sockpool: [ifindex(88), proto(112), unicast(0), fd(10,11)]
May 11 07:27:08 8be7506dd805 Keepalived_vrrp[11506]: VRRP_Script(check_nginx) succeeded

以上仅仅是Nginx+keepalived主备模式,始终存在一台服务器处于空闲状态,那么如何更好的把两台服务器利用起来,下面可以Nginx+keepalived双主架构来实现,让两台服务器对外两个VIP地址,同时接收用户的请求。

三. 双主架构部署Nginx+Keepalived

这种方式可以有效的利用现有的资源,提升接收请求的并发量,让两台服务器互为主备,要实现这个效果,就需要在配置文件中在添加一个事例VI_2

3.1 在配置文件中添加功能

172.17.0.2 服务器:

! Configuration File for keepalived
global_defs {
   notification_email {
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_nginx {
        script "/root/auto_config_nginx_status.sh"
        interval 5
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 151
    priority 100
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.188
    }
    track_script {
        check_nginx
    }
}
vrrp_instance VI_2 {   # 实例2
    state BACKUP        #第一台服务器上添加第二个实例,有一个主状态,这个就设置成备用状态
    interface eth0     #网卡接口不变
    virtual_router_id 152   #id号需要修改,实例之间ID号不能一致
    priority 90				#作为备用服务器,优先级可以设置成90
    advert_int 5			#表示每五秒进行一次健康检查
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.189 		#VIP IP设置成189
    }
    track_script {
        check_nginx
    }
}

172.17.0.3 服务器:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_nginx {
        script "/root/auto_config_nginx_status.sh"
        interval 5
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 151
    priority 90
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.188
    }
    track_script {
        check_nginx
   }
}
vrrp_instance VI_2 {
    state MASTER       
    interface eth0
    virtual_router_id 152
    priority 100
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.0.189

配置好之后就可以重启服务了

[root@Backup-03 ~]# systemctl restart keepalived

还是一样查看日志文件查看状态

[root@Master-02 ~]# tail -fn 30 /var/log/messages
May 11 06:40:30 8be7506dd805 Keepalived_vrrp[6728]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 11 06:40:35 8be7506dd805 Keepalived_vrrp[6728]: VRRP_Instance(VI_1) Entering MASTER STATE
May 11 06:40:35 8be7506dd805 Keepalived_vrrp[6728]: VRRP_Instance(VI_1) setting protocol VIPs.
May 11 06:40:35 8be7506dd805 Keepalived_vrrp[6728]: Sending gratuitous ARP on eth0 for 172.17.0.188
May 11 06:40:35 8be7506dd805 Keepalived_vrrp[6728]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 172.17.0.188
May 11 06:40:35 8be7506dd805 Keepalived_vrrp[6728]: Sending gratuitous ARP on eth0 for 172.17.0.188
May 11 06:40:35 8be7506dd805 Keepalived_vrrp[6728]: Sending gratuitous ARP on eth0 for 172.17.0.188

172.17.0.2服务器使用的依然还是172.17.0.188的VIP;
再来查看172.17.0.3服务器的日志信息

May 11 06:40:36 b31c0155f7d0 Keepalived_vrrp[6422]: VRRP_Instance(VI_2) Transition to MASTER STATE
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: VRRP_Instance(VI_2) Entering MASTER STATE
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: VRRP_Instance(VI_2) setting protocol VIPs.
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: Sending gratuitous ARP on eth0 for 172.17.0.189
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: VRRP_Instance(VI_2) Sending/queueing gratuitous ARPs on eth0 for 172.17.0.189
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: Sending gratuitous ARP on eth0 for 172.17.0.189
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: Sending gratuitous ARP on eth0 for 172.17.0.189
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: Sending gratuitous ARP on eth0 for 172.17.0.189
May 11 06:40:41 b31c0155f7d0 Keepalived_vrrp[6422]: Sending gratuitous ARP on eth0 for 172.17.0.189

172.17.0.3服务器使用的是v2实例的172.17.0.189 VIP;
通过ip addr 命令查看VIP是否出现冲突的情况;

[root@Master-02 ~]# ip addr |grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
172.17.0.2
172.17.255.255
172.17.0.188

[root@Backup-03 ~]# ip addr |grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
172.17.0.3
172.17.255.255
172.17.0.189

3.2 模拟服务宕机

继续试下服务宕机后,显示的结果是怎么样的
将第一台服务器的nginx服务给关闭了

[root@Master-02 ~]# pkill nginx
[root@Backup-03 ~]# ip addr |grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
172.17.0.3
172.17.255.255
172.17.0.189
172.17.0.188

可以看到两个VIP都跑到了第二台服务器上,那么这时就会有人问了,两个VIP都在一个服务器上,是否会出错;理论上是不会的,可以在网页上查看这两个VIP显示的结果。

[root@VM-12-17-centos ~]# curl 172.17.0.188
0.3IP server 
[root@VM-12-17-centos ~]# curl 172.17.0.189
0.3IP server 

这时将第一台服务器的服务恢复后,188的VIP会重新的绑定在172.17.0.2服务器上。

[root@Master-02 ~]# /usr/sbin/nginx
[root@Master-02 ~]# systemctl start keepalived;tail -fn 30 /var/log/messages
May 11 07:00:47 8be7506dd805 Keepalived_vrrp[8605]: Opening file '/etc/keepalived/keepalived.conf'.
May 11 07:00:47 8be7506dd805 Keepalived_vrrp[8605]: VRRP_Instance(VI_2) Entering BACKUP STATE
May 11 07:00:47 8be7506dd805 Keepalived_vrrp[8605]: VRRP sockpool: [ifindex(88), proto(112), unicast(0), fd(10,11)]
May 11 07:00:47 8be7506dd805 Keepalived_vrrp[8605]: VRRP_Script(check_nginx) succeeded
May 11 07:00:49 8be7506dd805 Keepalived_vrrp[8605]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 11 07:00:54 8be7506dd805 Keepalived_vrrp[8605]: VRRP_Instance(VI_1) Entering MASTER STATE
May 11 07:00:54 8be7506dd805 Keepalived_vrrp[8605]: VRRP_Instance(VI_1) setting protocol VIPs.
May 11 07:00:54 8be7506dd805 Keepalived_vrrp[8605]: Sending gratuitous ARP on eth0 for 172.17.0.188
May 11 07:00:54 8be7506dd805 Keepalived_vrrp[8605]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 172.17.0.188
May 11 07:00:54 8be7506dd805 Keepalived_vrrp[8605]: Sending gratuitous ARP on eth0 for 172.17.0.188
May 11 07:00:54 8be7506dd805 Keepalived_vrrp[8605]: Sending gratuitous ARP on eth0 for 172.17.0.188

3.3 双主企业架构需要注意的地方

Nginx+keepalived双主企业架构,在日常维护及管理过程中需要如下几个方面:

  • Keepalived主配置文件必须设置不同的VRRP名称,同时优先级和VIP设置也各不相同;
  • Nginx网站总访问量为两台Nginx服务器之和,可以写脚本自动统计访问量;
  • 两台Nginx为Master,存在两个VIP地址,用户从外网访问VIP,需配置域名映射到两个VIP上方可。
  • 通过外网DNS映射不同VIP的方法也称为DNS负载均衡模式; 可以通过Zabbix实时监控VIP访问状态是否正常。

总结

Keepalived+Nginx的高可用配置起来还是比较容易的,需要注意的是,配置时,要将id号对应,并且优先级上也要决定好是哪台机器作为主,哪台作为备,若觉得以上内容还行的,可以点赞支持一下!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot2】四:核心技术----配置文件

文章目录 1.SpringBoot配置文件种类2.yaml3.支持的数据类型4.对象5.数组6.字面量7.示例 1.SpringBoot配置文件种类 主要有两种类型&#xff1a; properties yaml 2.yaml 语法&#xff1a; 大小写敏感使用缩进表示层级关系缩进不允许使用tab&#xff0c;只允许空格缩进的空格…

开源字节数字化乡村系统

随着社会的发展&#xff0c;互联网技术的迅速发展&#xff0c;乡村建设也受到了越来越多的关注。互联网乡村建设是一种新型的乡村建设模式&#xff0c;它将互联网技术与乡村建设相结合&#xff0c;以提高乡村建设的效率和质量。为了实现互联网乡村建设&#xff0c;需要建立一个…

2023 FP独立站的运营玩法汇总

无论Paypal怎么风控封号、冻结资金&#xff0c;但还是有很多新人前仆后继地加入外贸独立站这一行&#xff0c;特别是做FP。因为明白人都知道&#xff0c;FP利润空间比普货产品大得多。 那么2023年的独立站我们该怎么做&#xff0c;怎么运营才能逐步起色&#xff1f;今天我就跟…

Java版工程项目管理系统平台+企业工程系统源码+助力工程企业实现数字化管理

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

48-Dockerfile-CMD/ENTRYPOINT指令

CMD/ENTRYPOINT指令 前言CMD作用格式使用示例 ENTRYPOINT作用格式使用示例CMD/ENTRYPOINT区别CMD使用示例ENTRYPOINT使用示例 前言 本篇来学习下Dockerfile中的CMD/ENTRYPOINT指令 CMD 作用 启动容器时默认执行的命令 说明&#xff1a; 一个 Dockerfile 只有一个 CMD 指令&…

nginx+flume网络流量日志实时数据分析实战

文章目录 nginxflume网络流量日志实时数据分析实战网络流量日志数据分析-概述网络流量日志数据分析-数据处理流程网络流量日志数据分析-数据采集网站日志文件启动nginx服务器:刷新页面,查看日志信息:日志字段解释 网络流量日志数据分析-数据采集-Flume框架Flume概述Flume运行机…

ESP32-C2开发板烧录演示

一、准备工作 数据线X 1 、 四博智联 ESPC2-12 开发板 X 1 二、环境搭建 1、进入https://code.visualstudio.com 官网下载VSCODE软件 2、安装完成后安装乐鑫插件如下图 3、插件安装完后&#xff0c;查看- 命令面板&#xff08;快捷键CtrlShiftP&#xff09;。 4、输入config…

基于C#的上位机和组态软件:如何选择最佳方案?

C#上位机并非取代组态软件&#xff0c;而是其补充&#xff0c;它们各自在不同的应用场景中发挥作用。 如果您了解组态&#xff0c;但不懂C#编程&#xff0c;且没有特殊需求&#xff08;如自定义协议、复杂业务、第三方系统对接等&#xff09;&#xff0c;并且希望获得良好的功…

无人机航测行业中常见名词解释,你都知道吗?

无人机航测具有机动灵活、高效快速、作业成本低、适用范围广、生产周期短等优势&#xff0c;目前主要应用于地形测绘、工程建设、土地资源调查、地质灾害应急处理、城市数字化建设等方面。下面就来了解一下无人机航测行业中的常见名词吧。 1、航片&#xff1a;利用航空摄影器拍…

有什么好用的云渲染?

在CG制作流程中&#xff0c;离线渲染一直是必要且耗时的环节。你的场景越复杂&#xff0c;渲染出现问题的可能性就越大&#xff0c;尤其是当你独自工作&#xff0c;没有人给你建议的时候&#xff0c;灯光、模型、场景任何一个环节渲染时出现问题都可能让你焦头烂额&#xff0c;…

掌握这些思维技巧,解救996的打工人!

你身边有没有这样的人&#xff1a;面对堆积如山的工作、随时弹出的任务&#xff0c;接二连三的群也能游刃有余地处理。回看自己&#xff0c;旧的任务还在做&#xff0c;新的任务已经从天而降&#xff0c;日程表上满是任务却无从下手…… 明明忙个不停却成果甚微&#xff0c;这…

数据结构与算法基础

目录 第六章、数据结构与算法基础1、数组与矩阵1.1、数组1.2、稀疏矩阵1.3、数据结构的定义 2、线性表 2.1、顺序表和链表2.2、顺序存储与链式存储对比2.3、 队列与栈 3、广义表4、树与二叉树 4.1、特殊二叉树4.2、二叉树遍历4.3、反向构造二叉树4.4、树转二叉树4.5、查找二叉…

自然语言处理实战项目6-无监督学习之文本聚类分析,将任意文本分类

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目6-无监督学习之文本聚类分析&#xff0c;将任意文本分类。当今互联网上的数据量越来越大&#xff0c;机器学习技术越来越成熟。在这种情况下&#xff0c;将文本按其主题或者意义进行分类是一项…

本地部署 Whisper

本地部署 Whisper 1. 什么是 Whisper2. Github 地址3. 创建虚拟环境4. 安装 ffmpeg5. 部署 Whisper6. 使用 Whisper 1. 什么是 Whisper Whisper 是一个通用的语音识别模型。它是在一个大型的不同音频数据集上训练出来的&#xff0c;也是一个多任务模型&#xff0c;可以进行多语…

微服务介绍 SpringCloud,服务拆分和远程调用,注册中心Eureka,负载均衡Ribbon,注册中心Nacos

一、微服务介绍 1.系统架构的演变 什么是微服务&#xff0c;微服务有哪些特征SpringCloud是什么SpringCloud与Dubbo的区别 1.单体架构 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。当网站流量很小时&#xff0c;单体架构非常合适 1.单体架构 优点&a…

为什么我说自学黑客(网络安全),一般人还是算了吧!

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

Spark大数据处理讲课笔记4.1 Spark SQL概述、数据帧与数据集

文章目录 零、本讲学习目标一、Spark SQL&#xff08;一&#xff09;Spark SQL概述&#xff08;二&#xff09;Spark SQL功能&#xff08;三&#xff09;Spark SQL结构1、Spark SQL架构图2、Spark SQL三大过程3、Spark SQL内部五大组件 &#xff08;四&#xff09;Spark SQL工作…

大型剧本杀游戏小程序

大型剧本杀游戏具有以下几个方面的前景&#xff1a; 娱乐市场需求增加&#xff1a;随着人们对于娱乐方式的多样化需求增加&#xff0c;大型剧本杀游戏作为一种互动性强、参与感强的娱乐形式&#xff0c;将会得到越来越多的关注和喜爱。 适应移动端用户&#xff1a;大型…

Git-git的使用、分支、本地仓与远程仓、idea中使用

Git Git 简介 ​ Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 [1] 也是[Linus Torvalds](https://baike.baidu.com/item/Linus Torvalds/9336769)为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git…

PyTorch Geometric (PyG) 库的安装

PyG 库的安装 前言1、PyG库的安装过程2、版本问题解决 前言 最近在学习图神经网络&#xff0c;需要用到PyG库&#xff0c;发现这个库的安装不能简单的使用pip install 安装&#xff0c;这里记录一下。 1、PyG库的安装过程 第一步&#xff1a;查看自己的torch版本和cuda版本 …