Оптимизация репликации в Mysql

Thank you for reading this post, don't forget to subscribe!

В базах дан­ных репли­ка­цию часто исполь­зу­ют для обес­пе­че­ния высо­кой доступ­но­сти. Одна­ко, про­цесс репли­ка­ции может нагру­жать осно­вой сер­вер (мастер). Кро­ме это­го, даже оди­на­ко­вая по ресур­сам, репли­ка может отста­вать от масте­ра. Давай­те посмотрим.

Мониторинг

После настрой­ки репли­ка­ции сле­ду­ет посто­ян­но сле­дить за несколь­ки­ми пара­мет­ра­ми на слейве:

# Запрос вер­нет ста­ти­сти­ку и настрой­ки слейва

Сто­ит обра­тить вни­ма­ние на такие показатели:

# Ста­тус рабо­ты реплики

Пока­за­те­ли Slave_IO_Running и Slave_SQL_Running отра­жа­ют нор­маль­ную рабо­ту репли­ки. Оба долж­ны иметь зна­че­ние Yes. Когда один из этих пока­за­те­лей равен No, в Last_Error будет виден текст ошиб­ки репликации.

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

Отключение sync_binlog

Пара­метр sync_binlog опре­де­ля­ет логи­ку син­хро­ни­за­ции дан­ных из бин­ло­га с дис­ком. Если зна­че­ние рав­но 1, запись на диск будет про­ис­хо­дить после каж­дой тран­зак­ции. Это дела­ет хра­ни­ли­ще очень надеж­ным, но крайне силь­но нагру­жа­ет дис­ко­вую под­си­сте­му на мастере.

Зна­че­ние 0 отклю­чит син­хро­ни­за­цию из Mysql, и база дан­ных будет пола­гать­ся на ОС в вопро­се запи­си лога на диск. Такое зна­че­ние может уве­ли­чить про­из­во­ди­тель­ность масте­ра в несколь­ко раз.

Про­ве­рить теку­щее зна­че­ние мож­но так:

# Про­вер­ка режи­ма син­хро­ни­за­ции бинлога

# Син­хро­ни­за­цию луч­ше отключить

Отклю­чить син­хро­ни­за­цию мож­но без пере­за­груз­ки сер­ве­ра, для это­го доста­точ­но выполнить:

Одна­ко не забудь­те испра­вить этот пара­метр и в my.cnf, что­бы он сохра­нил­ся после перезагрузки:

В .io мы все­гда отклю­ча­ем син­хро­ни­за­цию бин­ло­га. Это уве­ли­чи­ло про­пуск­ную спо­соб­ность наших Mysql узлов в 2…3 раза, раз­гру­зив дис­ко­вые под­си­сте­мы мастеров.

Многопоточная репликация

До недав­не­го вре­ме­ни Mysql репли­ка рабо­та­ла все­го в один поток. Тогда, даже если мастер и слейв иден­тич­ны по харак­те­ри­сти­кам, слейв все рав­но может отста­вать от мастера.

В вер­сии Mysql 5.6 внед­ре­на под­держ­ка парал­лель­ной репли­ка­ции. Она поз­во­ля­ет слей­ву обра­ба­ты­вать бин­лог парал­лель­но в несколь­ко пото­ков. Такой режим вклю­ча­ет­ся настрой­кой в my.cnf на слейве:

# Вклю­че­ние репли­ка­ции в 2 потока

Чис­ло зада­ет коли­че­ство пото­ков и может при­ни­мать зна­че­ния от 2 до 1024. Зна­че­ние 0 отклю­чит мно­го­по­точ­ную обра­бот­ку бинлога.

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

Понят­но, что если у вас все­го одна база дан­ных, вы не полу­чи­те при­рост в про­из­во­ди­тель­но­сти. Зато в вер­сии Mysql 5.7 для мож­но изме­нить тип рас­пре­де­ле­ния опе­ра­ций с помо­щью настрой­ки в my.cnf:

# Изме­не­ния типа парал­ле­ли­за­ции обра­бот­ки бинлога

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

  • Мони­торь­те Seconds_Behind_Master на слей­ве, он дол­жен быть равен нулю.
  • Отклю­чай­те син­хро­ни­за­цию бин­ло­га на масте­ре: sync_binlog = 0.
  • Исполь­зуй­те парал­лель­ную обра­бот­ку бин­ло­га на слей­ве: slave-parallel-workers = 2 (или дру­гое коли­че­ство пото­ков) в новых вер­си­ях Mysql.