Гид по технологиям

Настройка репликации MySQL с шифрованием SSL на Debian Squeeze

• 7 min read • Базы данных • Обновлено 22 Nov 2025
Репликация MySQL с SSL на Debian Squeeze
Репликация 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 — нет.

Содержимое: основной план

  1. Установка MySQL 5 и включение SSL.\
  2. Настройка master: слушать на всех интерфейсах, создание сертификатов, настройка binlog и пользователя репликации.\
  3. Снятие дампа, передача на slave и настройка slave.\
  4. Проверка, контрольные списки и отладка.

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 -p
show 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/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

Настройка 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 шага)

  1. Подготовка: проверить версии MySQL, сеть и доступ root.\
  2. Криптография: сгенерировать CA, серверные и клиентские ключи; защищать приватные ключи.\
  3. Конфигурация: включить binlog, задать server-id, настроить SSL в my.cnf.\
  4. Проверка: создать консистентный дамп с блокировкой, настроить 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)

  1. Если реплика не стартует — проверить SHOW SLAVE STATUS\G.\
  2. Если ошибка SSL — проверить права на /etc/mysql/newcerts и правильность pem-файлов.\
  3. Если позиция не совпадает — пересоздать 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.\
  • Настроили и запустили репликацию, проверили её статус.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро