确保跨服务器的流程只有一个实例

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
    
    0
    single-beat celery beat
    
    1
    single-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 beat
6

"stop"将停止您的子进程,因此任何节点都将再次接收它

single-beat celery beat
7

"重新启动"将重新启动活动节点中的子进程。

single-beat celery beat
8

"暂停"将杀死子节点,并将所有单拍节点放入暂停状态。这在部署时很有用,以确保没有"旧版本的代码" 正在运行部署过程。部署后,您可以"继续",以便任何节点都可以选择子节点。

single-beat celery beat
9

"resume"将使单拍节点处于等待状态-因此任何节点都将拾取子节点

single-beat celery beat
0

"quit"将终止所有子进程,然后终止父进程本身。因此,将没有活动的单拍节点。它对 使用某种手刹-当您使用蓝色/绿色或金丝雀风格的部署时,也可能有用。

single-beat celery beat
1

使用模式

您可以在example/cellerybeat.conf上看到supervisor的示例用法

为什么

还有一些其他的解决方案,但要么它们很复杂,要么您需要修改流程。而且我找不到一个更简单的解决方案来解决这个问题,而不修改或添加锁到我的任务中就无法找到https://github.com/celeri/celeri/issues/251" rel="nofollow">https://github.com/celeri/celeri/issues/251。

您还可以查看Uwsgi的军团支持

学分

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java从CSV读取并批量插入数据库Netezza   java如何减少Apache CXF客户端存根对象的内存大小?   ServletsJava。lang.NullPointerException:未设置FileItemFactory   Android中的java,是否有任何使用类格式化一组视图的方法?   java无法使用JACOB创建ActiveXComponent   java组织。日食swt。小部件。组,这个类可以被滚动吗   java如何隐藏javabean中的方法,使其不出现在wsdl中   Java函数式编程:如何将for循环中的ifelse梯形图转换为函数式?   java Openshift:在应用程序之间共享MySQL cartrige   JavaHTTPPOST请求返回HTML代码而不是JSON数据   java为什么我的合并排序比快速排序慢?   java JMH基准测试Neo4j   java在底部导航器上处理rotate,在片段上导航   java错误:链接有关字符串资源的文件资源失败   Javaservlet+ajax+jsp   java:加载带有客户端证书的HTTPS url   java如何使用自定义ConstraintValidator将ConstraintViolations添加到索引i处的列表元素   java是否可以在某些布局中对容器中的组件重新排序?