有 V2EX 的坛友问到如何静态编译 keepalived 的问题,实际上 keepalived 确实配置比较麻烦。那还有一个简单易行的 ucarp,生产也可以用这个。

ucarp 跟 keepalived 一样,都是用于高可用的 IP 漂移

但是比 keepalived 配置简单,而且 opnsense 就是用的这个做的高可用,opnsense 是个非常可靠的防火墙软件。

首先有两台虚机,172.18.19.1和172.18.19.2,虚拟ip是172.18.19.3

先配置172.18.19.1

yum install epel-release
yum install psmisc
yum install ucarp

cat<< EOF >> /etc/systemd/system/ucarp.service
[Unit]
Description=UCARP virtual interface
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/ucarp.sh
RemainAfterExit=true
ExecStop=/usr/bin/killall -SIGTERM ucarp
ExecStop=/bin/sleep 10
TimeoutStopSec=30
StandardOutput=journal

[Install]
WantedBy=multi-user.target
EOF

注意,上面我们的systemd是直接调用了ucarp.sh来启动,这样更简单。
三个脚本,注意权限是755

cat<< EOF >> /usr/local/bin/ucarp.sh
#!/bin/bash'
/usr/sbin/ucarp -i eth0 -B -p nb1Dshiwode -v 001 -a 172.18.19.3 -s 172.18.19.1 --shutdown --preempt -u /usr/local/bin/vip-up.sh -d /usr/local/bin/vip-down.sh
EOF

cat<< EOF >> /usr/local/bin/vip-up.sh 
#!/bin/sh
/sbin/ip addr add ${2}/24 dev ${1}
/sbin/ip neigh flush dev ${1}
EOF

cat<< EOF >> /usr/local/bin/vip-down.sh
#!/bin/sh
/sbin/ip addr del ${2}/24 dev ${1}
/usr/sbin/arp -d ${2}
EOF

chmod 755 /usr/local/bin/ucarp.sh /usr/local/bin/vip-up.sh /usr/local/bin/vip-down.sh

ok,第一台机器就配置好了

所有的东西都在ucarp.sh的那一行的参数上,直接用ucarp -h来查看

配置第二台172.18.19.2,其他的东西都一样,唯一不同的就是ucapr.sh的一处不一样

cat<< EOF >> /usr/local/bin/ucarp.sh
#!/bin/bash'
/usr/sbin/ucarp -i eth0 -B -p nb1Dshiwode -v 001 -a 172.18.19.3 -s 172.18.19.2 --shutdown --preempt -u /usr/local/bin/vip-up.sh -d /usr/local/bin/vip-down.sh
EOF

# -s 172.18.19.2 源ip和19.1不同

ok,两台都配置完毕, 分别执行启动

systemctl daemon-reload
systemctl enable --now ucarp

可以再找一台机器,一直长 ping 172.18.19.3,然后随机杀掉 19.1 和 19.2 上面的 ucarp 进程,可以看到 vip 172.18.19.3 会来回飘

注意:如果主掉了,从接管了 vip 变成 master,那么主再起来的时候不会去抢从的 master。