Mysql
 sql >> база данни >  >> RDS >> Mysql

Изследване на MySQL Binlog сървър – Ripple

MySQL не ограничава броя на подчинените, които можете да свържете към главния сървър в топология на репликация. Въпреки това, тъй като броят на подчинените устройства се увеличава, те ще имат влияние върху главните ресурси, тъй като двоичните регистрационни файлове ще трябва да се обслужват на различни подчинени устройства, работещи с различни скорости. Ако оттичането на данни на главната машина е голямо, само обслужването на двоични регистрационни файлове може да насити мрежовия интерфейс на главния.

Класическо решение за този проблем е да се разположи binlog сървър – междинен прокси сървър, който се намира между главния и неговите подчинени. Сървърът на binlog е настроен като подчинен на главния и от своя страна действа като главен към оригиналния набор от подчинени устройства. Той получава двоични регистрационни събития от главния, не прилага тези събития, но ги обслужва на всички други подчинени устройства. По този начин натоварването на главната е значително намалено и в същото време binlog сървърът обслужва binlogs по-ефективно на подчинените, тъй като не се налага да извършва никаква друга обработка на сървър на база данни.

Ripple е binlog сървър с отворен код, разработен от Павел Иванов. Публикация в блог от Percona, озаглавена MySQL Ripple:Първото впечатление от MySQL Binlog сървър, дава много добро въведение за внедряването и използването на Ripple. Имах възможност да проуча Ripple по-подробно и исках да споделя наблюденията си чрез тази публикация.

1. Поддръжка за репликация, базирана на GTID

Ripple поддържа само GTID режим, а не репликация, базирана на файл и позиция. Ако вашият master работи в режим без GTID, ще получите тази грешка от Ripple:

Неуспешно четене на пакет:Има грешка при четене на пакет от сървъра:Нишката на подателя на репликация не може да започне в режим AUTO_POSITION:този сървър има GTID_MODE =OFF вместо ВКЛ.

Можете да посочите Server_id и UUID за ripple сървъра, като използвате опциите на cmd ред:  -ripple_server_id и  -ripple_server_uuid

И двата са незадължителни параметри и ако не са посочени, Ripple ще използва сървърния идентификатор по подразбиране=112211 и uuid ще бъде генериран автоматично.

2. Свързване към главната с помощта на потребител и парола за репликация

Докато се свързвате с главния, можете да посочите потребителя и паролата за репликация, като използвате опциите на командния ред:

 -ripple_master_user и  -ripple_master_password

3. Крайна точка на връзката за сървъра на Ripple

Можете да използвате опциите на командния ред -ripple_server_ports и -ripple_server_address, за да посочите крайните точки на връзката за сървъра на Ripple. Уверете се, че сте посочили достъпното в мрежата име на хост или IP адрес на вашия сървър на Ripple като  -rippple_server_address. В противен случай по подразбиране Ripple ще се свърже с localhost и следователно няма да можете да се свържете с него отдалечено.

4. Настройка на подчинени на сървъра на Ripple

Можете да използвате командата CHANGE MASTER TO, за да свържете вашите подчинени устройства за репликация от сървъра на Ripple.

За да гарантирате, че Ripple може да удостовери паролата, която използвате, за да се свържете с нея, трябва да стартирате Ripple, като посочите опцията -ripple_server_password_hash

Например, ако стартирате ripple сървъра с командата:

rippled -ripple_datadir=./binlog_server -ripple_master_address=   -ripple_master_port=3306 -ripple_master_user=repl -ripple_master_password='password' -ripple_server_ports=15000 -ripple_server_address='172.31.23.201' -ripple_server_password_hash='EF8C75CB6E99A0732D2DE207DAEF65D555BDFB8E'

можете да използвате следната команда CHANGE MASTER TO, за да се свържете от подчинения:

СМЯНЕТЕ ГЛАВНИЯ КЪМ master_host='172.31.23.201', master_port=15000, master_password=’XpKWeZRNH5#satCI’, master_user=’rep’

Обърнете внимание, че хешът на паролата, определен за сървъра на Ripple, съответства на текстовата парола, използвана в командата CHANGE MASTER TO. Понастоящем Ripple не удостоверява автентичността въз основа на потребителските имена и приема всяко непразно потребителско име, стига паролата да съвпада.

Изследване на MySQL Binlog Server - RippleClick To Tweet

5. Управление на сървър на Ripple

Възможно е да наблюдавате и управлявате сървъра на Ripple с помощта на MySQL протокола от всеки стандартен MySQL клиент. Има ограничен набор от поддържани команди, които можете да видите директно в изходния код на страницата на mysql-ripple GitHub.

Някои от полезните команди са:

  • ИЗБЕРЕТЕ @@global.gtid_executed; – За да видите GTID SET на сървъра на Ripple въз основа на неговите изтеглени двоични регистрационни файлове.
  • СТОП НА ПОДЧЕРЕНОТО; – За да изключите сървъра на Ripple от главния.
  • СТАРТИ РАБОТА; – За да свържете сървъра на Ripple към главния.

Известни проблеми и предложения за подобрение

1. Не видях опция за настройка на канал за репликация на SSL от сървър на Ripple към главния

В резултат на това сървърът на Ripple няма да може да се свърже с главен, който изисква криптирани връзки. Опитът за свързване ще доведе до грешка:

0322 09:01:36.555124 14942 mysql_master_session.cc:164] Неуспешно свързване към хост:, порт:3306, err:Неуспешно свързване:Връзките, използващи несигурен транспорт, са забранени, докато<--transporte_ONcure. /код>

2. Не успях да накарам сървъра на Ripple да работи с опцията за полусинхронизиране

Стартирах сървъра на Ripple, използвайки опцията -ripple_semi_sync_slave_enabled=true

При свързването му главният може да открие сървъра на Ripple като подчинен с активиран полусинхрон.

mysql> показва състояние като 'rpl%';
-------------------------------- ---------------------
| Име на променлива                              | Стойност |
----------------------------------------------------- ----------
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_status                | ВКЛ.    |
| Rpl_semi_sync_slave_status                 | ИЗКЛЮЧЕНО   |
----------------------------------------------------- ----------

Опитът за изпълнение на транзакция в полусинхронизиран режим обаче изчака rpl_semi_sync_master_timeout, който беше 180000

mysql> създайте база данни d12;
Заявката е ОК, засегнат е 1 ред (3 мин. 0,01 сек.)

Видях, че полусинхронизацията е изключена в главния:

mysql> показва състояние като 'rpl%';
+-------------------------------- ------------+-------+
| Име на променлива                              | Стойност |
+--------------------------------------------------- -+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_status                | ИЗКЛЮЧЕНО   |
| Rpl_semi_sync_slave_status                 | ИЗКЛЮЧЕНО   |
+---------------------------------------------------- -+-------+

Съответен фрагмент от регистрационните файлове за грешки на mysql:

2020-03-21T10:05:56.000612Z 52 [Забележка] Стартирайте binlog_dump към master_thread_id(52) slave_server(112211), pos(, 4)
2020-03-21T10:05:52 [2020-03-21T10:05:56. Забележка] Стартирайте полусинхронизиране на binlog_dump към подчинен (идентификатор на сървъра:112211), pos(, 4)
20020-03-21T10:08:55.873990Z 2 [Предупреждение] Изчакване на изчакване за отговор на binlog (файл:mysql-bin .000010, поз.:350), полусинхронизиране до файл , позиция 4.
2020-03-21T10:08:55.874044Z 2 [Забележка] Полусинхронизирането на репликацията е изключено.

Има проблем, докладван по подобен начин тук на страницата MySQL Ripple Github.

3. Проблем при използване на паралелна репликация за подчинените на Ripple сървър

Видях, че SQL нишката на подчинения често спира с грешката:

Last_SQL_Error:Не може да се изпълни текущата група събития в паралелен режим. Открито събитие Gtid, име на релейния дневник /mysql_data/relaylogs/relay-log.000005, позиция 27023962, което предотвратява изпълнението на тази група събития в паралелен режим. Причина:Главното събитие е логически отпечатано неправилно.

Анализирането на регистрационния файл и позицията на релето по-горе разкри, че „номерът на поредицата“ на транзакцията в този момент е нулиран на 1. Проследих причината за ротация на binlog, която се случва на оригинален майстор. Обикновено за директни подчинени има събитие за завъртане, поради което релейните регистрационни файлове също ще се въртят на базата на ротация на главния двоичен журнал. Моята оценка е, че такива условия могат да бъдат открити и нулирането на поредния номер може да се обработва от паралелни нишки. Но когато поредният номер се промени без завъртането на регистрите на релето, виждаме, че паралелните нишки се провалят.

Това наблюдение се отчита като проблем:повреда на подчинената паралелна нишка при синхронизиране от binlog сървър #26

4. Помощната програма mysqlbinlog не работи върху двоичните регистрационни файлове, произведени от сървъра на Ripple

Опитът да стартирате помощната програма mysqlbinlog в двоичния дневник доведе до грешка:

ГРЕШКА:Грешка в Log_event::read_log_event():'Намерено невалидно събитие в двоичен дневник', data_len:43, event_type:-106

Този проблем е повдигнат тук:Не може да се отворят двоичните регистрационни файлове с помощта на помощната програма mysqlbinlog. #25

Това е признато от автора като известен проблем. Смятам, че би било полезно да се поддържа тази помощна програма за целите на отстраняване на грешки.

Засега това е отчетът от моето бързо тестване. Планирам да актуализирам тази публикация в блога, когато срещна повече открития за Ripple. Като цяло открих, че е прост и ясен за използване и има потенциал да се превърне в стандарт за binlog сървъри в MySQL среди.

Още съвети за вас

Проверки на състоянието на MySQL сървър

При настройка на MySQL главен-подчинен с висока достъпност (HA) е важно непрекъснато да наблюдавате здравето на главния и подчинения сървър, за да можете да откривате потенциални проблеми и да предприемате коригиращи действия . Научете повече

Изграждания на MySQL Rolling Index

Как да оптимизирате процеса на създаване на MySQL индекс по такъв начин, че да не се повлияе на редовното ви работно натоварване. Ако имате набор от реплики главен-подчинен MySQL, можете да създавате индекса един възел в даден момент по подвижния начин. Научете повече

Висока наличност на MySQL

Наличността на дадена система е процентът на времето, през което услугите й са работели за определен период от време. Обикновено се изразява като серия от 9. Вижте наличността и съответното време на престой, измерено за една година. Научете повече


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намерете стойности, които не съдържат числа в MySQL

  2. Escape низ на Python за MySQL

  3. Как да търсите няколко колони в MySQL?

  4. Колона, изчислена от друга колона?

  5. Как да нулирате паролата на коренния потребител на MySQL