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 2
bind-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 3
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Рестартирайте услугата MySQL.
sudo systemctl restart mysql
-
Проверете състоянието на MySQL и се уверете, че е
active
.sudo systemctl status mysql
mysql.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 [email protected]<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 2
bind-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 4
server-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 mysql
mysql.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\G
Slave_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