Pull to refresh

Настройка mysql для репликаций по ssl (Debian, Ubuntu)

Reading time5 min
Views2K
Статья для тех, кому нужно настроить репликации типа master-slave на сервере mysql, используя защищенное соединение. Когда возникла необходимость, я столкнулся с недостаточностью информации на русском о настройке репликации и практически с полным отсутствием информации, как это сделать, используя ssl. В конце концов поднять репликации мне удалось. Хочу поделиться опытом и нарытыми ссылками.

Приводимые команды установки программ примеры файлов конфигурации касаются дебиан-подобных систем (в том числе убунту). В других дистрибутивах они могут отличаться. Например, для установки программ в RH и CentOS вместо «apt-get install» нужно писать «yum install».
Статья актуальна, начиная с августа 2009 года до того момента, пока что-нибудь не поменяют разработчики используемых здесь программ.
Mysql-server-5.0, Ubuntu 8.04-9.04 и соответствующий им Debian.

Подготовительные работы — делаем ключи


Далее будет рассказано о том, как настроить сами репликации. Если безопасность соединения вас не волнует, этот пункт не для вас.
Файл настроек мускула предлагает для создания ключей воспользоваться прогой — тиникой:

# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".

Я его послушал, хотя истинные линуксоиды обязаны создавать ключи из командной строки. Если вы не тру, то:

sudo apt-get install tinyca
sudo tinyca2


В проге нужно:
  1. Создать СА-сертификат (параметр Common Name установим в cacert). Далее, создать сертификат и ключ (создаются в паре) для сервера и клиента (не забыть внести пароль СА-сертификата, который мы придумывали, когда его создавали).
  2. Экспортировать СА-сертификат и сертификаты сервера и клиента в формат PEM с именами cacert.pem, my-server-cert.pem и my-client-cert.pem соответсвенно.
  3. Экспортировать ключи сервера и клиента (внимание, опция Without passphrase = Yes, иначе мускуль не сможет расшифровать ваш сертификат, потребует пароль СА-сертификата) в формат PEM с именами my-server-key.pem и my-client-key.pem соответственно.
  4. Указать всем 5-ти файлам права на чтение владельцу и группе, прав на запись — не давать. Ну и проследить, чтобы мускуль был либо владельцем, либо входил в группу.


Команды для изменения прав и владельцев в порядке упоминания:

chmod 440 *.pem
chown root:mysql *.pem


СА-сертификат — это сертификат автора, он служит для связки сертификатов сервера и клиента. На сервере будут нужны сертификат и ключ сервера, на клиенте — сертификат и ключ клиента, и на обоих будет нужен сертификат автора — cacert.

Настраиваем мастер-сервер


В дебиан-подобных системах (по крайней мере) в файле my.cnf указана команда

!includedir /etc/mysql/conf.d/

которая говорит включить все файлы конфигурации (*.cnf) из указанной директории. Создадим там файл replica.cnf со следующим содержанием:

[mysqld]
log-bin = /var/log/mysql/mysql-bin.log
slave-compressed = 1
binlog-do-db = mydb
server-id = 1

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

  • log-bin — путь к файлу бинарного логирования изменений БД.
  • slave-compressed — позволяет сжимать передаваемые от мастера к слейву данные
  • binlog-do-db — название базы данных, которую собираемся реплицировать
  • server-id — идентификатор сервера, должен быть уникальным в пределах связанных между собой серверов


Параметры ssl указываются в случае, если есть желание защитить соединение для репликаций. Указываются созданные ранее ключи. Положить их нужно в папку мускула, рядом с my.cnf. Мои попытки положить их в папку /etc/mysql/certs/ приводили к ошибкам типа «Не могу получить сертификат из файла ...». Возможно, есть решения и для других папок, но я не стал их искать.

После произведенных телодвижений нужно перегрузить мускул, зайти в него и посмотреть

SHOW VARIABLES LIKE '%ssl%';

В ответе параметр have_ssl и/или have_openssl имеет значение YES в случае суксь, и DISABLED во всех плохих других случаях (отсутствие параметра говорит о том, что ваша сборка мускула не поддерживает ssl). Если йес нас не нашел, идем в логи искать причину: /var/log/mysql.log, /var/log/mysql.err, /var/log/syslog или еще куда, в зависимости от того, куда настроен логировать себя мускул на вашей системе.

Еще нам нужно настроить пользователя отдельного для репликаций. Решается это выполнением запроса

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%.slave.domain' IDENTIFIED BY 'slave_password' require SSL

В случае, если безопасность нас не волнует, слова «require SSL» нужно опустить. В названии домена «%» работает так же, как «*» в записи «*.cnf».

Теперь этому же пользователю нужно дать права читать таблицы нашей БД:

GRANT SELECT ON mydb.* TO 'slave_user'@'%.slave.domain' IDENTIFIED BY 'slave_password' require SSL

В других доках встречаются указания давать также права SUPER или даже ALL, но я этого не делал, а работает все равно.

Переносим БД на раба


Перед созданием дампа БД необходимо залочить таблицы — во избежание неприятностей:

USE mydb;
FLUSH TABLES WITH READ LOCK;


Далее, посмотрим состояние мастера:

SHOW MASTER STATUS;

И запишем значения полей File и Position на листик — они нам еще пригодятся. У меня это были значения mysql-bin.000002 и 412 соответсвенно. Важно не заблудиться в нулях :)

Теперь сделаем дамп БД:

mysqldump -u slave_user -pslave_password --opt mydb > mydb.sql

В связи с тем, что нашему слейву мы дали мало прав, эта команда может заругаться (я ее не пробовал, делал дамп через webmin). В этом случае или добавьте прав пользователю, или выполните дамп из-под другого пользователя.

В конце концов, разблокируем таблицы:

UNLOCK TABLES;

И перепишем дамп на сервер-слейв.

Коннектим клиент


На клиентско-рабском сервере нужно залить данные в БД:

mysql -u root -p
[create database mydb]
[use mydb]
source /path/to/mydb.sql
exit


В квадратных скобках — команды, которые выполнять необязательно, если в вашем скрипте mydb.sql уже есть команды создания БД.

Хотя в других инструкциях это написано, я не стал создавать пользователя slave_user и давать ему какие-либо права на клиентском сервере. Если что — ссылки в конце статьи вам в клики.

Далее, создадим файл /etc/mysql/conf.d/replica.cnf

[mysqld]
server-id = 2

[client]
# ssl params
ssl-ca=/etc/mysql/my-cacert.pem
ssl-cert=/etc/mysql/my-client-cert.pem
ssl-key=/etc/mysql/my-client-key.pem


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

Перегружаем мускул, заходим в него и выполняем серию команд:

SLAVE STOP;

CHANGE MASTER TO
MASTER_HOST='master.host.ru',
MASTER_USER='slave_user',
MASTER_PASSWORD='slave_password',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=412,
MASTER_CONNECT_RETRY=30,

MASTER_SSL = 1,
MASTER_SSL_CA = '/etc/mysql/my-cacert.pem',
MASTER_SSL_CERT = '/etc/mysql/my-client-cert.pem',
MASTER_SSL_KEY = '/etc/mysql/my-client-key.pem'

START SLAVE;


  • MASTER_HOST — имя хоста (или айпишник) мастер-сервера
  • MASTER_LOG_FILE и MASTER_LOG_POS — данные, полученные с мастер сервера и записанные ранее на листик
  • MASTER_CONNECT_RETRY — время (в секундах) до следующей попытки соединиться с мастером в случае разрыва связи
  • MASTER_SSL — ставим в 1, если нужно использовать защищенное соединение, иначе — 0. Если поставили 0, то параметры MASTER_SSL_CA, MASTER_SSL_CERT и MASTER_SSL_KEY тоже не указывайте.


В данный момент репликации уже должны работать :)
Проверяйте, изменяя данные на сервере. Практически сразу (несколько секунд разницы) они должны меняться на клиенте. Если не меняется — идем в логи искать причины. Или идем читать другие доки:

Если не заработало


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

http://www.opennet.ru/tips/info/1696.shtml — русиш, без ssl, не забыть прочитать каменты (есть полезные)
http://www.webnext.ru/blog/2007/08/21/replication-mysql-master-slave.html — русиш, без ssl, галопом по европам
http://dibaliklayar.blogspot.com/2006/10/replication-of-mysql-50-using-ssl.html — инглиш, с ssl, читал без внимания, так как нашел уже после того как сам лоб расшиб

ЗЫ. Да, нашел достаточно подробное и полезное описание настройки репликаций здесь. Без ssl, но много интересного.

Второй вариант — спрашивайте в комментариях, если не я, то другие хабралюди подскажут. Глядишь, и заработает.
Если есть пояснения или замечания — прошу тоже писать, самому интересно, почему некоторые вещи нужны, хотя работает и без них.
Tags:
Hubs:
+6
Comments4

Articles