MySQL Replication basics или Репликация на MySQL server

Защо да използваме репликация на базата данни?

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

Как става всичко това?

За начало ни трябват 2 MySQL сървъра. За опитната постановка и двата сървъра са с версия 5.4.3-beta

master – това е сървъра, който е главен за replication cluster-a и от който всички останали ще взимат данните
slave – това е сървъра, който пази огледално копие на съдържанието на master сървъра – бази данни, таблици, записи

Настройки на master сървъра

За начало трябва да пуснем сървъра да слуша на външното IP на машината като закоментираме следния ред в my.cnf (обикновено се намира в /etc/mysql/my.cnf):

#skip-networking
#bind-address            = 127.0.0.1

Също там (в my.cnf) добавяме информация за самата репликация:

log-bin = /var/log/mysql/mysql-master-bin.log # log, в който ще се записва случващото се с MySQL сървъра (базите данни) на master сървъра
binlog-do-db=exampledb # име на базата данни, която ще репликираме. Ако махнете този ред ще се репликират всички бази
server-id=1 # задължително добавяме ID на сървъра. Изисква се от конфигурацията.

Следващата стъпка е да рестартираме master MySQL сървъра:

/etc/init.d/mysql restart

След рестарта се логваме в MySQL конзолата и даваме права на slave сървъра да чете от нашият нов master сървър:

GRANT REPLICATION SLAVE ON *.* TO 'slaveUser'@'%' IDENTIFIED BY '<password>'; (заменете <password> с парола по ваш избор)
FLUSH PRIVILEGES;

Настройки на slave сървъра

За тези настройки има много информация в Интернет. Голяма част от нея е deprecated, тоест вече е остаряла и не е съвместима с направените промени по текущия MySQL сървър.

Отваряме my.cnf на slave сървъра и правим следните промени:

server-id=2 # задължително го добавяме. Различно от server-id на master сървъра
replicate-do-db=exampledb # коя база данни ще репликираме тук, тоест коя ще взимаме от master и ще записваме тук на slave сървъра
 
# следващите данни са масово разпространени в Интернет, но не са нужни в този файл.
master-host=0.0.0.0
master-user=slaveУser
master-password=secret-password-here

И двата сървъра вече са стартирани или ако не са, трябва да ги стартирате 🙂

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

За целта се логваме в MySQL конзолата на slave сървъра и изпълняваме следните команди:

mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST='0.0.0.0', MASTER_USER='slaveUser', MASTER_PASSWORD='<password>', MASTER_LOG_FILE='mysql-master-bin.000003', MASTER_LOG_POS=0, MASTER_PORT=3306;
MASTER_HOST='0.0.0.0' # IP на master сървъра
MASTER_USER='slaveUser' # потребителското име за slave сървъра, което избрахме по-горе
MASTER_PASSWORD='<password>' # паролата, която избрахме по-горе
MASTER_LOG_FILE='mysql-master-bin.000003' # това се взима от следващата описана команда
MASTER_LOG_POS=0 # тук е добре да оставим 0 и съответно на slave машината да нямаме създадена базата данни, която искаме да репликираме
MASTER_PORT=3306 # порт, на който слуша master сървъра

За да намерим MASTER_LOG_FILE изпълняваме следната команда на master сървъра

mysql> show master status;
+-------------------------+-----------+--------------+------------------+
| File                    | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+-----------+--------------+------------------+
| mysql-master-bin.000006 | 272737959 |              |                  |
+-------------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
 
mysql>

Съответно нашият MASTER_LOG_FILE се казва mysql-master-bin.000006

След като сме определили файла и сме изпълнили заявката за потребител, парола и порт на slave сървъра, пак на него изпълняваме командата за стартиране на slave:

mysql> START SLAVE;

От тук нататък би трябвало да имате изцяло работещи и реплекиращи master и slave сървъри.

За пълна информация можете да погледнете документацията на MySQL за MySQL replication