1 概述

  • 我们已经可以使用Nginx来保证服务的高可用,但是依然有问题,如果Nginx出现了单点故障,那么整个服务就将宕机,所以我们可以考虑使用Nginx+Keepalived来实现集群高可用。

Nginx出现单点故障.png

2 Keepalived介绍

  • Keepalived是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障的发生,通过配合Nginx可以实现web前端服务的高可用。
  • Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)协议用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器工作正常的话就是MASTER,或者通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP以及数据的转发等,其他设备不拥有该虚拟IP,状态是BACKUP,除了接受MASTER的VRRP状态通告信息完,不执行对外的网络功能。当主机失效的时候,BACKUP将接管原先MASTER的网络功能。
  • VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行的时候只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接受到MASTER的通告信息,各个BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举。

3 Nginx+Keepalived的架构图

Nginx+Keepalived的架构图.png

4 机器规划

主机名称 IP地址 安装软件
Nginx-MASTER(Nginx的主节点) 192.168.49.100 Nginx、Keepalived
Nginx-BACKUP(Nginx的从节点) 192.168.49.101 Nginx、Keepalived

5 Nginx+Keepalived实现高可用集群

5.1 在192.168.49.100和192.168.49.101机器上安装Nginx

  • 安装依赖:
  1. yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
  • 下载Nginx:
  1. wget http://nginx.org/download/nginx-1.18.0.tar.gz
  • 解压Nginx:
  1. tar -zxvf nginx-1.18.0.tar.gz
  • 进入Nginx的解压目录:
  1. cd nginx-1.18.0/
  • 执行./configure命令:
  1. ./configure
  • 执行make && make install命令:
  1. make && make install
  • 为了以示区别,将192.168.49.100上的Nginx的首页换成192.168.49.100:
  1. cd /usr/local/nginx/html
  1. echo "192.168.49.100" > index.html
  • 为了以示区别,将192.168.49.101上的Nginx的首页换成192.168.49.101:
  1. cd /usr/local/nginx/html
  1. echo "192.168.49.101" > index.html
  • 分别启动192.168.49.100和192.168.49.101上的Nginx:
  1. cd /usr/local/nginx/sbin
  1. ./nginx

5.2 在192.168.49.100和192.168.49.101机器上安装Keepalived

  • 下载keeepalived:
  1. wget https://www.keepalived.org/software/keepalived-2.2.1.tar.gz
  • 解压keeepalived:
  1. tar -zxvf keepalived-2.2.1.tar.gz
  • 进入keeepalived的解压目录:
  1. cd keepalived-2.2.1/
  • 执行./configure命令:
  1. ./configure
  • 如果出现了*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS,可以执行如下的命令:
  1. yum -y install libnl libnl-devel libnfnetlink-devel
  1. ./configure
  • 执行make && make install命令:
  1. make && make install
  • 在192.168.49.100(主节点)配置Keepalived:
  1. mkdir -pv /etc/keepalived
  1. vim /etc/keepalived/keepalived.conf
  1. ! Configuration File for keepalived
  2. global_defs {
  3. ## 标识本节点的字条串,通常为 hostname
  4. router_id nginx-master;
  5. script_user root
  6. enable_script_security
  7. }
  8. ## 检测脚本
  9. ## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
  10. vrrp_script chk_nginx {
  11. script "/etc/keepalived/nginx_check.sh"
  12. interval 2
  13. weight -5
  14. fall 3
  15. rise 2
  16. }
  17. ## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
  18. vrrp_instance VI_1 {
  19. ## 主节点为 MASTER,对应的备份节点为 BACKUP
  20. state MASTER
  21. interface ens33
  22. # 主机的IP地址
  23. mcast_src_ip 192.168.49.100
  24. # 虚拟路由id
  25. virtual_router_id 100
  26. ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
  27. priority 100
  28. ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
  29. nopreempt
  30. ## 组播信息发送间隔,所有节点设置必须一样,默认 1s
  31. advert_int 2
  32. authentication {
  33. auth_type PASS
  34. auth_pass 1111
  35. }
  36. track_script {
  37. chk_nginx
  38. }
  39. ## 虚拟 IP 池, 所有节点设置必须一样
  40. virtual_ipaddress {
  41. 192.168.49.110
  42. }
  43. }
  • 在192.168.49.101(从节点)配置Keepalived:
  1. mkdir -pv /etc/keepalived
  1. vim /etc/keepalived/keepalived.conf
  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id nginx-backup
  4. script_user root
  5. enable_script_security
  6. }
  7. vrrp_script chk_nginx {
  8. script "/etc/keepalived/nginx_check.sh"
  9. interval 2
  10. weight -5
  11. fall 3
  12. rise 2
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface ens33
  17. virtual_router_id 101
  18. priority 90
  19. mcast_src_ip 192.168.49.101
  20. advert_int 2
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. track_script {
  26. chk_nginx
  27. }
  28. virtual_ipaddress {
  29. 192.168.49.110
  30. }
  31. }
  • 在192.168.49.100和192.168.49.101上创建Nginx的检查脚本:
  1. cd /etc/keepalived
  1. vim nginx_check.sh
  1. #!/bin/bash
  2. A=`ps -C nginx –no-header |wc -l`
  3. if [ $A -eq 0 ];then
  4. /usr/local/nginx/sbin/nginx
  5. sleep 2
  6. if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
  7. killall keepalived
  8. fi
  9. fi
  1. chmod +x /etc/keepalived/nginx_check.sh
  • 分别启动192.168.49.100和192.168.49.101上的Keepalived:
  1. systemctl daemon-reload
  1. systemctl enable --now keepalived
  • 查看VIP:
  1. # 在192.168.49.100和192.168.49.101上输入如下的命令
  2. ip a

查看VIP.png

查看VIP2.png

  • 测试VIP:
  1. ping 192.168.49.110 -c 4

测试VIP.png

测试VIP2.png