首页 > 运维 > keepalived > 通过keepalive实现Nginx高可用
2019
12-06

通过keepalive实现Nginx高可用

Keepalive介绍

Keepalived主要功能是用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,从而实现高可用性和热备。它诞生之初的目的是能够自主调用ipvsadm来生成规则,并且能够自动实现将用户访问的地址转移到其他节点上进行实现的。

Keepalived:核心包含一个core模块和2个checkersVRRP协议。Core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。checkers:检查服务检查reserved的健康状况的,基于脚本也可检查服务本身的健康状况。这里是实现ipvs后端健康状况的检测的。VRRP (Virtual Router Redundancy Protocol,即虚拟路由冗余协议):是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。VRRP中每个节点之间都有优先级的一般为0-255(0,255有特殊用法)数字越大优先级越高。

keepalived是以VRRP协议为实现基础的,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master节点和多个backup节点。Master节点上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当 backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

理论到此结束

1.硬件环境规划

3台机器 1台宿主机,其实都是虚拟机,我用的docker, 懒得去装虚拟机

搭建

#在node1,node2,node3和nfs节点上均选择mini方式安装CentOS 7 64-bit,并按照规划配置IP地址。 我用的docker启动的,比较方便。

#nfs为当前宿主机,也就是说数据我完了要存到我宿主机,不会放到docker虚拟机中,这样也保险一些 nfs搭建自行解决,本篇不涉及 或者看这篇 传送门

1.  在节点 node1,node2,node3 上安装Nginx 和Keepalive 1.3.5

2. 将Nginx数据的存储路径配置在节点NFS上(这个等keepalive这块配置完再设置,否则现在设置都挂载同一个目录,对keepalive测试不好区分)

2.1配置keepalive nginx检测脚本

配置在/opt/.local/check_nginx_alive.sh 下(这个看个人喜好)

chmod +x /opt/.local/check_nginx_alive.sh #添加执行权限,下面keepalived配置文件要用到

3.配置node1上的keepalive

4.配置node2 keepalive

5. 配置node3 keepalive

6. 多种启动方法 启动 keepalive

systemctl start keepalived

systemctl enable keepalived #设置开机自启动

/etc/init.d/keepalived start

/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived.conf-D

7. 验证keepalive服务

8.查看三个容器中的keepalived状态

node1 master已经启动
node2 backup已经启动
node3 backup 已经启动

9.查看虚拟ip 是否已经绑定到eth0

10.验证访问

<1>.我们分别在 node1 node2 node3机器上 访问curl 172.18.0.7

可以看见,此时3个节点容器通过虚拟vip : 172.18.0.7 访问nginx数据,请求返回的数据都是master容器中nginx配置的 “我是Master-000000…1” 内容

<2.>继续验证 关闭node1 主节点的nginx 或 keepalived

因为前面有个脚本,内容是如果检测不到nginx服务就kill掉keepalived服务,所以我们停止nginx 也就相当于停止了 keepalived

可以看到 keepalived服务已经停止了

现在我们再node1 node2 node3节点访问 curl 172.18.0.7

node1
node2
node3

可以看到当master节点模拟故障关闭,依据我们原先配置的优先级,node2被暂时推举为maser来提供访问,当前访问数据来源由node2来提供。

<3.>再次启动主节点 node1 master 看看会有什么变化

node1
node2
node3

可以看到,当node1 master容器中的nginx 和 keepalived服务开启后,请求返回的数据会再次转到master中。

11. 然后将3台机器的nginx数据目录都指向 挂载nfs机器的挂载点。这样3台机器都统一访问web服务,即使有1台故障,其他2台也同样提供web访问

Keepalived服务命令

  • systemctl daemon-reload  重新加载
  • systemctl enable keepalived.service  设置开机自动启动
  • systemctl disable keepalived.service 取消开机自动启动
  • systemctl start keepalived.service 启动
  • systemctl stop keepalived.service停止
  • systemctl status keepalived.service  查看服务状态
最后编辑:
作者:shooter
这个作者貌似有点懒,什么都没有留下。