RedisClusterException: слишком много соединений в redis при использовании пула соединений - PullRequest
0 голосов
/ 27 августа 2018

Я использую aredis для обработки пула соединений.Вот как я создаю экземпляры соединений redis в основной функции -

redis_conn = await asyncio.ensure_future(get_redis_conn(redis_host,       loop))

Ниже приводится определение подпрограммы -

async def get_redis_conn(host, loop):
    return StrictRedisCluster(startup_nodes=host, decode_responses=True, loop=loop, max_connections=96)

Я использую sanic для запуска веб-сервера.Вот как я это создаю -

app.run(host='0.0.0.0', port=port, after_start=after_start, workers=32)

Моя реализация каким-то образом неверна?Я не могу понять, как Redis повторно использует эти соединения?

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Поскольку redis-cluster позволяет сделать 10000 - 32 открытых соединения для каждого кластера.Теперь, если у вас есть 10 серверов, то каждый сервер не может сделать более 1000 открытых соединений.Таким образом, проблема, вероятно, для вашего случая будет, для каждого сервера, если у вас есть 50 рабочих, тогда число максимальных подключений при инициализации redis не должно быть больше 20. Попробуйте уменьшить это максимальное количество подключений на одного работника, так как оно отлично сработало для меня.

Eg:
StrictRedisCluster(startup_nodes=host, decode_responses=True, loop=loop, max_connections=35)

Таким образом, вам нужно уменьшить это ограничение max_connections на одного работника.

0 голосов
/ 18 декабря 2018

Хотя отладку проблемы без доступа к вашему коду немного затруднительна, мне кажется, что инициализация соединения кластера, которую вы используете, кажется мне неправильной.

Я сделаю предположение и скажу, что ваша "Метод main используется более 96 раз, и это приводит к исключению, которое вы получаете.

Попробуйте установить кластерное соединение только один раз для всего приложения и передайте его с помощью app:

from sanic import Sanic 
from aredis import StrictRedisCluster    


app = Sanic(__name__)

@app.listener('before_server_start')
def init(app, loop):
    app.redis_conn = StrictRedisCluster(
        startup_nodes=HOST, decode_responses=True, loop=loop, max_connections=96
    )

@app.route("/")
async def test(request):
    return json.loads(await app.redis_conn.get(cache_key))


app.run(host='0.0.0.0', port=port, after_start=after_start, workers=32)


По сути, это похоже на предложенное мной решение: Как использовать aiohttp ClientSession с Sanic?
...