В этом руководстве описывается, как настроить репликацию базы данных в 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 не установлен на обоих серверах, то приступайте к установке, выполнив команду на основном и дополнительном серверах:
Вам будет предложено ввести пароль root для MySQL как на основном, так и на вторичном сервере.aptitude install mysql-server mysql-client
Теперь проверим поддержку 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
-
Оценка Хостинга Inmotion
19 Oct, 24 -
Шпаргалка По Макетам Объектов В Perl
19 Oct, 24 -
Оптимальный Алгоритм Игры В Морской Бой
19 Oct, 24