Настройка репликации MySQL с шифрованием SSL на Debian Squeeze
- Кратко: этот пошаговый гид показывает, как настроить репликацию MySQL между master и slave с использованием SSL для защиты трафика. Подойдёт для Debian Squeeze и схожих дистрибутивов.\
- Результат: данные базы exampledb будут синхронизированы с master на slave через зашифрованное подключение.\
- Важно: репликация не заменяет резервное копирование — случайные DELETE также реплицируются.
Введение
Этот документ описывает, как настроить репликацию MySQL через SSL, чтобы предотвратить перехват паролей и данных между master и slave. Репликация MySQL создаёт точную копию базы данных с master-сервера на другом сервере (slave). Все изменения на master немедленно записываются в бинарный лог и воспроизводятся на slave, то есть базы остаются синхронизированы. Это не политика резервного копирования: если на master выполнен DELETE, он будет выполнен и на slave. Репликация полезна для отказоустойчивости и масштабирования чтения.
Опытный термин: бинарный лог (binlog) — журнал изменений, который используется slave для применения тех же изменений.
Важно: все шаги выполняются с root-привилегиями. Убедитесь, что вы вошли как root.
О чём этот гид
- Репликация базы exampledb с server1.example.com (192.168.0.100) на server2.example.com (192.168.0.101).\
- Оба сервера: Debian Squeeze (инструкции применимы к большинству дистрибутивов с незначительными изменениями).\
- На master база exampledb уже существует; на slave — нет.
Содержимое: основной план
- Установка MySQL 5 и включение SSL.\
- Настройка master: слушать на всех интерфейсах, создание сертификатов, настройка binlog и пользователя репликации.\
- Снятие дампа, передача на slave и настройка slave.\
- Проверка, контрольные списки и отладка.
1 Предварительная заметка
В этом руководстве я использую имена server1.example.com и server2.example.com с указанными IP-адресами. Настраивайте команды под свои имена и пароли. Не придумывайте случайные значения для production — используйте безопасные пароли и управляйте ключами.
Важное
- Репликация и SSL требуют точной синхронизации конфигураций и корректных прав на файлы сертификатов.\
- Не оставляйте приватные ключи в общедоступных каталогах.
2 Установка MySQL 5 и включение поддержки SSL
Если MySQL ещё не установлен на server1 и server2, установите его:
server1/server2:
apt-get install mysql-server mysql-clientВ процессе установки вас попросят задать пароль для MySQL root. Этот пароль действует для root@localhost и [email protected] / [email protected].
Затем проверьте, поддерживает ли сервер SSL. Войдите в MySQL:
mysql -u root -pВ MySQL-шелле выполните:
show variables like '%ssl%';Если вывод показывает have_openssl и have_ssl как DISABLED, то SSL поддержка компиляцией включена, но не активирована. Пример исходного вывода (перенесено из оригинального руководства):
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>Выйдите из MySQL:
quit;Откройте /etc/mysql/my.cnf и в секции [mysqld] найдите раздел Security Features — добавьте строку ssl (содержимое в конфиге остается неизменным, см. код ниже):
vi /etc/mysql/my.cnfСреди строки * Security Features добавьте:
[...]
# * 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Проверьте снова в MySQL:
mysql -u root -pshow variables like '%ssl%';Если 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;3 Настройка master
Чтобы репликация работала, MySQL на master (server1) должен слушать не только localhost. Прокомментируйте или удалите строку bind-address = 127.0.0.1 в /etc/mysql/my.cnf:
server1:
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 2792/mysqld
server1:~#Создание CA, server и client сертификатов
Создайте каталог для сертификатов и перейдите в него:
mkdir /etc/mysql/newcerts && cd /etc/mysql/newcertsУбедитесь, что установлен openssl:
apt-get 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Пример ожидаемого вывода (не изменяйте, это пример):
root@server1:/etc/mysql/newcerts# ls -l
total 32
-rw-r--r-- 1 root root 1346 May 23 16:23 ca-cert.pem
-rw-r--r-- 1 root root 1675 May 23 16:23 ca-key.pem
-rw-r--r-- 1 root root 1099 May 23 16:23 client-cert.pem
-rw-r--r-- 1 root root 1679 May 23 16:23 client-key.pem
-rw-r--r-- 1 root root 956 May 23 16:23 client-req.pem
-rw-r--r-- 1 root root 1099 May 23 16:23 server-cert.pem
-rw-r--r-- 1 root root 1675 May 23 16:23 server-key.pem
-rw-r--r-- 1 root root 956 May 23 16:23 server-req.pem
root@server1:/etc/mysql/newcerts#Передача сертификатов на slave
На slave создайте каталог:
server2:
mkdir /etc/mysql/newcertsНа master передайте три файла на slave (как root):
server1:
scp /etc/mysql/newcerts/ca-cert.pem [email protected]:/etc/mysql/newcertsscp /etc/mysql/newcerts/client-cert.pem [email protected]:/etc/mysql/newcertsscp /etc/mysql/newcerts/client-key.pem [email protected]:/etc/mysql/newcertsНастройка my.cnf на master для SSL
Откройте /etc/mysql/my.cnf и раскомментируйте/укажите пути к сертификатам в секции * Security Features:
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, который будет подключаться с slave:
mysql -u root -pВ MySQL-шелле выполните:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;Строка REQUIRE SSL необязательна; если её опустить, пользователь сможет подключаться как по шифрованному, так и по нешифрованному каналу. REQUIRE SSL запрещает незашифрованные подключения.
Чтобы изменить уже существующего пользователя и потребовать SSL:
GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;Затем:
FLUSH PRIVILEGES;
quit;Настройка бинарного лога и server-id
Включите бинарный лог и укажите server-id и базу для репликации (в [mysqld]):
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Создание согласованного снимка базы данных
Мы заблокируем базу, получим позицию master и создадим дамп. Это важно для консистентности данных.
mysql -u root -pВ MySQL-шелле выполните:
USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;Команда SHOW MASTER STATUS выдаст файл и позицию binlog, например:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | exampledb | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql>Запишите значения File и Position — они понадобятся при настройке slave.
Не выходите из MySQL, чтобы блокировка оставалась активной. Откройте второе окно терминала и создайте дамп и передайте его на slave:
server1 (в другом окне):
cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql [email protected]:/tmpПосле успешной передачи вернитесь в первое окно и снимите блокировку:
server1:
UNLOCK TABLES;
quit;4 Настройка slave (кратко, обязательные шаги)
На сервере slave (server2) выполните:
- Убедитесь, что MySQL установлен и SSL включён (аналогично шагу 2).\
- Поместите ca-cert.pem, client-cert.pem, client-key.pem в /etc/mysql/newcerts (мы уже скопировали).\
- В my.cnf на slave настройте ssl-ca, ssl-cert, ssl-key, а также server-id, и укажите, что это slave (server-id должно отличаться от master).
Пример настроек в /etc/mysql/my.cnf на slave:
server-id = 2
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/client-cert.pem
ssl-key=/etc/mysql/newcerts/client-key.pemПерезапустите MySQL на slave.
Затем импортируйте snapshot.sql на slave:
mysql -u root -p exampledb < /tmp/snapshot.sqlВ MySQL-шелле на slave выполните команду CHANGE MASTER TO, используя параметры, полученные на master (MASTER_LOG_FILE и MASTER_LOG_POS), а также укажите master_host, master_user и master_password. Обязательно укажите MASTER_SSL=1, если хотите принудить SSL:
Пример (на slave в mysql):
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=106,
MASTER_SSL=1;После этого запустите процесс репликации:
START SLAVE;Проверьте статус:
SHOW SLAVE STATUS\GОжидаемые поля: Slave_IO_Running: Yes, Slave_SQL_Running: Yes. Если есть ошибки, они будут в Last_IO_Error или Last_SQL_Error.
Отладка и частые проблемы
- Если Slave_IO_Running = No — проверьте сетевое соединение, доступность master по порту 3306 и правильность учётных данных.\
- Если Last_IO_Error содержит проблемы с SSL — проверьте права на ключи, корректность сертификатов и соответствие путей в my.cnf.\
- Если позиции MASTER_LOG_FILE/MASTER_LOG_POS неверны — убедитесь, что вы использовали значения, полученные при FLUSH TABLES WITH READ LOCK.
Совет: используйте netstat/ss, чтобы проверить слушает ли master порт 3306.
Когда это не подходит
- Если вы не контролируете сеть между серверами и не уверены в целостности маршрута, подумайте об использовании VPN или приватных сетей.\
- Для односторонних резервных копий лучше использовать периодические дампы и хранилище версий — репликация не даёт защиты от человеческих ошибок.
Альтернативные подходы
- Использовать SSH-туннель или VPN для защиты трафика вместо SSL MySQL.\
- Рассмотреть GTID (Global Transaction Identifiers) в более новых версиях MySQL вместо позиции binlog для упрощения управления репликацией.\
- Использовать инструменты резервного копирования (например, xtrabackup) для создания горячих резервных копий.
Мини‑методология: безопасная настройка репликации (4 шага)
- Подготовка: проверить версии MySQL, сеть и доступ root.\
- Криптография: сгенерировать CA, серверные и клиентские ключи; защищать приватные ключи.\
- Конфигурация: включить binlog, задать server-id, настроить SSL в my.cnf.\
- Проверка: создать консистентный дамп с блокировкой, настроить slave, подтвердить Slave_IO_Running и Slave_SQL_Running.
Проверочный чеклист для администратора
- MySQL установлен на master и slave.\
- SSL поддержка включена (have_ssl = YES).\
- Сертификаты созданы и корректно размещены.\
- my.cnf настроен (ssl-ca, ssl-cert, ssl-key, server-id, log_bin, binlog_do_db).\
- Пользователь репликации создан с REQUIRE SSL (по желанию).\
- Дамп был создан с FLUSH TABLES WITH READ LOCK и передан на slave.\
- CHANGE MASTER TO выполнен с MASTER_SSL=1 и правильными параметрами.\
- START SLAVE; SHOW SLAVE STATUS\G — обе строки Running.
Роли и обязанности (короткие списки)
Администратор master:
- Генерация сертификатов.\
- Настройка my.cnf и binlog.\
- Создание пользователя репликации и выдача прав.
Администратор slave:
- Получение и безопасное хранение client ключей.\
- Импорт snapshot.sql.\
- Настройка CHANGE MASTER TO и запуск репликации.
Критерии приёмки
- Slave_IO_Running = Yes и Slave_SQL_Running = Yes.\
- Нет ошибок в Last_IO_Error/Last_SQL_Error.\
- Данные в таблицах exampledb на обеих машинах совпадают для тестовой выборки.
Фактическая справка (ключевые элементы)
- Порт по умолчанию MySQL: 3306.\
- Binlog — источник репликации; server-id должен быть уникальным для каждого сервера.\
- MASTER_SSL=1 в CHANGE MASTER TO принуждает SSL-соединение.
Пример решения проблем (короткий runbook)
- Если реплика не стартует — проверить SHOW SLAVE STATUS\G.\
- Если ошибка SSL — проверить права на /etc/mysql/newcerts и правильность pem-файлов.\
- Если позиция не совпадает — пересоздать snapshot с LOCK/SHOW MASTER STATUS и повторить настройку.
Пример диаграммы принятия решения
flowchart TD
A[Нужно ли шифрование трафика?] -->|Да| B[Использовать MySQL SSL или VPN]
A -->|Нет| C[Можно использовать незашифрованную репликацию в доверенной сети]
B --> D{Есть ли доступ к OpenSSL и права root?}
D -->|Да| E[Сгенерировать сертификаты и настроить my.cnf]
D -->|Нет| F[Рассмотреть VPN/SSH-туннель]Заключение
Этот руководство показывает все необходимые шаги для настройки репликации MySQL с использованием SSL на Debian Squeeze. Основные этапы: включение поддержки SSL, генерация сертификатов, настройка master (binlog и server-id), создание согласованного дампа и настройка slave с принудительным SSL. Всегда проверяйте статус репликации и храните приватные ключи в надёжном месте.
Краткие рекомендации:
- Тестируйте процесс на непроизводственной среде.\
- Используйте безопасные пароли и ограничивайте доступ к ключам.\
- Документируйте значения MASTER_LOG_FILE и MASTER_LOG_POS во время создания дампа.
Короткое резюме
- Настроили SSL и сертификаты.\
- Включили binlog и задали server-id.\
- Создали согласованный дамп и импортировали его на slave.\
- Настроили и запустили репликацию, проверили её статус.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента