溫馨提示×

ubuntu如何實現分布式定時任務

小樊
49
2025-06-25 05:19:35
欄目: 智能運維

在Ubuntu上實現分布式定時任務,通??梢允褂靡韵聨追N方法:

  1. 使用Cron結合分布式鎖

    • 在每個節點上設置Cron任務。
    • 使用分布式鎖(如Redis、etcd或Zookeeper)來確保同一時間只有一個節點執行任務。
  2. 使用Celery

    • Celery是一個分布式任務隊列,支持定時任務(通過Celery Beat)。
    • 配置多個Celery worker節點來處理任務。
    • 使用Redis或RabbitMQ作為消息代理。
  3. 使用Apache Airflow

    • Airflow是一個工作流調度平臺,可以定義復雜的任務依賴關系。
    • 支持分布式執行,可以在多個節點上運行Executor(如CeleryExecutor、KubernetesExecutor等)。
    • 配置Airflow Scheduler和Webserver在不同的節點上。
  4. 使用Kubernetes CronJobs

    • 如果你在Kubernetes集群中運行應用,可以使用Kubernetes的CronJob資源來調度定時任務。
    • Kubernetes會自動管理任務的分布式執行。

下面是一個簡單的示例,展示如何使用Cron結合Redis分布式鎖來實現分布式定時任務:

安裝依賴

首先,安裝所需的軟件包:

sudo apt-get update
sudo apt-get install python3-pip redis-server
pip3 install redis

編寫Python腳本

創建一個Python腳本distributed_cron.py,內容如下:

import time
import redis
from datetime import datetime

# 連接到Redis服務器
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

def acquire_lock(lock_name, acquire_timeout=10):
    identifier = str(uuid.uuid4())
    end = time.time() + acquire_timeout
    while time.time() < end:
        if redis_client.setnx(lock_name, identifier):
            return identifier
        time.sleep(0.001)
    return False

def release_lock(lock_name, identifier):
    with redis_client.pipeline() as pipe:
        while True:
            try:
                pipe.watch(lock_name)
                if pipe.get(lock_name) == identifier:
                    pipe.multi()
                    pipe.delete(lock_name)
                    pipe.execute()
                    return True
                pipe.unwatch()
                break
            except redis.WatchError:
                pass
    return False

def task():
    print(f"Task executed at {datetime.now()}")

def main():
    lock_name = "distributed_cron_lock"
    identifier = acquire_lock(lock_name)
    if identifier:
        try:
            task()
        finally:
            release_lock(lock_name, identifier)
    else:
        print("Failed to acquire lock")

if __name__ == "__main__":
    main()

設置Cron任務

編輯Cron任務:

crontab -e

添加以下行來每分鐘運行一次腳本:

* * * * * /usr/bin/python3 /path/to/distributed_cron.py

運行Redis服務器

確保Redis服務器正在運行:

sudo systemctl start redis-server

通過這種方式,你可以確保即使在多個節點上運行Cron任務,也只有一個節點能夠執行定時任務。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女