0.背景介绍
Keepalived是一种开源的高可用性解决方案,它可以确保系统的高可用性和负载均衡。其原理是利用VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)技术,在一个虚拟IP地址和多个实际IP地址之间实现快速的自动切换。其主要作用是在一个局域网中提供一个虚拟IP地址,同时在多台服务器之间自动地漂移实际IP地址,确保高可用性和负载均衡。
TeleDB for PostgreSQL使用keepalived的VIP高可用能力来实现RDS实例连接的高可用性。
下面是Keepalived的工作流程:
- 实际IP地址的状态检测:Keepalived通过检查实际IP地址的状态来判断是否需要进行切换。
- 虚拟IP地址的切换:当一个实际IP地址不可用时,Keepalived将虚拟IP地址切换到另一台服务器上。
- VRRP决策过程:在决定哪个服务器负责处理虚拟IP地址时,服务器会进行一个VRRP决策过程。在该过程中,每个服务器都会发送一个优先级值给网络中的其他服务器,使用优先级值最高的服务器来处理虚拟IP地址。
总的来说,Keepalived的作用是提供高可用性和负载均衡,它可以确保系统的持续运行和高效性,为企业提高业务的可用性和稳定性提供了极大的帮助。
1.编译
1.1 下载Keepalived安装包并检验MD5
[postgresql@evm-ch32k771ccmka53j9e40 data]$ wget keepalived-2.0.20.tar.gz #通过keepalived官网下载
HTTP request sent, awaiting response... 200 OK
Length: 1036063 (1012K) [application/octet-stream]
Saving to: ‘keepalived-2.0.20.tar.gz’
keepalived-2.0.20.tar.gz 100%[============================================================================================================================>] 1012K 881KB/s in 1.1s
2023-04-27 14:52:41 (881 KB/s) - ‘keepalived-2.0.20.tar.gz’ saved [1036063/1036063]
[postgresql@evm-ch32k771ccmka53j9e40 data]$ md5sum keepalived-2.0.20.tar.gz
a5966e8433b60998709c4a922a407bac keepalived-2.0.20.tar.gz
1.2 解压&安装必要依赖
1. tar -zxvf keepalived-2.0.20.tar.gz
2. sudo yum -y install openssl-devel popt-devel net-snmp-devel gcc libnl3 libnl3-devel
1.3 编译安装keepalived包
1. cd keepalived-2.0.20
#配置编译包存放路径,支持自定义:这里为/data/keepalived
2. ./configure --prefix=/data/keepalived
3. make && make install
4. mkdir /data/keepalived/etc/init.d && mkdir /data/keepalived/lib
5. cp /data/keepalived-2.0.20/keepalived/etc/init.d/keepalived /data/keepalived/etc/init.d
6. rm -rf /data/keepalived-2.0.20/keepalived/etc/data/keepalived-2.0.20/keepalived/etc/keepalived.conf && touch /data/keepalived-2.0.20/keepalived/etc/data/keepalived-2.0.20/keepalived/etc/keepalived.conf
7. ldd keepalived
linux-vdso.so.1 (0x0000fffeb9bf0000)
libm.so.6 => /lib64/libm.so.6 (0x0000fffeb9a50000)
libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x0000fffeb9780000)
libssl.so.1.1 => /lib64/libssl.so.1.1 (0x0000fffeb96d0000)
libnl-genl-3.so.200 => /lib64/libnl-genl-3.so.200 (0x0000fffeb96a0000)
libnl-3.so.200 => /lib64/libnl-3.so.200 (0x0000fffeb9650000)
libc.so.6 => /lib64/libc.so.6 (0x0000fffeb94d0000)
/lib/ld-linux-aarch64.so.1 (0x0000fffeb9c00000)
libz.so.1 => /lib64/libz.so.1 (0x0000fffeb9490000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000fffeb9460000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000fffeb9420000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000fffeb93e0000)
将动态链接库cp到/data/keepalived/lib目录下,例如:cp /lib64/libm.so.6 /data/keepalived/lib
在不同操作系统(eg. ctyunos,uos以及openEuler等)执行编译后,使用ldd keepalived 来获取keepalived所依赖的动态链接文件,并且将其归档至编译好文件的lib目录下,后续执行安装时将lib目录的.so文件拷贝至系统目录中,完成多操作系统适配。
2.安装(仅用于测试手动安装)
2.1 注册系统服务
# 创建keepalived配置文件目录
1. sudo mkdir -p /etc/keepalived
# 将keepalived配置文件拷贝到etc下
2. sudo cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# 拷贝执行文件
3. sudo cp /data/keepalived/sbin/keepalived /usr/sbin/
# 将初始化脚本拷贝到系统初始化目录下
4. sudo cp /data/keepalived/etc/init.d/keepalived /etc/init.d/
# 将keepalived系统配置文件拷贝到etc下
5. sudo cp /data/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# 添加可执行权限
6. sudo chmod +x /etc/init.d/keepalived
# 添加keepalived到开机启动
7. sudo chkconfig --add keepalived
sudo chkconfig keepalived on
# 查看添加到chkconfig的自启动服务(可不执行)
8. sudo chkconfig --list
# 复制所有的动态链接库到/lib64目录下,重复的动态链接库不覆盖
9. sudo cp /data/keepalived/lib/* /lib64
2.2 配置keepalived文件(使用默认配置可跳过)
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置报警邮件地址,可设置多个
acassen@firewall.loc #接收通知的邮件地址
}
notification_email_from test0@163.com #设置 发送邮件通知的地址
smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
router_id LVS_DEVEL #主机标识,用于邮件通知
vrrp_skip_check_adv_addr
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_script chk_nginx_service { #VRRP 脚本声明
script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本
interval 3 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 3 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
user keepalived_script #执行脚本的用户或组
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.130
}
track_script { #脚本监控状态
chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务
notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务
notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务;
}
virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
vrrp_instance VI_2 { #vrrp 实例部分定义,VI_1自定义名称
state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 90 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.131
}
}
virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
2.3 keepalived启停/状态查询
# Keepalived服务启动
1. systemctl start keepalived 或者 service keepalived start
# 停止keepalived服务
2. systemctl stop keepalived 或者 service keepalived stop
# 重启keepalived服务
3. systemctl restart keepalived 或者 service keepalived restart
# 查看keepalived服务运行情况
4. ps -ef | grep keepalived 或者 systemctl status keepalived 或者 service keepalived status