keepalived实现nginx高可用

第1章 keepalived服务说明

1.1 keepalived是什么?

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

  Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

  所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

         keepalived官网http://www.keepalived.org

1.2 keepalived服务的三个重要功能

  管理LVS负载均衡软件

  实现LVS集群节点的健康检查中

  作为系统网络服务的高可用性(failover)

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

  Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。

  在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

  那么,什么是VRRP呢?

  VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。

1.4 keepalived 原理

1.4.1keepalived高可用架构示意图

1.4.2 文字,表述

Keepalived的工作原理:

  Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:

    1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。

    2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。

    3) VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。

    4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。

    5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

  介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工作原理:

  Keepalived高可用对之间是通过 VRRP进行通信的, VRRP是遑过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

  在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。

第2章 keepalived软件使用

2.1 软件的部署

实验环境:
[root@k8s-master ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@k8s-master ~]# sestatus
SELinux status:                 disabled
[root@k8s-master ~]# systemctl status firewalld
 firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@k8s-master ~]# systemctl status iptables
 iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

2.1.1 第一个里程碑 keepalived软件安装

 yum install keepalived -y 

/etc/keepalived
/etc/keepalived/keepalived.conf     #keepalived服务主配置文件
/etc/rc.d/init.d/keepalived         #服务启动脚本
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/libexec/keepalived
/usr/sbin/keepalived

第二个里程碑: 进行默认配置测试

2.1.2 配置文件说明

1-13行表示全局配置

 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        #定义路由标识信息,相同局域网唯一
 }  

15-30行 虚拟ip配置 brrp

vrrp_instance VI_1 {   #定义实例
    state MASTER         #状态参数 master/backup 只是说明
    interface eth0       #虚IP地址放置的网卡位置
    virtual_router_id 51 #主从ID一致
    priority 100         # 优先级决定是主还是备    越大越优先
    advert_int 1        #主备通讯时间间隔
    authentication {     # ↓
        auth_type PASS    #↓
        auth_pass 1111    #认证
    }                        #↑ 
    virtual_ipaddress {  #↓
        192.168.200.16    设备之间使用的虚拟ip地址
        192.168.200.17
        192.168.200.18
    }
}

配置管理LVS

2.1.3 最终配置文件

主负载均衡服务器配置

! Configuration File for keepalived

global_defs {
   # 运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
   router_id k8s-master
}

# 检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
vrrp_script chk_http_port {
    # 这里通过命令或脚本监测
# script "</dev/tcp/127.0.0.1/22"
script
"/usr/local/sbin/chk_nginx_pid.sh" # 脚本执行间隔,每2s检测一次 interval 2 # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 #weight 2 # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) #fall 2 # 检测1次成功就算成功。但不修改优先级 #rise 1 } vrrp_instance VI_1 { # 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER state MASTER # 指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的 interface ens33 # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 virtual_router_id 51 # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 priority 150 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 advert_int 1 # 设置验证类型和密码。主从必须一样 authentication { # 设置vrrp验证类型,主要有PASS和AH两种 auth_type PASS # 设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } # VRRP HA 虚拟地址 如果有多个VIP,继续换行填写 virtual_ipaddress { 192.168.12.233 }

# 执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
track_script {
# 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
  chk_http_port
}
}

备负载均衡服务器配置

! Configuration File for keepalived

global_defs {
   # 运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
   router_id k8s-node2
}

# 检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
vrrp_script chk_http_port {
    # 这里通过脚本监测
    script "/usr/local/sbin/chk_nginx_pid.sh"
    # 脚本执行间隔,每2s检测一次
    interval 2
    # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    #weight 2
    # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    #fall 2
    # 检测1次成功就算成功。但不修改优先级
    #rise 1
}

vrrp_instance VI_1 {
    # 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER
    state BACKUP
    # 指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    interface ens33
    # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    virtual_router_id 51
    # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
    priority 100
    # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1
    # 设置验证类型和密码。主从必须一样
    authentication {
    # 设置vrrp验证类型,主要有PASS和AH两种
        auth_type PASS
    # 设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    # VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
    virtual_ipaddress {
        192.168.12.233
    }

# 执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
track_script {
# 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
  chk_http_port
}
}

2.1.4 启动keepalived

[root@k8s-master ~]# systemctl start keepalived
[root@k8s-master ~]# systemctl status keepalived
 keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2020-05-26 12:27:49 CST; 1s ago
  Process: 36759 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 36760 (keepalived)
    Tasks: 3
   Memory: 1.4M
   CGroup: /system.slice/keepalived.service
           ├─36760 /usr/sbin/keepalived -D
           ├─36761 /usr/sbin/keepalived -D
           └─36762 /usr/sbin/keepalived -D

May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Registering Kernel netlink command channel
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Registering gratuitous ARP shared channel
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Opening file '/etc/keepalived/keepalived.conf'.
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP_Instance(VI_1) removing protocol VIPs.
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Using LinkWatch kernel netlink reflector...
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP_Script(chk_http_port) succeeded
May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP_Instance(VI_1) Transition to MASTER STATE

2.1.5 测试web站点

[root@k8s-master ~]# curl 192.168.12.233
192.168.12.222 master
[root@k8s-master ~]# systemctl stop nginx
[root@k8s-master ~]# curl 192.168.12.233
192.168.12.224 backup

2.1.6 查看虚拟ip状态

[root@k8s-master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e2:cc:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.12.222/24 brd 192.168.12.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.12.233/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fee2:cc80/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:b5:91:d3:e9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

2.1.7 Nginx进程检测脚本

[root@k8s-master ~]# cat /usr/local/sbin/chk_nginx_pid.sh 
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then
    echo 'nginx server is died'
    systemctl stop keepalived
fi 

2.1.8 大坑

注意:keepalived默认使用端口122进行通讯,必须开放112端口,或者停用防火墙.保证各个主机之间112端口的连通性

# CentOS6中iptables配置开放112端口
iptables -I INPUT  -p 112 -j ACCEPT
service iptables save
service iptables restart
# 查看端口开放情况
iptables -L -n --line-numbers

参考文章:https://www.cnblogs.com/clsn/p/8052649.html

原文地址:https://www.cnblogs.com/cpw6/p/10409687.html