zoukankan      html  css  js  c++  java
  • 高可用之keepalived

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

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

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

     keepalived服务的三个重要功能

    【管理LVS负载均衡软件】

    LVS,全程Linux virtual Server

    keepalived高可用&故障切换原理 ​ 

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

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

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

    VRRP描述

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

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

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

      4.工作时主节点发包,备节点接包,当备节点接收不到主节点的数据包的时候,就启动接管程序接管主节点的资源。备用节点可以存在多个,通过优先级竞选。一般keepaived只配置一对主备。

    Keepalived描述

    keepalived高可用性服务器之间是通过VRRP进行通信的,VRRP协议是通过竞选机制来确定主备身份,主节点的优先级高于备节点。

    工作时,主节点优先获取所有的资源,备用节点处于等待状态,只有当备节点,得不到主节点的数据消息,备节点开始工作,接管主节点素有的资源,然后顶替它的位置,

    当Keepalived服务对之间,作为主节点的机器会一直发送VRRP广播数据包,告诉备节点,我还活着,因此备节点不会抢占资源,当主节点宕机,备节点接替,整个切换过程最快小于1S。

    部署keepalived

    【环境准备】

    [root@lb01 conf]# cat /etc/redhat-release
    CentOS Linux release 7.5.1804 (Core)
    [root@lb01 conf]#
    [root@lb01 conf]# uname -r
    3.10.0-862.el7.x86_64
    [root@lb01 conf]# uname -m
    x86_64
    

    【安装keepalived】

    # lb01
    [root@lb01 conf]# yum install keepalived -y
    [root@lb01 conf]# rpm -qa keepalived
    keepalived-1.3.5-16.el7.x86_64
    
    
    # lb02
    [root@lb02 nginx-1.16.0]# yum install keepalived -y
    [root@lb02 nginx-1.16.0]# rpm -qa keepalived
    keepalived-1.3.5-16.el7.x86_64
    

    【配置文件】(全局定义部分 global definition)

    [root@lb01 conf]# head -12 /etc/keepalived/keepalived.conf | cat -n
         1    ! Configuration File for keepalived
         2
         3    global_defs {
         4       notification_email {
         5         acassen@firewall.loc
         6         failover@firewall.loc
         7         sysadmin@firewall.loc
         8       }
         9       notification_email_from Alexandre.Cassen@firewall.loc
        10       smtp_server 192.168.200.1
        11       smtp_connect_timeout 30
        12       router_id LVS_DEVEL
    

     行内容解释:

      1. 注释行,!和#作用一样

      2. 空行

      3~8.定义邮件报警的地址,当keepalived主备切换,或者RS故障时发送告警邮件。

      9. 指定告警邮件,发信人地址

      10. 指定邮件服务器地址,例如本地配置了sendmail服务

      11. 连接邮件服务器的超时时间。

      12. 重要参数,指定keepalived的路由标识,在局域网内,该ID应该是唯一的。

    VRRP实例配置

    /etc/keepalived/keepalived.conf
    
     19 vrrp_instance VI_1 {
     20     state MASTER
     21     interface eth0
     22     virtual_router_id 51
     23     priority 100
     24     advert_int 1
     25     authentication {
     26         auth_type PASS
     27         auth_pass 1111
     28     }
     29     virtual_ipaddress {
     30         192.168.200.16
     31         192.168.200.17
     32         192.168.200.18
     33     }
     34 }
    

     参数解释:

      1.定义vrrp实例,名字是VI_1,每一个vrrp实例可以理解为是keepalived的一个业务,vrrp实例在配置文件中可以有多个,并且主节点的keepalived配置的vrrp_instance在备节点也必须存在,才能实现故障迁移(keepalived是一款工具,真正干活的配置是vrrp_instance)

      2. 参数作用是表示当前实例VI_1的角色是主节点,该参数值只有MASTER和BACKUP两种,严格区分大小写。MASTER表示工作中的主节点,BACKUP表示备用节点。BACKUP在MASTER故障时,接替其工作继续运转。

      3. insterface为网络通信接口,对外提供服务器的网络接口,根据自己机器修改

      4. 唯一虚拟路由ID标识,最好是数字,在当前keepalived.conf配置文件中必须是唯一的,且在MASTER和BACKUP的配置中相同实例的virtual_router_id必须是一样的,否则会出现脑裂问题

      5. 定义实例的优先级,也是一串数字,数字越大,优先级越高。在同一个vrrp_instance实例里,MASTER的优先级必须高于BACKUP,一般配置MASTER和BACKUP间隔大小在50,例如MASTER的优先级150,BACKUP的优先级是小于100的数值。

      6.定义MASTER和BACKUP之间的通信检查时间,默认单位是秒

    25~28. 权限配置参数,密码类型是PASS,密码为明文方式,长度建议不超过8个字符,一般用4位数字,同一个VRRP实例,MASTER和BACKUP的密码必须一样才能通信。

    29~34. 定义虚拟IP的地址,可以配置多个IP地址,且明确子网掩码和IP绑定的网络接口(网卡名),否则虚拟IP的子网掩码默认是32位,网络接口和前面的

    定义keepalived检查nginx脚本

    #!/bin/bash
    A=`ps -C nginx –no-header |wc -l`
    if [ $A -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
    fi
    

      

    vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
        interval 2 #检测时间间隔
        weight -20 #如果条件成立的话,则权重 -20
    }
    

      

    配置主keepalived服务器

    1.备份旧配置文件,定义新配置文件
    [root@lb01 conf]# cd /etc/keepalived/
    [root@lb01 keepalived]# cp keepalived.conf{,.bak}
    [root@lb01 keepalived]# ls
    keepalived.conf  keepalived.conf.bak
    [root@lb01 keepalived]# >keepalived.conf
    
    2.删除所有旧的配置,定义新配置,这个需要根据自己机器环境修改
    [root@lb01 keepalived]# cat keepalived.conf -n
         1    global_defs {
         2        router_id lb01
         3    }
         4
         5    vrrp_instance VI_1 {
         6        state MASTER
         7        interface ens33
         8        virtual_router_id 51
         9        priority 150
        10        advert_int 1
        11        authentication {
        12            auth_type PASS
        13            auth_pass 1111
        14        }
                    # 将 track_script 块加入 instance 配置块
                   track_script {
                          chk_nginx #执行 Nginx 监控的服务
                    }
                    # 定义虚拟IP,也就是VIP,提供给用户访问的高可用地址,绑定网络接口ens33,别名ens33:3,主备节点要相同
        15        virtual_ipaddress {
        16            192.168.178.3/24 dev ens33 label ens33:3
        17        }
        18    }
    

      

      【启动keepalived】

    [root@lb01 keepalived]# ps -ef|grep keep|grep -v grep
    [root@lb01 keepalived]# systemctl start keepalived
    [root@lb01 keepalived]# ps -ef|grep keep|grep -v grep
    root      28529      1  1 11:16 ?        00:00:00 /usr/sbin/keepalived -D
    root      28530  28529  0 11:16 ?        00:00:00 /usr/sbin/keepalived -D
    root      28531  28529  0 11:16 ?        00:00:00 /usr/sbin/keepalived -D
    

      【检查】

    [root@lb01 keepalived]# ip addr|grep "inet 192"
        inet 192.168.178.130/24 brd 192.168.178.255 scope global noprefixroute ens33
        inet 192.168.178.3/24 scope global secondary ens33:3
    

      

    配置备keepalived服务器

    [root@lb02 keepalived]# cat -n keepalived.conf
         1
         2    global_defs {
         3        router_id lb02
         4    }
         5
         6    vrrp_instance VI_1 {
         7        state BACKUP
         8        interface ens33
         9        virtual_router_id 51
        10        priority 100
        11        advert_int 1
        12        authentication {
        13            auth_type PASS
        14            auth_pass 1111
        15        }
        16        virtual_ipaddress {
        17            192.168.178.3/24 dev ens33 label ens33:3
        18        }
        19    }
    

      【启动】

    [root@lb02 keepalived]# ps -ef|grep keep|grep -v grep
    root      29374      1  0 13:48 ?        00:00:00 /usr/sbin/keepalived -D
    root      29375  29374  0 13:48 ?        00:00:00 /usr/sbin/keepalived -D
    root      29376  29374  0 13:48 ?        00:00:00 /usr/sbin/keepalived -D
    

      

    如果出现lb01、lb02抢夺vip资源,排查故障思路

      1. 主备服务器是否能够通信,可以ping检测

      2. 是否没有正确配置防火墙,或是忘记关闭防火墙

      3. 两台服务器的keepalived.conf是否写错(例如虚拟路由ID是否不一致)

    高可用性负载均衡实战

    【lb01(nginx.conf)】

    [root@lb01 keepalived]# cat -n /opt/nginx/conf/nginx.conf
         1    worker_processes  1;
         2    events {
         3        worker_connections  1024;
         4    }
         5    http {
         6        include       mime.types;
         7        default_type  application/octet-stream;
         8    upstream www_pools {
         9    server 192.168.178.121;
        10    server 192.168.178.122;
        11    }
        12        server {
        13            listen       80;
        14            server_name  www.chaoge.com;
        15
        16        location / {
        17
        18        proxy_pass http://www_pools;
        19        proxy_set_header Host $host;
        20    }
        21
        22
        23
        24    }
        25
        26    }
    
    # 重启nginx
    [root@lb01 keepalived]# nginx -s reload
    # 检查
    [root@lb01 keepalived]# netstat -tunlp|grep nginx
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      27706/nginx: master
    

    【lb02(nginx.conf)】

    [root@lb02 keepalived]# cat -n /opt/nginx/conf/nginx.conf
         1
         2    worker_processes  1;
         3    events {
         4        worker_connections  1024;
         5    }
         6    http {
         7        include       mime.types;
         8        default_type  application/octet-stream;
         9    upstream www_pools {
        10    server 192.168.178.121;
        11    server 192.168.178.122;
        12    }
        13        server {
        14            listen       80;
        15            server_name  www.chaoge.com;
        16            location / {
        17            proxy_pass http://www_pools;
        18            proxy_set_header Host $host;
        19    }
        20    }
        21    }
    
    # 重启nginx
    nginx -s reload
    
    # 检查
    [root@lb02 keepalived]# netstat -tunlp|grep nginx
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      29698/nginx: master
    

    【lb01(keepalived.conf)】

    1.检查配置文件,配置好VI_1实例,实例配置如下
    [root@lb01 keepalived]# cat -n /etc/keepalived/keepalived.conf
         1    global_defs {
         2        router_id lb01
         3    }
         4
         5    vrrp_instance VI_1 {
         6        state MASTER
         7        interface ens33
         8        virtual_router_id 51
         9        priority 150
        10        advert_int 1
        11        authentication {
        12            auth_type PASS
        13            auth_pass 1111
        14        }
        15        virtual_ipaddress {
        16            192.168.178.3/24 dev ens33 label ens33:3
        17        }
        18    }
        19
    
    2.此处的VIP就是交给Nginx负载均衡的高可用IP地址
    

    【lb02(keepalived.conf)】

    [root@lb02 keepalived]# cat -n /etc/keepalived/keepalived.conf
         1
         2    global_defs {
         3        router_id lb02
         4    }
         5
         6    vrrp_instance VI_1 {
         7        state BACKUP
         8        interface ens33
         9        virtual_router_id 51
        10        priority 100
        11        advert_int 1
        12        authentication {
        13            auth_type PASS
        14            auth_pass 1111
        15        }
        16        virtual_ipaddress {
        17            192.168.178.3/24 dev ens33 label ens33:3
        18        }
        19    }
        20
    

      

    【web01站点配置】

    1.检查nginx.conf,有关www.chaoge.com虚拟主机配置如下
    server {
    listen 80;
    server_name www.chaoge.com;
     charset utf-8;
    location / {
            root html/www;
            index index.html index.htm;
    }
    access_log logs/access_www.log main;
    }
    
    
    2.定义好用于测试负载均衡的站点资料
    [root@web01 logs]# echo "我是real server web01,超哥真的太细了" > /opt/nginx/html/www/index.html
    

    【web02站点配置】

    1.检查nginx.conf,有关www.chaoge.com虚拟主机配置如下
    server {
    listen 80;
    server_name www.chaoge.com;
    charset utf-8;
    location / {
            root html/www;
            index index.html index.htm;
    }
    access_log logs/access_www.log main;
    }
    
    
    2.定义好测试负载均衡的站点资料
    [root@web02 nginx-1.16.0]# echo "我是real server web02,超哥牛皮666" > /opt/nginx/html/www/index.html
    

    【用户访问模拟配置】

    超哥这里是mac,因此直接使用命令行,windows的兄弟请搜索hosts文件,在C盘目录下
    
    yumac:~ root# tail -1 /etc/hosts
    192.168.178.3 www.chaoge.com
    

      

     

     

     【关闭主nginx负载均衡主节点】

    1.关闭服务
    systemctl stop keepalived
    
    2.直接关机来的效果更好,模拟机器宕机
    poweroff
    

      

     对用户来说,一切都是正常的。

    检查lb02负载均衡节点。

    发现vip已经成功漂移到备节点,整个实验大功告成。

  • 相关阅读:
    python递归 及 面向对象初识及编程思想
    python匿名函数 与 内置函数
    python迭代器与生成器(二)
    linux---常用命令(二)
    linux---常用命令(一)
    Linux CentOS服务启动
    常见HTTP状态码
    oncontextmenu
    javascript之with的使用 弊端
    js的with语句使用方法
  • 原文地址:https://www.cnblogs.com/abc1234567/p/14221501.html
Copyright © 2011-2022 走看看