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。

  1. # 安装java环境,为了方便,直接yum安装了
  2. $ yum -y install java
  3. # 安装tomcat
  4. $ wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.tar.gz
  5. $ tar zxf apache-tomcat-9.0.38.tar.gz && mv apache-tomcat-9.0.38 /opt/tomcat-9.0.38
  6. # 准备首页文件(两个机器的首页内容自定义,测试时最好不要定义为一样的,后期好分辨)
  7. $ mkdir /web/webapp1/ -p
  8. $ cat > /web/webapp1/index.jsp << EOF
  9. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  10. <html>
  11. <head>
  12. <title>JSP test1 page</title>
  13. </head>
  14. <body>
  15. <% out.println("This is 192.168.20.10...");%>
  16. </body>
  17. </html>
  18. EOF
  19. # <% out.println..... 后面写的就是首页内容
  20. $ vim /opt/tomcat-9.0.38/conf/server.xml # 修改主配置文件
  21. ......................................
  22. <Host name="localhost" appBase="webapps"
  23. unpackWARs="true" autoDeploy="true"> #定位到该行,然后添加下面两行内容
  24. <Context docBase="/web/webapp1" path="" reloadable="false">
  25. </Context>
  26. # 启动tomcat
  27. $ /opt/tomcat-9.0.38/bin/startup.sh
  28. # 确定端口已监听
  29. $ ss -lnput | grep 8080
  30. tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=33918,fd=56))
  31. # 调整防火墙策略
  32. $ firewall-cmd --add-port=8080/tcp --permanent
  33. $ firewall-cmd --reload

访问测试:

keepalived配置详解 - 图1

部署keepalived

若部署最新版本,则会在make时出错,怀疑是需要升级内核,没有过多纠结,而是选择编译了2.0.20版本。

两台机器都需要安装keepalived。

  1. $ wget https://keepalived.org/software/keepalived-2.0.20.tar.gz
  2. $ yum install -y gcc openssl-devel openssl libnl libnl-devel libnfnetlink-devel
  3. $ tar zxf keepalived-2.0.20.tar.gz && cd keepalived-2.0.20
  4. $ ./configure --prefix=/opt/keepalived-2.0.20
  5. $ make && make install
  6. # 添加为系统服务并开机自启
  7. $ mkdir /etc/keepalived
  8. $ cp keepalived/etc/init.d/keepalived /etc/init.d/
  9. $ cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  10. $ cp keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  11. $ cd /etc/init.d/
  12. $ chkconfig --add keepalived
  13. $ systemctl enable keepalived

配置keepalived

配置文件中有一些无关紧要的配置,我也没耐心写,就这样吧,能过满足业务需求即可。

配置tomcat01主机

  1. # 先看配置含义,下面有完整无注释的配置
  2. $ cat /etc/keepalived/keepalived.conf
  3. global_defs {
  4. script_user root
  5. router_id TOMCAT-01 # route_id 必须唯一,可以写为主机名
  6. }
  7. # 下面是定义一个健康检测机制,可被多次调用
  8. vrrp_script chk_tomcat {
  9. script "/etc/keepalived/chk_tomcat.sh" # 指定命令或者脚本路径,脚本需要有执行权限
  10. interval 2 # 执行间隔时间,默认为 1s
  11. }
  12. # 下面是定义一个VRRP实例,实例名为 VI_1
  13. vrrp_instance VI_1 {
  14. state BACKUP # 状态为backup
  15. interface ens33 # 指定VIP绑定到哪块网卡
  16. unicast_src_ip 192.168.20.10 # 指定为本机IP
  17. unicast_peer {
  18. 192.168.20.6 # 指定对端IP
  19. }
  20. virtual_router_id 23 # 虚拟路由ID,参与主备的机器路由ID都应该是一样的
  21. priority 100 # 指定优先级
  22. nopreempt # 不抢占,即允许一个priority比较低的节点作为master
  23. advert_int 1 # 发vrrp包的时间间隔,即多久进行一次master选举(可认为是健康检查时间间隔)
  24. authentication { # 认证区域,参与主备的机器,此字段应保持一致
  25. auth_type PASS
  26. auth_pass 1234
  27. }
  28. virtual_ipaddress { # 指定VIP
  29. 192.168.20.15/24
  30. }
  31. # 调用上面定义的健康检测模块
  32. track_script {
  33. chk_tomcat
  34. }
  35. }
  36. ################ 完整无注释的配置文件如下 #################
  37. $ cat /etc/keepalived/keepalived.conf # keepalived.conf 配置文件如下
  38. global_defs {
  39. script_user root
  40. router_id TOMCAT-01
  41. }
  42. vrrp_script chk_tomcat {
  43. script "/etc/keepalived/chk_tomcat.sh"
  44. interval 2
  45. }
  46. vrrp_instance VI_1 {
  47. state BACKUP
  48. interface ens33
  49. unicast_src_ip 192.168.20.10
  50. unicast_peer {
  51. 192.168.20.6
  52. }
  53. virtual_router_id 23
  54. priority 100
  55. nopreempt
  56. advert_int 1
  57. authentication {
  58. auth_type PASS
  59. auth_pass 1234
  60. }
  61. virtual_ipaddress {
  62. 192.168.20.15/24
  63. }
  64. track_script {
  65. chk_tomcat
  66. }
  67. }
  68. $ cat /etc/keepalived/chk_tomcat.sh # 健康检测脚本如下
  69. #!/usr/bin/env bash
  70. keepalived_log=/etc/keepalived/vip.log
  71. tomcat_pid=$(ps -ef | grep tomcat-9.0.38 | grep -v grep | wc -l) # 确保此处过滤出来的是你的进程,并且尽可能精准匹配你的进程
  72. if [[ ${tomcat_pid} -eq 0 ]];then
  73. cat >> ${keepalived_log} << EOF
  74. Tomcat stopped running at $(date '+%F %T')
  75. Stopping keepalived ...
  76. EOF
  77. systemctl stop keepalived
  78. fi
  79. $ chmod +x /etc/keepalived/chk_tomcat.sh # 脚本需要有执行权限
  80. # 将配置文件同步到tomcat-02
  81. $ rsync -az /etc/keepalived/keepalived.conf 192.168.20.6:/etc/keepalived/
  82. $ 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)。