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

Как да конфигурирате репликация на източник-реплика в MySQL

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

Как работи репликацията на MySQL данни

Процесът на репликация първо съхранява данни в изходната база данни и след това ги копира във всякакви реплики. След като обработи инструкцията, изходният сървър на база данни проследява промяната в двоичен дневник. Дневникът служи като последователен запис на всички промени в структурата и съдържанието на базата данни. SELECT изразите не се записват, защото не променят съдържанието на базата данни.

Актуализациите се случват асинхронно, така че репликите не трябва да бъдат непрекъснато свързани. Това контрастира със синхронните архитектури на системите с висока надеждност. Ако е необходима синхронизация в реално време, MySQL препоръчва използването наNDB Cluster .

Всяка реплика извлича данни от източника, като изисква съдържанието на двоичния дневник на източника. След това репликата прилага изявленията по ред, като ефективно възпроизвежда събитията, възникнали в източника. Всяка реплика е независима и следи текущата си позиция с изходния двоичен журнал. Освен това всяка реплика може да се синхронизира с източника според собствения си график. Данните могат да се четат от всеки от сървърите, включително репликите.

MySQL позволява висока степен на детайлност. Възможно е да се репликира върху определени бази данни или дори конкретни таблици в базата данни. Форматът за репликация по подразбиране е Репликация, базирана на оператор (SBR), в който се репликира целият SQL оператор. Въпреки това, Репликация, базирана на ред (RBR) също е наличен. Този формат репликира редовете, които са били променени. Възможно е също така да се конфигурират по-сложни конфигурации много към много. Консултирайте се с MySQL Documentation за повече информация относно различните опции за репликация.

Забележка MySQL по-рано нарича репликация източник-реплика като "главна-подчинена репликация". MySQL организацията наскоро промени терминологията, обяснявайки аргументите си в актуализацията на терминологията. По-старият термин „главен“ е променен на „източник“, докато „подчинен“ вече се нарича „реплика“. Старите термини все още може да се появяват в определени команди и изходни дисплеи, докато MySQL актуализира своята кодова база. Това ръководство използва предпочитаните термини на MySQL в инструкциите.

Предимства на MySQL репликация на данни

Разрешаването на репликация на източник-реплика предлага много значителни предимства пред неизлишната система. Списъкът по-долу предоставя преглед на някои предимства:

  • Лесно е да създадете живо архивно копие по всяко време. Тъй като процесът на репликация е асинхронен, репликацията може да се извърши по всеки график. Не е необходимо копията да се поддържат в синхрон с източника, за да работят надеждно.

  • Добавянето на реплика може да увеличи времето за работа и надеждността на цялата система. Първичният контрол може да премине към репликата, ако е необходима поддръжка или изходната база данни не е налична.

  • Всяка реплика предоставя друг четим екземпляр на базата данни. Това позволява на програмите за извличане на данни или анализ на данни да заявяват репликата, без да поставят допълнително натоварване върху оригиналната база данни.

  • Тази архитектура увеличава мащабируемостта и производителността. Базата данни чете и SELECT изявленията могат да бъдат балансирани между сървърите, намалявайки латентността.

  • Трети страни могат да получат достъп само за четене до база данни чрез реплика и вече не изискват достъп до източника. Реплика на база данни може да бъде създадена при поискване, когато е необходима, и унищожена, когато вече не е необходима. Тази техника подобрява сигурността и гарантира, че е невъзможно да се подправят оригиналните данни.

Преди да започнете

  1. Ако все още не сте го направили, създайте акаунт в Linode и Compute Instance. Вижте нашите ръководства Първи стъпки с Linode и Създаване на изчислителен екземпляр.

  2. Следвайте нашето ръководство за настройка и осигуряване на изчислителен екземпляр, за да актуализирате вашата система. Може също да пожелаете да зададете часовата зона, да конфигурирате името на хоста си, да създадете ограничен потребителски акаунт и да укрепите SSH достъпа.

  3. Трябва да имате поне два отделни Linode, за да конфигурирате репликацията на MySQL източник-реплика. Един Linode хоства изходната база данни, докато друг възел е необходим за реплики сървъра.

Забележка Стъпките в това ръководство са написани за потребител без root права. Командите, които изискват повишени привилегии, имат префикс с sudo . Ако не сте запознати с sudo команда, вижте ръководството за потребители и групи на Linux.

Конфигуриране на репликация на източник-реплика в MySQL

За да конфигурирате репликация на източник-реплика, MySQL трябва да бъде инсталиран на два отделни сървъра, които могат да комуникират един с друг. Тези инструкции са насочени към дистрибуцията на Ubuntu, но като цяло са приложими за всички дистрибуции на Linux. Процесът се състои от следните стъпки:

  1. Инсталирайте MySQL.
  2. Конфигурирайте изходната база данни на MySQL.
  3. Конфигурирайте нов потребител на MySQL за репликата.
  4. Подгответе MySQL данните за репликация.
  5. Конфигурирайте базата данни за реплики на MySQL.
  6. Импортирайте репликираните MySQL данни и активирайте репликацията.

Инсталирайте MySQL

Ако MySQL не е наличен и на двата Linodes, инсталирайте го, като използвате следните стъпки:

  1. Надстройте Linodes.

     sudo apt-get update && sudo apt-get upgrade
    
  2. Инсталирайте MySQL сървъра и клиентските приложения както на изходния, така и на реплики сървъра.

     sudo apt-get install mysql-server mysql-client -y
    
  3. Конфигурирайте опциите за сигурност, включително root паролата, като използвате mysql_secure_installation команда.

     sudo mysql_secure_installation
    
  4. Ако използвате защитна стена като ufw , уверете се, че позволява преминаването на MySQL трафик. Добавете следното правило, за да отворите порт 3306 на защитната стена.

     ufw allow mysql
    

Конфигуриране на изходната база данни на MySQL

За да активирате репликацията на MySQL, редактирайте някои променливи в основния конфигурационен файл на MySQL. Направете следните промени в конфигурацията на изходната база данни.

  1. Намерете основния конфигурационен файл на MySQL на сървъра на базата данни източник. Този файл обикновено се намира в /etc/mysql/mysql.conf.d/mysqld.cnf . Въпреки това в по-ранни инсталации той може да се намира в /etc/my.cnf или /etc/mysql/my.cnf . Може също да се направи препратка от един от файловете чрез includedir директива.

  2. Отворете конфигурационния файл на MySQL и променете bind-address към IP адреса на изходния сървър.

    Файл:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    
    bind-address  = <source_ip_address>
        
  3. Разкоментирайте или добавете редовете за 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
        
  4. Рестартирайте услугата MySQL.

     sudo systemctl restart mysql
    
  5. Проверете състоянието на 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.

  1. Въведете обвивката на MySQL.

     sudo mysql -u root -p
    
  2. Добавете потребител за акаунта за реплика, като използвате MySQL CREATE USER синтаксис. Потребителското име трябва да се състои от името на акаунта за реплика, @ символ и IP адреса на сървъра реплика. Изберете по-сигурна парола за акаунта вместо REPLICA_PASSWORD .

     CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
    
    Забележка За да позволите на репликата да може да се свързва от всеки адрес, посочете потребителя като 'replica_account_name'@'%' . % символът представлява всеки адрес или домейн. Това осигурява допълнителна гъвкавост за сметка на известна сигурност.
  3. Предоставете права за репликация на отдалечения потребител на реплика.

     GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
    

Подгответе MySQL данните за репликация

В този момент е необходимо да се изчисти и заключи изходната база данни, за да се подредят данните за репликация.

  1. Останете в обвивката на MySQL и изчистете привилегиите, за да презаредите таблиците за предоставяне, без да рестартирате базата данни.

     FLUSH PRIVILEGES;
    
  2. Заключете базата данни, за да замразите базата данни в стабилна точка, от която да експортирате данните. Поддържайте MySQL клиента да работи, докато не експортирате базата данни. Въвеждането на която и да е команда за запис или излизането от обвивката MySQL освобождава заключването.

     FLUSH TABLES WITH READ LOCK;
    
    Внимание Тази команда блокира всички ангажименти към изходната база данни. Експортирайте данните, преди да позволите на източника да обработва повече ангажименти. В противен случай базата данни реплика може да се повреди или да не е в съответствие с базата данни източник. Завършете двете оставащи стъпки в този раздел възможно най-скоро.
  3. Проверете състоянието на базата данни, като използвате следната команда. Тази команда показва текущия регистрационен файл заедно с позицията на последния запис в този файл. Запишете тази информация, защото е необходимо да се инициира репликация на репликата по-късно.

     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)
  4. Използвайки обвивката на Linux от друга конзола, експортирайте базата данни с помощта на mysqldump инструмент. Изберете запомнящо се име за целевия файл. Включете –master-data опция за добавяне на информация за регистрационния файл и позицията на текущия запис към дневника.

     sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
    
    Забележка За да експортирате една база данни, включете --opt <database_name> опция вместо -–all-databases .
  5. Върнете се в оригиналната обвивка на MySQL, отключете изходната база данни.

     UNLOCK TABLES;
    
  6. Излезте от обвивката на MySQL.

     QUIT;
    
  7. Копирайте експортирания файл на база данни на сървъра на базата данни реплика, като използвате ftp , scp , или друг метод за прехвърляне на файла.

     scp databasecopy.sql [email protected]<replica_ip_address>
    

Конфигуриране на базата данни за реплики на MySQL

Следната конфигурация трябва да се приложи към конфигурацията на базата данни реплика. За да инсталирате MySQL на сървъра за реплика, вижте раздела Инсталиране на MySQL.

  1. Отворете основния 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
        
  2. Разкоментирайте или добавете редовете за 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
        
  3. Рестартирайте услугата MySQL, за да включите промените.

     sudo systemctl restart mysql
    
  4. Проверете състоянието на 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
  5. (По избор ) MySQL препоръчва използването на SSL за свързване към източника за по-голяма сигурност. Повече информация за конфигурирането на SSL можете да намерите в MySQL SSL Documentation. Инструментът за настройка на RSA може да се използва за ускоряване на този процес.

Импортирайте репликираните MySQL данни и активирайте репликацията

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

  1. Въведете следната команда от обвивката на Linux, за да импортирате изходната база данни. Посочете името на базата данни, използвано за експортиране на данните по-рано.

     sudo mysql -u root -p < databasecopy.sql
    
  2. Влезте в обвивката на MySQL.

     sudo mysql -u root -p
    
  3. Спрете репликата.

     STOP REPLICA;
    
  4. Въведете 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.
  5. Рестартирайте репликата.

     START REPLICA;
    
  6. Проверете състоянието на репликата. Репликата трябва да чака събития и не трябва да има 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Присъединяване на таблици с проблем SUM в MYSQL

  2. Как да направите пълно външно присъединяване в MySQL

  3. MySQL 8 Общи изрази за таблица CTE

  4. Как да направите псевдоним на поле или колона в MySQL?

  5. SQL:Повторете ред с резултати няколко пъти и номерирайте редовете