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
- master 关闭keepalived
- 查看 backup 的ip
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