Защо да използваме репликация на базата данни?
Има много и различни доводи, поради които хората използват репликацията (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