问题描述:启动keepalived进程报错"Can't open PID file /run/keepalived.pid",如下所示:
系统:rhel 7.9
keepalived版本:keepalived-2.2.7.tar.gz

1、异常重现
[root@leo-mysql01 keepalived-2.2.7]# systemctl start keepalived
[root@leo-mysql01 keepalived-2.2.7]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2023-12-24 18:25:48 CST; 16s ago
     Docs: man:keepalived(8)
           man:keepalived.conf(5)
           man:genhash(1)
           https://keepalived.org
  Process: 17182 ExecStart=/opt/keepalived-2.2.7/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 17184 (code=exited, status=2)
    Tasks: 0
   CGroup: /system.slice/keepalived.service

Dec 24 18:25:47 leo-mysql01 Keepalived[17184]: NOTICE: setting config option max_auto_priority should result in better keepalived performance
Dec 24 18:25:47 leo-mysql01 Keepalived[17184]: Starting Healthcheck child process, pid=17185
Dec 24 18:25:47 leo-mysql01 Keepalived[17184]: Starting VRRP child process, pid=17186
Dec 24 18:25:47 leo-mysql01 systemd[1]: Started LVS and VRRP High Availability Monitor.
Dec 24 18:25:47 leo-mysql01 Keepalived_healthcheckers[17185]: Initializing ipvs
Dec 24 18:25:47 leo-mysql01 Keepalived_healthcheckers[17185]: Note: IPVS with IPv6 will not be supported
Dec 24 18:25:48 leo-mysql01 systemd[1]: keepalived.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 24 18:25:48 leo-mysql01 systemd[1]: Unit keepalived.service entered failed state.
Dec 24 18:25:48 leo-mysql01 systemd[1]: keepalived.service failed.
Dec 24 18:25:48 leo-mysql01 Keepalived_healthcheckers[17185]: Note: IPVS with IPv6 will not be supported

后台日志报错如下:
Dec 24 18:29:49 leo-mysql01 systemd: Starting LVS and VRRP High Availability Monitor...
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: Starting Keepalived v2.2.7 (01/16,2022)
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: Running on Linux 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 (built for Linux 3.10.0)
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: Command line: '/opt/keepalived-2.2.7/sbin/keepalived' '-D'
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: WARNING - using deprecated default config file '/etc/keepalived/keepalived.conf' - please move to '/usr/local/etc/keepalived/keepalived.conf'
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: Opening file '/etc/keepalived/keepalived.conf'.
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: Configuration file /etc/keepalived/keepalived.conf
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: (Line 15) WARNING - number '0' outside range [0.000001, 4294.967295]
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: (Line 15) vrrp_garp_interval '0' is invalid
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: (Line 16) WARNING - number '0' outside range [0.000001, 4294.967295]
Dec 24 18:29:49 leo-mysql01 Keepalived[17289]: (Line 16) vrrp_gna_interval '0' is invalid
Dec 24 18:29:54 leo-mysql01 systemd: Can't open PID file /run/keepalived.pid (yet?) after start: No such file or directory
Dec 24 18:29:54 leo-mysql01 Keepalived[17292]: NOTICE: setting config option max_auto_priority should result in better keepalived performance
Dec 24 18:29:54 leo-mysql01 Keepalived[17292]: Starting Healthcheck child process, pid=17293
Dec 24 18:29:54 leo-mysql01 Keepalived[17292]: Starting VRRP child process, pid=17294
Dec 24 18:29:54 leo-mysql01 systemd: Started LVS and VRRP High Availability Monitor.
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Note: IPVS with IPv6 will not be supported
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Gained quorum 1+0=1 <= 1 for VS [192.168.200.100]:tcp:443
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Gained quorum 1+0=1 <= 2 for VS [10.10.10.2]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Gained quorum 1+0=1 <= 2 for VS [10.10.10.3]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Activating healthchecker for service [192.168.201.100]:tcp:443 for VS [192.168.200.100]:tcp:443
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Activating healthchecker for service [192.168.200.2]:tcp:1358 for VS [10.10.10.2]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Activating healthchecker for service [192.168.200.3]:tcp:1358 for VS [10.10.10.2]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Activating healthchecker for service [192.168.200.4]:tcp:1358 for VS [10.10.10.3]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Activating healthchecker for service [192.168.200.5]:tcp:1358 for VS [10.10.10.3]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_vrrp[17294]: Registering Kernel netlink reflector
Dec 24 18:29:54 leo-mysql01 systemd: keepalived.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 24 18:29:54 leo-mysql01 Keepalived_vrrp[17294]: Registering Kernel netlink command channel
Dec 24 18:29:54 leo-mysql01 systemd: Unit keepalived.service entered failed state.
Dec 24 18:29:54 leo-mysql01 Keepalived_vrrp[17294]: (/etc/keepalived/keepalived.conf: Line 21) WARNING - interface eth0 for vrrp_instance VI_1 doesn't exist
Dec 24 18:29:54 leo-mysql01 systemd: keepalived.service failed.
Dec 24 18:29:54 leo-mysql01 Keepalived_vrrp[17294]: Non-existent interface specified in configuration
Dec 24 18:29:54 leo-mysql01 Keepalived_vrrp[17294]: Stopped - used 0.000000 user time, 0.001799 system time
Dec 24 18:29:54 leo-mysql01 Keepalived[17292]: pid 17294 exited with permanent error CONFIG. Terminating
Dec 24 18:29:54 leo-mysql01 Keepalived[17292]: CPU usage (self/children) user: 0.000898/0.000000 system: 0.000197/0.002376
Dec 24 18:29:54 leo-mysql01 Keepalived[17292]: Stopped Keepalived v2.2.7 (01/16,2022)
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Shutting down service [192.168.201.100]:tcp:443 from VS [192.168.200.100]:tcp:443
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Shutting down service [192.168.200.2]:tcp:1358 from VS [10.10.10.2]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Shutting down service [192.168.200.3]:tcp:1358 from VS [10.10.10.2]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Shutting down service [192.168.200.4]:tcp:1358 from VS [10.10.10.3]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Shutting down service [192.168.200.5]:tcp:1358 from VS [10.10.10.3]:tcp:1358
Dec 24 18:29:54 leo-mysql01 Keepalived_healthcheckers[17293]: Stopped - used 0.002270 user time, 0.001135 system time
Dec 24 18:30:01 leo-mysql01 systemd: Started Session 25 of user root.

说明:如上可知,Can't open PID file /run/keepalived.pid为问题所在.

2、异常解决
[root@leo-mysql01 keepalived]# cat keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
   script_user root
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 
vrrp_instance VI_1 {
    state MASTER
    #interface为刚才查到的本机网卡名称
    interface ens33
    #同一网段中同一组virtual_router_id值相同,不同组virtual_router_id值唯一.
    #如server-1、server-2为一组,virtual_router_id=51
    #server-3、server-4为一组,则virtual_router_id不能为51
    virtual_router_id 51
    #字数越大,优先级越高,master必须大于backup
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       #该ip为虚拟出来的vip地址
       192.168.133.92
    }
}
 
#配置virtual_server ip为上面配置的虚拟vip地址,端口为mysql的端口
virtual_server 192.168.133.92 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    #real_server该配置为实际物理机ip地址以及实际物理机mysql端口
    real_server 192.168.133.90 3306 {
        #当该ip端口连接异常时,执行该脚本
        notify_down /etc/keepalived/shutdown.sh
        TCP_CHECK {
            #实际物理机ip地址
            connect_ip 192.168.133.90
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

说明:添加"script_user root"参数,此处参考https://blog.csdn.net/little_crab_/article/details/123704852 网址.

3、结果验证
[root@leo-mysql01 keepalived]# systemctl start keepalived
[root@leo-mysql01 keepalived]# ps -ef|grep keepalived
root      17558      1  0 18:44 ?        00:00:00 /opt/keepalived-2.2.7/sbin/keepalived -D
root      17559  17558  0 18:44 ?        00:00:00 /opt/keepalived-2.2.7/sbin/keepalived -D
root      17560  17558  0 18:44 ?        00:00:00 /opt/keepalived-2.2.7/sbin/keepalived -D
root      17564  17408  0 18:44 pts/3    00:00:00 grep --color=auto keepalived
[root@leo-mysql01 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2023-12-24 18:44:13 CST; 47s ago
     Docs: man:keepalived(8)
           man:keepalived.conf(5)
           man:genhash(1)
           https://keepalived.org
  Process: 17556 ExecStart=/opt/keepalived-2.2.7/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 17558 (keepalived)
    Tasks: 3
   CGroup: /system.slice/keepalived.service
           ├─17558 /opt/keepalived-2.2.7/sbin/keepalived -D
           ├─17559 /opt/keepalived-2.2.7/sbin/keepalived -D
           └─17560 /opt/keepalived-2.2.7/sbin/keepalived -D

Dec 24 18:44:16 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92
Dec 24 18:44:16 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92
Dec 24 18:44:16 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92
Dec 24 18:44:17 leo-mysql01 Keepalived_healthcheckers[17559]: TCP connection to [192.168.133.90]:tcp:3306 success.
Dec 24 18:44:21 leo-mysql01 Keepalived_vrrp[17560]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.133.92
Dec 24 18:44:21 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92
Dec 24 18:44:21 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92
Dec 24 18:44:21 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92
Dec 24 18:44:21 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92
Dec 24 18:44:21 leo-mysql01 Keepalived_vrrp[17560]: Sending gratuitous ARP on ens33 for 192.168.133.92

说明:如上所示,成功开启keepalived.