本文目录:
1. 概述
2. VRRP 协议
3. KeepAlived 架构模型
4. 安装 KeepAlived
5. 配置 keepalived 的日志
6. keepalived 配置文件详解
1. 概述
KeepAlived 主要有两个功能:
(1). 能够对 RealServer 进行健康状况检查, 支持 4 层 5 层和 7 层协议进行健康检查;
(2). 对负载均衡调度器实现高可用, 防止 Director 单点故障
在 keepalived 设计之初, 它只是 LVS 周边的一个辅助工具, 用于 LVS 的监控状况检查, 因此它和 LVS 的兼容性非常好如果某一个 realserver 节点宕了, keepalived 会将此节点从管理列表中踢出去, 当此节点恢复后又将此节点加回管理列表, 这样能够就让 realserver 负载均衡变的智能化但是, 此时的调度器存在单点故障的可能性, 因此有必要对其实现高可用
实现 LVS 高可用可以使用多种软件来实现, 如 heartbeat, 但是 heartbeat 本身不能实现 ipvs 的健康状况检查, 需要搭配 Ldirectord(安装完 heartbeat 就有了)来进行健康检查所幸的是 keepalived 后来也加入了高可用的功能, 而且配置起来也相当简单相比于 heartbeat+Ldirectord,keepalived 的检查速度极快, 故障转移也极快, 布置也简单的多所以一般来说, 要管理 ipvs, 都会选择使用 keepalived 下图列出了构建 LVS 高可用的几种工具:
keepalived 实现故障转移的功能是通过 VRRP(virtual router redundancy protocol 虚拟路由器冗余协议)协议来实现的 在 keepalived 正常工作的时候, 主节点 (master) 会不断的发送心跳信息给备节点(backup), 当备节点不能在一定时间内收到主节点的心跳信息时, 备节点会认为主节点宕了, 然后会接管主节点上的资源, 并继续向外提供服务保证其可用性当主节点恢复的时候, 备节点会自动让出资源并再次自动成为备节点
注意, 使用 keepalived 监控高可用 LVS 集群时(即常说的 keepalived+lvs), 并不需要在 Director 上使用 ipvsadm 等管理工具额外配置 ipvs 规则因为 keepalived 中集合了管理 ipvs 规则的组件(即稍后模型图中的 ipvs wrapper), 可以直接在 keepalived 的配置文件中配置 ipvs 相关规则, 在解析配置文件时会通过特定的组件将规则发送到内核中的 ipvs 模块
2. VRRP 协议
VRRP 协议的出现是为了解决静态路由的单点故障, 它是通过一种竞选机制来将路由任务交给某个 vrrp 路由器的
在 VRRP 物理结构中, 有多个物理的 VRRP 路由器, 其中有一台称为 "master" 即主节点路由器, 其他的都是 "backup" 备节点路由器, 谁是 master 谁是 backup, 这是通过他们的优先级来定义竞选的
在 VRRP 虚拟结构中, 虚拟路由器是通过 "MAC+VRID" 的形式来标识的, 如 "00-00-5E-00-01-{VRID}" 在 VRRP 虚拟结构中, 不管谁是 master, 对外都是相同的 MAC 和 VIP, 客户端主机并不需要因为 master 的改变而修改自己的路由配置
VRRP 结构中路由器之间的通信是通过 IP 多播的方式实现的 (也可以配置为其它通信方式) 但是, 只有 master 节点才会发送 VRRP 广告包 (vrrp advertisement message) 当 master 节点宕掉的时候, backup 中优先级最高的 VRRP 设备会抢占并升级为 master
3.keepalived 架构模型
Keepalived 服务启动的时候, 将产生三个相关进程, 一个父进程和两个子进程
- PID 111 Keepalived <-- Parent process fork and monitor children
- 112 \_ Keepalived <-- VRRP child
- 113 \_ Keepalived <-- Healthchecking child
父进程负责 fork 和监控子进程, 因此父进程也称为 WatchDog 两个子进程都会开启本地套接字 Unix Domain Socket 当 keepalived 服务启动后, 父进程会通过 unxi domain socket 每隔 5 秒发送一个 "Hello" 消息给子进程, 如果父进程无法发送消息给子进程, 将认为子进程出现问题, 于是会重启子进程
下图是 keepalived 设计架构图:
其中:
Checkers 组件: 负责 RealServer 的健康状况检查, 并在 LVS 的拓扑中移除添加 RealServer 它支持 layer4/5/7 层的协议检查该组件使用独立的子进程负责, 但被父进程监控
VRRP 组件: 提供 Director 的故障转移功能从而实现 Director 的高可用该组件可独立提供功能, 无需 LVS 的支持该组件使用独立的子进程负责, 但被父进程监控
System Call 组件: 提供读取自定义脚本的功能该组件在使用时, 将临时产生一个子进程来执行任务
IPVS wrapper 组件: 负责将配置文件中 IPVS 相关规则发送到内核的 ipvs 模块
Netlink Reflector: 用来设定监控 vrrp 的 vip 地址
4. 安装 keepalived
使用 keepalived, 完全可以 yum 安装本文仅给出编译安装的方法, 后文的所有配置都使用 yum 安装的 keepalived
官方各版本源码下载地址: http://www.keepalived.org/download.html 以下是编译安装 keepalived-1.2.19 版本的过程
- yum -y install openssl-devel
- tar xf keepalived-1.2.19.tar.gz
- cd keepalived-1.2.19
- ./configure --prefix=/usr/local/keepalived-1.2.19
- make && make install
其中./configure 的.--with-kernel-dir. 是在管理 LVS 时需要使用的, 如果不用配合 LVS, 则可以不用此选项
再做一下编译安装的规范行为
- ln -s /usr/local/keepalived-1.2.19 /usr/local/keepalived
- echo "MANPATH /usr/local/keepalived/share/man" >>/etc/man.config
- echo "export PATH=/usr/local/keepalived/sbin:$PATH" > /etc/profile.d/keepalived.sh
- chmod +x /etc/profile.d/keepalived.sh
- . /etc/profile.d/keepalived.sh
编译安装后, 在安装目录下生成以下一些目录, 其中 keepalived 程序在 sbin 目录下
- [root@xuexi ~]# cd /usr/local/keepalived
- [root@xuexi keepalived]# ls
- bin etc lib sbin share
在 etc 目录下, 有配置文件 SysV 管理脚本和大量配置文件示例
- [root@xuexi keepalived]# ls etc
- keepalived rc.d sysconfig
- [root@xuexi keepalived]# ls etc/keepalived/
- keepalived.conf samples
- [root@xuexi keepalived]# ls etc/rc.d/init.d/
- keepalived
但需要注意的是, 这里提供的 SysV 服务管理脚本是错误的, 原因是脚本中的 keepalived 命令路径错误所以修改该文件
- # 原文
- start() {
- echo -n $"Starting $prog:"
- daemon keepalived ${KEEPALIVED_OPTIONS}
- RETVAL=$?
- echo
- [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
- }
- # 修改后
- start() {
- echo -n $"Starting $prog:"
- daemon /usr/local/keepalived/sbin/keepalived ${KEEPALIVED_OPTIONS}
- RETVAL=$?
- echo
- [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
- }
5. 配置 keepalived 的日志
默认 keeepalived 的日志会记录到 / var/log/messages 中可以配置 keepalived 使其记录到其它文件中
先修改 / etc/sysconfig/keepalived 文件, 以下是原文内容
- #Options
- for keepalived.See`keepalived--help ' output and keepalived(8) and
- # keepalived.conf(5) man pages for a list of all options. Here are the most
- # common ones :
- #
- # --vrrp -P Only run with VRRP subsystem.
- # --check -C Only run with Health-checker subsystem.
- # --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
- # --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
- # --dump-conf -d Dump the configuration data.
- # --log-detail -D Detailed log messages.
- # --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
- #
- KEEPALIVED_OPTIONS="-D"'
要配置独立的日志, 将其中的 "KEEPALIVED_OPTIONS" 改为如下:
KEEPALIVED_OPTIONS="-D -S 0"
上面配置使用 local0 这个设备来记录日志, 因此去修改 rsyslog 的配置文件 / etc/rsyslog.conf, 添加该设备记录日志的级别和路径
- # Keepalived log config
- local0.* /var/log/keepalived.log
再重启 rsyslog
service rsyslog restart
6.keepalived 配置文件详解
配置文件分为 3 部分: 全局部分 VRRPd 部分 (即实现高可用部分) 以及 LVS 虚拟服务部分(健康状况检查以及管理的集群服务)
选项很多, 具体的意义可以 man keepalived.conf 默认内容如下:
- ! Configuration File for keepalived
- global_defs { #全局部分定义邮件报警系统, 可以不用定义
- notification_email { #定义邮件发送目标
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc #定义邮件发送人
- smtp_server 192.168.200.1
- smtp_connect_timeout 30
- router_id LVS_DEVEL #标识 keepalived 服务器的字符串, 实现高可用时需要使用它标识节点
- # 全局部分关于静态地址和静态路由的配置, 可以 man keepalived.conf, 不过几乎不用配置这部分
- }
- # 定义 vrrp 实例一个配置文件中可以实现多实例但不同主机上互为 master<-->backup 的实例名需相同
- vrrp_instance VI_1 {
- state MASTER #定义实例的角色状态是 master 还是 backup
- interface eth0 #定义 vrrp 绑定的接口, 即接收或发送心跳通告的接口, 即 HA 监测接口
- virtual_router_id 51 #虚拟路由标识(VRID), 同一实例该数值必须相同, 即 master 和 backup 中该值相同
- #同一网卡上的不同 vrrp 实例, 该值必须不能相同取值范围 0-255
- priority 100 #该 vrrp 实例中本机的 keepalived 的优先级, 优先级最高的为 master 该选项的优先级
- #高于 state 选项, 即若 state 指定的是 backup, 但这里设置的值最高, 则仍为 master
- advert_int 1 #心跳信息发送和接收时间间隔, 单位为秒
- authentication { #认证方式, 同一实例中这个配置必须完全一样才可通过认证只建议使用 PASS 认证
- auth_type PASS
- auth_pass 1111 #最多支持 8 字符, 超过 8 字符将只取前 8 字符
- }
- virtual_ipaddress { #设置的 VIP 只有 master 节点才会设置 master 出现故障后, VIP 会故障转移到 backup
- #这些 vip 默认配置在 interface 指定的接口别名上, 可使用 dev 选项来指定配置接口
- #使用 ip add 的方式添加若要被 ifconfig 查看, 在 IP 地址后加上 label 即可
- #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
- 192.168.200.16 label eth0:1
- 192.168.200.17
- 192.168.200.18
- 192.168.200.19/24 dev eth1
- }
- }
- # 定义虚拟服务部分
- virtual_server 192.168.200.100 443 { #虚拟服务地址和端口, 使用空格分隔, 其中地址为 VIP
- delay_loop 6 #健康检查时间间隔
- lb_algo rr #定义负载均衡 LB 的算法, 这里使用的是 rr 调度算法
- lb_kind NAT #lvs 的模型, 有 NAT/DR/TUN 三种
- nat_mask 255.255.255.0
- persistence_timeout 50 #持久会话保持时长
- protocol TCP #监控服务的协议类型, 1.3.0 版本之前只支持 tcp, 之后还支持 udp
- real_server 192.168.201.100 443 { #定义 real_server 部分, 地址和端口使用空格分隔
- weight 1 #LVS 权重
- SSL_GET { #健康状况检查的检查方式, 常见的有 HTTP_GET|SSL_GET|TCP_CHECK|MISC_CHECK
- url {
- path / #指定 ssl_get 健康状况检查的路径, 例如检查 index.html 是否正常
- digest ff20ad2481f97b1754ef3e12ecd3a9cc
- #健康状况需要状态码, 可以是 status_codedigest 或 digest+status_code
- #digest 值用 keepalived 的 genhash 命令生成, 一般使用 status_code 即可
- status_code 200
- }
- url {
- path /mrtg/
- digest 9b3a0c85a887a256d6939da88aabd8cd
- }
- connect_timeout 3 #表示 3 秒无响应就超时, 即此 realserver 不健康, 需重试连接
- nb_get_retry 3 #表示重试 3 次, 3 次之后都超时就是宕机, 防止误伤(nb=number)
- delay_before_retry 3 #重试的时间间隔
- #上述配置需 12 秒才能判断节点故障, 时间太久, 应改小
- }
- }
- }
- virtual_server 10.10.10.2 1358 {
- delay_loop 6
- lb_algo rr
- lb_kind NAT
- persistence_timeout 50
- protocol TCP
- sorry_server 192.168.200.200 1358 #定义当所有 Real server 都宕机的时候, 由哪台服务器继续提供服务
- #一般在 keepalived 本机给定一个 web 页面, 提示网站正在维护的信息
- real_server 192.168.200.2 1358 {
- weight 1
- HTTP_GET {
- url {
- path /testurl/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- url {
- path /testurl2/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- url {
- path /testurl3/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- real_server 192.168.200.3 1358 {
- weight 1
- HTTP_GET {
- url {
- path /testurl/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334c
- }
- url {
- path /testurl2/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334c
- }
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
- virtual_server 10.10.10.3 1358 {
- delay_loop 3
- lb_algo rr
- lb_kind NAT
- nat_mask 255.255.255.0
- persistence_timeout 50
- protocol TCP
- real_server 192.168.200.4 1358 {
- weight 1
- HTTP_GET {
- url {
- path /testurl/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- url {
- path /testurl2/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- url {
- path /testurl3/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- real_server 192.168.200.5 1358 {
- weight 1
- HTTP_GET {
- url {
- path /testurl/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- url {
- path /testurl2/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- url {
- path /testurl3/test.jsp
- digest 640205b7b0fc66c1ea91c463fac6334d
- }
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
关于配置文件中的几种时间间隔:
advert_int N1:vrrp 主备之间发送和接收心跳信息的时间间隔和 Checker 组件无关
delay_loop N2: 是健康状况检查的时间间隔每隔几秒就检查一次
connect_timeout N3: 连接 RS 的超时时间, 连接不上说明不健康, 需要重试连接来判定 RS 是否故障
nb_get_retry N4: 一个节点不健康的判定重试次数要重试 N 次, N 次内都不健康说明节点故障了
delay_before_retry N5: 判定某节点不健康后过 N 秒再进行重试判定
N2 和 N5 的区别在于: 当上一次健康检查结果是正常的, 将会隔 N2 秒再检查如果某次检查不健康, 即联系不上 RS, 则每隔 N5 秒重试一次, 直到 N4 次后才判定该 RS 已经故障因此, 最终需要 N3+N4*N5 才能判定一个节点的故障
虽然健康检查的失败次数是可以指定的, 但一般都会设置多于 1 次防止误伤另外, 成功的检查只需一次即可
keepalived 支持 4 层 5 层和 7 层的健康状况检查, 按检查类型又可分为 TCP 检查 (4 层)HTTP 检查(5 层)SSL_HTTP 检查(5 层) 以及自定义的 MISC 检查 (可实现 7 层) 其中:
TCP_CHECK: 通过 TCP 连接来检查后端 RS 是否健康
HTTP_GET: 通过获取指定页面来检查后端 RS 是否健康是否健康是根据是否匹配 digeststatus_code 来判断的
SSL_GET: 和 HTTP_GET 一样, 只不过使用的协议是 HTTPS
MISC_CHECK: 通过加载自定义健康状况检查的脚本来检查对象是否健康, 要求这些脚本中健康与否的返回值为 0 或 1
使用 MISC_CHECK 检查时, 方式如下:
- MISC_CHECK {
- misc_path /path_to_script/script.sh
- (or misc_path /path_to_script/script.sh <arg_list>)
- }
回到 Linux 系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到网站架构系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到数据库系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7586194.html
来源: https://www.cnblogs.com/f-ck-need-u/p/8483807.html