title: keepalived配置详解 #标题tags: keepalived #标签
date: 2020-09-23
categories: linux大杂烩 # 分类
最近项目上用到了keepalived,之前搞过,但只是记了个随笔,今日抽出时间来,把此文档整理下。
环境准备
项目背景: 两个tomcat服务器,要使用keepalived配置VIP,能够实现tomcat服务异常时VIP自动漂到备机。
hostname | IP | service | VIP |
---|---|---|---|
tomcat-01 | 192.168.20.10 | tomcat、keepalived | 192.168.20.15 |
tomcat-02 | 192.168.20.6 | tomcat、keepalived | 192.168.20.15 |
部署tomcat
两台机器都需要安装tomcat。
# 安装java环境,为了方便,直接yum安装了
$ yum -y install java
# 安装tomcat
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.tar.gz
$ tar zxf apache-tomcat-9.0.38.tar.gz && mv apache-tomcat-9.0.38 /opt/tomcat-9.0.38
# 准备首页文件(两个机器的首页内容自定义,测试时最好不要定义为一样的,后期好分辨)
$ mkdir /web/webapp1/ -p
$ cat > /web/webapp1/index.jsp << EOF
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("This is 192.168.20.10...");%>
</body>
</html>
EOF
# <% out.println..... 后面写的就是首页内容
$ vim /opt/tomcat-9.0.38/conf/server.xml # 修改主配置文件
......................................
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"> #定位到该行,然后添加下面两行内容
<Context docBase="/web/webapp1" path="" reloadable="false">
</Context>
# 启动tomcat
$ /opt/tomcat-9.0.38/bin/startup.sh
# 确定端口已监听
$ ss -lnput | grep 8080
tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=33918,fd=56))
# 调整防火墙策略
$ firewall-cmd --add-port=8080/tcp --permanent
$ firewall-cmd --reload
访问测试:
部署keepalived
若部署最新版本,则会在make时出错,怀疑是需要升级内核,没有过多纠结,而是选择编译了2.0.20版本。
两台机器都需要安装keepalived。
$ wget https://keepalived.org/software/keepalived-2.0.20.tar.gz
$ yum install -y gcc openssl-devel openssl libnl libnl-devel libnfnetlink-devel
$ tar zxf keepalived-2.0.20.tar.gz && cd keepalived-2.0.20
$ ./configure --prefix=/opt/keepalived-2.0.20
$ make && make install
# 添加为系统服务并开机自启
$ mkdir /etc/keepalived
$ cp keepalived/etc/init.d/keepalived /etc/init.d/
$ cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
$ cp keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
$ cd /etc/init.d/
$ chkconfig --add keepalived
$ systemctl enable keepalived
配置keepalived
配置文件中有一些无关紧要的配置,我也没耐心写,就这样吧,能过满足业务需求即可。
配置tomcat01主机
# 先看配置含义,下面有完整无注释的配置
$ cat /etc/keepalived/keepalived.conf
global_defs {
script_user root
router_id TOMCAT-01 # route_id 必须唯一,可以写为主机名
}
# 下面是定义一个健康检测机制,可被多次调用
vrrp_script chk_tomcat {
script "/etc/keepalived/chk_tomcat.sh" # 指定命令或者脚本路径,脚本需要有执行权限
interval 2 # 执行间隔时间,默认为 1s
}
# 下面是定义一个VRRP实例,实例名为 VI_1
vrrp_instance VI_1 {
state BACKUP # 状态为backup
interface ens33 # 指定VIP绑定到哪块网卡
unicast_src_ip 192.168.20.10 # 指定为本机IP
unicast_peer {
192.168.20.6 # 指定对端IP
}
virtual_router_id 23 # 虚拟路由ID,参与主备的机器路由ID都应该是一样的
priority 100 # 指定优先级
nopreempt # 不抢占,即允许一个priority比较低的节点作为master
advert_int 1 # 发vrrp包的时间间隔,即多久进行一次master选举(可认为是健康检查时间间隔)
authentication { # 认证区域,参与主备的机器,此字段应保持一致
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { # 指定VIP
192.168.20.15/24
}
# 调用上面定义的健康检测模块
track_script {
chk_tomcat
}
}
################ 完整无注释的配置文件如下 #################
$ cat /etc/keepalived/keepalived.conf # keepalived.conf 配置文件如下
global_defs {
script_user root
router_id TOMCAT-01
}
vrrp_script chk_tomcat {
script "/etc/keepalived/chk_tomcat.sh"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
unicast_src_ip 192.168.20.10
unicast_peer {
192.168.20.6
}
virtual_router_id 23
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.20.15/24
}
track_script {
chk_tomcat
}
}
$ cat /etc/keepalived/chk_tomcat.sh # 健康检测脚本如下
#!/usr/bin/env bash
keepalived_log=/etc/keepalived/vip.log
tomcat_pid=$(ps -ef | grep tomcat-9.0.38 | grep -v grep | wc -l) # 确保此处过滤出来的是你的进程,并且尽可能精准匹配你的进程
if [[ ${tomcat_pid} -eq 0 ]];then
cat >> ${keepalived_log} << EOF
Tomcat stopped running at $(date '+%F %T')
Stopping keepalived ...
EOF
systemctl stop keepalived
fi
$ chmod +x /etc/keepalived/chk_tomcat.sh # 脚本需要有执行权限
# 将配置文件同步到tomcat-02
$ rsync -az /etc/keepalived/keepalived.conf 192.168.20.6:/etc/keepalived/
$ rsync -az /etc/keepalived/chk_tomcat.sh 192.168.20.6:/etc/keepalived/
配置tomcat02主机
$ cat /etc/keepalived/keepalived.conf # 修改配置文件如下
global_defs {
script_user root
router_id TOMCAT-02 # 修改route_id
}
vrrp_script chk_tomcat {
script "/etc/keepalived/chk_tomcat.sh"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
unicast_src_ip 192.168.20.6 # 修改为本机IP
unicast_peer {
192.168.20.10 # 修改为对端IP
}
virtual_router_id 23
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.20.15/24
}
track_script {
chk_tomcat
}
}
接下来两台机器就都可以启动keepalived了。在启动之前,先配置防火墙规则,防止两台机器通信受阻,导致出现脑裂现象。
调整防火墙策略
注:两台主机都需要执行以下命令,以便放行相关流量。224.0.0.18是keepalived的组播地址,使用的是vrrp协议。
# 注意修改网卡名称和你主机网卡名的一致
$ firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
$ firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
$ firewall-cmd --reload
启动keepalived
两台机器都启动keepalived。
$ systemctl start keepalived
# 确认进程存在
$ ps -ef | grep keepalived | grep -v grep
root 34325 1 0 02:59 ? 00:00:00 /opt/keepalived-2.0.20/sbin/keepalived -D
root 34326 34325 0 02:59 ? 00:00:00 /opt/keepalived-2.0.20/sbin/keepalived -D
root 34327 34325 0 02:59 ? 00:00:00 /opt/keepalived-2.0.20/sbin/keepalived -D
确认VIP已存在
注:VIP只能存在一台机器上,并且只能用ip
命令查看到VIP。
# 查看VIP(一般VIP会在先启动keepalived的那个机器上)
$ ip a # 或 ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0a:3a:ad brd ff:ff:ff:ff:ff:ff
inet 192.168.20.10/24 brd 192.168.20.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.20.15/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::1707:f528:803d:73b9/64 scope link noprefixroute
valid_lft forever preferred_lft forever
至此,配置已经完成了,自行验证VIP漂移效果即可。
注意事项
如果发生过服务不可用,记得在服务恢复后,重新启动下keepalived(上面定义的配置文件中,只要服务不可用,就会杀掉keepalived进程),以便keepalived继续正常工作(也可以将脚本中的systemctl stop keepalived
改为systemctl restart keepalived
,但这样的话,在你服务进程恢复前,keepalived会一直进行重启,从而产生大量的日志,keepalived的日志在/var/log/messages
)。