芹菜无法连接到哨兵:找不到'mymaster'的主人



我有一个正在工作的redis哨兵。我可以用python代码连接到它,并在没有问题的情况下ping它(下面的代码(。然而,当我尝试将我的芹菜应用程序连接到这个redissentinel时,我没有找到"mymaster"的master。我可能有一些设置错误?我的主人和哨兵都有密码保护。我在Openshift中运行它,但我不确定它是否相关,因为来自不同pod(和服务(的python代码可以访问sentinel。

redis-cli -p 26379 -h 192.168.7.248
192.168.7.248:26379> auth abc
OK
192.168.7.248:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.18.36:6379,slaves=0,sentinels=1
import redis
from redis.sentinel import Sentinel
sentinel = Sentinel([('192.168.7.248', 26379)], sentinel_kwargs={'password': 'abc'})
host, port = sentinel.discover_master("mymaster")
redis_client = redis.StrictRedis(
host=host,
port=port,
password='abc'
)
print(redis_client.ping())

该代码打印出";真的";。

我的芹菜应用程序:

from celery import Celery
app = Celery("app_celery")
options = {
"master_name": "mymaster",
"sentinel_kwargs": {"password": "abc"},
}
app.conf.broker_url = "sentinel://192.168.7.248:26379"
app.conf.broker_transport_options = options

我非常绝望,任何帮助都将不胜感激。

Celery文档只展示了如何配置您的sentinel密码。https://docs.celeryq.dev/en/stable/getting-started/backends-and-brokers/redis.html

如果您的master和sentinel都有密码保护,那么下面是您初始化Celery应用程序的方法。

from celery import Celery
REDIS_PASSWORD = 'your_redis_password'
REDIS_SENTINEL_PASSWORD = 'your_redis_sentinel_password'
redis_broker = f'sentinel://:{REDIS_PASSWORD}@localhost:26379;sentinel://:{REDIS_PASSWORD}@localhost:26380;sentinel://:{REDIS_PASSWORD}@localhost:26381'
app = Celery('app_celery', broker=redis_broker)
app.conf.broker_transport_options = {'master_name': 'mymaster', 'sentinel_kwargs': { 'password': REDIS_SENTINEL_PASSWORD }}

文档中没有它,但这对我有效:

broker_url = "sentinel://:your_password@host_ip:port_no;..."
broker_transport_options = {"master_name": "your_master_name"}

因此,请在每个sentinel主机的broker_url中包含密码。

更多详细信息

Celery在引擎盖下使用Kombu。Kombu实际上为您提供了不在transport_options下包含密码的选项,Celery不会对此进行翻译。所以在Kombu你可以这样做:

c = kombu.Connection(
"sentinel://host_ip:port_no;...",
"password": "your_password",
transport_options={"master_name": "your_master_name"},
)
c.connect()

如果您的连接和sentinel主机的密码相同,这将非常有效。

但Celery所做的是将密码粘贴到transport_options内部或一直粘贴到sentinel_kwargs内部。因此,这实际上就是被送到Kombu的东西。

celery_broker_transport_options = {
"master_name": "your_master_name",
"password": "your_password"
}
# gets into Kombu like this
c = kombu.Connection(
"sentinel://host_ip:port_no;...",
transport_options={
"master_name": "your_master_name",
"password": "your_password",
}
)

# OR
celery_broker_transport_options = {
"master_name": "your_master_name",
"sentinel_kwargs": {"password": "your_password"}
}
# gets into Kombu like this
c = kombu.Connection(
"sentinel://host_ip:port_no;...",
transport_options={
"master_name": "your_master_name",
"sentinel_kwargs": {"password": "your_password"}
}
)

这两种情况都不起作用。

因此,通过在broker_url中包含sentinel主机密码,您就可以绕过这一点错误我称之为

相关内容

  • 没有找到相关文章

最新更新