keepalived 实现高可用

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:  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:  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 {
    [/] [brd ] [dev ]
    ...
}
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 []
        -- 使用 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 实现高可用)