美文网首页
keepalived 实现高可用

keepalived 实现高可用

作者: fangfc | 来源:发表于2019-01-01 18:17 被阅读0次

    1. keepalived 概述

    1.1 keepalived 是什么

    • keepalived 常用来作为 实现高可用方案的软件, 也可以管理 LVS.
    • keepalived 软件主要是通过VRRP 协议实现高可用功能. VRRP(Virtual Router RedundancyProctol) 是虚拟路由器荣誉协议, 用于解决静态路由单点故障的问题, 能够保证个别节点宕机时, 整个网络可以不间断运行.
    • keepalived 一方面可以配置管理LVS 功能, 同时也可以对LVS 下面节点进行健康检查功能, 另一方面可以实现系统网络的高可用功能.

    1.2 keepalived 原理

    • Keepalived 是通过 VRRP 协议通信的, 所以需要先了解vrrp协议.

      • VRRP 是通过一种竞选机制来讲路由 任务交给某个 VRRP 路由器
      • VRRP 用IP多播的方式, (默认多播地址(224.0.0.x)) 实现高可用对 之间的通信.
      • 工作时 主节点在多播地址 发包, 备节点 收包, 当备用节点收不到包时, 就会启动接管程序, 来接管主节点的任务, 通过优先级竞选, 一般keepalived 管理节点都是一对.
      • VRRP 使用了加密协议加密数据, 但是keepalved 官方推荐使用明文的方式配置验证类型 和密码.
    • keepalived 工作原理

      • keepalived 高可用对之间通过 VRRP 协议通信, VRRP 通过竞选机制来确定 master/backup, master的优先级高于 backup, 工作时会有现货的所有资源, backup 节点处于等待状态, 当 master 挂了的时候, backup 会接管master, 然后顶替master对外提供服务.
      • keepalive 服务对之间, 只有作为 master 的服务会一直发送 VRRP 广播, 告诉 backup 还活着, 当 backup 收不到 广播包时, 会启动验证服务接管资源, 保证业务连续性.

    2. 部署keepalived

    2.1 安装前准备

    • 系统环境

    2.2 下载keepalived

    • 下载地址
      • 官网: http://www.keepalived.org
    [root@node10009 src]$ ll ./keepalived-1.4.5.tar.gz 
    -rw-r--r-- 1 root root 749813 Jan  1 14:46 ./keepalived-1.4.5.tar.gz
    [root@node10009 src]# tar zxf keepalived-1.4.5.tar.gz 
    [root@node10009 src]# cd keepalived-1.4.5 
    

    2.3 安装

    • 编译安装
    [root@node10009 keepalived-1.4.5]# ./configure --prefix=/opt/app/keepalived 
    ...
    [root@node10009 keepalived-1.4.5]# make && make install
    ...
    [root@node10009 keepalived-1.4.5]# cd /opt/app/keepalived/
    [root@node10009 keepalived]# ls
    bin  etc  sbin  share
    [root@node10009 keepalived]# 
    
    • 拷贝相关文件以及执行脚本
    [root@node10009 keepalived]# cp /opt/src/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
    [root@node10009 keepalived]# cp /opt/src/keepalived-1.4.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    [root@node10009 keepalived]# cp /opt/app/keepalived/etc/keepalived/keepalived.conf /etc/keeplaived/
    
    • backup 节点同样安装

    2.4 配置

    • master 编辑配置文件
      • # vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
       router_id 101 
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100 
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 12345
        }   
        virtual_ipaddress {
            192.168.10.5
        }   
    }
    
    • backup 配置
    # 与master 相似.
    # 只需要修改下面两项
    state BACKUP
    priority 50  
    

    2.5 启动

    • 启动
      • master 和 backup 一样
    [root@node10009 keepalived]# 
    [root@node10009 keepalived]# /etc/init.d/keepalived start
    Starting keepalived (via systemctl):                       [  OK  ]
    [root@node10009 keepalived]# 
    
    • 查看状态
      • master
    [root@node10009 keepalived]# ip addr show ens33
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:8f:4e:4a brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.9/24 brd 192.168.10.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet 192.168.10.5/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe8f:4e4a/64 scope link 
           valid_lft forever preferred_lft forever
    [root@node10009 keepalived]# 
    
    - backup
    
    [root@node10011 keepalived]# ip a s ens33
    3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:81:ed:eb brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.11/24 brd 192.168.10.255 scope global noprefixroute ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::4dde:82c6:582c:3368/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    
    • 可以看到 master 的 ens33 网卡上多个 VIP

    2.6 测试

    • master 和 backup 都启动 nginx
    001.png
    • master 关闭keepalived
    002.png
    • 查看 backup 的ip
    003.png

    3. keepalived 脑裂

    3.1 脑裂概述

    • 在高可用(HA)系统中, 当两个节点的 '心跳'断开时, 会为了一个整体, 动作协调HA系统, 会分裂成两个独立个体, 由于相互失去了联系, 都会以为 对方出现了故障, 两个节点就会出现脑裂, 争抢共享资源., 会发生严重的后果, 如: 争抢服务导致服务无法运行, 同时读写共享存储, 导致存储损坏.
    • 对于HA 系统脑裂的解决方法有:
      • 添加冗余的心跳线(原本心跳在网线上的 广播包), 添加 双线, 减少脑裂几率
      • 启动磁盘锁, 正在服务的一方会锁定共享硬盘, '脑裂发生时' 让对方无法使用硬盘,
      • 设定仲裁机制, 如: 添加参考IP(网关IP) 当心跳断开时, 2个节点会各自判断参考ip 是否可通讯, 如果该节点不同则 放弃竞争.

    3.2 脑裂产生的原因

    • 高可用服务器之间心跳线线路发生故障, 导致无法正常通信.
      • 心跳线坏了.
      • 网卡相关驱动问题, ip 配置冲突
      • 心跳线之间连接的设备故障(网卡即交换机)
      • 仲裁的机器出现故障
    • 高可用服务器 上开启了 防火墙规则 阻止了 心跳消息传输.
    • 高可用服务器 心跳网卡地址配置不正确
    • 其他服务配置不正确, 如心跳方式, 心跳广播冲突, 软件bug

    3.3 解决方案

    • 同时使用两个心跳线路,
    • 检测到脑裂发生时 强行关闭一个心跳节点, (需要特殊设备, 如 stonith, feyce)
    • 对脑裂的监控报警, 发生时 第一时间人为介入

    4. keepalived 配置文件

    • keepalived 仅有一个配置文件 keepalived.conf
    • 主要包含会以下几个区域:
      • global_defs:
      • static_ipaddress
      • start_routes
      • vrrp_script
      • vrrp_intance

    4.1 global_defs

    • 配置发生故障时通知对象, 以及机器标识
    • 详解
    notification_email {}
        - 配置故障发生时发送邮件对象(接受者 邮箱)
    notification_email_from 
        - 发送邮件的 邮箱(发送者)
    smpt_server
        - 通知邮件的 smtp 地址
    smtp_connect_timeout
        - 连接 smtp 服务的超时时间
    router_id LVS_DEVEL
        - LVS_DEVEL 是表示备节点的字符串, 通常可以设置hostnanme, 会在故障时的邮件内 用到
    vrrp_strict
        - 强制执行严格的 VRRP 协议.
    vrrp_garp_interval 0
        - 接口发送的 ARP 报文延时时间.
    vrrp_gna_interval
        - 接口发送给您的未接收请求的 消息之间延迟时间
    

    4.2 static_ipaddress 和 start_routes

    • staitc_ipaddress和 static_routes 用于配置ip 和 route 信息, 如果机器上机器上已配置了 IP 和路由, name这两个区域不需要配置,
    • 语法:
    static_ipaddress {
        <IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING] [scope <SCOPE>]
        ...
    }
    static_routes {
        ...
    }
    static_rules {
        ...
    }
    
    • 示例
    static_ipaddress {
        192.168.10.10/24 dev ens33 scopo global
    }
    satic_route {
        192.168.0.0/24 via 192.168.10.1 dev ens33
    }
    

    4.3 vrrp_script

    • 用来作健康检查, 当检查失败时 会启动 vrrp_instance 的 priority(优先级) 减少相对应的值.
    • 示例
    vrrp_script check_http_port {   
    -- vrrp_scrpt 定义脚本, 需要指定脚本名  
    
        scritpt "/opt/shell/check_http_port.sh"
        -- 定义一个脚本信息, 该脚本内容用于 check_http_port
    
        interval 2
        -- 执行脚本间隔时间, 单位 s
    
        weight 10
        -- 当脚本判断为错误时,会设置 优先级(这里是10), 当该优先级低于 BACKUP 的优先级时, 会被BACKUP 替代.
    
        timeout 20
        -- 脚本运行超时时间
    
        rise 10
        -- 该脚本运行成功的话, 会提升优先级 10,(+10)
    
        fall 10
        -- 转换所需的成功次数....
    
        user USERNAME [GROUPNAME]
        -- 执行脚本的user 和 group
    
        init_fail
        -- 最初状态为该脚本是失败状态.
    }
    

    4.4 vrrp_intance 和 vrrp_sync_group

    • vrrp_intance 用于定义对外提供服务的VIP 区域相关属性.
    • vrrp_rsync_group 用来定义 vrrp_intance 组, 改组内动作一致
    • 两个 vrrp_intance 属于一个 vrrp_rsync_group 时, 如果一个 vrrp_instance 发生故障切换了, 另一个也会同时切换(即使么有发生故障)
    • 示例
    vrrp_instance VI_1 {
    -- 配置区域
    
        state MASTER
            -- 配置为 MASTER 或者 BACKUP, 表示该机器最初`状态, 如果其他机器的 优先级高于高机器, 怎会称为 MASTER
    
        interface ens33
            -- 绑定接口, 由 vrrp 绑定
    
        use_vmac [<VMAC_INTERFACE>]
            -- 使用 VRRP 虚拟MAC,
    
        virtual_router_id 51
            -- 用于区分多个vrrp多实例的 唯一标识, 每组服务应当使用 相同的 id(master 和 backup 的id 必须一致)
    
        priority 100
            -- 选举Master 时使用的权限
    
        advert_int 1
            -- Vrrp 广播的间隔时间, 
    
        authentication {
            -- 设置认证的方式
            auth_type PASS || AH
                -- PASS 表示简单明文密码, AH 表示 IPSEC 加密
            auth_pass 1234
                -- 配置密码, master 和 backup 应当一致
        }
    }
    
    

    END

    相关文章

      网友评论

          本文标题:keepalived 实现高可用

          本文链接:https://www.haomeiwen.com/subject/zptolqtx.html