Принцип репликации master-slave Mysql и проблема задержки синхронизации

MySQL

Проблемы, решаемые репликацией master-slave

  • Распределение данных: распределяйте данные по разным географическим местоположениям посредством репликации.
  • Балансировка нагрузки: разделение чтения и записи и загрузка чтения в несколько подчиненных библиотек
  • Резервное копирование: доступно как резервное копирование в реальном времени.
  • Высокая доступность: Высокая доступность с первичной первичной репликацией

принцип репликации

Принцип репликации на самом деле очень прост и делится только на следующие три шага:

  1. Изменения данных записываются в двоичный журнал основной базы данных. В частности, прежде чем каждая транзакция будет готова к отправке для завершения обновления данных, основная база данных записывает событие обновления данных в двоичный журнал, и Mysql будет следовать порядку транзакции. отправка, запись бинарного лога. После завершения регистрации основная библиотека уведомляет механизм хранения о необходимости фиксации транзакции.

  2. Ведомая библиотека запустит поток ввода-вывода, который подключится к главной библиотеке. Поток дампа binlog в основной библиотеке будет читать события обновления в локальном файле журнала binlog в основной библиотеке. Он отправляется в подчиненную библиотеку, и после получения лога из библиотеки он будет записан в локальный релейный лог relay-log.

  3. События в журнале ретрансляции relay-log считываются из потока SQL в подчиненной библиотеке и воспроизводятся в подчиненной библиотеке. (До версии 5.6 поток SQL был однопоточным, что увеличивало задержку между ведущим и подчиненным)

Промежуток времени

Что записывает файл журнала, в конце концов, что это такое? mysql поддерживает два формата журналов, оба формата журнала также отражают собственную репликацию.

Репликация на основе операторов:

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

Копирование на основе строк:

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

Сравните два:

  • Репликация заявления:

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

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

Точки конфигурации

# 如果在双主复制结构中没有设置ID的话就会导致循环同步问题
server_id=1

# 即日志中记录的是语句还是行更新或者是混合
binlog_format=mixed

# 在进行n次事务提交以后,Mysql将执行一次fsync的磁盘同步指令。将缓冲区数据刷新到磁盘。
# 为0的话由Mysql自己控制频率。
sync_binlog=n

# 为0的话,log buffer将每秒一次地写入log file中并且刷新到磁盘。
# mysqld进程崩溃会丢失一秒内的所有事务。
# 为1的话,每次事务log buffer会写入log file并刷新到磁盘。(较为安全)
# 在崩溃的时候,仅会丢失一个事务。
# 为2的话,每次事务log buffer会写入log file,但一秒一次刷新到磁盘
innodb_flush_logs_at_trx_commit=0


# 阻止从库崩溃后自动启动复制,给一些时间来修复可能的问题,
# 崩溃后再自动复制可能会导致更多的问题。并且本身就是不一致的
skip_slave_start=1 


# 是否将从库同步的事件也记录到从库自身的bin-log中
# 允许备库将重放的事件也记录到自身的二进制日志中去,可以将备库当做另外一台主库的从库
log_slave_update 

# 日志过期删除时间,延迟严重的话会导致日志文件占用磁盘
expire_logs_days=7

Три параметра innodb_flush_logs_at_trx_commit легко спутать. Ниже приводится подробный анализ:

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

  • Параметр 0: MySQL записывает данные буфера журнала в файл журнала и сбрасывает их на диск каждую секунду. Это означает, что при сбое mysql все транзакции в течение секунды будут потеряны.
  • Параметр 1: Каждая фиксация транзакции будет записывать буфер журнала в файл журнала и сбрасывать его на диск. Это означает, что при сбое mysql будет потеряна только одна транзакция.
  • Параметр 2: Каждая фиксация транзакции будет одновременно записывать буфер журнала в файл журнала, но не на диск. MySQL будет контролировать, чтобы файл журнала сбрасывался на диск каждую секунду. При сбое MySQL операционная система не выходит из строя. ., в log_file будет потеряна только одна транзакция, операционная система по-прежнему будет сбрасывать файл журнала на диск, и если операционная система также выйдет из строя или потеряет питание, транзакции в течение секунды будут потеряны.

Рекомендуемое использование: innodb_flush_logs_at_trx_commit=2 и sync_binlog=500 будут работать быстрее. Если innodb_flush_logs_at_trx_commit и sync_binlog равны 1, это безопаснее.

проблема с задержкой

Генерация задержки:

  • Когда параллелизм TPS основной библиотеки высок, поскольку основная библиотека записывается несколькими потоками, а поток SQL подчиненной библиотеки является однопоточным, SQL подчиненной библиотеки может не поспевать за скоростью обработки основная библиотека (производитель работает эффективнее, чем потребитель быстрее, что приводит к накоплению товаров).

Замедленное разрешение:

Сеть: распространяйте подчиненную библиотеку в той же локальной сети или в среде с меньшей сетевой задержкой.

Оборудование: настройте лучшее оборудование из библиотеки, чтобы улучшить производительность произвольной записи.

Конфигурация: настройте sync_binlog=0, innodb_flush_log_at_trx_commit=2, logs-slave-updates=0 из библиотеки, увеличьте размер innodb_buffer_pool_size, разрешите выполнение большего количества операций в памяти Mysql и сократите дисковые операции. Или обновите версию Mysql5.7, чтобы использовать параллельную репликацию.

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

Личный опыт автора, если есть какие-либо ошибки, пожалуйста, не стесняйтесь комментировать и исправлять меня.

Перейдите на мой личный блог vc2x.com