Подробное объяснение настойчивости Redis Aof

Redis
Подробное объяснение настойчивости Redis Aof

Redis — это база данных в памяти, которая хранит данные в памяти, а эффективность чтения и записи намного выше, чем у традиционных баз данных, которые хранят данные на диске. Но как только процесс завершится, данные Redis будут потеряны.

Чтобы решить эту проблему, Redis предоставляет две схемы сохранения, RDB и AOF, для сохранения данных в памяти на диск во избежание потери данных. Введение RDB находится в этой статье«Сведения о сохранении Redis RDB», сегодня давайте рассмотрим принципы, связанные с AOF.

Постоянство AOF (добавлять только файл) записывает каждую команду записи в независимый журнал и повторно выполняет команды в файле AOF при перезапуске Redis для восстановления данных. Основная роль AOF заключается в решении проблемы сохранения данных в реальном времени.

РБД и АОФ

Антирез описал преимущества и недостатки RDB и AOF в статье «Redis Persistence Decryption»:

  • RDB — это компактно сжатый двоичный файл, представляющий резервную копию данных Redis на определенный момент времени. Он очень подходит для резервного копирования, полной репликации и других сценариев. Например, выполняйте резервное копирование bgsave каждые 6 часов и копируйте файл RDB на удаленный компьютер или в файловую систему для аварийного восстановления.
  • Redis загружает RDB и восстанавливает данные намного быстрее, чем AOF
  • Данные в режиме RDB не могут обеспечить постоянство в реальном времени, но в режиме AOF это возможно.

Далее давайте посмотрим, как AOF обеспечивает постоянство в реальном времени.

Реализация сохраняемости AOF

示意图

Как показано на рисунке выше, реализацию функции персистентности AOF можно разделить на команды добавления (append), записи файлов (write), синхронизации файлов (sync), перезаписи файлов (rewrite) и перезапуска загрузки (load). Процесс выглядит следующим образом:

  • Все команды записи добавляются в буфер AOF.
  • Буфер AOF синхронизируется с жестким диском в соответствии с соответствующей политикой.
  • Поскольку файл AOF становится все больше и больше, файл AOF необходимо регулярно переписывать для достижения цели сжатия.
  • Когда Redis перезапускается, файл AOF может быть загружен для восстановления данных.

команда добавить

Когда функция сохраняемости AOF включена, после того, как Redis выполнит команду записи, она добавит выполненную команду записи на сервер Redis в формате протокола (то есть RESP, протокол связи для взаимодействия между клиентом Redis и сервером). ) Конец буфера AOF сохраняется.

Например, команда SET mykey myvalue записывается в буфер AOF в следующем формате.

"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"

Формат протокола Redis это не будет повторяться, причина AOF, почему прямое соглашение в текстовом формате, потому что все операции добавления команд записи должны выполняться непосредственно с использованием формата протокола, чтобы избежать накладных расходов на вторичную обработку.

Запись файлов и синхронизация

Каждый раз, когда Redis завершает цикл событий, он вызываетflushAppendOnlyFileФункция для определения необходимости записи и синхронизации содержимого буфера AOF в файл AOF.

flushAppendOnlyFileПоведение функции определяется конфигурацией redis.confappendfsyncстоимость опции. Этот параметр имеет три необязательных значения:always,everysecиno:

  • always: Redis записывает все содержимое буфера AOF в файл AOF в каждом цикле событий и синхронизирует файл AOF, поэтомуalwaysЭффективностьappendfsyncХудший из трех вариантов, но и самый безопасный с точки зрения безопасности. Постоянство AOF также теряет только данные команды, сгенерированные в одном цикле событий, когда происходит время простоя.
  • everysec: Redis записывает все содержимое буфера AOF в файл AOF в каждом цикле событий и каждую секунду синхронизирует файл AOF в дочернем потоке. С точки зрения эффективности этот режим достаточно быстр. В случае простоя теряется только одна секунда командных данных.
  • no: Redis записывает все содержимое буфера AOF в файл AOF в каждом цикле событий. Синхронизация файлов AOF контролируется операционной системой. Этот режим самый быстрый, но интервал синхронизации больше, и в случае сбоя может быть потеряно больше данных.

Под системой Linux.writeОперация запускает механизм отложенной записи. Linux предоставляет буферы страниц в ядре для обеспечения производительности операций ввода-вывода на жестком диске.writeОперация возвращается сразу после записи в системный буфер. Синхронные дисковые операции зависят от системных механизмов планирования, таких как заполнение пространства страницы буфера или достижение определенного периода времени. Перед синхронизацией файлов, если в это время произойдет сбой системы, данные в буфере будут потеряны.

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

appendfsyncТри значения представляют три разных вызоваfsyncстратегия. перечислитьfsyncЧем чаще цикл, тем хуже эффективность чтения и записи, но чем выше соответствующая безопасность, тем меньше данных теряется в случае простоя.

Роль ввода-вывода Linux и различных системных вызовов показана на следующем рисунке. Конкретный контент можно просмотреть«Разговор о вводе-выводе в Linux»одна статья.

示意图

Восстановление данных AOF

Файл AOF содержит все команды записи, необходимые для восстановления данных Redis, поэтому Redis может восстановить состояние перед закрытием Redis, прочитав и повторно выполнив команды записи, сохраненные в файле AOF.

示意图

Подробные шаги для чтения Redis файла AOF и восстановления состояния базы данных следующие:

  • Создайте поддельный клиент без сетевого подключения, потому что команды Redis могут выполняться только в контексте клиента, а команды, используемые для загрузки файла AOF, поступают непосредственно из файла AOF, а не через сетевое подключение.Поэтому сервер использует псевдоклиент без сетевого подключения для выполнения команды записи, сохраненной в файле AOF.Эффект выполнения команды из псевдоклиента точно такой же, как и у клиента с сетевым подключением.
  • Разберите и извлеките команду записи из файла AOF.
  • Выполните команду чтения и записи, используя псевдоклиент.
  • Шаги 2 и 3 выполняются до тех пор, пока не будут обработаны все команды записи в файл AOF.

После выполнения вышеуказанных шагов состояние базы данных, сохраненное в файле AOF, будет полностью восстановлено.

AOF переписать

Поскольку постоянство AOF записывает состояние Redis, сохраняя выполненные команды записи, поскольку Redis работает в течение длительного времени, содержимое файла AOF будет увеличиваться, а размер файла также будет увеличиваться. чтобы повлиять на Redis и даже на хост-компьютер.

Чтобы решить проблему расширения объема файла AOF, Redis предоставляет функцию перезаписи (перезаписи) файла AOF. С помощью этой функции Redis может создать новый файл AOF для замены существующего файла AOF. Состояние Redis, сохраняемое старым и новым файлами AOF, одинаково, но новый файл AOF не будет содержать никаких команд чести, занимающих много места, поэтому размер нового файла AOF обычно намного меньше размера старого файла AOF. .

示意图

Как показано на рисунке выше, перед перезаписью запись с именемlistСостояние ключа, файл AOF должен сохранить пять команд, а после перезаписи нужно сохранить только одну команду.

Перезапись файла AOF не требует каких-либо операций чтения, анализа или записи в существующем файле AOF, но достигается путем чтения текущего состояния базы данных сервера. Сначала прочитайте текущее значение ключа из базы данных, а затем используйте одну команду для записи пары ключ-значение вместо нескольких команд для записи пары ключ-значение ранее.Это принцип реализации функции перезаписи AOF.

В реальном процессе, чтобы избежать переполнения входного буфера клиента при выполнении команды, перезапись AOF будет иметь дело с четырьмя типами ключей, которые могут иметь несколько элементов, таких как список, хэш-таблица, набор и отсортированный набор. количество элементов, содержащихся в ключе, если число превышает константу REDIS_AOF_REWRITE_ITEMS_PER_CMD (обычно 64), используйте несколько команд для записи значения ключа вместо одной команды.

Существует три основных триггерных механизма перезаписи:

  • Вручную вызовите команду bgrewriteaof. Если в данный момент выполняется подпроцесс перезаписи, эта перезапись будет отложена, в противном случае перезапись будет запущена напрямую.
  • Вручную включите функцию AOF с помощью инструкции по настройке.Если нет подпроцесса RDB, будет инициирована перезапись для записи данных в текущей базе данных в файл перезаписи.
  • В таймере Redis, если есть перезапись, которую необходимо завершить, и нет запущенного RDB или подпроцесса перезаписи, условие перезаписи будет активировано один раз или размер файла AOF достигнет настроенного условия перезаписи.

Перезапись фона AOF

Функция перезаписи AOF будет выполнять большое количество операций записи, а поток, вызывающий функцию, будет заблокирован на длительное время, поэтому Redis выполняет операцию перезаписи AOF в дочернем процессе.

  • Во время перезаписи AOF дочернего процесса процесс Redis может продолжать обрабатывать клиентские командные запросы.
  • Дочерний процесс имеет копию данных памяти родительского процесса, что также может обеспечить безопасность данных в случае, когда блокировки неприменимы.

Тем не менее, во время RESTART во время дочернего процесса REDIS получает команду клиента, которая будет изменять существующую статус базы данных, что привело к непоследовательной сохранению состояния базы данных в текущем состоянии данных и перезаписи файла AOF.

С этой целью Redis устанавливает буфер перезаписи AOF, который используется после того, как сервер создает дочерний процесс.Когда Redis выполняет команду записи, он одновременно отправляет команду записи в буфер AOF и переписывает AOF.буфер.

示意图

Когда дочерний процесс завершит работу по перезаписи AOF, он отправит сигнал родительскому процессу.После того как родительский процесс получит сигнал, он вызовет обработчик сигнала и выполнит следующую работу:

  • Запишите все содержимое буфера перезаписи AOF в новый файл AOF и убедитесь, что состояние базы данных, сохраненное в новом файле AOF, соответствует текущему состоянию сервера.
  • Переименуйте новый файл AOF, атомарно перезапишите существующий файл AOF и завершите замену старого и нового файлов.
  • Продолжить обработку команд запроса клиента.

В течение всего процесса фоновой перезаписи AOF только выполнение обработчика сигнала будет блокировать основной процесс Redis, в остальных случаях фоновая перезапись AOF не будет блокировать основной процесс.

示意图

постскриптум

В будущем я продолжу изучать репликацию и кластеризацию Redis, и я надеюсь, что вы продолжите уделять мне внимание.

Адрес личного блога:remcarpediem