• 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

  • 相关阅读:
    第7.10节 Python类中的实例变量定义与使用
    第7.9节 案例详解:Python类封装
    第7.8节 Python中隐秘的类封装方法
    第7.7节 案例详解:Python类继承机制
    第7.6节 Python中类的继承机制详述
    第7.5节 揭开Python类中self的面纱
    第7.4节 Python中与众不同的类
    第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型
    第7.2节 关于面向对象设计的一些思考
    (独孤九剑)--流程控制
  • 原文地址:https://www.cnblogs.com/cpw6/p/10409687.html
Copyright © 2020-2023  润新知