有志不在年高,无志空长百岁。
导航
- 1 工具先容
- 2 协议先容
- 3 设置布局
- 4 应用场景
- 4.1 VIP 漂移
- 4.2 VIP 绑定
- 4.3 康健查抄
- 4.4 切换关照
- 4.5 负载均衡
- 5 杂七杂八
1、工具先容
Keepalived 是一个运行在 Linux 上的 高可用(HA) 与 负载均衡辅助 服务,最初紧张是为 Linux Virtual Server(LVS)操持的,但现在也常被用来搭建服务的高可用,以防止业务焦点装备出现单点故障。固然说它也 间接具备负载均衡 的本领,但在设置和使用上,个人以为它比 HAProxy 更为复杂欠好用。故本文的重点只关注其高可用的本领,不对其负载均衡的本领做过多探究。
注:为什么上面说 Keepalived 是间接具备负载均衡的本领呢?是由于 Keepalived 与 LVS 是高度集成的组合,LVS 才是现实具备负载均衡本领的服务,而 Keepalived 仅是支持设置负载均衡的规则,然后调用 LVS 实现。详细过程如下:
- 你编写设置:在 /etc/keepalived/keepalived.conf 中写好 virtual_server 相干的全部规则(IP、端口、算法、后端服务器列表等)。
- Keepalived 启动:Keepalived 服务启动后,会读取自己的设置文件。
- 主动调用 IPVS:Keepalived 内部包罗了使用 LVS 的代码。它会直接调用 Linux 内核的 IPVS 接口,把你设置文件里的规则,主动转换成 ipvsadm 下令才华创建的规则。
- 验证效果:你可以随时运行 ipvsadm -L -n 来查察。你会看到,只要 Keepalived 在运行,这里就已经有规则了,而你完全没有动过 ipvsadm 下令。
Keepalived 可以与 HAProxy/LVS/Nginx 组合以实现业务的 高可用+负载均衡 的功能,以下是关于 Keepalived + HAProxy 组合的架构图:
2、协议先容
Keepalived 底层紧张依靠 VRRP 协议(Virtual Router Redundancy Protocol 捏造路由冗余协议),而协议的紧张作用就是在多个节点之间推选出一个 MASTER 脚色,等协议推选出 MASTER 之后,再由 Keepalived 到 MASTER 所处的服务器上去实现 VIP(捏造 IP) 的功能(就是在指定的物理网卡上再制作出一个捏造的网络适配器)。
注:VIP 即捏造 IP,就是一个未分配给真实主机的 IP,也就是说对外提供服务的主机除了有一个真实 IP 外另有一个虚 IP,使用这两个 IP 中的恣意一个都可以毗连到这台主机。
注意:这个 VIP 一样平常都是取的和服务器 IP 同网段的地点,如许它捏造出来之后,客户端在原有底子稳定动的环境下便可直接访问;而如果使用别的网段的 IP,客户端要想访问到这个捏造 IP,网络管理员还必要对路由器交换机这些网络装备举行路由调解,待调解之后客户端才华够顺遂访问。
VRRP 协议推选 MASTER 的工作过程:
- 全部服务器在开启 VRRP 功能后,都会根据优先级确定自己在服务器池中的脚色。优先级高的服务器成为 Master,优先级低的成为 Backup。【全部成员都在举行推选】
- 成为 Master 的服务器会定期发送 VRRP 告示报文(即心跳/广播包), 关照服务器池内的其他服务器自己工作正常;而成为 Backup 的服务器则会启动定时器等候告示报文的到来。同时 MASTER 也会通过 ARP 协议对外(VIP 地点网段之内的全部呆板)告示该 VIP 的捏造 IP 以及 MAC 地点,以让客户端可以或许及时相识当前 VIP 对应的 MAC 地点(实在就是让客户端知道 VIP 当前地点的详细服务器是哪个)。
- 如果 Backup 们的定时器在超时之后仍未收到 Master 发送来的 VRRP 告示报文,此时 Backup 们便会以为 Master 已经无法正常工作,于是 Backup 们就会以为自己才是 Master,并纷纷对外发送 VRRP 告示报文。于是新一轮的推选便再次睁开,此时 Backup 们就又会根据优先级再次推选出 Master,让其负担报文的转发功能。【除了故障呆板之外的剩余成员都在举行推选】
- 【在默认的抢占模式下】如果不久之后,原来故障的 MASER 又规复了正常,此时它便会将自己的优先级数值与当前 MASTER 告示报文中的优先级数值举行比力,如果自己大,则直接劫掠 MASTER,并规复自己原来的转发功能。【仅规复呆板与当前 MASTER 成员在举行推选】
- 【在非抢占模式下】如果不久之后,原来故障的 MASER 又规复了正常,此时即便它的优先级大于当前 MASTER 的优先级,它也不会去劫掠 MASTER,而是等当前的 MASTER 故障之后它才会在下一轮的推选中举行 MASTER 的劫掠。
注:(1)VRRP 协议的实现有 VRRPv2 和 VRRPv3 两个版本。此中,VRRPv2 基于 IPv4,VRRPv3 基于 IPv6。 VRRPv2 和 VRRPv3 在功能实现上并没有区别,仅仅只是应用的网络环境差别而已。(2)Keepalived 允许服务器池中只有个别呆板开启了非抢占模式,而别的呆板仍旧是抢占模式如许的用法。但发起均保持同等。
3、设置布局
Keepalived 默认的设置文件是 /etc/keepalived/keepalived.conf,它团体的语法布局如下:- # 全局参数
- global_defs {
- # 定义 router_id、邮箱通知等参数
- }
- # VIP 绑定组
- vrrp_sync_group VG1 {
- group {
- # 配置 VIP 漂移实例名称
- }
- }
- # 健康检查脚本
- vrrp_script chk_mt {
- # 定义检查脚本的位置、定时间隔、权重变化值等参数
- }
- # VIP 漂移实例1
- vrrp_instance VI_1 {
- # 定义状态、优先级、接口等参数
- track_script {
- chk_mt
- }
- virtual_ipaddress {
- # 指定 VIP 的 IP 地址
- }
- }
- # VIP 漂移实例2
- vrrp_instance VI_2 {
- # 定义状态、优先级、接口等参数
- virtual_ipaddress {
- # 指定 VIP 的 IP 地址
- }
- }
- # LVS 负载均衡
- virtual_server 192.168.200.12 443 {
- # 定义负载均衡的模式、算法、协议等参数
- real_server 192.168.100.2 443 {
- # 指定后台实际提供服务的地址
- }
- real_server 192.168.100.3 443 {
- # 指定后台实际提供服务的地址
- }
- }
复制代码注:以上功能块都不是必须要出现的,比方我们只使用 keepalived 的高可勤奋能,那么只必要 vrrp_instance 块存在即可,别的块无关紧要。
4、应用场景
以下实行的环境状态如下:
- 实行环境统共两台服务器 A 和 B(均未开启 SELinux、iptables 安全设置 )
- A 网卡 ens33,IP 地点 192.168.98.120
- B 网卡 ens33,IP 地点 192.168.98.130
- 界说的 VIP 地点 192.168.98.200、192.168.98.250。
4.1、VIP 漂移
实行目标:聚合两台服务器形成一个捏造 ip,使得只要服务器池中另有一台呆板存活,那么这个捏造 ip 便仍旧可以正常访问。- # 服务器 A 的 keepalived 配置
- #global_defs {
- # router_id test-name # 本机名称,可随便自定义
- # vrrp_strict # 对 VRRP 配置进行严格校验。建议关闭,否则可能会出现一些奇怪的问题。
- # enable_script_security # 开启脚本执行环境的安全模式,此时脚本相关的文件权限、内容规范、所属人都会被严格检查,检查通过脚本才会被执行。所以,一般还是把它关闭掉,否则疑点会很多。
- # script_user root # 指定执行脚本的用户,不指定的话,默认是 keepalived_script 用户,而该用户默认不存在,还需要手动去创建。
- #}
- vrrp_instance VI_1 {
- state MASTER # 设置起始状态为 MASTER 角色,但片刻之后,这个角色能否保持还是取决于 priority。
- interface ens33 # 指定 VIP 绑定的网卡接口
- virtual_router_id 50 # 类似群组的功能,要求同一个服务器池的机器的此值都保持一致,否则会出现脑裂现象,即同时出现多个 MASTER 角色。
- priority 150 # 指定优先级,值越大优先级越高。取值范围:0~255
- advert_int 1 # 心跳发包间隔时间,1秒
- # nopreempt # 开启非抢占模式
- virtual_ipaddress {
- 192.168.98.200 # 定义虚拟 IP
- }
- }
复制代码- # 服务器 B 的 keepalived 配置
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 50
- priority 100
- advert_int 1
- virtual_ipaddress {
- 192.168.98.200
- }
- }
复制代码注:(1)如果 AB 服务器只有一方开启了非抢占模式,那么仅为服务器 A 开启非抢占模式的推选,仅对 A 有效,B 若没有开启此功能的话,B 是会举行抢占的。(2)router_id 是“节点名字”可恣意指定,virtual_router_id 是“VRRP 组编号”,服务器池中的全部主机必须保持同等。
4.2、VIP 绑定
实行目标:让多个捏造 ip 捆绑在一台服务器上,而不是让他们各自推选随机分布在差别的服务器上。- # 服务器 A 的 keepalived 配置
- global_defs {
- router_id LVS_MASTER
- }
- ############################
- # 第一个 VRRP 实例
- ############################
- vrrp_instance VI_WEB {
- state MASTER
- interface ens33
- virtual_router_id 51 # 关注点
- priority 150 # 关注点
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.98.200/24 # 关注点
- }
- }
- ############################
- # 第二个 VRRP 实例
- ############################
- vrrp_instance VI_DB {
- state MASTER
- interface ens33
- virtual_router_id 52 # 关注点
- priority 50 # 关注点
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.98.250/24 # 关注点
- }
- }
- ############################
- # 同步组
- ############################
- vrrp_sync_group VG_1 {
- group {
- VI_WEB
- VI_DB
- }
- }
复制代码- # 服务器 B 的 keepalived 配置
- global_defs {
- router_id LVS_MASTER
- }
- ############################
- # 第一个 VRRP 实例
- ############################
- vrrp_instance VI_WEB {
- state BACKUP
- interface ens33
- virtual_router_id 51 # 关注点
- priority 100 # 关注点
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.98.200/24 # 关注点
- }
- }
- ############################
- # 第二个 VRRP 实例
- ############################
- vrrp_instance VI_DB {
- state BACKUP
- interface ens33
- virtual_router_id 52 # 关注点
- priority 100 # 关注点
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.98.250/24 # 关注点
- }
- }
- ############################
- # 同步组
- ############################
- vrrp_sync_group VG_1 {
- group {
- VI_WEB
- VI_DB
- }
- }
复制代码注:服务器 A 的 VI_WEB 的优先级大于 服务器 B 的 VI_WEB,A 的 VI_DB 的优先级又小于 B 的 VI_DB,在不绑定 VIP 组的环境下,A 服务器上存在一个 VIP,B 服务器存在一个 VIP;当绑定 VIP 组之后,这两个 VIP 要么都在 A 服务器上,要么都在 B 服务器上,此时优先级好像没有什么作用了, VIP 在哪个服务器上完全取决于服务启动的先后序次了。
4.3、康健查抄
实行目标:让服务器的优先级可以随着外部环境的一些可变因素而发生变革,而不是一成稳定大概只能在 keepalived 服务挂掉或服务器宕机的环境下,优先级才会改变,陪伴着 MASTER 脚色才华发生改变。- # 服务器 A 的 keepalived 配置
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 50
- priority 150
- advert_int 1
- virtual_ipaddress {
- 192.168.98.200
- }
- }
复制代码- # 服务器 B 的 keepalived 配置
- #global_defs {
- # vrrp_strict # 对 VRRP 配置进行严格校验。建议关闭,否则可能会出现一些奇怪的问题。
- # enable_script_security # 开启脚本执行环境的安全模式,此时脚本相关的文件权限、内容规范、所属人都会被严格检查,检查通过脚本才会被执行。所以,一般还是把它关闭掉,否则疑点会很多。
- # script_user root # 指定执行脚本的用户,不指定的话,默认是 keepalived_script 用户,而该用户默认不存在,还需要手动去创建。
- #}
- vrrp_script chk_mt {
- script "/etc/keepalived/chk_mt.sh" # 当脚本返回 0 时,priority(160) = priority(100) + weight(60),此时 B 的优先级会大于 A,B 会切换为 MASTER。
- interval 10 # 脚本每 10 秒执行一次
- weight 60
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 50
- priority 100
- advert_int 1
- virtual_ipaddress {
- 192.168.98.200
- }
- track_script {
- chk_mt
- }
- }
复制代码 测试脚本如下:- #!/bin/bash
- #touch /tmp/test.txt
- echo test >> /tmp/test2.txt
- touch /tmp/test.txt
- #exit 1
复制代码注:关于康健脚本的实行,在测试的时间坑有点多,现将注意事项整理如下。
(1)安全选项 enable_script_security 开启的状态下,被实行脚本的权限最好是 750,脚本全部者和 script_user 指定的要保持同等。
(2)keepalived 的脚本实行环境不是简朴的 bash,脚本内容不能有雷同 echo 123 >> /tmp/test.txt 这种写法,出现特别符号,会导致脚天职析错误的题目。如果要举行判定,可在脚本中写入 /usr/bin/touch /tmp/test.txt ,然后在 shell 中不绝实行 stat /tmp/test.txt 去查察文件的修改时间是否发生变革,如有变革则阐明脚本是被实行了。
(3)脚本在被实行时,systemctl ststus keepalived.service 日志 中并不会体现脚本每次被定时实行的变乱,只会体现初次被实行时的状态。但即便体现初始化失败,也并不意味着该脚本就没有被实行,它的判定标准好像只是根据脚本的末了一条下令的返回值举行的判定,若末了一条下令实行失败或错误,日志 体现的初始化状态便也是 failed 状态,但这个状态下脚本仍旧被定时实行着。
(4)脚本在每次被实行之后,它的优先级的盘算并非每次都是 priority = priority + weight, 而是只有在“状态发生变革”时才会调解优先级。比方,假设 weight 即是 20,脚本被定时实行 5 次之后 优先级的状态如下:
时间返回值状态priorityT10OK90T21FAIL70T31FAIL(仍失败)70(稳定)T41FAIL(连续失败)70(稳定)T50OK90可见,weight 值不是让 priority 不停递减,它只是在 90 和 70 这两个值之间来回跳。
4.4、切换关照
实行目标:让服务器的脚色在发生变革时,可以通过邮箱或一些别的的本领来关照管理员,或是让其可以实行一些别的什么脚本任务啥的。- #通知脚本:
- #!/bin/bash
- # 这里是我们的vip 地址
- vip=172.16.100.104
- contact='root@localhost'
- notify() {
- mailsubject="`hostname` to be $1: $vip floating"
- mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
- echo $mailbody | mail -s "$mailsubject" $contact # 发送
- }
- case "$1" in
- master)
- notify master
- exit 0
- ;;
- backup)
- notify backup
- exit 0
- ;;
- fault)
- notify fault
- exit 0
- ;;
- *)
- echo 'Usage: `basename $0` {master|backup|fault}'
- exit 1
- ;;
- esac
复制代码- # ... 其他配置
- vrrp_instance VI_1 {
- # ... 其他配置
- notify_master "/etc/keepalived/notify.sh master" # 当当前服务器的角色切换为 MASTER 时向 root 用户发送 mail通知
- notify_backup "/etc/keepalived/notify.sh backup" # 当当前服务器的角色切换为 BACKUP 时向 root 用户发送 mail通知
- notify_fault "/etc/keepalived/notify.sh fault" # 当当前服务器的角色切换为 FAULT 时向 root 用户发送 mail通知
- }
复制代码 4.5、负载均衡
实行目标:让访问 VIP 的哀求任务可以被匀称的分发给差别的后端服务器举行处理惩罚。- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 50
- priority 150
- advert_int 1
- virtual_ipaddress {
- 192.168.98.200
- }
- }
- virtual_server 192.168.98.200 8080 {
- delay_loop 20
- lb_algo rr # 负载均衡调度算法
- lb_kind NAT # 负载实现的 NAT 模式
- persistence_timeout 360
- protocol TCP
- # 实际处理任务的后端服务器
- real_server 192.168.98.120 8080 {
- weight 1
- TCP_CHECK { # TCP 健康检查
- connect_timeout 3
- }
- }
- real_server 192.168.98.130 8080 {
- weight 1
- TCP_CHECK {
- connect_timeout 3
- }
- }
- }
复制代码注:以上仅为设置上的示例,现实上还必要在呆板上举行一些体系级的功能开启,详细参考 这篇文章。仅凭以上设置,在欣赏器访问 web 服务 http://192.168.98.200:8080 并不可以或许乐成。
5、杂七杂八
(1)参考文档:中文手册、木西条记、CSDN
(2)服务器之间的心跳包的防火墙放行规则如下:- # 放行广播包
- iptables -A INPUT -i eth1 -d 224.0.0.0/8 -j ACCEPT
- # 放行协议号 112。心跳包是一个基于 ip 协议之上的 vrrp 协议包,协议号是 112。【这条似乎可以省略,有前面一条就够了】
- iptables -A INPUT -i eth1 -p 112 -j ACCEPT
复制代码 (3)查抄当前服务器是否是 MASTER 脚色,可以使用 systemctl status keepalived.service 查察,但通过 ip a 查察更方便,VIP 是否见效一眼便知。
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |