确保跨服务器的流程只有一个实例
single-beat的Python项目详细描述
单拍
Single Beat是一个很好的小应用程序,它确保只有一个流程实例在服务器上运行。
例如cellerybeat(或某种每日邮件发件人、孤立文件清理程序等)只需要在一台服务器上运行, 但如果那台服务器坏了,那你就去另一台服务器启动它,等等。
由于我们都讨厌手动操作,单拍自动完成此过程。
如何
我们使用redis作为锁定服务器,并将您的进程用单拍包起来,分为两个服务器,
single-beat celery beat
在第二台服务器上
single-beat celery beat
在第三台服务器上
single-beat celery beat
第二个过程将一直等到第一个过程死亡为止。
安装
sudo pip install single-beat
配置
您可以使用环境变量配置单拍,如
SINGLE_BEAT_REDIS_SERVER='redis://redis-host:6379/1' single-beat celery beat
单拍redis服务器
你可以给redis主机url,我们把它传给
单拍redis哨兵
使用redis sentinel选择要使用的redis主机,sentinel定义为主机名和端口对的冒号分隔列表,例如
192.168.1.10:26379;192.168.1.11:26379;192.168.1.12:26379
单拍redis哨兵主机(默认
mymaster
)单拍redis哨兵数据库(默认为0)
单拍标识符
默认情况下,我们使用您的进程名作为标识符,如
single-beat celery beat
所有进程都会检查一个名为"Single Beat"芹菜的密钥,但在某些情况下,您可能需要提供另一个标识符,例如您的项目名称等。
SINGLE_BEAT_IDENTIFIER='celery-beat' single-beat celery beat
单拍锁定时间(默认为5秒)
单拍锁定时间(默认为2*单拍锁定时间秒)
单拍心跳间隔(默认1秒)
启动进程时,我们在redis服务器中设置了一个10秒过期(初始锁定时间)的密钥, 其他单拍过程检查该键是否存在-如果存在,则不会产生子项。
我们继续每1秒更新一次密钥(心跳间隔),并将其设置为5秒的ttl(锁定时间)
这应该行得通,但您可能希望给出更轻松的时间间隔,例如:
SINGLE_BEAT_LOCK_TIME=300SINGLE_BEAT_HEARTBEAT_INTERVAL=60 single-beat celery beat
单拍主机标识符(默认socket.gethostname)
我们将主机名和进程id设置为lock keys值,这样您就可以检查进程所处的位置。
SINGLE_BEAT_IDENTIFIER='celery-beat' single-beat celery beat
single-beat celery beat
0single-beat celery beat
1single-beat celery beat
2单拍日志级别(默认警告)
如果要查看心跳信号消息,请将日志级别更改为"调试"。
单拍等待模式(默认心跳)
单拍等待(默认60秒)
单拍有两种不同的模式: -心跳(默认) -监督
在heartbeat模式下,单拍负责所有事情,生成一个进程来检查其状态、发布等。 在监督模式下,单拍开始,检查孩子是否在某处跑步,并等待一段时间,然后退出。因此,supervisord-或另一个调度程序将拾取并重新启动单拍。
在第一台服务器上
single-beat celery beat
3这将在第二台服务器上每秒心跳一次
single-beat celery beat
4因此,如果您在supervisor.conf中这样做
single-beat celery beat
5它会每60秒产生一次芹菜节拍。
CLI
单拍也有一个简单的cli,它提供有关进程所在位置的信息,还可以暂停单拍、重新启动进程等。
"info"将显示进程运行的位置,第一个节点标识符是连接到redis的IP地址-默认情况下。
single-beat celery beat6
"stop"将停止您的子进程,因此任何节点都将再次接收它
single-beat celery beat7
"重新启动"将重新启动活动节点中的子进程。
single-beat celery beat8
"暂停"将杀死子节点,并将所有单拍节点放入暂停状态。这在部署时很有用,以确保没有"旧版本的代码" 正在运行部署过程。部署后,您可以"继续",以便任何节点都可以选择子节点。
single-beat celery beat9
"resume"将使单拍节点处于等待状态-因此任何节点都将拾取子节点
single-beat celery beat0
"quit"将终止所有子进程,然后终止父进程本身。因此,将没有活动的单拍节点。它对 使用某种手刹-当您使用蓝色/绿色或金丝雀风格的部署时,也可能有用。
single-beat celery beat1
使用模式
您可以在example/cellerybeat.conf上看到supervisor的示例用法
为什么
还有一些其他的解决方案,但要么它们很复杂,要么您需要修改流程。而且我找不到一个更简单的解决方案来解决这个问题,而不修改或添加锁到我的任务中就无法找到https://github.com/celeri/celeri/issues/251" rel="nofollow">https://github.com/celeri/celeri/issues/251。
您还可以查看Uwsgi的军团支持
学分
推荐PyPI第三方库