Как Настроить Репликацию В Mysql С Использованием Ssl-Шифрования В Debian Lenny

В этом руководстве описывается, как настроить репликацию базы данных в MySQL с использованием SSL-соединения для шифрования.

Репликация MySQL синхронизирует базу данных, что позволяет вам иметь точную копию базы данных на другом сервере.

Все обновления базы данных на главном сервере автоматически реплицируются на другой сервер, что помогает защитить базу данных от аппаратных сбоев.

В этой статье будет показано, как реализовать репликацию базы данных exampledb с сервера server1.example.com (ip-адрес 192.168.0.100) на сервер server2.example.com (ip-адрес 192.168.0.101) с использованием SSL-соединения.

Оба сервера работают на Debian Lenny, но конфигурацию можно использовать практически во всех дистрибутивах без изменений.

База данных exampledb с таблицами и данными, которые уже существуют только на основной.

Все команды выполняются с правами пользователя root. Если сервер MySQL не установлен на обоих серверах, то приступайте к установке, выполнив команду на основном и дополнительном серверах:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

aptitude install mysql-server mysql-client

Вам будет предложено ввести пароль root для MySQL как на основном, так и на вторичном сервере.

Теперь проверим поддержку SSL-соединений с MySQL. Давайте войдем в MySQL и введем команду в командной строке MySQL:

mysql -u root -p mysql> show variables like '%ssl%'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+ 7 rows in set (0.00 sec) mysql>quit;

Если вывод выглядит так, это означает, что MySQL был скомпилирован с поддержкой SSL, но, как видно из таблицы, have_openssl DISABLED и have_ssl DISABLED не активны.

Чтобы включить поддержку SSL, вам необходимо отредактировать файл my.cnf, который находится в /etc/mysql/.



vi /etc/mysql/my.cnf

Найдите строки *Функции безопасности и добавьте строку ssl.

[.

] # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca".

ssl # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem [.

]

Перезапустим MySQL:

/etc/init.d/mysql restart

и проверьте, активна ли поддержка SSL

mysql -u root -p show variables like '%ssl%'; mysql> show variables like '%ssl%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+-------+ 7 rows in set (0.00 sec) mysql>quit;

Вывод показывает, что SSL включен.

Затем настройте MySQL на прослушивание всех интерфейсов, закомментировав строкуbind-address = 127.0.0.1 в /etc/mysql/my.cnf: сервер1:

vi /etc/mysql/my.cnf [.

] # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 [.

]

Перезапустите MySQL:

/etc/init.d/mysql restart

Теперь посмотрим, что висит на наших портах:

netstat -tap | grep mysql server1:~# netstat -tap | grep mysql tcp 0 0 *:mysql *:* LISTEN 3771/mysqld server1:~#

Судя по всему MySQL транслируется на всех интерфейсах.

Теперь нам нужно создать центры сертификации, серверы и клиентские сертификаты для SSL-соединений.

Обычно я создаю их в каталоге /etc/mysql/newcerts. Давайте создадим каталог newcerts:

mkdir /etc/mysql/newcerts && cd /etc/mysql/newcerts

Давайте убедимся, что OpenSSL установлен:

aptitude install openssl

Создайте сертификат CA:

openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem

Далее создайте сертификат для сервера.

:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

и для клиента:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

Вывод должен выглядеть так:

ls -l server1:/etc/mysql/newcerts# ls -l total 32 -rw-r--r-- 1 root root 1346 2010-08-18 20:13 ca-cert.pem -rw-r--r-- 1 root root 1675 2010-08-18 20:13 ca-key.pem -rw-r--r-- 1 root root 1099 2010-08-18 20:14 client-cert.pem -rw-r--r-- 1 root root 1675 2010-08-18 20:14 client-key.pem -rw-r--r-- 1 root root 956 2010-08-18 20:14 client-req.pem -rw-r--r-- 1 root root 1099 2010-08-18 20:14 server-cert.pem -rw-r--r-- 1 root root 1679 2010-08-18 20:14 server-key.pem -rw-r--r-- 1 root root 956 2010-08-18 20:14 server-req.pem server1:/etc/mysql/newcerts#

Теперь нам необходимо передать сертификаты ca-cert.pem, client-cert.pem и client-key.pem на второй сервер.

Создадим каталог на втором сервере: сервер2:

mkdir /etc/mysql/newcerts

Вернёмся на сервер1 и перенесём сертификаты следующим образом: сервер1:

scp /etc/mysql/newcerts/ca-cert.pem [email protected]:/etc/mysql/newcerts scp /etc/mysql/newcerts/client-cert.pem [email protected]:/etc/mysql/newcerts scp /etc/mysql/newcerts/client-key.pem [email protected]:/etc/mysql/newcerts

Затем откройте /etc/mysql/my.cnf на сервере 1 и внесите изменения в область * Функции безопасности, раскомментировав строки ssl-ca, ssl-cert и ssl-key:

vi /etc/mysql/my.cnf [.

] # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca".

ssl ssl-ca=/etc/mysql/newcerts/ca-cert.pem ssl-cert=/etc/mysql/newcerts/server-cert.pem ssl-key=/etc/mysql/newcerts/server-key.pem [.

]

Перезапустим MySQL:

/etc/init.d/mysql restart

Теперь мы создадим пользователя репликации «slave_user», который будет использоваться на сервере2 для доступа к базе данных на сервере1.

mysql -u root -p GRANT REPLICATION SLAVE ON *.

* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;

Строка REQUIRE SSL не является обязательной; если вы оставите его, то подчиненному_пользователю будет разрешено подключаться через зашифрованные и незашифрованные соединения.

При использовании SSL будут разрешены только зашифрованные соединения.

(Если пользователь репликации уже создан и вам нужно указать только SSL-соединение, то сменить пользователя нужно следующим образом:

GRANT USAGE ON *.

* TO 'slave_user'@'%' REQUIRE SSL;

)

FLUSH PRIVILEGES; quit;

Кроме того, мы должны указать MySQL, где хранить наши логи для репликации, а также указать, какой сервер является основным, а какой — репликационным:

vi /etc/mysql/my.cnf [.

] # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. server-id = 1 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M binlog_do_db = exampledb [.

]

Перезапустите MySQL

/etc/init.d/mysql restart

Далее нам необходимо выполнить несколько операций: 1. Заблокируйте базу данных exampledb на сервере1. 2. Узнайте главный статус сервера1. 3. Создайте дамп SQL exampledb (для импорта на сервер2).

4. Разблокируйте нашу базу

mysql -u root -p USE exampledb; FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 98 | exampledb | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) mysql>

Теперь, не выходя из консоли mysql (поскольку блокировка базы данных будет снята), сделаем резервную копию и перенесем ее на сервер2. сервер1:

cd /tmp mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql scp snapshot.sql [email protected]:/tmp

После завершения операции вы можете смело разблокировать нашу базу данных.

сервер1:

UNLOCK TABLES; quit;

На этом настройка сервера1 завершена.

Начнем настройку сервера2, открыв конфигурацию мускула: сервер2:

vi /etc/mysql/my.cnf

Давайте убедимся, что у нас есть следующие настройки строк (если их нет, добавим):

[.

] server-id=2 master-connect-retry=60 replicate-do-db=exampledb [.

]

Значение server-id=2 уникально и должно отличаться от значения на сервере1. Перезапустим MySQL:

/etc/init.d/mysql restart

Прежде чем приступить к настройке репликации, давайте создадим пустую базу данных:

mysql -u root -p CREATE DATABASE exampledb; quit;

Теперь вы можете импортировать дамп базы данных snapshot.sql на сервер2.

/usr/bin/mysqladmin --user=root --password=yourrootsqlpassword stop-slave cd /tmp mysql -u root -pyourrootsqlpassword exampledb < snapshot.sql

Давайте перейдем к MySQL и выполним команду, чтобы server2 был вторичным сервером, а server1 был определен как основной сервер:

mysql -u root -p CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98, MASTER_SSL=1, MASTER_SSL_CA = '/etc/mysql/newcerts/ca-cert.pem', MASTER_SSL_CERT = '/etc/mysql/newcerts/client-cert.pem', MASTER_SSL_KEY = '/etc/mysql/newcerts/client-key.pem';

*MASTER_HOST — ip адрес или имя хоста в нашем случае это ip * MASTER_USER — пользователь репликации для основного сервера * MASTER_PASSWORD — пароль пользователя.

* MASTER_LOG_FILE — значение файла журнала на сервере1, которое мы обнаружили, будет выполнять команду SHOW MASTER STATUS; * MASTER_LOG_POS — Значение, полученное при выполнении команды SHOW MASTER STATUS; * MASTER_SSL — создает соединение между главным и вторичным сервером с использованием SSL. * MASTER_SSL_CA — Путь к сертификату ЦС (сервер2) * MASTER_SSL_CERT — Путь к сертификату client-cert.pem (server2) * MASTER_SSL_KEY — Путь к сертификату client-key.pem (server2).

И наконец

START SLAVE;

Теперь давайте проверим статус сервера2

SHOW SLAVE STATUS \G mysql> SHOW SLAVE STATUS \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.100 Master_User: slave_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 98 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 235 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: exampledb Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 98 Relay_Log_Space: 235 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: Yes Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem Master_SSL_CA_Path: Master_SSL_Cert: /etc/mysql/newcerts/client-cert.pem Master_SSL_Cipher: Master_SSL_Key: /etc/mysql/newcerts/client-key.pem Seconds_Behind_Master: 0 1 row in set (0.00 sec) mysql>

После этого вы можете выйти из MySQL:

quit;

Вот и все, настройка сервера завершена.

Если вы все сделали правильно, то репликация настроена правильно и работоспособна.

Большое спасибо за ваше внимание! P.S. Если вы нашли опечатку или неправильно сформулированное предложение, напишите мне в личку.

Теги: #Debian lenny #MySQL #базы данных #SSL #MySQL

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.