Статья для тех, кому нужно настроить репликации типа master-slave на сервере mysql, используя защищенное соединение. Когда возникла необходимость, я столкнулся с недостаточностью информации на русском о настройке репликации и практически с полным отсутствием информации, как это сделать, используя ssl. В конце концов поднять репликации мне удалось. Хочу поделиться опытом и нарытыми ссылками.
Приводимые команды установки программ примеры файлов конфигурации касаются дебиан-подобных систем (в том числе убунту). В других дистрибутивах они могут отличаться. Например, для установки программ в RH и CentOS вместо «apt-get install» нужно писать «yum install».
Статья актуальна, начиная с августа 2009 года до того момента, пока что-нибудь не поменяют разработчики используемых здесь программ.
Mysql-server-5.0, Ubuntu 8.04-9.04 и соответствующий им Debian.
Далее будет рассказано о том, как настроить сами репликации. Если безопасность соединения вас не волнует, этот пункт не для вас.
Файл настроек мускула предлагает для создания ключей воспользоваться прогой — тиникой:
Я его послушал, хотя истинные линуксоиды обязаны создавать ключи из командной строки. Если вы не тру, то:
В проге нужно:
Команды для изменения прав и владельцев в порядке упоминания:
СА-сертификат — это сертификат автора, он служит для связки сертификатов сервера и клиента. На сервере будут нужны сертификат и ключ сервера, на клиенте — сертификат и ключ клиента, и на обоих будет нужен сертификат автора — cacert.
В дебиан-подобных системах (по крайней мере) в файле my.cnf указана команда
которая говорит включить все файлы конфигурации (*.cnf) из указанной директории. Создадим там файл replica.cnf со следующим содержанием:
Параметры ssl указываются в случае, если есть желание защитить соединение для репликаций. Указываются созданные ранее ключи. Положить их нужно в папку мускула, рядом с my.cnf. Мои попытки положить их в папку /etc/mysql/certs/ приводили к ошибкам типа «Не могу получить сертификат из файла ...». Возможно, есть решения и для других папок, но я не стал их искать.
После произведенных телодвижений нужно перегрузить мускул, зайти в него и посмотреть
В ответе параметр have_ssl и/или have_openssl имеет значение YES в случае суксь, и DISABLED во всех плохих других случаях (отсутствие параметра говорит о том, что ваша сборка мускула не поддерживает ssl). Если йес нас не нашел, идем в логи искать причину: /var/log/mysql.log, /var/log/mysql.err, /var/log/syslog или еще куда, в зависимости от того, куда настроен логировать себя мускул на вашей системе.
Еще нам нужно настроить пользователя отдельного для репликаций. Решается это выполнением запроса
В случае, если безопасность нас не волнует, слова «require SSL» нужно опустить. В названии домена «%» работает так же, как «*» в записи «*.cnf».
Теперь этому же пользователю нужно дать права читать таблицы нашей БД:
В других доках встречаются указания давать также права SUPER или даже ALL, но я этого не делал, а работает все равно.
Перед созданием дампа БД необходимо залочить таблицы — во избежание неприятностей:
Далее, посмотрим состояние мастера:
И запишем значения полей File и Position на листик — они нам еще пригодятся. У меня это были значения mysql-bin.000002 и 412 соответсвенно. Важно не заблудиться в нулях :)
Теперь сделаем дамп БД:
В связи с тем, что нашему слейву мы дали мало прав, эта команда может заругаться (я ее не пробовал, делал дамп через webmin). В этом случае или добавьте прав пользователю, или выполните дамп из-под другого пользователя.
В конце концов, разблокируем таблицы:
И перепишем дамп на сервер-слейв.
На клиентско-рабском сервере нужно залить данные в БД:
В квадратных скобках — команды, которые выполнять необязательно, если в вашем скрипте mydb.sql уже есть команды создания БД.
Хотя в других инструкциях это написано, я не стал создавать пользователя slave_user и давать ему какие-либо права на клиентском сервере. Если что — ссылки в конце статьи вам в клики.
Далее, создадим файл /etc/mysql/conf.d/replica.cnf
Вторая, клиентская часть — для защищенных соединений. Главное, не забыть положить созданные ранее ключи в указанную папку.
Перегружаем мускул, заходим в него и выполняем серию команд:
В данный момент репликации уже должны работать :)
Проверяйте, изменяя данные на сервере. Практически сразу (несколько секунд разницы) они должны меняться на клиенте. Если не меняется — идем в логи искать причины. Или идем читать другие доки:
В статье описано, как я поднимал репликации на собственных серверах. Возможно, из-за различий в настройке или по другим причинам у вас не получится заставить все работать. Тогда могу только оставить ссылки на ресурсы, которые помогли мне.
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, но много интересного.
Второй вариант — спрашивайте в комментариях, если не я, то другие хабралюди подскажут. Глядишь, и заработает.
Если есть пояснения или замечания — прошу тоже писать, самому интересно, почему некоторые вещи нужны, хотя работает и без них.
Приводимые команды установки программ примеры файлов конфигурации касаются дебиан-подобных систем (в том числе убунту). В других дистрибутивах они могут отличаться. Например, для установки программ в 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
В проге нужно:
- Создать СА-сертификат (параметр Common Name установим в cacert). Далее, создать сертификат и ключ (создаются в паре) для сервера и клиента (не забыть внести пароль СА-сертификата, который мы придумывали, когда его создавали).
- Экспортировать СА-сертификат и сертификаты сервера и клиента в формат PEM с именами cacert.pem, my-server-cert.pem и my-client-cert.pem соответсвенно.
- Экспортировать ключи сервера и клиента (внимание, опция Without passphrase = Yes, иначе мускуль не сможет расшифровать ваш сертификат, потребует пароль СА-сертификата) в формат PEM с именами my-server-key.pem и my-client-key.pem соответственно.
- Указать всем 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, но много интересного.
Второй вариант — спрашивайте в комментариях, если не я, то другие хабралюди подскажут. Глядишь, и заработает.
Если есть пояснения или замечания — прошу тоже писать, самому интересно, почему некоторые вещи нужны, хотя работает и без них.