Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик аккаунт, просьба указывать источник перепечатываемой статьи.
В этой статье мы продолжим оRedis
Давайте узнаем об одной из самых важных вещей:Redis
механизм постоянства.
Что такое постоянство Redis?
Redis
в виде пары ключ-значение в памяти базы данных (NoSQL
), данные хранятся в памяти, и при обработке клиентских запросов все операции выполняются в памяти следующим образом:
Что плохого в этом?
На самом деле, любой, кто хоть немного разбирается в компьютерах, знает, что данные, хранящиеся в памяти, исчезнут, пока сервер будет выключен (вызванный разными причинами), не только выключение сервера приведет к исчезновению данных,Redis
Демон сервера завершает работу, и данные в памяти также исчезают.
только дляRedis
Когда кеш используется для проекта, исчезновение данных может не быть проблемой, и данные могут быть загружены из источника данных снова, но если бизнес-данные, отправленные пользователем, хранятся непосредственно вRedis
Среди них поставитьRedis
Используется в качестве базы данных для хранения важных бизнес-данных, а затемRedis
Последствия потери данных памяти могут быть разрушительными.
Чтобы избежать потери данных в памяти,Redis
Предоставляет поддержку сохранения, мы можем выбирать различные способы сохранения данных из памяти на жесткий диск, чтобы данные могли сохраняться.
Redis
при условииRDB
иAOF
Два разных метода сохранения данных, давайте подробно представим эти разные методы сохранения.
RDB
RDB
Это метод сохраняемости моментальных снимков, который заключается в храненииRedis
Данные памяти в определенное время сохраняются в файл на жестком диске, а имя файла, сохраненное по умолчанию, называетсяdump.rdb
, пока вRedis
Когда сервер запустится, он будет перезагруженdump.rdb
Данные файла восстанавливаются в памяти.
Включить сохраняемость RDB
включиRDB
Метод сохранения очень прост, клиент можетRedis
сервер отправляетsave
илиbgsave
команда, чтобы заставить сервер генерироватьrdb
файл, или указать триггер через файл конфигурации сервераRDB
состояние.
1. сохранить команду
save
Команда является синхронной операцией.
# 同步数据到磁盘上
> save
Когда клиент отправляет на серверsave
Сервер блокируется, когда запрос команды сохраняетсяsave
Запросы от других клиентов после команды до завершения синхронизации данных.
Если объем данных слишком велик, данные синхронизации будут выполняться долго, и сервер Redis не может принимать другие запросы в течение этого периода, поэтому лучше не использовать его в производственной среде.
save
Заказ.
2. bgsave
иsave
различные команды,bgsave
Команда является асинхронной операцией.
# 异步保存数据集到磁盘上
> bgsave
Когда клиент отправляет услугуbgsave
Когда приказали,Redis
Основной серверный процесс будетforks
Дочерний процесс для проблемы синхронизации данных, после сохранения данных в файл rdb дочерний процесс завершится.
Итак, сsave
по сравнению с командойRedis
сервер обрабатываетbgsave
Используйте дочерние потоки для записи ввода-вывода, в то время как основной процесс все еще может получать другие запросы, ноforks
Дочерний процесс является синхронным, поэтомуforks
Когда это дочерний процесс, он не может получать другие запросы, а это означает, что если разветвление дочернего процесса занимает слишком много времени (обычно очень быстро), команда bgsave по-прежнему блокирует запросы других клиентов.
3. Конфигурация сервера запускается автоматически
Помимо отправки команд через клиент, есть еще один способ, то есть вRedis
в файле конфигурацииsave
Укажите условие, которое запускает сохраняемость RDB, например [сколько операций записи выполняется как минимум за сколько секунд], чтобы открытьRDB
синхронизация данных.
Например, мы можем указать следующие параметры в файле конфигурации redis.conf:
# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000
Затем файл конфигурации загружается при запуске сервера.
# 启动服务器加载配置文件
redis-server redis.conf
Этот метод запуска RDB через файл конфигурации сервера аналогичен команде bgsave.При достижении условия запуска он разветвляет дочерний процесс для синхронизации данных, но лучше не запускать сохранение RDB таким образом, потому что параметр слишком короткое время запуска, легко часто записывать в файл rdb, что влияет на производительность сервера.Если установка времени слишком длинная, это приведет к потере данных.
RDB-файл
Выше описаны три способа позволить серверу генерировать RDB-файлы, независимо от того, генерируется ли он основным процессом или подпроцессом.
- Создайте временный файл rdb и запишите данные.
- Завершите запись данных и замените официальный файл rdb временным текстом.
- Удалите исходный файл БД.
Имя файла, сгенерированное RDB по умолчанию, — dump.rdb.Конечно, я могу настроить его более подробно через файл конфигурации.Например, когда несколько процессов сервера redis запускаются под одной машиной, разные имена rdb можно настроить через номер порта, как показано ниже:
# 是否压缩rdb文件
rdbcompression yes
# rdb文件的名称
dbfilename redis-6379.rdb
# rdb文件保存目录
dir ~/redis/
Несколько преимуществ RDB
- По сравнению с методом AOF восстановление данных через файлы rdb происходит быстрее.
- rdb очень компактны и подходят для резервного копирования данных.
- Резервное копирование данных через RDB мало влияет на производительность сервера Redis из-за использования генерации подпроцессов.
Несколько недостатков RDB
- Если сервер не работает, используйте
RDB
Этот метод приведет к потере данных через определенный период времени, например, если мы установим синхронизацию один раз в 10 минут или один раз в 5 минут при достижении 1000 записей, то, если сервер выйдет из строя до достижения условия триггера, данные в этот период будет потерян. - Использование команды сохранения приведет к блокировке сервера, и последующие запросы могут быть получены только после завершения синхронизации данных.
- Когда команда bgsave используется для разветвления дочернего процесса, если объем данных слишком велик, процесс разветвления также будет заблокирован.Кроме того, дочерний процесс разветвления будет потреблять память.
AOF
закончил говоритьRDB
, давай поболтаемRedis
Другой метод сохранения:AOF(Append-only file)
.
иRDB
Хранение снимка в определенный момент отличается,AOF
Persistence будет записывать каждую команду операции записи от клиента к серверу и сохранять эти операции записи в видеRedis
Добавление протокола сохраняется в суффиксе какaof
В конце файла при перезагрузке сервера Redis он будет загружен и запущенaof
файловые команды с целью восстановления данных.
Включить сохранение AOF
По умолчанию Redis не включает сохранение AOF. Мы можем включить его в файле конфигурации и настроить более подробно, как показано в следующем файле redis.conf:
# 开启aof机制
appendonly yes
# aof文件名
appendfilename "appendonly.aof"
# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no
appendfsync always
# 默认不重写aof文件
no-appendfsync-on-rewrite no
# 保存目录
dir ~/redis/
Три стратегии записи
В приведенном выше файле конфигурации мы можем передатьappendfsync
option указывает стратегию записи, есть три варианта
appendfsync always
# appendfsync everysec
# appendfsync no
1. always
Каждая операция записи клиентом сохраняется вaof
Для файлов эта стратегия очень безопасна, но каждая запись имеет операцию ввода-вывода, поэтому она также очень медленная.
2. everysec
appendfsync
Политика записи по умолчанию, запись один раз в секунду.aof
файла, поэтому может быть потеряно до 1 с данных.
3. no
Redis
Сервер не несет ответственности за написаниеaof
, но оставьте на усмотрение операционной системы, когда писатьaof
документ. Более быстрый, но наименее безопасный вариант и не рекомендуется.
Перезапись файла AOF
AOF добавляет каждую запись от клиента кaof
В конце файла, например, при многократном выполнении команды incr для ключа, в это времяaof
Сохраните каждую команду в файл aof, файл aof станет очень большим.
incr num 1
incr num 2
incr num 3
incr num 4
incr num 5
incr num 6
...
incr num 100000
Файл aof слишком велик. При загрузке файла aof для восстановления данных он будет очень медленным. Чтобы решить эту проблему, Redis поддерживает перезапись файла aof. При перезаписи файла aof требуется минимальный набор команд для восстановление текущих данных может быть сгенерировано, например, как в приведенном выше примере.Так много команд можно переписать как:
set num 100000
Файл aof представляет собой двоичный файл. Он не сохраняет каждую команду напрямую, как в приведенном выше примере, а использует собственный формат Redis. Вышеприведенное является просто удобной демонстрацией.
Два способа переписать
Через параметр no-appendfsync-on-rewrite в конфигурационном файле redis.conf можно указать, включать ли перезапись.Этот метод будет перезаписываться каждый раз при fsync, что будет влиять на производительность сервера.Поэтому значение по умолчанию - нет, что не рекомендуется использовать.
# 默认不重写aof文件
no-appendfsync-on-rewrite no
Клиент отправляет серверу команду bgrewriteaof, и сервер также может выполнять перезапись AOF.
# 让服务器异步重写追加aof文件命令
> bgrewriteaof
Метод перезаписи AOF также является асинхронной операцией, то есть, если файл aof должен быть записан, основной процесс Redis разветвит дочерний процесс для его обработки, как показано ниже:
Преимущества перезаписи файлов aof
-
Сжимайте файлы, чтобы уменьшить использование диска.
-
Команда aof сжата в минимальный набор команд, что увеличивает скорость восстановления данных.
Повреждение файла AOF
При записи файла журнала aof, если сервер Redis не работает, файл журнала aof будет иметь ошибку формата.При перезапуске сервера Redis сервер Redis откажется загружать файл aof.Вы можете восстановить файл aof и восстановить данные с помощью следующих шагов.
-
Сделайте резервную копию файла now aof на всякий случай.
-
Используйте команду redis-check-aof для восстановления файла aof Формат команды следующий:
# 修复aof日志文件
$ redis-check-aof -fix file.aof
- Перезапустите сервер Redis, загрузите восстановленный файл aof и восстановите данные.
Преимущества АОФ
AOF просто добавляет файлы журнала, поэтому он меньше влияет на производительность сервера, работает быстрее, чем RDB, и потребляет меньше памяти.
Недостатки АОФ
-
Файл журнала, сгенерированный методом AOF, слишком велик.Даже если он перезаписывается с помощью AFO, размер файла все равно велик.
-
Восстановление данных происходит медленнее, чем RDB.
Должен ли я выбрать RDB или AOF?
Благодаря приведенному выше введению мы понимаем преимущества и недостатки RDB и AOF Как выбрать?
С помощью следующих выражений мы можем сравнить RDB и AOF по нескольким аспектам.При применении мы должны выбрать RDB или AOF в зависимости от наших реальных потребностей.На самом деле, если вы хотите, чтобы данные были достаточно безопасными, вы можете включить оба метода, но Одновременная операция ввода-вывода двух методов сохраняемости серьезно повлияет на производительность сервера, поэтому иногда приходится делать выбор.
Когда включены и RDB, и AOF, Redis будет предпочтительно использовать журнал AOF для восстановления данных, поскольку файлы, сохраненные AOF, являются более полными, чем файлы RDB.
резюме
выше много сказаноRedis
знание механизма персистентности, на самом деле, если вы простоRedis
В качестве сервера кэширования вы можете вообще игнорировать персистентность, но сегодня в большинстве серверных архитектурRedis
Он играет только роль кэш-сервера, а также может использоваться в качестве базы данных для сохранения наших бизнес-данных.В настоящее время нам нужно понять соответствующиеRedis
Отличие и выбор стратегии настойчивости.
Ваше внимание — самое большое поощрение на моем писательском пути!