什么是 Keepalived 呢? keepalived 观其名可知保持存活在网络里面就是保持在线了,也就是所谓的高可用或热备用来防止单点故障 ( 单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用 ) 的发生。那说到 keepalived 时不得不说的一个协议就是 VRRP 协议,可以说这个协议就是 keepalived 实现的基础,那么首先我们来看看 VRRP 协议
一、 VRRP 协议
VRRP 协议
学过网络的朋友都知道网络在设计的时候必须考虑到冗余容灾包括线路冗余设备冗余等防止网络存在单点故障那在路由器或三层交换机处实现冗余就显得尤为重要在网络里面有个协议就是来做这事的这个协议就是 VRRP 协议 Keepalived 就是巧用 VRRP 协议来实现高可用性 (HA) 的。 keepalived 完全遵守 VRRP 协议包括竞选机制等等
二、Keepalived原理
Keepalived 原理
keepalived 也是模块化设计不同模块复杂不同的功能下面是keepalived 的组件
corecheck vrrp libipfwc libipvs-2.4 libipvs-2.6
core 是keepalived 的核心复杂主进程的启动和维护全局配置文件的加载解析等
check 负责healthchecker( 健康检查) 包括了各种健康检查方式以及对应的配置的解析包括LVS 的配置解析
vrrpVRRPD 子进程VRRPD 子进程就是来实现VRRP 协议的
libipfwciptables(ipchains) 库配置LVS 会用到
libipvs* 配置LVS 会用到
注意keepalived 和LVS 完全是两码事只不过他们各负其责相互配合而已
keepalived 启动后会有三个进程
父进程:内存管理子进程管理等等
子进程:VRRP 子进程
子进程:healthchecker 子进程
有图可知两个子进程都被系统WatchDog 看管,两个子进程各自负责自己的事。healthchecker 子进程负责检查各自服务器的健康程度。例如HTTP、 LVS 等等。如果healthchecker 子进程检查到MASTER 上服务不可用了,就会通知本机上的兄弟VRRP 子进程让他删除、通告并且去掉虚拟IP, 转换为BACKUP 状态
三、 Keepalived 配置文件详解
keepalived 配置详解
keepalived 有三类配置区域( 姑且就叫区域吧) 注意不是三种配置文件是一个配置文件里面三种不同类别的配置区域
全局配置(Global Configuration)
VRRPD 配置
LVS 配置
(一)全局配置
全局配置又包括两个子配置
全局定义(global definition)
静态路由配置(static ipaddress/routes)
1、 全局定义(global definition) 配置范例
1. global_defs
2. {
3. notification_email
4. {
5. admin@example.com
6. }
7. notification_email_from admin@example.com
8. smtp_server 127.0.0.1
9. stmp_connect_timeout 30
10.router_id node1
11.}
全局配置解析
global_defs 全局配置标识表面这个区域{} 是全局配置
1. notification_email
2. {
3. admin@example.com
4. admin@ywlm.net
5. }
表示keepalived 在发生诸如切换操作时需要发送email 通知,以及email 发送给哪些邮件地址,邮件地址可以多个,每行一个
notification_email_from admin@example.com
表示发送通知邮件时邮件源地址是谁
smtp_server 127.0.0.1
表示发送email 时使用的smtp 服务器地址这里可以用本地的sendmail 来实现
smtp_connect_timeout 30
连接smtp 连接超时时间
router_id node1
机器标识
2、 静态地址和路由配置范例
1. static_ipaddress
2. {
3. 192.168.1.1/24 brd + dev eth0 scope global
4. 192.168.1.2/24 brd + dev eth1 scope global
5. }
6. static_routes
7. {
8. src $SRC_IP to $DST_IP dev $SRC_DEVICE
9. src $SRC_IP to $DST_IP via $GW dev$SRC_DEVICE
10.}
这里实际上和系统里面命令配置IP 地址和路由一样例如
192.168.1.1/24 brd + dev eth0 scope global 相当于: ip addr add192.168.1.1/24 brd + dev eth0 scope global
就是给eth0 配置IP 地址
路由同理
一般这个区域不需要配置
这里实际上就是给服务器配置真实的IP 地址和路由的。在复杂的环境下可能需要配置,一般不会用这个来配置。我们可以直接
用vi /etc/sysconfig/network-script/ifcfg-eth1 来配置。切记这里可不是VIP 哦,不要搞混淆了切记切记!
(二) VRRPD 配置
VRRPD 配置包括三个类
VRRP 同步组(synchroization group)
VRRP 实例(VRRP Instance)
VRRP 脚本
1、 VRRP 同步组(synchroizationgroup) 配置范例
1. vrrp_sync_group VG_1 {
2. group {
3. http
4. mysql
5. }
6. notify_master /path/to/to_master.sh
7. notify_backup /path_to/to_backup.sh
8. notify_fault "/path/fault.shVG_1"
9. notify /path/to/notify.sh
10.smtp_alert
11.}
其中
1. group {
2. http
3. mysql
4. }
http 和mysql 是实例名,和下面的实例名一致
1. notify_master /path/to/to_master.sh 表示当切换到 master 状态时要执行的脚本
2. notify_backup /path_to/to_backup.sh 表示当切换到 backup 状态时要执行的脚本
3. notify_fault "/path/fault.shVG_1"
notify /path/to/notify.sh
smtp alter 表示切换时给global defs 中定义的邮件地址发送右键通知
2、 VRRP 实例(instance) 配置范例
1. vrrp_instance VI_1 {
2. interface eth0
3. state MASTER # BACKUP for slave routers
4. priority 101 # 100 for BACKUP
5. virtual_router_id 51
6. garp_master_delay 1
7.
8. authentication {
9. auth_type PASS
10. auth_pass password
11. }
12. track_interface {
13. eth0
14. }
15. virtual_ipaddress {
16. 172.16.100.1/16 dev eth0 label eth0:0
17. }
18. track_script {
19. chk_haproxy
20. chk_mantaince_down
21. }
22.
23.
24. notify_master"/etc/keepalived/notify.sh master"
25. notify_backup "/etc/keepalived/notify.shbackup"
26. notify_fault"/etc/keepalived/notify.sh fault"
}
state 指定instance(Initial) 的初始状态。就是说在配置好后这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定,如果这里设置为master, 但如若他的优先级不及另外一台,那么这台在发送通告时会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为master
interface 实例绑定的网卡因为在配置虚拟IP 的时候必须是在已有的网卡上添加的
track interface 跟踪接口设置。额外的监控里面,任意一块网卡出现问题都会进入故障(FAULT) 状态。例如用nginx 做均衡器的时候内网必须正常工作,如果内网出问题了这个均衡器也就无法运作了,所以必须对内外网同时做健康检查
mcastsrc ip 发送多播数据包时的源IP 地址。这里实际上就是在哪个地址上发送VRRP 通告。这个非常重要!一定要选择稳定的网卡端口来发送。这里相当于heartbeat 的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP, 也就是interface 指定的IP 地址
garp master delay 在切换到master 状态后延迟进行免费的ARP(gratuitous ARP) 请求
virtual_router_id 这里设置VRID。 这里非常重要,相同的VRID 为一个组他将决定多播的MAC 地址
priority 100 设置本节点的优先级。优先级高的为master
advert_int 检查间隔默认为1 秒
virtualipaddress 这里设置的就是VIP, 也就是虚拟IP 地址。他随着state 的变化而增加删除。当state 为master 的时候就添加,当state 为backup 的时候删除。这里主要是由优先级来决定的,和state 设置的值没有多大关系。这里可以设置多个IP 地址
virtualroutes 原理和virtual ipaddress 一样只不过这里是增加和删除路由
lvssync daemon interface lvs syncd 绑定的网卡
authentication 这里设置认证
authtype 认证方式可以是PASS 或AH 两种认证方式
authpass 认证密码
nopreempt 设置不抢占。这里只能设置在state 为backup 的节点上,而且这个节点的优先级必须比另外的高
preemptdelay 抢占延迟
debug debug 级别
notifymaster 和sync group 这里设置的含义一样,可以单独设置。例如不同的实例通知不同的管理人员,http 实例发给网站管理员,mysql 的就发邮件给DBA
3、 VRRP 脚本
1. vrrp_script check_running {
2. script "/usr/local/bin/check_running"
3. interval 10
4. weight 10
5. }
6.
7. vrrp_instance http {
8. state BACKUP
9. smtp_alert
10. interface eth0
11. virtual_router_id 101
12. priority 90
13. advert_int 3
14. authentication {
15. auth_type PASS
16. auth_pass whatever
17. }
18. virtual_ipaddress {
19. 1.1.1.1
20. }
21. track_script {
22. check_running weight 20
23. }
24. }
首先在 vrrp_script 区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更
vrrp_script check_running {
script "/usr/local/bin/check_running"
interval 10 # 脚本执行间隔
weight 10 # 脚本结果导致的优先级变更, 10 表示优先级 +10 -10 则表示优先级 -10
}
然后在 实例 ( vrrp_instance ) 里面引用有点类似脚本里面的函数引用一样先定义后引用函数名
track_script {
check_running weight 20
}
注意 VRRP 脚本 (vrrp_script) 和 VRRP 实例 ( vrrp_instance ) 属于同一个级别
脚本实例 2
vrrp_script chk_nginx {
script "killall -0 nginx > /dev/null 2>&1"
interval 1
weight -5 #检测失败的时候权重减 5
}
killall -0 服务名称
用于检测服务是否正常运行返回值为 0 则正常 1 异常
四、针对 LVS 的特有配置
如果你没有配置LVS+keepalived 那么无需配置这段区域,如果你用的是nginx 来代替LVS 也无需配置这段,这里的LVS 配置是专门为keepalived+LVS 集成准备的。不过也可以用来做一些特别的检测,检测出状态后可以写脚本去做相应的处理。
注意了,这里LVS 配置并不是指真的安装LVS 然后用ipvsadm 来配置他,而是用keepalived 的配置文件来代替ipvsadm 来配置LVS, 这样会方便很多,一个配置文件搞定这些维护方便配置方便是也
这里LVS 配置也有两个配置
一个是虚拟主机组配置
一个是虚拟主机配置
1、 虚拟主机组配置文件详解
这个配置是可选的根据需求来配置吧这里配置主要是为了让一台realserver 上的某个服务可以属于多个Virtual Server 并且只做一次健康检查
virtual_server_group {
# VIP port
fwmark
}
2、 虚拟主机配置
virtual server 可以以下面三种的任意一种来配置
1. virtual server IP port
2. virtual server fwmark int
3. virtual server group string
下面以第一种比较常用的方式来配详细解说一下
virtual_server 192.168.1.2 80 {
# 设置一个virtual server:VIP:Vport
delay_loop 3
# service polling 的delay 时间即服务轮询的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #LVS 调度算法
lb_kind NAT|DR|TUN #LVS 集群模式
persistence_timeout 120
# 会话保持时间秒为单位即以用户在120 秒内被分配到同一个后端realserver
persistence_granularity
#LVS 会话保持粒度ipvsadm 中的-M 参数默认是0xffffffff 即每个客户端都做会话保持
protocol TCP # 健康检查用的是TCP 还是UDP
ha_suspend #suspendhealthchecker’sactivity
virtualhost
#HTTP_GET 做健康检查时检查的web 服务器的虚拟主机即host 头
sorry_server
# 备用机就是当所有后端realserver 节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里啦
real_server
# 后端真实节点主机的权重等设置主要后端有几台这里就要设置几个
{
weight 1 # 给每台的权重0 表示失效( 不知给他转发请求知道他恢复正常) 默认是1
inhibit_on_failure # 表示在节点失败后把他权重设置成0 而不是冲IPVS 中删除
notify_up | # 检查服务器正常(UP) 后要执行的脚本
notify_down | # 检查服务器失败(down) 后要执行的脚本
HTTP_GET # 健康检查方式
{
url { # 要检测的URL 可以有多个
path / # 具体路径
digest
status_code 200 # 返回状态码
}
connect_port 80 # 监控检查的端口
bindto # 健康检查的IP 地址
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 2 # 重连间隔
} # END OF HTTP_GET|SSL_GET
# 下面是常用的健康检查方式健康检查方式一共有 HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK 这些
#TCP 方式
TCP_CHECK {
connect_port 80
bindto 192.168.1.1
connect_timeout 4
} # TCP_CHECK
# SMTP 方式这个可以用来给邮件服务器做集群
SMTP_CHECK
host {
connect_ip
connect_port # 默认检查25 端口
14 KEEPALIVED
bindto
}
connect_timeout
retry
delay_before_retry
# "smtp HELO"|·-ê§à"
helo_name |
} #SMTP_CHECK
#MISC 方式这个可以用来检查很多服务器只需要自己会些脚本即可
MISC_CHECK
{
misc_path | # 外部程序或脚本
misc_timeout # 脚本或程序执行超时时间
misc_dynamic
# 这个就很好用了可以非常精确的来调整权重是后端每天服务器的压力都能均衡调配这个主要是通过执行的程序或脚本返回的状态代码来动态调整weight 值使权重根据真实的后端压力来适当调整不过这需要有过硬的脚本功夫才行哦
# 返回0 健康检查没问题不修改权重
# 返回1 健康检查失败权重设置为0
# 返回2-255 健康检查没问题但是权重却要根据返回代码修改为返回码-2 例如如果程序或脚本执行后返回的代码为200 # 那么权重这回被修改为 200-2
}
} # Realserver
} # Virtual Server
五、 keepalived通知脚本进阶示例
下面的脚本可以接受选项其中
-s, --service SERVICE,...指定服务脚本名称当状态切换时可自动启动、重启或关闭此服务
-a, --address VIP: 指定相关虚拟路由器的VIP地址
-m, --mode {mm|mb}指定虚拟路由的模型mm表示主主mb表示主备它们表示相对于同一种服务而方其VIP的工作类型
-n, --notify {master|backup|fault}指定通知的类型即vrrp角色切换的目标角色
-h, --help获取脚本的使用帮助
#!/bin/bash
# Author: MageEdu
# description: An example of notify script
# Usage: notify.sh -m|--mode {mm|mb} -s|--service SERVICE1,... -a|--address VIP -n|--notify {master|backup|falut} -h|--help
#contact='linuxedu@foxmail.com'
helpflag=0
serviceflag=0
modeflag=0
addressflag=0
notifyflag=0
contact='root@localhost'
Usage() {
echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] "
echo "Usage: notify.sh -h|--help"
}
ParseOptions() {
local I=1;
if [ $# -gt 0 ]; then
while [ $I -le $# ]; do
case $1 in
-s|--service)
[ $# -lt 2 ] && return 3
serviceflag=1
services=(`echo $2|awk -F"," '{for(i=1;i
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com