在Ubuntu上实现分布式定时任务,通常可以使用以下几种方法:
使用Cron结合分布式锁:
使用Celery:
使用Apache Airflow:
使用Kubernetes CronJobs:
下面是一个简单的示例,展示如何使用Cron结合Redis分布式锁来实现分布式定时任务:
首先,安装所需的软件包:
sudo apt-get update
sudo apt-get install python3-pip redis-server
pip3 install redis
创建一个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任务:
crontab -e
添加以下行来每分钟运行一次脚本:
* * * * * /usr/bin/python3 /path/to/distributed_cron.py
确保Redis服务器正在运行:
sudo systemctl start redis-server
通过这种方式,你可以确保即使在多个节点上运行Cron任务,也只有一个节点能够执行定时任务。