我有 2 个服务器作为独立的 systemd 单元启动。它们分别监听端口 3001 和 3002。
我想要实现滚动重启(也称为滚动更新或渐进更新,有关此部署策略的更多信息)。
以下是运行“systemctl restart app”时我寻找的事件序列:
- app-unit1 正在运行 && app-unit2 正在运行
- app-unit1 已停止
- app-unit1 已启动
- app-unit2 已停止
- app-unit2 已启动
通过这样做,利用这些服务器前面的负载均衡器,我可以重新加载这些服务器而不会中断全局服务。
我实现了本文:
/etc/systemd/system/app.service
[Unit]
Description=app
After=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
/etc/systemd/system/app-unit1.service
[Unit]
Description=app-unit1
PartOf=app.service
After=app.service
[Service]
Type=notify
Environment=PORT=3001
ExecStart=/usr/bin/start-server.sh
Restart=on-failure
[Install]
WantedBy=app.service
/etc/systemd/system/app-unit2.service
[Unit]
Description=app-unit2
PartOf=app.service
After=app.service
After=app-unit1.service
[Service]
Type=notify
Environment=PORT=3002
ExecStart=/usr/bin/start-server.sh
Restart=on-failure
[Install]
WantedBy=app.service
运行“systemctl restart app”时产生的事件序列:
- app-unit1 正在运行 && app-unit2 正在运行
- app-unit2 已停止 && app-unit1 已停止(不确定哪一个先停止)
- app-unit1 已启动
- app-unit2 已启动
因此,在步骤 2 和步骤 3 之间我的服务中断了。
问题是:如何使用 systemd 实现滚动重启?