Keepalived安装与配置

本文详细介绍了Keepalived的安装步骤、配置文件解析及常见问题处理,包括负载均衡和高可用性的实现,适用于初学者和进阶用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

keepalived安装配置

**
有关keepalived安装和配置相关博文很多,我找了两篇介绍的都特别详细,只是版本不一样,原文地址如下:
https://blog.youkuaiyun.com/xyang81/article/details/52554398
https://my.oschina.net/u/2347651/blog/3011012

一、简介
Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。
在这里插入图片描述
上图是Keepalived的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。
内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和NETLINK(提供高级路由及其他相关的网络功能)两个部份。
用户空间:

WatchDog:负载监控checkers和VRRP进程的状况
VRRP Stack:负载负载均衡器之间的失败切换FailOver,如果只用一个负载均稀器,则VRRP不是必须的。
Checkers:负责真实服务器的健康检查healthchecking,是keepalived最主要的功能。换言之,可以没有VRRP Stack,但健康检查healthchecking是一定要有的。
IPVS wrapper:用户发送设定的规则到内核ipvs代码
Netlink Reflector:用来设定vrrp的vip地址等。
Keepalived的所有功能是配置keepalived.conf文件来实现的。

二、安装与配置
从官网下载keepalived的最新版本,本文以版本2.0.18为例。
Keepalived下载地址

shell> cd /opt/local/
shell> wget http://www.keepalived.org/software/keepalived-2.0.18.tar.gz
shell> tar -zxvf keepalived-2.0.18.tar.gz
shell> cd keepalived-2.0.18
shell> ./configure --prefix=/opt/local/keepalived
shell> make && make install

2.2 配置
安装完成后,进入安装目录的etc目录下,将keepalived相应的配置文件拷贝到系统相应的目录当中。keepalived启动时会从/etc/keepalived目录下查找keepalived.conf配置文件,如果没有找到则使用默认的配置。/etc/keepalived目录安装时默认是没有安装的,需要手动创建。配置文件目录结构如下所示:

shell> tree -l /opt/local/keepalived/etc
├── init
│   └── keepalived.conf
├── keepalived
│   ├── keepalived.conf
│   └── samples
│       ├── client.pem
│       ├── dh1024.pem
│       ├── keepalived.conf.conditional_conf
│       ├── ........
└── sysconfig
    └── keepalived

分别对应系统目录(忽略samples目录):
/etc/keepalived/keepalived.conf
/etc/rc.d/init.d/keepalived
/etc/sysconfig/keepalived
因为keepalived的默认配置文件位置是: /etc/keepalived/keepalived.conf,所以需要将实际的文件文职软连接到这里,当然也可以在/opt/local/etc/syscofig/keepalived里面配置增加选项: -f 配置文件路径,这样的形式来更改配置文件路径。本文是以建立软连接的方式

sudo ln -s /opt/local/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

或者通过拷贝

shell> mkdir /etc/keepalived
shell> cp /opt/local/keepalived/etc/keepalived.conf /etc/keepalived/keepalived.conf
shell> cp /opt/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
shell> cp /opt/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

这样就算是安装完成了。

开启对应网卡的防火墙的vrrp支持
sudo firewall-cmd --reload
当然,测试机器关闭防火墙也就一劳永逸了,记得要同时关闭selinux。selinux的保护机制导致跟踪脚本不能执行某些操作(例如:重启某项服务等),解决方法是修改对应脚本的安全上下文类型,详细看下面的配置说明(2.0.0版本不需要修改安全上下文类型了)。

启动

Centos 7

shell> systemctl start keepalived.service
或者

Centos 6

shell> service keepalived start
shell> service keepalived stop #停止服务
shell> service keepalived restart #重启服务

另外需要注意的一点是,keepalived启动时不会检查配置文件的语法是否正确,所以我们在编写配置文件时要特别小心,别写错了,否则会出现一些意想不到的现象。

使用service keepalived start命令启动服务时,默认会将/etc/sysconfig/keepalived文件中KEEPALIVED_OPTIONS参数作为keepalived服务启动时的参数,并从/etc/keepalived/目录下加载keepalived.conf配置文件,或用-f参数指定配置文件的位置。

# 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.日志默认输出在/var/log/message文件中
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D"

运行keepalived --help可以查看启动时的可选参数,这些可选参数都可以配置在/etc/sysconfig/keepalived文件中的KEEPALIVED_OPTIONS选项中,作为服务启动时的参数。

keepalived正常运行后,会启动3个进程,其中一个是父进程,负责监控其子进程。一个是vrrp子进程,另外一个是checkers子进程。

shell> ps -ef | grep keepalived
root       831     1  0 11:22 ?        00:00:00 keepalived -D
root       840   831  0 11:22 ?        00:00:00 keepalived -D
root       841   831  0 11:22 ?        00:00:00 keepalived -D

三、keepalived.conf配置文件说明
keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三块:全局定义块、VRRP实例定义块和虚拟服务器定义块。全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是一个功能比较完整的配置文件模板:

#主节点
! Configuration File for keepalived

global_defs {
   notification_email {
     aaaa@xxxx.com
   }
   notification_email_from bem@aipark.com
   smtp_server smtp.qiye.163.com
   smtp_connect_timeout 30
   router_id NodeA
}
#vrrp script示例,必须声明在vrrp_instance节点前:
vrrp_script check_haproxy {
   script "/etc/keepalived/scripts/check-nginx.sh"
   interval 3	#每隔3秒坚持一次
}

vrrp_instance http4dfs {
    state MASTER #设置为从服务器
    interface eth0	#监测网络接口
    dont_track_primary
    nopreempt
    virtual_router_id 51 #主、备必须一样
    priority 100	#(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
    advert_int 1	 #VRRP Multicast广播周期秒数
    authentication {
        auth_type PASS	 #VRRP认证方式,主备必须一致
        auth_pass 1111	 #(密码)
    }
    virtual_ipaddress {
        10.110.60.166		#VRRP HA虚拟地址
    }
    track_script {
	check_haproxy
    }
}
#备节点
! Configuration File for keepalived

global_defs {
   notification_email {
     aaaa@xxxx.com
   }
   notification_email_from bem@aipark.com
   smtp_server smtp.qiye.163.com
   smtp_connect_timeout 30
   router_id NodeB
}
#vrrp script示例,必须声明在vrrp_instance节点前:
vrrp_script check_haproxy {
   script "/etc/keepalived/scripts/check-nginx.sh"
   interval 3	#每隔3秒坚持一次
}

vrrp_instance http4dfs {
    state BACKUP	#设置为从服务器
    interface eth0	#监测网络接口
    dont_track_primary
    nopreempt
    virtual_router_id 51 #主、备必须一样
    priority 80	#(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
    advert_int 1	 #VRRP Multicast广播周期秒数
    authentication {
        auth_type PASS	 #VRRP认证方式,主备必须一致
        auth_pass 1111	 #(密码)
    }
    virtual_ipaddress {
        10.110.60.166		#VRRP HA虚拟地址
    }
    track_script {
	check_haproxy
    }
}

简单检查nginx进程是否存在,实际上nginx进程正常运行并不代表服务就是正常的,应该同时检查后端服务时候正常,check_nginx.sh:

#!/bin/bash
count=$(ps -C nginx --no-heading | wc -l)
if [ "$count" = "0" ]; then
   # systemctl start nginx.service
    echo `/opt/local/nginx/sbin/nginx`
    sleep 2
    count=$(ps -C nginx --no-heading | wc -l)
    exit 1
else
    exit 0
fi  

global_defs项

notification_email : keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
router_id : 机器标识,通常可设为hostname。故障发生时,邮件通知会用到。

vrrp_instance项

state : 只能为两个值之一:MASTER或BACKUP(必须大写)。指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER。
interface : 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的。
mcast_src_ip : 发送多播数据包时的源IP地址(默认是224.0.0.28,使用默认的就可以了)。这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址。
virtual_router_id :0~255, 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址。
priority : 1~254,数字越大优先级越高。设置本节点的优先级,优先级高的为master
advert_int : 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常。
authentication : 定义认证方式和密码,主从必须一样。
virtual_ipaddress : 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址。
track_script : 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
uncast_src_ip : 单播地址,即本机ip。
uncast_peer : 接收单播地址(BACKUP ip),配置在{}里面,可以多个。

vrrp_script

告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script。

script : 自己写的检测脚本。也可以是一行命令如killall -0 nginx。
interval 2 : 每2s检测一次。
weight -5 : 检测失败(脚本返回非0)则优先级 -5。
fall 2 : 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)。
rise 1 : 检测 1 次成功就算成功。但不修改优先级。

这里要说明一下script一般有2种写法:

通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定。
脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP。
上文 vrrp_script 配置部分,killall -0 nginx属于第1种情况,/etc/keepalived/check_nginx.sh属于第2种情况(脚本中关闭keepalived)。个人更倾向于通过shell脚本判断,但有异常时exit 1,正常退出exit 0,然后keepalived根据动态调整的 vrrp_instance 优先级选举决定是否抢占VIP:

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少。
其他情况,原本配置的优先级不变,即配置文件中priority对应的值。

提示:

优先级不会不断的提高或者降低。
可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)。
不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况。
在MASTER节点的 vrrp_instance 中 配置 nopreempt ,当它异常恢复后,即使它 priority 更高也不会抢占,这样可以避免正常情况下做无谓的切换。
以上可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。
对于keepalived出现脑裂问题请查询keepalived脑裂章节

如果需要再虚拟一个其他网卡的vip,可以复制多一份vrrp_instance进行修改。

修改完后,复制或者同步修改好的配置文件到备机,记得修改备机的state为BACKUP和优先级prority, 优先级必须比主机的优先级低。

如果在不关闭主机keepalived进程的情况下,想要使某台备机提升为主机,可以修改优先级大于当前主机优先级50,重启备机keepalived即可。官方文档:

#for electing MASTER, highest priority wins. #to be MASTER, make this 50 more than on other machines. priority 100

[x] 开启相应访问端口
如果防火墙使用firewalld管理:

firewall-cmd --zone=public --add-port=80/tcp --permanent
开启80端口

[x] 开启vrrp协议支持
全部部署了keepalived的主机都需要开启vrrp支持。

如果遇到主备切换很慢而且主备都存在的情况下,请求却一直路由到备机,这种情况一般是防火墙没有开启vrrp的支持。需要按如下方法处理:
如果防火墙使用firewall-cmd进行管理(Centos 7):

添加规则

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

重启防火墙

firewall-cmd --reload
enp0s3对应网卡名称, 224.0.0.18是keepalived的组播地址。

如果防火墙使用iptables进行管理(Centos 6):
vim /etc/sysconfig/iptables

添加配置

-A INPUT -i 网卡名称 -p vrrp -s 主/备IP -j ACCEPT
如果禁用了组播,可以使用单播

master

uncast_src_ip 10.0.0.1
uncast_peer {
10.0.0.2
}

backup

uncast_src_ip 10.0.0.2
uncast_peer {
10.0.0.1
}
[ ] 修改日志路径
keepalived的默认日志路径是: /var/log/message

以下以日志路径/var/log/keepalived.log为例:

keepalived --help 可以查看支持的配置

修改/etc/sysconfig/keepalived:
修改前: KEEPALIVED_OPTIONS="-D", 修改后: KEEPALIVED_OPTIONS="-D -d -S 0"

修改/etc/rsyslog.conf:
上面的0表示的是系统级别的日志存放路径local0.*, 在/etc/rsyslog.conf里面最后面增加:

local0.* /var/log/keepalived.log
重启相应服务: 修完上述两部分后,先重启系统日志服务:
sudo systemctl restart rsyslog.service
再重启keepalived服务:

sudo systemctl restart keepalived.service
如果上述必需配置都已经配置好了,还 是不能访问,那就是配置有问题了,请检查各个配置是否有拼写错误等原因。

问题和异常处理
查看日志发现健康检查一直提示子进程死亡,重启:
日志: Healthcheck child process(14203) died: Respawning

解决方法: 删除多无或无效的vrrp_server节点。 vrrp_server是用于lvs的负载均衡的,如无用可以删掉。 参考这里

执行跟踪脚本报错,提示:
/…/…/检查脚本.sh exited due to signal 15

解决方法: 脚本里的休眠时间要小于vrrp_script里面设置的执行间隔interval;

使用跟踪脚本检查并尝试重启nginx(或其他服务),不能重启,但是单独跑脚本却能重启:
原因:selinux的保护机制。

解决方法: 1.关闭selinux。临时关闭: setenfource 0; 永久关闭: 修改/etc/selinux/config里的SELINUX属性,enfourcing为强制开启,permissive为宽容,disabled为关闭,设置为后两个之一就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值