Быстро понять постоянство Redis

Java
Быстро понять постоянство Redis

Серия статей Redis

Зачем нужна настойчивость

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

Постоянство Redis

RedisПредоставляет два метода сохраняемости, а именноRDBа такжеAOF.

  • RDB : RedisМетод сохраняемости по умолчанию основан наснимокдостичь при соблюдении определенных условийRedisДанные в памяти автоматически сохраняются на диске.
  • AOF : RedisНе включено по умолчаниюAOFПостоянство, необходимо установить в файле конфигурацииappendonly trueна. он хранитRedisизпоследовательная последовательность инструкций.

Сохранение в режиме RDB

сохранить метод блокировки

существуетRedisЕсть команда запускаRDBПостоянство, но эта операция будет заблокированаRedis.

Эта командаsave,мы все знаемRedisявляется однопоточным, если сохраняетсяспециальная обработкаЕсли это так, то он будет блокировать другие команды, что приведет кRedisнедоступен в течение короткого периода времени, еслиRDBЕсли файл очень большой, то операция прошивки будет занимать десятки секунд, что серьезно повлияет на удобство использования, поэтому мы его вообще не используем.saveЗаказ.

фоновый режим bgsave

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

Какое специальное лечение?

во-первыхRedisОсновной процесс вызоветglibcФункцияforkЗапускается дочерний процесс, который сохранит файлВсе персистентность передается дочернему процессу для обработки, то родительский процесс может продолжить обработку запроса пользователя (bgsaveвернется сразу после выполнения). Конечно, в основном процессеforkПри работе он также может запрашивать команды у пользователя.производить кратковременную блокировку.

Все имеет преимущества и недостатки, вы видитеbgsaveТак хорошо, нет ли минусов? Ответ - да, где это? Давайте сначала узнаемCOWмеханизм.

COW

COW(копировать при записи), т.е.копирование при записи. мы знаемRDBПостоянство требует обхода данных в памяти, как показано на рисунке ниже.

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

Итак, вот механизм создания снимков —COW. Мы знаем, что приведенный выше сегмент данных на самом деле состоит из множества операционных систем.Страницакомбинированный.COW На самом деле, когда основному процессу необходимо изменить данные в памяти, он сначала копирует страницу, на которой находятся данные, которые нужно изменить, а затем модифицирует их на скопированной странице..Когда страница копируется, она занимает дополнительную память, что такжеbgsaveкоэффициент использования памятиsaveПричин много, но сильно не переживайте, ведь запросов пользователей на изменение данных в период пересохранения будет не много, да и используемой дополнительной памяти будет не много.

Автоматически запускать RDB

существуетRedisЕсть несколько ситуаций, в которыхRDBнастойчивость, так что даже если вы выключитеRDB,Redisвсе еще будет продолжатьсяRDBупорство.

  • когда условия соблюдены

    существуетRedisВ файле конфигурации есть три конфигурации.

    save 900 1
    save 300 10
    save 60 10000
    

    Это на самом делеRDBПричина, по которой он включен по умолчанию в , его формат такойsave seconds changeTimes,saveПервое число позади — это время, а второе число — количество модификаций.Эти три конфигурации означают, что одна модификация выполняется в течение 900 секунд, или 10 модификаций — в течение 300 секунд, или 10 000 — в течение 60 секунд. быть сделаннымRDBавтоматическая настойчивость.

  • shutdownкогдаRedisЭто будет сделано во время обычного завершения работыRDBУпорство.

  • flushallбудет производить пустойRDBдокумент

  • Когда master-slave репликация полностью реплицирована (пока этого достаточно для понимания, о кластере Redis я расскажу в следующей статье)

Преимущества RDB

  • RDBфайл, который сжат и хранит данные, которые могут бытьБыстрое аварийное восстановление.
  • Подходит для холодного приготовления.

Недостатки РБД

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

Стойкость АОФ

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

appendonly yes   # 默认为no这里设置yes开启
dir ./           # aof文件目录
appendfilename "appendonly-6379.aof" #aof文件名

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

# appendfsync always  每次进行修改操作就进行写盘
appendfsync everysec  每秒进行一些写盘
# appendfsync no      从不

RedisВсего предусмотрено три параметра, обычно рассмотрите настройкуeverysecЗаписывает на диск каждую секунду, что снижает как эффективность, так и потерю данных.

Принцип АОФ

AOFЖурнал хранится дляRedisинструкции по эксплуатации, сAOFlog мы можем использовать его дляRedisповтор.

Например, в это время мыAOFзаписано в журналеset hello worldа такжеsadd userset FancisQС помощью этих двух команд мы можемRedisпример сделать этоAOFвоспроизведение файла, и в итоге это пустоеRedisВыше есть две записи.

вы можете найтиRedisДва метода сохранения в очень похожиMySQLсерединаbin logа такжеredo log, но вы должны заметить, чтоRedisсерединаAOFдаСначала выполните команду, а затем сохраните журнализ. с участиемMySQLсерединаWALМеханизм прямо противоположный.

Зачем? Я думаю, что есть два момента.

  1. RedisЭто слабая транзакция, нам не нужно обеспечивать сильную согласованность данных. существуетMySQLв мы использовалиredo logдвухэтапная фиксациягарантироватьsave-crashспособности, при этомRedisОчевидно, что нам не нужно этого делать.Если команда упадет до записи журнала после выполнения команды, она исчезнет.Из-за слабых транзакций мы не должны гарантировать, что данные должны существовать.
  2. Во избежание хранения в логе неправильных инструкций, если мы пишем лог первым, значит мы не выполнили соответствующую работу в начале.Логическая обработка и проверка параметров, так что это будетСначала было записано много неправильных инструкций, но мы знаемAOFфайл требуетсяхудетьДа, эти инструкции по ошибкам дадутAOFПохудение приносит много хлопот.

AOF переписать

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

Напримерset a b,set a c,set a d.....

На самом деле три вышеупомянутыхkeyОперация выполняется над данными a, вRDBэто может только выжитьa = d,Но потому чтоAOFмеханизм инструкций, должно существовать три, но первое бессмысленно, что займет много места и дастAOFПовтор приносит неприятности.

такRedisБудет вAOFКогда файл слишком большой (соответствует определенному условию)автоматическийAOFпереписать. Соответственно таких конфигураций в конфигурационном файле две.

# 下面两条需要同时满足
# 表示当前 aof 文件超过上次 aof文件大小的百分之多少时会进行重写,如果没有重写过则以启动时的大小为标准
auto-aof-rewrite-percentage 100 
# 文件大于多少的时候进行重写
auto-aof-rewrite-min-size 64mb

Так,AOFКак переписывается?

bgrewriteaof

ЭтоAOFКоманда перезаписи (описанный выше процесс перезаписи на самом делеbgrewriteaof),а такжеbgsaveТакой же,Redisтакже будетforkДочерний процесс, пусть дочерний процесс берет на себя ответственностьAOFперезаписать файл. Общий процесс выглядит следующим образом:

Преимущества и недостатки АОФ

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

Гибридное постоянство Redis

существуетRedisДо 4.0 мы обычно открывалиAOFЗатем выбросьте его, когда вам нужно восстановить состояние памяти.Воспроизведение журнала AOF ( Если вы используете RDB, вы потеряете много данных). но еслиRedisПример большой,AOFЕсли файл также большой, это вызоветRedisПерезагрузка очень медленная.

Для решения этой проблемы вRedisПосле 4.0 мы можемRDBдокументы иAOFИнкрементные журналы хранятся вместе. Если мы восстановим состояние памяти в это время, мы сможем использовать предыдущееRDBраздел, а затем используйтеRDBИнкрементальный журнал AOF создается после сохранениявыполнить восстановление состояния памяти, чтобы сократить время.

Как выбрать RDB и AOF

  • Вообще говоря, если есть определенные требования к безопасности данных, вам следуетИспользуйте обе функции сохраняемости одновременно.
  • еслиМожет противостоять минутной потере данныхможно просто использоватьRDB.
  • AOFиспользовать как можно большеeverysecКонфигурация может не только обеспечить безопасность данных, но и обеспечить эффективность работы.
  • RDBблизкоsave seconds changeTimesЭто автоматический механизм сохраняемости или разумное использование параметров.

карта разума

Спасибо за чтение. Поделитесь с вами своей картой ума (#^.^#)