Nginx+Keepalived实现服务的高可用

网友投稿 866 2022-11-06

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Nginx+Keepalived实现服务的高可用

1.Keepalived高可用软件

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。

keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual  Router  Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

2.Keepalived高可用故障切换转移原理

Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

一般情况下,如果我们做小型项目,前端用一个nginx做反向代理即可,大概是这样的

但是,作为互联网项目,纯2C的话必然需要做高可用,不仅后端的Server有N个,Nginx同样需要有N个,一主N备,当有一个服务器挂掉的时候,服务能瞬间切换到其他服务器,大概是这样的

下面就以上图为例,说明一下如何实现server的高可用。

1、准备

虚拟机两台,同样安装nginx,keepalived,最简单的安装方法

yum -y install nginx,

yum -y install keepalived。

如果找不到安装到哪儿了,可以使用whereis nginx查看,这里不再赘述。

网络划分如下

名称                                       IP            虚拟IP            操作系统

虚拟机1(VM1) 172.17.1.150      172.17.1.160     centos7.5

虚拟机2(VM2) 172.17.1.151   172.17.1.160        centos7.5

2、两台机器都要操作:关闭防火墙,修改nginx首页,启动nginx

* 关闭防火墙

systemctl stop firewalld.service #临时关闭,重启失效

systemctl disable firewalld.service #禁止开机启动

安装nginx

[root@localhost ~]# yum install nginx

修改nginx首页(两台机器分别操作)

[root@localhost ~]# echo "yunweimao" > usr/share/nginx/html/index.html

[root@localhost ~]# echo "maoxiaopu" > usr/share/nginx/html/index.html

启动nginx

[root@localhost ~]# service nginx restart

报错:

nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)

nginx: configuration file etc/nginx/nginx.conf test failed

修改:

[root@localhost ~]# vim etc/nginx/conf.d/default.conf

* 简单起见,我们认为每个nginx都是代理一个服务,只用nginx默认带的静态页作为测试,分别修改页面内容为"yunweimao"和“maoxiaopu”

* 启动nginx

systemctl start nginx

3、修改keepalived的配置文件

主配置如下(默认配置文件:/etc/keepalived/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_script chk_nginx {

script "/etc/keepalived/nginx_check.sh"

interval 2

weight -20

}

vrrp_instance VI_1 {

state MASTER # 标识为主服务

interface eth0 #绑定虚拟机的IP

virtual_router_id 51 # 虚拟路由id,和从机保持一致

#mcast_src_ip 172.17.1.150  #本机ip

priority 100 #权重,需要高于从机

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_nginx ## 执行 Nginx 监控的服务

}

virtual_ipaddress {

172.17.1.160 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虚拟IP地址

}

}

从机配置(默认配置文件:/etc/keepalived/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 dreamer1

#   vrrp_skip_check_adv_addr

#   vrrp_strict

#   vrrp_garp_interval 0

#   vrrp_gna_interval 0

}

vrrp_script chk_nginx {

script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径

interval 2 ## 检测时间间隔

weight -20 ## 如果条件成立,权重-20

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

mcast_src_ip 172.17.1.151 ## 本机 IP 地址

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_nginx ## 执行 Nginx 监控的服务

}

virtual_ipaddress {

172.17.1.160

}

}

3、编写监测心跳脚本

上面配置中可以看到有一个脚本文件:/etc/keepalived/nginx_check.sh

查看nginx是否启动,如果没启动则启动,如果启动不起来,停掉keepalived服务,此时心跳断掉,服务转向另一个nginx。

#!/bin/bash

counter=$(ps -C nginx --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

/usr/sbin/nginx

sleep 2

counter=$(ps -C nginx --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

/etc/init.d/keepalived stop

fi

fi

4、测试

* 启动172.17.1.150上的nginx和keepalive

* 启动172.17.1.151上的nginx和keepalive

* 访问虚拟IP:http://172.17.1.160

* 停掉172.17.1.150上的keepalive

[root@localhost ~]# service  keepalived stop

* 重新启动172.17.1.150上的keepalive,又会回到yunweimao

[root@localhost ~]# service  keepalived start

女票从事平面设计这一块,需要设计海报,宣传册的也可以联系我,明码标价3元/1页。

上一篇:软件测试培训之界面测试的测试点以及应该注意的问题
下一篇:软件测试培训之测试的7条原则
相关文章

 发表评论

暂时没有评论,来抢沙发吧~