RedisClusterException при попытке записи с использованием Celery

Моя среда: у меня три сервера Ubuntu. Один сервер используется как балансировщик нагрузки с помощью Nginx. Два других сервера содержат точно такой же проект (они идентичны, за исключением Redis, где один ящик является главным, а другой - подчиненным).

Программы / приложения, которые я использую Python, Gunicorn, Django, Celery, Redis, Sentinel

Что делает мой проект: у меня есть URL-адрес, который принимает запрос GET, выполняет некоторую логику в отношении запроса и сохраняет в redis.

def save(key, value):
    conn = redis_cluster_connect()
    print conn
    conn.set(key, value)
    conn.set('bar','foo')

Это работало нормально, когда мое соединение было:

def redis_connect():
    print 'redis connected'
    return redis.Redis(host="xxx.xx.xxx.x", port=6380, db=1) # CHANGE TO THE REDIS PORT THAT IS ACTIVE

Но когда я использую кластерное соединение:

def redis_cluster_connect():
    startup_nodes = [{"host": "xxx.xx.xxx.x", "port": "6380"}]
    rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)

return rc

Я получаю ошибку:

[2016-09-15 13:28:59,682: INFO/MainProcess] Received task: testapp.tasks.mobilise_stops[cc64c425-bd37-4896-b6ab-4319de5fb743]
    [2016-09-15 13:28:59,684: WARNING/Worker-1] Oh no! Task failed: RedisClusterException("ERROR sending 'cluster slots' command to redis server: {'host': 'xxx.xx.xxx.x', 'port': '6380'}",)
    [2016-09-15 13:28:59,685: ERROR/MainProcess] Task testapp.tasks.mobilise_stops[cc64c425-bd37-4896-b6ab-4319de5fb743] raised unexpected: RedisClusterException("ERROR sending 'cluster slots' command to redis server: {'host': 'xxx.xx.xxx.x', 'port': '6380'}",)
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 240, in trace_task
        R = retval = fun(*args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 438, in __protected_call__
        return self.run(*args, **kwargs)
      File "/var/www/gateway/venv/gateway/testapp/tasks.py", line 50, in mobilise_stops
        save(mobilise_stops.request.id, 'Success')
      File "/var/www/gateway/venv/gateway/testapp/tasks.py", line 28, in save
        conn = redis_cluster_connect()
      File "/var/www/gateway/venv/gateway/testapp/tasks.py", line 19, in redis_cluster_connect
        rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
      File "/usr/local/lib/python2.7/dist-packages/rediscluster/client.py", line 157, in __init__
        **kwargs
      File "/usr/local/lib/python2.7/dist-packages/rediscluster/connection.py", line 83, in __init__
        self.nodes.initialize()
      File "/usr/local/lib/python2.7/dist-packages/rediscluster/nodemanager.py", line 148, in initialize
        raise RedisClusterException("ERROR sending 'cluster slots' command to redis server: {0}".format(node))
    RedisClusterException: ERROR sending 'cluster slots' command to redis server: {'host': 'xxx.xx.xxx.x', 'port': '6380'}

Когда я запускаю redis-cli и устанавливаю переменную на главном сервере (на сервере 1), я могу получить ее на подчиненном устройстве (на сервере 2).

server 1:
xxx.xx.xxx.x:6380> set test 100
OK

server 2:
xxx.xx.xxx.x:6381> get test 
"100"

Когда я пытаюсь выполнить команду кластерных слотов в клиенте redis, я получаю ту же ошибку, что и выше.

xxx.xx.xxx.x:6380> cluster slots
(error) ERR unknown command 'cluster'

Следует учитывать, что в моем файле конфигурации redis нет сокета tcp, когда я пытался использовать tcp, redis не работал. Когда я пытался запустить Redis, у меня возникла ошибка. Он был изменен на Unixsocket по умолчанию, который входит в файл redis.conf по умолчанию.

Из:

tcp-backlog 511

To:

unixsocket /var/run/redis/redis.sock
unixsocketperm 700

person Jahedh    schedule 15.09.2016    source источник


Ответы (2)


Вы не используете кластер redis, поэтому попытка выполнить команды только для redis-cluster завершится ошибкой.

person The Real Bill    schedule 17.09.2016
comment
Спасибо, что все, я запутался между master-slave и redis cluster. Спасибо за разъяснения! - person Jahedh; 19.09.2016

В моем случае проблема была в версии redis-py-cluster (1.3.4), после переустановки на версию 1.3.1 у меня все работает нормально. Я предполагаю, что в этой версии пакета python была какая-то проблема.

person Hayk Petrosyan    schedule 05.07.2017