MySQL е система за управление на релационна база данни, която е един от най-популярните проекти с отворен код. Въпреки че е известен със своята стабилност, MySQL е още по-надежден, ако е конфигурирана репликация на източник-реплика. При репликация един MySQL сървър обикновено се обозначава като източник . Източникът изпраща всякакви промени в базата данни и актуализации на данни до едно или повече реплика сървъри на база данни. Процедурата за репликация на данни на MySQL е гъвкава и сървърите за реплики не трябва да бъдат постоянно свързани с източника. Това ръководство обяснява как да конфигурирате репликация на данни източник-реплика в MySQL.
Как работи репликацията на MySQL данни
Процесът на репликация първо съхранява данни в изходната база данни и след това ги копира във всякакви реплики. След като обработи инструкцията, изходният сървър на база данни проследява промяната в двоичен дневник. Дневникът служи като последователен запис на всички промени в структурата и съдържанието на базата данни. SELECT изразите не се записват, защото не променят съдържанието на базата данни.
Актуализациите се случват асинхронно, така че репликите не трябва да бъдат непрекъснато свързани. Това контрастира със синхронните архитектури на системите с висока надеждност. Ако е необходима синхронизация в реално време, MySQL препоръчва използването наNDB Cluster .
Всяка реплика извлича данни от източника, като изисква съдържанието на двоичния дневник на източника. След това репликата прилага изявленията по ред, като ефективно възпроизвежда събитията, възникнали в източника. Всяка реплика е независима и следи текущата си позиция с изходния двоичен журнал. Освен това всяка реплика може да се синхронизира с източника според собствения си график. Данните могат да се четат от всеки от сървърите, включително репликите.
MySQL позволява висока степен на детайлност. Възможно е да се репликира върху определени бази данни или дори конкретни таблици в базата данни. Форматът за репликация по подразбиране е Репликация, базирана на оператор (SBR), в който се репликира целият SQL оператор. Въпреки това, Репликация, базирана на ред (RBR) също е наличен. Този формат репликира редовете, които са били променени. Възможно е също така да се конфигурират по-сложни конфигурации много към много. Консултирайте се с MySQL Documentation за повече информация относно различните опции за репликация.
Забележка MySQL по-рано нарича репликация източник-реплика като "главна-подчинена репликация". MySQL организацията наскоро промени терминологията, обяснявайки аргументите си в актуализацията на терминологията. По-старият термин „главен“ е променен на „източник“, докато „подчинен“ вече се нарича „реплика“. Старите термини все още може да се появяват в определени команди и изходни дисплеи, докато MySQL актуализира своята кодова база. Това ръководство използва предпочитаните термини на MySQL в инструкциите.
Предимства на MySQL репликация на данни
Разрешаването на репликация на източник-реплика предлага много значителни предимства пред неизлишната система. Списъкът по-долу предоставя преглед на някои предимства:
-
Лесно е да създадете живо архивно копие по всяко време. Тъй като процесът на репликация е асинхронен, репликацията може да се извърши по всеки график. Не е необходимо копията да се поддържат в синхрон с източника, за да работят надеждно.
-
Добавянето на реплика може да увеличи времето за работа и надеждността на цялата система. Първичният контрол може да премине към репликата, ако е необходима поддръжка или изходната база данни не е налична.
-
Всяка реплика предоставя друг четим екземпляр на базата данни. Това позволява на програмите за извличане на данни или анализ на данни да заявяват репликата, без да поставят допълнително натоварване върху оригиналната база данни.
-
Тази архитектура увеличава мащабируемостта и производителността. Базата данни чете и
SELECTизявленията могат да бъдат балансирани между сървърите, намалявайки латентността. -
Трети страни могат да получат достъп само за четене до база данни чрез реплика и вече не изискват достъп до източника. Реплика на база данни може да бъде създадена при поискване, когато е необходима, и унищожена, когато вече не е необходима. Тази техника подобрява сигурността и гарантира, че е невъзможно да се подправят оригиналните данни.
Преди да започнете
-
Ако все още не сте го направили, създайте акаунт в Linode и Compute Instance. Вижте нашите ръководства Първи стъпки с Linode и Създаване на изчислителен екземпляр.
-
Следвайте нашето ръководство за настройка и осигуряване на изчислителен екземпляр, за да актуализирате вашата система. Може също да пожелаете да зададете часовата зона, да конфигурирате името на хоста си, да създадете ограничен потребителски акаунт и да укрепите SSH достъпа.
-
Трябва да имате поне два отделни Linode, за да конфигурирате репликацията на MySQL източник-реплика. Един Linode хоства изходната база данни, докато друг възел е необходим за реплики сървъра.
Забележка Стъпките в това ръководство са написани за потребител без root права. Командите, които изискват повишени привилегии, имат префикс сsudo. Ако не сте запознати сsudoкоманда, вижте ръководството за потребители и групи на Linux.
Конфигуриране на репликация на източник-реплика в MySQL
За да конфигурирате репликация на източник-реплика, MySQL трябва да бъде инсталиран на два отделни сървъра, които могат да комуникират един с друг. Тези инструкции са насочени към дистрибуцията на Ubuntu, но като цяло са приложими за всички дистрибуции на Linux. Процесът се състои от следните стъпки:
- Инсталирайте MySQL.
- Конфигурирайте изходната база данни на MySQL.
- Конфигурирайте нов потребител на MySQL за репликата.
- Подгответе MySQL данните за репликация.
- Конфигурирайте базата данни за реплики на MySQL.
- Импортирайте репликираните MySQL данни и активирайте репликацията.
Инсталирайте MySQL
Ако MySQL не е наличен и на двата Linodes, инсталирайте го, като използвате следните стъпки:
-
Надстройте Linodes.
sudo apt-get update && sudo apt-get upgrade -
Инсталирайте MySQL сървъра и клиентските приложения както на изходния, така и на реплики сървъра.
sudo apt-get install mysql-server mysql-client -y -
Конфигурирайте опциите за сигурност, включително root паролата, като използвате
mysql_secure_installationкоманда.sudo mysql_secure_installation -
Ако използвате защитна стена като
ufw, уверете се, че позволява преминаването на MySQL трафик. Добавете следното правило, за да отворите порт3306на защитната стена.ufw allow mysql
Конфигуриране на изходната база данни на MySQL
За да активирате репликацията на MySQL, редактирайте някои променливи в основния конфигурационен файл на MySQL. Направете следните промени в конфигурацията на изходната база данни.
-
Намерете основния конфигурационен файл на MySQL на сървъра на базата данни източник. Този файл обикновено се намира в
/etc/mysql/mysql.conf.d/mysqld.cnf. Въпреки това в по-ранни инсталации той може да се намира в/etc/my.cnfили/etc/mysql/my.cnf. Може също да се направи препратка от един от файловете чрезincludedirдиректива. -
Отворете конфигурационния файл на MySQL и променете
bind-addressкъм IP адреса на изходния сървър.- Файл:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2bind-address = <source_ip_address>
-
Разкоментирайте или добавете редовете за
server-idиlog-bin. Задайтеserver-idдо1иlog-binкъм/var/log/mysql/mysql-bin.log.Забележка Уверете се, че
skip_networkingпроменливата не е декларирана никъде. Коментирайте го, ако се появи в този файл. За да репликирате единична база данни, добавете редаbinlog_do_db = <database_name>към файла.- Файл:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Рестартирайте услугата MySQL.
sudo systemctl restart mysql -
Проверете състоянието на MySQL и се уверете, че е
active.sudo systemctl status mysqlmysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago
Конфигуриране на нов потребител на MySQL за репликата
Трябва да създадете нов потребител на изходния сървър, който да представлява репликата. Нови потребители се създават в обвивката на MySQL.
-
Въведете обвивката на MySQL.
sudo mysql -u root -p -
Добавете потребител за акаунта за реплика, като използвате MySQL
CREATE USERсинтаксис. Потребителското име трябва да се състои от името на акаунта за реплика,@символ и IP адреса на сървъра реплика. Изберете по-сигурна парола за акаунта вместоREPLICA_PASSWORD.CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';Забележка За да позволите на репликата да може да се свързва от всеки адрес, посочете потребителя като
'replica_account_name'@'%'.%символът представлява всеки адрес или домейн. Това осигурява допълнителна гъвкавост за сметка на известна сигурност. -
Предоставете права за репликация на отдалечения потребител на реплика.
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
Подгответе MySQL данните за репликация
В този момент е необходимо да се изчисти и заключи изходната база данни, за да се подредят данните за репликация.
-
Останете в обвивката на MySQL и изчистете привилегиите, за да презаредите таблиците за предоставяне, без да рестартирате базата данни.
FLUSH PRIVILEGES; -
Заключете базата данни, за да замразите базата данни в стабилна точка, от която да експортирате данните. Поддържайте MySQL клиента да работи, докато не експортирате базата данни. Въвеждането на която и да е команда за запис или излизането от обвивката MySQL освобождава заключването.
FLUSH TABLES WITH READ LOCK;Внимание Тази команда блокира всички ангажименти към изходната база данни. Експортирайте данните, преди да позволите на източника да обработва повече ангажименти. В противен случай базата данни реплика може да се повреди или да не е в съответствие с базата данни източник. Завършете двете оставащи стъпки в този раздел възможно най-скоро.
-
Проверете състоянието на базата данни, като използвате следната команда. Тази команда показва текущия регистрационен файл заедно с позицията на последния запис в този файл. Запишете тази информация, защото е необходимо да се инициира репликация на репликата по-късно.
SHOW MASTER STATUS;+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1301 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) -
Използвайки обвивката на Linux от друга конзола, експортирайте базата данни с помощта на
mysqldumpинструмент. Изберете запомнящо се име за целевия файл. Включете–master-dataопция за добавяне на информация за регистрационния файл и позицията на текущия запис към дневника.sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sqlЗабележка За да експортирате една база данни, включете
--opt <database_name>опция вместо-–all-databases. -
Върнете се в оригиналната обвивка на MySQL, отключете изходната база данни.
UNLOCK TABLES; -
Излезте от обвивката на MySQL.
QUIT; -
Копирайте експортирания файл на база данни на сървъра на базата данни реплика, като използвате
ftp,scp, или друг метод за прехвърляне на файла.scp databasecopy.sql example@sqldat.com<replica_ip_address>
Конфигуриране на базата данни за реплики на MySQL
Следната конфигурация трябва да се приложи към конфигурацията на базата данни реплика. За да инсталирате MySQL на сървъра за реплика, вижте раздела Инсталиране на MySQL.
-
Отворете основния MySQL файл, който обикновено се намира в
/etc/mysql/mysql.conf.d/mysqld.cnfи променетеbind-addressза да съвпадне с IP адреса на сървъра реплика.- Файл:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2bind-address = xx.xx.xx.xx
-
Разкоментирайте или добавете редовете за
server-idиlog-bin.server-idтрябва да бъде настроен на2на репликата, докатоlog-binпроменливата трябва да бъде настроена на/var/log/mysql/mysql-bin.log. Добавете променлива заrelay-logи го задайте на/var/log/mysql/mysql-relay-bin.log.Забележка Уверете се, че
skip_networkingпроменливата не е зададена никъде в този файл. За да репликирате една база данни, добавете следната директива към файлаbinlog_do_db = database_name. За да конфигурирате повече от една реплика, номерирайтеserver-idстойности по последователно нарастващ начин. Например, втора реплика ще имаserver-idот3.- Файл:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3 4server-id = 2 log_bin = /var/log/mysql/mysql-bin.log relay-log = /var/log/mysql/mysql-relay-bin.log
-
Рестартирайте услугата MySQL, за да включите промените.
sudo systemctl restart mysql -
Проверете състоянието на MySQL и се уверете, че е
active.sudo systemctl status mysqlmysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago -
(По избор ) MySQL препоръчва използването на SSL за свързване към източника за по-голяма сигурност. Повече информация за конфигурирането на SSL можете да намерите в MySQL SSL Documentation. Инструментът за настройка на RSA може да се използва за ускоряване на този процес.
Импортирайте репликираните MySQL данни и активирайте репликацията
Следващата стъпка е да импортирате копието на данните на базата данни, да зададете източника на репликация и да рестартирате сървъра на базата данни реплика. След това репликата трябва да бъде синхронизирана и готова за използване.
-
Въведете следната команда от обвивката на Linux, за да импортирате изходната база данни. Посочете името на базата данни, използвано за експортиране на данните по-рано.
sudo mysql -u root -p < databasecopy.sql -
Влезте в обвивката на MySQL.
sudo mysql -u root -p -
Спрете репликата.
STOP REPLICA; -
Въведете
CHANGE REPLICATION SOURCEкоманда, заедно със следните подробности. Заменете IP адреса на изходния сървър на база данни на мястото наsource_ip_address. ЗаSOURCE_USERиSOURCE_PASSWORD, въведете потребителското име и паролата на репликата от в Конфигуриране на нов потребител на MySQL за секцията Реплика. ЗаSOURCE_LOG_FILEиSOURCE_LOG_POSстойности, въведете информацията, която сте записали отSHOW MASTER STATUS;команда.CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;Забележка За да използвате SSL за връзката, която MySQL препоръчва, добавете атрибута
SOURCE_SSL=1към командата. Повече информация за използването на SSL в контекста на репликация на източник-реплика може да бъде намерена в документацията на MySQL. -
Рестартирайте репликата.
START REPLICA; -
Проверете състоянието на репликата. Репликата трябва да чака събития и не трябва да има
Last_IO_ErrorилиLast_Errorсъбития.Slave_SQL_Running_Stateзаписът трябва да посочва, че репликата е прочела регистъра на релето.SHOW REPLICA STATUS\GSlave_IO_State: Waiting for master to send event Master_Host: 178.79.153.39 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 156 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 371 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes .. Last_Errno: 0 Last_Error: .. Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Тестване на MySQL Source-Replica Replication
Ако изходната база данни вече е била попълнена преди инстанцирането на репликата, е необходимо допълнително тестване. В този случай се уверете, че базите данни и таблиците, които съществуват в източника, присъстват в репликата след импортирането на данните. В SHOW REPLICA STATUS дисплей, Slave_SQL_Running_State записът трябва да гласи Slave has read all relay log .
За да проверите дали репликацията се извършва правилно, създайте нова база данни или таблица в източника. След няколко секунди новият запис трябва да присъства в репликата. Проверете наличието на базата данни с помощта на SHOW DATABASES; команда. За да потвърдите наличието на таблица, превключете към базата данни, като използвате USE databasename; и въведете SHOW TABLES; . Също така е добра идея да стартирате SHOW REPLICA STATUS команда и проверете изхода за евентуални грешки. Last_Error и Last_IO_Error полетата трябва да са празни и репликата трябва да остане свързана.
Научете повече за MySQL Source-Replica Replication
Най-добрият източник за информация относно репликацията на източник-реплика е официалната документация на MySQL. Разделът за репликация съдържа по-обширна информация за архитектурата и инсталационния процес. Форумите на MySQL също могат да бъдат полезни.
Повече информация
Може да пожелаете да се консултирате със следните ресурси за допълнителна информация по тази тема. Въпреки че те са предоставени с надеждата, че ще бъдат полезни, моля, имайте предвид, че не можем да гарантираме за точността или навременността на външно хостваните материали.
- Документация на MySQL