Восстановление большого размера sh (> 1 ГБ) из файла rdb в Redis - PullRequest
0 голосов
/ 15 апреля 2020

Моя база данных Redis в настоящее время имеет большую таблицу ha sh - ок. 130 м пар ключ / значение, где каждый ключ и значение являются целыми числами (очевидно, хранятся в виде строки). Ха sh отлично работает в базе данных и потребляет <10 ГБ памяти общей системной памяти 64 ГБ, согласно `Redis.info (): </p>

'used_memory_human': '9.05G'

Это ха вычислительно дорого для создания этого ха sh, займет ~ 5,5 часов, чтобы завершить через 16 ядер. По этой причине я хочу иметь возможность выгрузить таблицу ha sh на диск и восстановить ее при запуске приложения. Я смог сделать дамп таблицы ha sh на диск успешно используя:

rdb = redis.Redis()

def dump_lookup_table():
    with open('redis_dumps/full_hash.rdb', 'wb') as full_hash_file:
        full_hash_file.write(rdb.dump("my_redis_hash"))

В результате файл 2,4 ГБ был сохранен в соответствующей папке. Проблема в том, что я пытаюсь восстановить файл ha sh из файла:

def restore_lookup_table():
    with open('redis_dumps/full_hash.rdb', 'rb') as full_hash_file:
        rdb.restore("my_redis_hash", 0, full_hash_file.read())

ConnectionError: Error 104 while writing to socket. Connection reset by peer.

Я протестировал с подразделом ha sh (около 25 м записей), который является файлом ~ 900 МБ на диске. Это успешно восстанавливается, поэтому проблема заключается в том, что Redis ограничивает принятие этого очень большого файла для восстановления.

При просмотре документов кажется, что я установил жесткий предел Query Buffer, описанный здесь , который ограничивает максимальный размер буфера клиента до 1 ГБ. Если я неправильно читаю docs и / или файл redis.conf, это, похоже, не настраивается, поэтому я не могу увеличить его, чтобы разрешить восстановление дампа 2,4 ГБ rdb.

Один потенциал Обходной путь, который я нашел, заключается в создании промежуточного временного файла, в который я копирую подмножество ключей, затем выкидываю этот ха sh в rdb и удаляю его. Затем я могу восстановить временные хеши по отдельности и скопировать ключи в мой единственный нужный ха sh. Это работает, но это очень, очень медленно по сравнению с простым дампом / восстановлением единственного ха sh.

Есть ли общепринятый способ для сброса / восстановления относительно больших хешей, подобных этому? Или есть ли способ переопределить или обойти жесткий предел в 1 ГБ в клиентском буфере?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...