• Linux高可用(HA)集群keepalived基础概念


    HA Server :

        nginx server

    HA Cluster实现方案:

        vrrp 协议的实现

            keepalived

        ais :完整的HA集群

            heartbeat

            corosync

    keepalived:

        vrrp 协议 : Virtual Redundant Routing Protocol

        vrrp 协议的软件实现,原生设计的目的是为了高可用的ipvs服务

        vrrp 协议完成地址流动

        为VIP地址所在的节点生成ipvs规则(在配置文件中预先定义)

        为ipvs集群的各RS做健康状态监测

        基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务

        

    有关keepalived术语:

        虚拟路由器: Virtual Router

        虚拟路由器标识: VRID(0-255)

        物理路由器

            master : 主设备

            backup : 备用设备

            priority : 优先级

        VIP : Virtual IP

        VMAC : Virtual MAC (23-de-99-01-22-VRID)

    通告: 心跳,优先级,周期性

    一些有关安全的方式:

        认证: 简单的字符认证,MD5

        无认证

    工作模式:

        主/备 : 但虚拟路径器

        主/主 : 主/备(虚拟路径器1), 备/主(虚拟路径器2)

    组件:

        核心组件:

            vrrp stack

            ipvs wrapper

            checkers

        控制组件: 配置文件分析器

        IO 复用器

        内存管理组件

    HA Cluster的配置前提

            (1) 各节点的时间必须同步 : ntp , chrony

            (2) 确保iptables 及 selinux不会成为阻碍

            (3) 各节点之间可通过主机名互相通信(对KA 并非必须),建议使用 /etc/hosts文件实现

            (4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(非必须)

    keepalived 安装配置:

    从centos 6.4 以上就开始收录在base源中

    程序环境:

            配置文件:/etc/keepalived/keepalived.conf

            主程序:/usr/sbin/keepalived

            Unit File:keepalived.service

    单主配置示例:

    1. ! Configuration File for keepalived
    2. global_defs {
    3.     notification_email {                    #邮件目的地方
    4.     root@localhost
    5.     }
    6.     notification_email_from keepalived@localhost            #邮件发送方
    7.     smtp_server 12 7.0.0.1                   #邮件服务器,端口25
    8.     smtp_connect_timeout 30                   #邮件服务器连接超时
    9.     router_id node1                       #路由器的物理标识符  
    10.     vrrp_mcast_group4 224.0.41.41                # vrrp 多播地址
    11. }
    12. vrrp_instance VI_1 {                        #vrrp 实例配置
    13.     state BACKUP                        #bakcup模式,备keepalived服务器
    14.     interface eno16777736                    #将当前虚拟路由器绑定eno16777736 物理接口
    15.     virtual_router_id 14                    #虚拟路由器的唯一ID
    16.     priority 98                         #优先级
    17.     advert_int 1                        #vrrp 通告时间间隔
    18.     authentication {                      #认证
    19.         auth_type PASS
    20.         auth_pass 571f97b2        #加密密码  openssl rand -hex 4 认证密钥不能超过8个字符,超过8个只对前8位有效,最好使用随机生成的字符串
    21.     }
    22.     virtual_ipaddress {                    #虚拟路由器要转移的ip
    23.         10.1.0.91/16 dev eno16777736             # 要转移的ip及绑定的物理接口
    24.     }
    25. }

    vrrp_mcast_group4 224.0.41.41  

    keepalived 就是通过多播地址实现的

    如果有MULTICAST说明该网卡支持多播,否则需要 ip link set dev eno33554984 multicast on

    配置语法:

      配置虚拟路由器:

    1. vrrp_instance {
    2. ...
    3. }

      专用参数:

                state MASTER|BACKUP : 当前节点再此虚拟路由器上的初始状态,只能有一个是MASTER,余下的都是BACKUP

                interface IFACE_NAME : 绑定为当前虚拟路由器使用的物理接口

                virtual_route_id VRID : 当前虚拟路由器的唯一标识,范围是0-255

                priority 100 : 当前主机在此虚拟路径器中的优先级,范围1-254

                advent_int 1 : vrrp 通告的时间间隔

                authentication {

                            auth_type AH|PASS

                            auth_pass

                }

    1. virtual_ipaddress{
    2. / brd dev scope label
    3. 192.168.200.17/24 dev eth1
    4. 192.168.200.18/24 dev eth2 label eth2:1
    5. }
    6. track_interface {
    7.         eth0
    8.         eth1
    9.         ...
    10. }    

    配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;

            nopreempt:定义工作模式为非抢占模式;

            preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;

    定义通知脚本:

            notify_master |:当前节点成为主节点时触发的脚本;

            notify_backup |:当前节点转为备节点时触发的脚本;

            notify_fault |:当前节点转为“失败”状态时触发的脚本;

        notify |:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;

    双主模型示例

    连个转移ip,同时被一个域名解析,还可以实现负载均衡

    1. ! Configuration File for keepalived
    2. global_defs {
    3.     notification_email {
    4.     root@localhost
    5.     }
    6.     notification_email_from keepalived@localhost
    7.     smtp_server 127.0.0.1
    8.     smtp_connect_timeout 30
    9.     router_id node1
    10.     vrrp_mcast_group4 224.0.100.19
    11. }
    12. vrrp_instance VI_1 {
    13.     state MASTER
    14.     interface eno16777736
    15.     virtual_router_id 14
    16.     priority 100
    17.     advert_int 1
    18.     authentication {
    19.         auth_type PASS
    20.         auth_pass 571f97b2
    21.     }
    22.     virtual_ipaddress {
    23.         10.1.0.91/16 dev eno16777736
    24.     }
    25. }
    26. vrrp_instance VI_2 {
    27.     state BACKUP
    28.     interface eno16777736
    29.     virtual_router_id 15
    30.     priority 98
    31.     advert_int 1
    32.     authentication {
    33.         auth_type PASS
    34.         auth_pass 578f07b2
    35.     }
    36. virtual_ipaddress {
    37.            10.1.0.92/16 dev eno16777736
    38.     }
    39. }

    示例通知脚本:

    1. #!/bin/bash
    2. #
    3. contact='root@localhost'
    4. notify() {
    5.     mailsubject="$(hostname) to be $1, vip floating"
    6.     mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    7.     echo "$mailbody" | mail -s "$mailsubject" $contact
    8. }
    9. case $1 in
    10.     master)
    11.         notify master
    12.     ;;
    13.     backup)
    14.         notify backup
    15.     ;;
    16.     fault)
    17.         notify fault
    18.     ;;
    19.     *)
    20.         echo "Usage: $(basename $0) {master|backup|fault}"
    21.         exit 1
    22.     ;;
    23. esac

    脚本的调用方法:

    1. notify_master "/etc/keepalived/notify.sh master"
    2. notify_backup "/etc/keepalived/notify.sh backup"
    3. notify_fault "/etc/keepalived/notify.sh fault"

    虚拟服务器:

        配置参数:

    1. virtual_server IP port | virtual_server fwmark int 
    2. {
    3. ...
    4. real_server {
    5. ...
    6. }
    7. ...
    8. }

        

        常用参数:

            delay_loop : 服务轮询的时间间隔

            lb_algo rr|wrr|wlc|lblc|sh|dh : 定义调度的方法

            lb_kind NAT|DR | TUN : 集群的类型

            persistence_timeout : 持久连接时长

            protocol TCP : 服务协议,仅支持TCP

            sorry_server : 备用服务器地址

            real_server

    1. {
    2. weight  : 权重
    3. notify_up |
    4. notify_down  |
    5. HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK{...} : 定义当前主机的健康状态检测方法;
    6. }
    1. HTTP_GET | SSL_GET {
    2. url {
    3. path : 定义要检测的URL
    4. status_code : 判断上述检测机制为健康状态的响应码
    5. digest : 判断上述检测机制为健康状态的响应的内容的校验码   
    6. }
    7. nb_get_retry : 重试次数
    8. delay_before_retry : 重试之前的延迟时长
    9. connect_ip :向当前RS的哪个ip地址发起健康状态检测请求
    10. connect_port :向当前RS的哪个PORT发起健康状态检测请求
    11. bindto :发出健康状态检测请求时使用的源地址;
    12. bind_port :发出健康状态检测请求时使用的源端口;
    13. connect_timeout :连接请求的超时时长;
    14. }
    1. TCP_CHECK {
    2. connect_ip :向当前RS的哪个IP地址发起健康状态检测请求
    3. connect_port :向当前RS的哪个PORT发起健康状态检测请求
    4. bindto :发出健康状态检测请求时使用的源地址;
    5. bind_port :发出健康状态检测请求时使用的源端口;
    6. connect_timeout :连接请求的超时时长;
    7. }

        

    高可用的ipvs集群示例:

    1. ! Configuration File for keepalived
    2. global_defs {
    3.     notification_email {
    4.         root@localhost
    5.     }
    6.     notification_email_from keepalived@localhost
    7.     smtp_server 127.0.0.1
    8.     smtp_connect_timeout 30
    9.     router_id node1
    10.     vrrp_mcast_group4 224.0.100.19
    11. }
    12. vrrp_instance VI_1 {
    13.     state MASTER
    14.     interface eno16777736
    15.     virtual_router_id 14
    16.     priority 100
    17.     advert_int 1
    18.     
    19.     authentication {
    20.         auth_type PASS
    21.         auth_pass 571f97b2
    22.     }
    23.     
    24.     virtual_ipaddress {
    25.         10.1.0.93/16 dev eno16777736
    26.     }
    27.     
    28.     notify_master "/etc/keepalived/notify.sh master"
    29.     notify_backup "/etc/keepalived/notify.sh backup"
    30.     notify_fault "/etc/keepalived/notify.sh fault"
    31. }
    32. virtual_server 10.1.0.93 80 {
    33.     delay_loop 3
    34.     lb_algo rr
    35.     lb_kind DR
    36.     protocol TCP
    37.     sorry_server 127.0.0.1 80
    38.     
    39.     real_server 10.1.0.69 80 {
    40.         weight 1
    41.         HTTP_GET {
    42.             url {
    43.                 path /
    44.                 status_code 200
    45.             }
    46.             connect_timeout 1
    47.             nb_get_retry 3
    48.             delay_before_retry 1
    49.         }
    50.     }
    51.     
    52.     real_server 10.1.0.71 80 {
    53.         weight 1
    54.         HTTP_GET {
    55.             url {
    56.                 path /
    57.                 status_code 200
    58.             }
    59.             connect_timeout 1
    60.             nb_get_retry 3
    61.             delay_before_retry 1
    62.         }
    63.     }
    64. }

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

    分两步

        (1)先定义一个脚本

        (2)调用此脚本

    1. vrrp_script {
    2. script ""
    3. interval INT 
    4. weight -INT 
    5. }
    1. track_script {
    2. SCRIPT_NAME_1
    3. SCRIPT_NAME_2
    4. ...
    5. }

    示例:高可用的nginx服务

    1. ! Configuration File for keepalived
    2. global_defs {
    3.     notification_email {
    4.         root@localhost
    5.     }
    6.     notification_email_from keepalived@localhost
    7.     smtp_server 127.0.0.1
    8.     smtp_connect_timeout 30
    9.     router_id node1
    10.     vrrp_mcast_group4 224.0.100.19
    11. }
    12. vrrp_script chk_down {
    13.     script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"  #成功返回值为0
    14.     interval 1    #每个1秒执行一次
    15.     weight -5  #失败权重减去一个数值
    16. }
    17. vrrp_script chk_nginx {
    18.     script "killall -0 nginx && exit 0 || exit 1"
    19.     interval 1
    20.     weight -5
    21. }
    22. vrrp_instance VI_1 {
    23.     state MASTER
    24.     interface eno16777736
    25.     virtual_router_id 14
    26.     priority 100
    27.     advert_int 1
    28.     authentication {
    29.         auth_type PASS
    30.         auth_pass 571f97b2
    31.     }
    32.     
    33.     virtual_ipaddress {
    34.         10.1.0.93/16 dev eno16777736
    35.     }
    36.     
    37.     track_script {    #调用前面定义过的脚本
    38.         chk_down
    39.         chk_nginx
    40.     }
    41.     
    42.     notify_master "/etc/keepalived/notify.sh master"
    43.     notify_backup "/etc/keepalived/notify.sh backup"
    44.     notify_fault "/etc/keepalived/notify.sh fault"
    45. }
     
    

  • 相关阅读:
    基于java+SpringBoot+VUE+Mysql社区家庭医生服务系统
    我对需求分析的理解
    Django后端开发——中间件
    学习教授LLM逻辑推理11.19
    河南灵活用工平台都适用于哪些行业?
    OSG第三方库编译之三十五:libzip编译(Windows、Linux、Macos环境下编译)
    word实用小技巧
    【Linux信号专题】四、信号的捕捉
    前端培训丁鹿学堂:vue性能优化总结(二)
    Python 多线程之threading介绍
  • 原文地址:https://blog.csdn.net/ly1358152944/article/details/126388148