Как настроить master-slave репликацию MariaDB с SSL на Ubuntu Linux
Репликация данных «Master-Slave» позволяет копировать базы данных на несколько серверов MariaDB. Это полезно для резервного копирования, восстановления данных, балансировки нагрузки и многого другого. В этом учебном руководстве вы узнаете, как настроить репликацию MariaDB, защищенную SSL, между главным и подчиненным серверами.
Наш пример
В этой статье будут использоваться следующие IP-адреса серверов db1 и db2:
- 192.168.2.5 (db1) — главный сервер MariaDB
- 192.168.2.6 (db2) — подчиненный сервер MariaDB
Я собираюсь предположить, что оба db1 и db2 являются совершенно новыми серверами. На сервере нет существующей базы данных.
Что вам нужно для установки master-slave-кластера MariaDB?
- Минимум два сервера (могут быть облачные или физические)
- Частная сеть (LAN / VLAN) между серверами
- VPN между двумя центрами обработки данных, если устанавливается между двумя IDC
- Ubuntu Linux 16.04 LTS на обоих серверах
Обновите /etc/hosts
Сначала обновите файл /etc/hosts на сервере db1 и db2 следующим образом:
1 |
$ sudo vi /etc/hosts |
Изменить / добавить следующим образом:
1 2 |
192.168.2.5 db1 192.168.2.6 db2 |
Сохраните и закройте файл. Проверьте следующим образом:
1 2 |
$ ping -c4 db1 $ ping -c4 db2 |
Шаг 1 — Установите последнюю стабильную версию MariaDB на Ubuntu 16.04 LTS
Введите следующую команду apt-get на сервере db1 и db2 для установки MariaDB:
1 2 3 4 5 |
$ sudo apt-get install software-properties-common $ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 $ sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirror.lstn.net/mariadb/repo/10.1/ubuntu xenial main' $ sudo apt-get update $ sudo apt-get install mariadb-server mariadb-client |
Результат выполнения:
Шаг 2 — Защитите MariaDB
Введите следующую команду:
1 |
$ mysql_secure_installation |
Результат выполнения:
Шаг 3. Создание ключей SSL и сертификатов для MariaDB
Введите следующие команды только на сервере db1 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ sudo mkdir -p /etc/mysql/ssl/ $ cd /etc/mysql/ssl/ $ sudo openssl genrsa 2048 > ca-key.pem ## set CA common name to " <strong>MariaDB admin</strong> " ## $ sudo openssl req -new -x509 -nodes -days 730 -key ca-key.pem -out ca-cert.pem ## set server certificate common name to " <strong>MariaDB server</strong> " ## $ sudo openssl req -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem -out server-req.pem $ sudo openssl rsa -in server-key.pem -out server-key.pem $ sudo openssl x509 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem ## set client common name to " <strong>MariaDB client</strong> " ## $ sudo openssl req -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem -out client-req.pem $ sudo openssl rsa -in client-key.pem -out client-key.pem $ sudo openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem $ sudo openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem |
Чтобы избежать каких-либо проблем, вы должны называть их так:
- Общее имя CA: MariaDB admin
- Общее имя сервера: MariaDB server
- Клиентское общее имя: MariaDB client
Также скопируйте все сертификаты на подчиненный сервер db2:
1 2 3 |
$ ssh user@db2 mkdir /tmp/ssl/ $ cd /etc/mysql/ssl/ $ scp * user@db2:/tmp/ssl/ |
Шаг 4. Настройка главного сервера MariaDB.
Введите следующие команды на главном сервере db1. Вам нужно отредактировать файл /etc/mysql/my.cnf, запустите:
1 |
$ sudo vi /etc/mysql/my.cnf |
Настройте клиент MariaDB (добавьте в раздел [client]) для использования SSL:
1 2 3 |
ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/client-cert.pem ssl-key=/etc/mysql/ssl/client-key.pem |
Set bind address, то есть прослушивание только частного IP-адреса db1 192.168.2.5 (убедитесь, что вы заменили IP 192.168.2.5 на ваш реальный IP-адрес)
1 |
bind-address = 192.168.2.5 |
Отметьте этот сервер как главный сервер. Это число должно быть уникальным:
1 |
server-id = 1 |
Убедитесь, что на сервере установлены binlogs, т.е. убедитесь, что log_bin и lob_bin_index установлены следующим образом:
1 2 |
log_bin = /var/log/mysql/mariadb-bin log_bin_index = /var/log/mysql/mariadb-bin.index |
Настройте сервер MariaDB (добавьте в раздел [mysqld]), использовать SSL:
1 2 3 4 |
ssl ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem |
Сохраните и закройте файл. Перезапустите сервер MariaDB, запустите:
1 |
$ sudo systemctl restart mysql.service |
Настроить репликацию
Введите следующую команду на сервере master db1 :
1 |
$ mysql |
ИЛИ
1 |
$ mysql -u root -p |
Вы должны создать пользователя MySQL на главном сервере (db1). Синтаксис:
1 |
grant replication slave on *.* TO {username}@'{ip_of_db2_server}' identified by '{password}' REQUIRE SSL; |
Например:
1 2 3 |
mysql> GRANT REPLICATION SLAVE ON *.* TO 'db_slave_usr'@'192.168.2.6' IDENTIFIED BY 'secretePassword' REQUIRE SSL; mysql> FLUSH PRIVILEGES; mysql> quit |
Узнать статус мастера
Введите в командной строке следующую команду:
1 |
$ mysql -u root -p |
После открытия оболочки MySQL введите:
1 |
mysql> SHOW MASTER STATUS; |
Результат выполнения:
Запишите файл и данные о расположении подчиненного сервера с именем db2.
Шаг 5. Настройка подчиненного сервера MariaDB
Введите следующие команды на сервере db2 . Сначала переместите все сертификаты из каталога /tmp/ssl/ в каталог /etc/mysql/:
1 |
$ sudo mv /tmp/ssl/ /etc/mysql/ |
Вам нужно отредактировать файл /etc/mysql/my.cnf, запустите:
1 |
$ sudo vi /etc/mysql/my.cnf |
Настройте клиент MariaDB (добавьте в раздел [client]) для использования SSL:
1 2 3 |
ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/client-cert.pem ssl-key=/etc/mysql/ssl/client-key.pem |
Set bind address, то есть прослушивать только частный IP-адрес db2 192.168.2.6 (убедитесь, что вы заменили IP 192.168.2.6 на ваш реальный IP-адрес)
1 |
bind-address = 192.168.2.6 |
Отметьте этот сервер как подчиненный сервер. Это число должно быть уникальным:
1 |
server-id = 2 |
Настройте сервер MariaDB (добавьте в раздел [mysqld]), чтобы использовать SSL:
1 2 3 4 |
ssl ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem |
Сохраните и закройте файл. Перезапустите сервер MariaDB, запустите:
1 |
$ sudo systemctl restart mysql.service |
Введите следующую команду на подчиненном сервере db2:
1 |
$ mysql -u root -p |
Введите следующую команду sql:
1 2 3 |
mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.5', MASTER_USER='db_slave_usr', MASTER_PASSWORD='secretePassword', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=661; MASTER_SSL=1; mysql> SLAVE START; mysql> SHOW SLAVE STATUS\G |
Теперь добавьте или удалите данные на главном сервере с именем db1, и он будет реплицирован на подчиненном сервере db2.
Примечание
Вам нужно изменить свое веб-приложение, написанное на PHP / Perl / Python, чтобы записывать данные только на главный сервер db1. Если сервер master db1 упал, читать данные с подчиненного сервера db2.
Наша команда имеет большой опыт построения отказоустойчивых систем, обращайтесь [email protected]