• Keepalived 配置实例


    Keepalived 是一款轻量级HA集群应用,它的设计初衷是为了做LVS集群的HA,即探测LVS健康情况,从而进行主备切换,不仅如此,还能够探测LVS代理的后端主机的健康状况,动态修改LVS转发规则。 

       当LVS进行主备切换的时候,对外提供服务的IP是如何做到切换的呢?这就依赖于keepalived 所应用的vrrp协议,即Virtual Reduntant  Routing Protocol,虚拟冗余路由协议。简单来讲,此协议是将IP设置在虚拟接口之上,根据一定的规则实现IP在物理主机上流动,即哪台主机可以占有该IP。

       而且keepalived具有脚本调用接口,可通过脚本完成拓展功能。

       1.Keepalived

    术语:

    虚拟路由器:Virtual Router 
    虚拟路由器标识:VRID(0-255)
    物理路由器:
    master:主设备
    backup:备用设备
    priority:优先级
    VIP:Virtual IP 
    VMAC:Virutal MAC (00-00-5e-00-01-VRID)
    通告内容:心跳,优先级等;周期性;
    各主机通告以组播方式通信,只向组内的主机发送数据包,因为按照组播的mac地址发送,组播mac地址是和组播ip地址对应的。iana(internet assigned number authority)规定,组播mac地址的高24bit为0x01005e,mac 地址的低23bit为组播ip地址的低23bit。相应地网卡需要设置支持multicast。
    抢占式,非抢占式;

    默认为抢占式。当优先级高的主机恢复正常状态时,将夺回IP,重新成为MASTER。 

    安全认证:
    无认证
    简单字符认证   #一般采用此方式
    MD5
    工作模式:
    主/备:单虚拟路径器;
    主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)
    假定两台主机A和B做HA,可以做两个虚拟接口,流动2个IP。接口1中,A设备优先级设定高,为MASTER;接口2种,B设备优先级高,为MASTER。

    这样两台主机,能通过两个对外IP同时工作。即主主模式。 

    组件:

    核心组件:
    vrrp stack
    ipvs wrapper
    checkers
    控制组件:配置文件分析器
    IO复用器
    内存管理组件

    HA Cluster的配置前提:

    (1) 各节点时间必须同步;
    (2) 确保iptables及selinux不会成为阻碍;

    2.Keepalived配置前需要了解的事

    本文演示的环境为centos7.2。keepalived软件安装,配置好yum源,软件包已在base仓库中收录。

    # yum install keepalived           安装即可 

    程序环境:

    网卡支持multicast
    配置文件:/etc/keepalived/keepalived.conf
    主程序:/usr/sbin/keepalived
    Unit File:keepalived.service

    配置文件组件部分:

    通用的配置结构 

    TOP HIERACHY

    GLOBAL CONFIGURATION
    Global definitions
    Static routes/addresses
    VRRPD CONFIGURATION
    VRRP synchronization group(s)
    VRRP instance(s)
    LVS CONFIGURATION
    Virtual server group(s)
    Virtual server(s)

    配置语法:

    配置虚拟路由器:实现IP流动的部分
    vrrp_instance <STRING> {
    ....
    }
    专用参数:
    state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
    interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口;
    virtual_router_id VRID:当前虚拟路由器的惟一标识,范围是0-255;
    priority 100:当前主机在此虚拟路径器中的优先级;范围1-254;
    advert_int 1:vrrp通告的时间间隔;
    authentication {
    auth_type AH|PASS
    auth_pass <PASSWORD>
    }
    virtual_ipaddress {
    <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
    192.168.200.17/24 dev eth1
    192.168.200.18/24 dev eth2 label eth2:1
    }
    track_interface {
    eth0
    eth1
    ...
    }
    配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
    nopreempt:定义工作模式为非抢占模式;
    preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;
    定义通知脚本:
    notify_master <STRING>|<QUOTED-STRING>:当前节点成为主节点时触发的脚本;
    notify_backup <STRING>|<QUOTED-STRING>:当前节点转为备节点时触发的脚本;
    notify_fault <STRING>|<QUOTED-STRING>:当前节点转为“失败”状态时触发的脚本;
    notify <STRING>|<QUOTED-STRING>:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;

     3.Keepalived 双主虚拟路由配置实例

    演示前说明: 

     2台centos7.2 主机:node-00,node-01

    VIP1:10.1.38.19预定node-00占有

    VIP2:10.1.38.20 预定node-01占有

    2台主机安装好keepalived之后,开始编辑配置文件 

    node-00的配置如下 

    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        root@localhost
       }
       notification_email_from keepalived@localhost           #定义来信人
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node-00
       vrrp_mcast_group4 224.0.38.12
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface team0
        virtual_router_id 38
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.19/16 dev team0
        }
    
        smtp_alert            #状态切换,使用邮件通知
    }
    
    vrrp_instance VI_2 {
        state BACKUP
        interface team0
        virtual_router_id 39
        priority 97
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.20/16 dev team0
        }
        smtp_alert
    }

    复制要把备注删掉

    node-01配置如下

    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        root@localhost
       }
       notification_email_from keepalived@localhost 
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node-01
       vrrp_mcast_group4 224.0.38.12
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface bond0
        virtual_router_id 38
        priority 97
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.19/16 dev bond0
        }
        smtp_alert
    }
    
    vrrp_instance VI_2 {
        state MASTER
        interface bond0
        virtual_router_id 39
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.20/16 dev bond0
        }
        smtp_alert
    }

    配置完成后,启动服务

    #systemctl start keepalived

    使用ip命令查看ip地址情况

    #ip address show

    node-00情况

    node-01情况

    此时,我们模拟node-00宕机,将node-00的keepalived服务停掉,那么10.1.38.19此ip会流动到node-01上

    #systemctl stop keepalived

    至此此部分演示完毕。

    4.Keepalived ipvs 高可用集群配置实例

    同样先科普的配置说明

    虚拟服务器:
    配置结构:
      virtual_server IP port 或者virtual_server fwmark int 
      {
        ...
        real_server {
          ...
        }
        ...
      }

    常用参数:
      delay_loop <INT>:服务轮询的时间间隔;
      lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法;
      lb_kind NAT|DR|TUN:集群的类型;
      persistence_timeout <INT>:定向调度时长;
      protocol TCP:服务协议,仅支持TCP;
      sorry_server <IPADDR> <PORT>:备用服务器地址;当后端主机都失败时,由此主机提供友好提示页面。
      real_server <IPADDR> <PORT>  
      {
        weight <INT>
        notify_up <STRING>|<QUOTED-STRING>
        notify_down <STRING>|<QUOTED-STRING>
        HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定义当前主机的健康状态检测方法;
      }

      HTTP_GET|SSL_GET {
        url {
            path <URL_PATH>:定义要监控的URL;
            status_code <INT>:判断上述检测机制为健康状态的响应码;
            digest <STRING>:判断上述检测机制为健康状态的响应的内容的校验码;
        }
        nb_get_retry <INT>:重试次数;
        delay_before_retry <INT>:重试之前的延迟时长;
        connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
        connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
        bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
        bind_port <PORT>:发出健康状态检测请求时使用的源端口;
        connect_timeout <INTEGER>:连接请求的超时时长;
      }

      TCP_CHECK {
        connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
        connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
        bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
        bind_port <PORT>:发出健康状态检测请求时使用的源端口;
        connect_timeout <INTEGER>:连接请求的超时时长;
      }

    开始演示实例

    演示说明:

      node-00,node-01 作为ipvs主机,做HA。对外服务IP为10.1.38.15,即VIP。

      node-02,node-03 作为后端主机,提供web服务。

      node-02 IP:10.1.38.13

      node-03 IP:10.1.38.14

     node-00配置如下

    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        root@localhost
       }
       notification_email_from keepalived@localhost 
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node-00
       vrrp_mcast_group4 224.0.38.12
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface team0
        virtual_router_id 38
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.15/16 dev team0
        }
    
        smtp_alert
    }
    virtual_server 10.1.38.15 80 {
        delay_loop 3
        lb_algo rr
        lb_kind DR
        protocol TCP
    
        sorry_server 127.0.0.1 80
    
        real_server 10.1.38.13 80 {
            weight 1
            HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            }
        }
        real_server 10.1.38.14 80 {
            weight 1
            HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            }
        }
    }

    node-01 配置如下

    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        root@localhost
       }
       notification_email_from keepalived@localhost 
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node-01
       vrrp_mcast_group4 224.0.38.12
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface bond0
        virtual_router_id 38
        priority 97
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.15/16 dev bond0
        }
    
        smtp_alert
    }
    virtual_server 10.1.38.15 80 {
        delay_loop 3
        lb_algo rr
        lb_kind DR
        protocol TCP
    
        sorry_server 127.0.0.1 80
    
        real_server 10.1.38.13 80 {
            weight 1
            HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            }
        }
        real_server 10.1.38.14 80 {
            weight 1
            HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            }
        }
    }

    两台后端主机做好lvs  dr模式集群设置,并开启web服务。启动ipvs两台主机keepalived服务。

    一切正常情况下,此时node-00拥有VIP,使用其他主机来访问 10.1.38.15

    测试1:

    #for i in {1..6};do curl 10.1.38.15;done 

         

      轮询调度正常。

      测试2:

      停掉node-00 keepalived服务,模拟宕机,测试冗余性

      正常结果还是正常轮询的。

      测试3:

      两台ipvs主机正常运行,停掉node-02上web服务,模拟后端主机宕机,测试keepalived动态调整后端主机列表功能

      

      测试结果,前端调度器只将服务调度至node-03上。

      再将node-02 web服务启动,再测试

      

      结果显示恢复正常轮询,至此keepalived动态调整能力测试完毕。

      其实以上结果,再ipvs主机直接查看lvs规则也可看出

      #ipvsadm -Ln

    5.Keepalived 做nginx 高可用集群配置实例

    再学习一个新知识,脚本调用

      keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;   

      分两步:(1) 先定义一个脚本;(2) 调用此脚本;

      vrrp_script <SCRIPT_NAME> {
        script ""     #定义一个判定语句,如果退出状态码为非0,则执行减优先级操作。
        interval INT     #测试间隔
        weight -INT        #降低优先级,是其释放VIP所有权
      }

      track_script {
        SCRIPT_NAME_1 #检测的脚本列表
        SCRIPT_NAME_2
        ...
      }

     开始演示实例

    演示说明:

    node-00,node-01 为nginx服务器,代理后端web服务器,使用keepalived做HA集群。

    node-02,node-03 为后端web服务器。

    node-00配置如下

    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        root@localhost
       }
       notification_email_from keepalived@localhost 
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node-00
       vrrp_mcast_group4 224.0.38.12
    }
    
        vrrp_script check_ngx {           #脚本在引用前定义好
            script "killall -0 nginx "  #探测nginx服务是否正常
            interval    1
            weight  -5
        }
    vrrp_instance VI_1 {
        state MASTER
        interface team0
        virtual_router_id 38
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.15/16 dev team0
        }
        track_script {  #在路由实例中引用自定义脚本
            check_ngx
        }
        smtp_alert
    }

    node-01配置如下

    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        root@localhost
       }
       notification_email_from keepalived@localhost 
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node-01
       vrrp_mcast_group4 224.0.38.12
    }
    
        vrrp_script check_ngx {
            script "killall -0 nginx"
            interval    1
            weight  -5
        }
    vrrp_instance VI_1 {
        state BACKUP
        interface bond0
        virtual_router_id 38
        priority 97
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass x1er44q
        }
        virtual_ipaddress {
            10.1.38.15/16 dev bond0
        }
        track_script {
            check_ngx
        }
        smtp_alert
    }

    node-00,node-01 启动nginx服务,并已设置好代理两台后端web服务器;启动keepalived 服务。

    node-02,node-03 启动web服务。

    如果配置正确,会有以下结果。

    测试1:使用另一台主机访问VIP,轮询响应结果正常,VIP在node-00。

    测试2:停止node-00 nginx服务,模拟nginx服务异常,访问VIP,轮询响应结果正常,VIP在node-01。

    测试3:恢复node-00 nginx 服务,VIP 流动回 node-00上。

     

    完~

      

     

     

  • 相关阅读:
    activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑
    Eclipse启动项目正常,放到tomcat下单独启动就报错的 一例
    Project facet jst.web.jstl has not been defined.
    MySQL删除所有表的外键约束、禁用外键约束
    Unsupported major.minor version 52.0解决办法
    Could not update Activiti database schema: unknown version from database: '5.20.0.1'
    Android SDK下载地址
    Unity3d游戏中添加移动MM支付SDK问题处理
    Unity3d集成移动MM SDK 2.2的技术要点(坑爹的MM SDK)
    Android SDK更新 Connection to http://dl-ssl.google.com refused 解决方法
  • 原文地址:https://www.cnblogs.com/cutemsyu/p/6019420.html
Copyright © 2020-2023  润新知