在生产环境上很多时候是以Nginx做反向代理对外提供服务,但是Nginx难免遇见故障,如:服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。因此需要两台以上的Nginx服务器对外提供服务,这样的话就可以解决其中一台宕机了,另外一台还能对外提供服务。

Keepalived高可用软件

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件

  • VRRP介绍

VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP,而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,MASTER实现针对虚拟路由器IP的各种网络功能。其他设备不拥有该虚拟IP,状态为BACKUP,除了接收MASTER的VRRP状态通告信息以外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。
VRRP可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。其中的虚拟路由即Virtual路由是由VRRP路由群组创建的一个不真实存在的路由,这个虚拟路由也是有对应的IP地址。而且VRRP路由1和VRRP路由2之间会有竞争选择,通过选择会产生一个Master路由和一个Backup路由。
Master路由和Backup路由之间会有一个心跳检测,Master会定时告知Backup自己的状态,如果在指定的时间内,Backup没有接收到这个通知内容,Backup调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
Master路由有一个特权就是虚拟路由和后端服务器都是通过Master进行数据传递交互的,而备份节点则会直接丢弃这些请求和数据,不做处理,只是去监听Master的状态

  • 环境准备 | VIP | IP | 主机名 | 主/从 | | —- | —- | —- | —- | | | 192.168.28.177 | keepalived1 | Master | | 192.168.28.253 | | | | | | 192.168.28.94 | keepalived2 | Backup |

安装Keepalived

安装完成后,有两个文件,一个是 /etc/keepalived/keepalived.conf(keepalived的系统配置文件,我们主要操作的就是该文件),一个是/usr/local/sbin目录下的keepalived,是系统配置脚本,用来启动和关闭keepalived

  1. 1. 从官方网站下载keepalived,官网地址https://keepalived.org/
  2. wget https://keepalived.org/software/keepalived-2.1.5.tar.gz
  3. 2. 创建keepalived目录,方便管理资源
  4. mkdir keepalived
  5. 3. 将压缩文件进行解压缩,解压缩到指定的目录
  6. tar -zxf keepalived-2.1.5.tar.gz -C keepalived/
  7. 4. keepalived进行配置,编译和安装
  8. cd keepalived/keepalived-2.1.5
  9. ./configure --sysconf=/etc --prefix=/usr/local
  10. make && make install

Keepalived配置文件介绍

  1. # global全局部分:
  2. global_defs {
  3. # 通知邮件,当keepalived发送切换时需要发email给具体的邮箱地址
  4. notification_email {
  5. tom@itcast.cn
  6. jerry@itcast.cn
  7. }
  8. # 设置发件人的邮箱信息
  9. notification_email_from zhangsan@163.cn
  10. # 指定smpt服务地址
  11. smtp_server 192.168.200.1
  12. # 指定smpt服务连接超时时间
  13. smtp_connect_timeout 30
  14. # 运行keepalived服务器的一个标识,可以用作发送邮件的主题信息
  15. router_id LVS_DEVEL
  16. # 默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)
  17. vrrp_skip_check_adv_addr
  18. # 严格遵守VRRP协议。
  19. vrrp_strict
  20. # 在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0
  21. vrrp_garp_interval 0
  22. # 在一个网卡上每组na消息之间的延迟时间,默认为0
  23. vrrp_gna_interval 0
  24. }
  25. # VRRP部分,该部分可以包含以下四个子模块
  26. 1. vrrp_script
  27. 2. vrrp_sync_group
  28. 3. garp_group
  29. 4. vrrp_instance
  30. # 我们会用到第一个和第四个,
  31. # 设置keepalived实例的相关信息,VI_1为VRRP实例名称
  32. vrrp_instance VI_1 {
  33. # 有两个值可选MASTER主 BACKUP备
  34. state MASTER
  35. # vrrp实例绑定的接口,用于发送VRRP包[当前服务器使用的网卡名称]
  36. interface ens192
  37. # 指定VRRP实例ID,范围是0-255
  38. virtual_router_id 51
  39. # 指定优先级,优先级高的将成为MASTER
  40. priority 100
  41. # 指定发送VRRP通告的间隔,单位是秒
  42. advert_int 1
  43. # vrrp之间通信的认证信息
  44. authentication {
  45. # 指定认证方式。PASS简单密码认证(推荐)
  46. auth_type PASS
  47. # 指定认证使用的密码,最多8位
  48. auth_pass 1111
  49. }
  50. virtual_ipaddress {
  51. # 虚拟IP地址设置虚拟IP地址,供用户访问使用,可设置多个,一行一个
  52. 192.168.28.253
  53. }
  54. }

访问测试

启动keepalived之前的网卡配置

  • 177机器配置

image.png

  • 94机器配置

image.png

启动Keepalived之后的配置

cd /usr/local/sbin
./keepalived

  • 177机器配置

177被选为master
image.png

  • 94机器配置

94没有改变
image.png

关闭177上的keepalived观察94变化

关闭177后,虚拟ip切换到94上去了
虚拟IP(VIP)会在MASTER节点上,当MASTER节点上的keepalived出问题以后,因为BACKUP无法收到MASTER发出的VRRP状态通过信息,就会直接升为MASTER。VIP也会”漂移”到新的MASTER。

  • 177机器

image.png

  • 94机器

image.png

  • 访问虚拟ip来控制nginx

访问http://192.168.28.253:8069/
image.png

自动切换keepalived主

想让vip进行切换,就必须要把服务器上的keepalived进行关闭,在keepalived所在服务器的nginx出现问题后,把keepalived关闭掉,就可以让VIP执行另外一台服务器。
keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是不同的场景需要不同的条件来判断是否需要进行主备切换。

  • 在keepalived配置文件中添加对应的配置像

    1. v# rrp_script 脚本名称
    2. {
    3. script "脚本位置"
    4. interval 3 #执行时间间隔
    5. weight -20 #动态调整vrrp_instance的优先级
    6. }
  • 编写脚本

Linux ps命令用于显示当前进程 (process) 的状态。
-C(command) :指定命令的所有进程
—no-header 排除标题

  1. #!/bin/bash
  2. num=`ps -C nginx --no-header | wc -l`
  3. if [ $num -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
  • 为脚本文件设置权限

chmod 755 ck_nginx.sh

  • 将脚本添加到
    1. vrrp_script ck_nginx {
    2. # 执行脚本的位置
    3. script "/etc/keepalived/ck_nginx.sh"
    4. # 执行脚本的周期,秒为单位
    5. interval 2
    6. # 权重的计算方式
    7. weight -20
    8. }
    9. vrrp_instance VI_1 {
    10. state MASTER
    11. interface ens192
    12. virtual_router_id 10
    13. priority 100
    14. advert_int 1
    15. authentication {
    16. auth_type PASS
    17. auth_pass 1111
    18. }
    19. virtual_ipaddress {
    20. 192.168.28.253
    21. }
    22. track_script {
    23. ck_nginx
    24. }
    25. }
    如果效果没有出来,可以使用 tail -f /var/log/messages查看日志信息,找对应的错误信息。