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