安装Keepalived
约 4309 字大约 14 分钟
yum安装
1、安装依赖包
[root@localhost ~]# yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
[root@localhost ~]# yum install -y keepalived
2、初始化及启动
[root@localhost ~]# systemctl start keepalived //启动keepalived
[root@localhost ~]# systemctl enable keepalived //加入开机启动keepalived
[root@localhost ~]# systemctl restart keepalived //重新启动keepalived
[root@localhost ~]# systemctl status keepalived //查看keepalived状态
编译安装
1、官网下载keepalived,解压并安装
注意这里不要下载最新版本,可能编译失败(亲身体验)
[root@master src]# yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
[root@master src]# wget http://www.keepalived.org/software/keepalived-2.1.5.tar.gz
[root@master src]# tar -zxvf keepalived-2.1.5.tar.gz -C /usr/local
[root@master src]# cd /usr/local/keepalived-2.1.5
[root@master keepalived-2.1.5]# ./configure --prefix=/usr/local/keepalived --sysconf=/etc --disable-dependency-tracking
[root@master keepalived-2.1.5]# make && make install
完成后会生成两个目录:
- /usr/local/keepalived/
- /etc/keepalived/
2、初始化及启动
# 将keepalived主程序加入到环境变量(安装目录下)
[root@localhost /]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
# keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用service命令便捷调用
[root@localhost /]# cp /usr/local/keepalived-2.1.5/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
# 增加系统服务
[root@localhost keepalived]# chkconfig --add keepalived
# 开机自启
[root@localhost keepalived]# chkconfig keepalived on
# 启动停止状态
[root@localhost keepalived]# service keepalived start
[root@localhost keepalived]# service keepalived stop
[root@localhost keepalived]# service keepalived status
[root@localhost keepalived]# service keepalived restart
keepalived.conf
keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三块:全局定义块、VRRP实例定义块和虚拟服务器定义块。全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是一个功能比较完整的配置文件模板:
配置说明
配置文件可以分为三块:
全局定义块: 对整个 Keepalive 配置生效的,不管是否使用 LVS;
**VRRP实际定义块:**是keepalived的核心;
全局定义块
- email通知(notification_email、smtp_server、smtp_connect_timeout): 用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。
- lvs_id: lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。
- router_id: 用户标识本节点的名称,通常为hostname
- 花括号{}: 用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。
VRRP实际定义块
vrrp_sync_group G1 {
group {
VI_1
VI_2
VI_5
}
notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
notify_backup "/usr/local/bin/vrrp.bak arg1 arg2"
notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
notify_stop "/usr/local/bin/vrrp.stop arg1 arg2"
}
vrrp_sync_group G2 {
group {
VI_3
VI_4
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
mcast_src_ip
garp_master_delay 10
track_interface {
eth0
eth1
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
192.168.200.17 dev eth1
192.168.200.18 dev eth2
}
virtual_routers {
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2
192.168.112.0/24 via 192.168.100.254
192.168.113.0/24 via 192.168.100.252 or 192.168.100.253
}
nopreempt
preemtp_delay 300
}
说明:
- vrrp_sync_group: 同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
- notify_master:指定当keepalived进入MASTER状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本,允许传入参数;
- notify_backup:指定当keepalived进入BACKUP状态时要执行的脚本;
- notify_fault:指定当keepalived进入FAULT状态时要执行的脚本;
- notify_stop:指定当keepalived程序终止时需要执行的脚本;
- group: 至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
- vrrp_instance: vrrp实例名
- state: 实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。
- interface: 对外提供服务的网卡接口,即VIP绑定的网卡接口。如: eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。
- priority: 节点优先级,取值范围0~254,MASTER要比BACKUP高
- smtp_alert: 有故障时是否激活邮件通知
- advert_int: MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
- mcast_src_ip: 本机IP地址
- authentication: 验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp 实例MASTER与BACKUP使用相同的密码才能正常通信。
- garp_master_delay: 用于设置在切换到MASTER状态后延时进行Gratuitous arp请求的时间;
- track_interface: 用于设置一些额外的网络监控接口,其中任何一个接口出现故障,keepalived都会进入FAULT状态;
- virtual_router_id: 虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。
- virtual_ipaddress: 用于设置虚拟IP地址(VIP),可设置多个,每行一个;keepalived通过ip address add命令的形式将VIP添加进系统中,而且IP形式可多样;
- virtual_routers: 和virtual_ipaddress段一样,用来设置在切换时添加或删除相关路由信息;
- nopreempt: 禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
- preemtp_delay: 用于设置抢占的延时时间,单位秒,如系统启动或重启之后网络需要经过一段时间才能正常工作,这时进行主备切换是没有必要的,此选项就是来设置这种情况发生的时间间隔;
- lvs_sync_daemon_inteface: 负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口
虚拟服务器块
virtual_server 192.168.12.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
persistence_granularity
protocol TCP
ha_suspend
virtualhost
sorry_server
real_server 192.168.12.132 80 {
weight 3
inhibit_on_failure
notify_up |
notify_down |
#TCP_CHECK检测方式示例:
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
#HTTP_GET和SSL_GET检测方式示例:
HTTP_GET | SSL_GET {
url {
path /index.html
digest e6c271eb5f017f280cf97ec2f51b02d3
status_code 200
}
connect_port 80
bindto 192.168.12.80
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}
说明:
- virtual_server: 定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。
- delay_loop: 健康检查时间间隔,单位: 秒
- lb_algo: 负载均衡调度算法,互联网应用常用方式为wlc或rr
- lb_kind: 负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
- protocol: 转发协议,分为TCP和UDP两种
- persistence_timeout: http服务会话保持时间,单位: 秒
- persistence_granularity: 配合persistence_timeout使用,后面跟的值是子网掩码,表示持续连接的粒度,默认是255.255.255.255即一个单独的客户端IP,如果改为255.255.255.0那么客户端所在的整个网段的请求都会分发到同一台realserver上;
- real_server
- real_server: 真实服务器IP和端口,可以定义多个
- weight: 负载权重,值越大,转发的优先级越高
- notify_up: 和notify_master相同,后跟一个脚本,表示在检测到real server节点服务处于UP状态后只执行的脚本;
- notify_down: 表示在检测到real server节点服务处于DOWN状态后只执行的脚本
- inhibit_on_failure: 表示在检测到real server节点失效后,把他的weight值置为0,而不是从IPVS中删除;
- TCP_CHECK
- TCP_CHECK: 服务有效性检测,常见的有HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK
- connect_port: 服务连接端口
- connect_timeout: 服务连接超时时长,单位: 秒
- nb_get_retry: 服务连接失败重试次数
- delay_before_retry: 重试连接间隔,单位: 秒
- url: 用来指定HTTP/SSL检查的URL信息,可指定多个URL;
- path: 后跟详细的URL路径;
- digest: SSL检查后的摘要信息,可通过genhash命令获取,如genhash -s 192.168.12.80 -p 80 -u /index.html
- status_code: 指定HTTP检查返回正常状态吗的类型,一般为200;
- bindto: 表示通过此地址来发送请求对服务器进行健康检查;
配置示例
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #全局配置
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
acassen@firewall.loc #指定收件人邮箱
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
smtp_server 192.168.200.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#如果这块没有,就不用管他
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
inside_network #实例名
outside_network
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
vrrp_instance inside_network {
state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
interface eth0 #设置实例绑定的网卡
dont_track_primary #忽略vrrp的interface错误(默认不设置)
track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换
eth0
eth1
}
mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求
virtual_router_id 50 #VPID标记
priority 99 #优先级,高优先级竞选为master
advert_int 1 #检查间隔,默认1秒
nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
preempt_delay #抢占延时,默认5分钟
debug #debug级别
authentication { #设置认证
auth_type PASS #认证方式,类型主要有PASS、AH 两种
auth_pass 111111 #认证密码
}
virtual_ipaddress { #设置vip
192.168.36.200
}
}
vrrp_instance VI_1 { #虚拟路由的标识符
state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
interface eth0 #通信所使用的网络接口
lvs_sync_daemon_inteface eth0 #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
virtual_router_id 51 #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
priority 100 #此节点的优先级,主节点的优先级需要比其他节点高
advert_int 1 #通告的间隔时间
nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
preempt_delay #抢占延时,默认5分钟
authentication { #认证配置
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口
delay_loop 6 #健康检查间隔,单位为秒
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
nat_mask 255.255.255.0 #VIP掩码
lb_kind NAT #负载均衡转发规则。一般包括DR,NAT,TUN 3种
persistence_timeout 50 #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了
protocol TCP #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP
persistence_granularity <NETMASK> #lvs会话保持粒度
real_server 192.168.201.100 443 { #真实服务器,包括IP和端口号
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up <string> | <quoted-string> #在检测到server up后执行脚本
notify_down <string> | <quoted-string> #在检测到server down后执行脚本
TCP_CHECK { #通过tcpcheck判断RealServer的健康状态
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 23 健康检查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET { #健康检测方式,可选有 SSL_GET、TCP_CHECK、HTTP_GET
url { #检查url,可以指定多个
path / #检查的url路径
digest ff20ad2481f97b1754ef3e12ecd3a9cc #需要检查到的内容。检查后的摘要信息。
status_code 200 #检查的返回状态码
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #连接超时时间
nb_get_retry 3 #检测尝试几次
delay_before_retry 3 #检测的时间间隔
}
}
}
Nginx+Keepalived
Master配置
! Configuration File for keepalived
global_defs {
enable_script_security
router_id LVS_DEVEL1 #运行 keepalived 服务器的标识,在一个网络内应该是唯一的
}
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive.sh"
interval 2 # 每隔两秒运行上一行脚本
weight 10 # 如果脚本运行成功,则升级权重+10
}
vrrp_instance VI_11 { #vrrp 实例定义部分
state MASTER #设置 lvs 的状态,MASTER 和 BACKUP 两种,必须大写
interface enp0s8 #设置对外服务的接口
virtual_router_id 51 #设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示
priority 100 #定义优先级,数字越大优先级越高,在一个 vrrp——instance 下,master 的优先级必须大于 backup
advert_int 1 #设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS
auth_pass 1111 #验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
}
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
virtual_ipaddress { #设置虚拟 ip 地址,可以设置多个,每行一个
192.168.11.100
}
}
virtual_server 192.168.11.100 80 { #设置虚拟服务器,需要指定虚拟 ip 和服务端口
delay_loop 6 #健康检查时间间隔
lb_algo rr #负载均衡调度算法
lb_kind NAT #负载均衡转发规则
persistence_timeout 50 #设置会话保持时间
protocol TCP #指定转发协议类型,有 TCP 和 UDP 两种
real_server cdh1 80 { #配置服务器节点 1,需要指定 real server 的真实 IP 地址和端口
weight 1 #设置权重,数字越大权重越高
TCP_CHECK { #realserver 的状态监测设置部分单位秒
connect_timeout 3 #超时时间
connect_port 80 #监测端口
delay_before_retry 3 #重试间隔
}
}
}
Backup配置
! Configuration File for keepalived
global_defs {
192.168.11.100
router_id LVS_DEVEL2
}
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive.sh"
interval 2 # 每隔两秒运行上一行脚本
weight 10 # 如果脚本运行成功,则升级权重+10
}
vrrp_instance VI_21 {
state BACKUP
interface enp0s8
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
virtual_ipaddress {
192.168.68.100
}
}
virtual_server 192.168.68.100 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server cdh2 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
connect_port 80
delay_before_retry 3
}
}
}
自动切换
在 master 和 backup 节点的 /etc/keepalived/check_nginx_alive.sh 目录下设置脚本
#!/bin/bash
# –no-headers 不打印头文件
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
# service keepalived stop
killall keepalived
fi
fi
LVS+Keepalived
Master配置
global_defs {
# notification_email {
# 499812002@qq.com
# }
# notification_email_from zhangxm_qz@163.com
# smtp_server smtp.163.com
# smtp_connect_timeout 30
router_id LVS_DEVEL16 #唯一标识
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #主节点
interface ens33
virtual_router_id 51
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.47.100/24
}
}
virtual_server 192.168.47.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.47.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.47.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
virtual_server 192.168.47.100 443 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.47.11 443 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.47.12 443 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
Backup配置
global_defs {
notification_email {
499812002@qq.com
}
notification_email_from zhangxm_qz@163.com
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id LVS_DEVEL17 #唯一id
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP #备机
interface ens33
virtual_router_id 51 #必须保持和主一致
priority 90 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.47.100
}
}
virtual_server 192.168.47.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.47.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.47.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
virtual_server 192.168.47.100 443 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.47.11 443 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.47.12 443 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
参考:
- keepalived介绍、安装及配置详解_catch that elf的博客-CSDN博客
- Linux下Keepalived安装与配置_中标麒麟安装keepalived_菲宇的博客-CSDN博客
- Keepalived的详细配置与使用_keepalived配置_Su丶因陀罗的博客-CSDN博客
- 基于keepalived 的nginx高可用方案_catch that elf的博客-CSDN博客
- 基于KeepAlivedLVS高可用实战_catch that elf的博客-CSDN博客
- Keepalived 解决使用systemctl 无法关闭_systemctl keepalived_Drifting Kern的博客-CSDN博客