要件
構成
以下のような感じ。
インターネットを介して二台のサーバーで稼働している MySQL にてレプリケーションを行う。その際に SSL で通信を暗号化する。
手順
MySQL SSL 対応確認、設定
レプリケーションユーザー作成
マスター側のにレプリケーション用のユーザーを作成する。このときに注意するのは REQUIRE SSL
オプション。
GRANT REPLICATION SLAVE ON *.* TO ${repl_user}@${slave_ip} IDENTIFIED BY '${your_password}' REQUIRE SSL; FLUSH PRIVILEGES;
マスター側で作成した証明書等をスレーブ側に転送しておく
マスターに接続する際に必要かなと思ったのでマスター側で作成した証明書をスレーブ側の任意のディレクトリに scp 等で取得しておく。
scp ${master_ip}/etc/mysql-ssl/* /etc/mysql-ssl/master/
レプリケーション設定
マスター側の my.cnf
には以下の設定を。
server-id = 100 log-bin expire_logs_days = 10
スレーブ側の my.cnf
には以下の設定を。
server-id = 101
レプリケーション開始
マスターにて show master status
を行う。
mysql> show master status\G *************************** 1. row *************************** File: mysqld-bin.000001 Position: 98 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)
スレーブにてレプリケーションを開始する。
CHANGE MASTER TO MASTER_HOST = 'xxx.xxx.xxx.xxx', MASTER_USER = 'repl_user', MASTER_PASSWORD = 'your_password', MASTER_LOG_FILE = 'mysqld-bin.000001', MASTER_LOG_POS = 98, MASTER_SSL = 1, MASTER_SSL_CA = '/etc/mysql-ssl/master/ca-cert.pem', MASTER_SSL_CERT = '/etc/mysql-ssl/master/server-cert.pem', MASTER_SSL_KEY = '/etc/mysql-ssl/master/server-key.pem';
start slave
を実行する。実行後 show slave status
にて確認する。
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: xxx.xxx.xxx.xxx Master_User: repl_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysqld-bin.000002 Read_Master_Log_Pos: 98 Relay_Log_File: mysqld-relay-bin.000005 Relay_Log_Pos: 236 Relay_Master_Log_File: mysqld-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: 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: 236 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: Yes Master_SSL_CA_File: /etc/mysql-ssl/master/ca-cert.pem Master_SSL_CA_Path: Master_SSL_Cert: /etc/mysql-ssl/master/server-cert.pem Master_SSL_Cipher: Master_SSL_Key: /etc/mysql-ssl/master/server-key.pem Seconds_Behind_Master: 0 1 row in set (0.00 sec)
Master_SSL_Allowed
が Yes
になっていることを確認する。それだけでは安心出来ないので以下を試してみる。
確認
スレーブ側で tcpdump
しながらマスタにデータベースを追加をしてみると...以下の通り暗号化されている。
上段はマスターサーバー、下段はスレーブサーバー。
ちょっとメモ
- レプリケーション設定を
my.cnf
への設定は不要 master.info
とrelay-log.info
が正常に記録されていればmy.cnf
へのレプリケーション設定は不要ではと思ったり- 5.5 系以降は
my.cnf
内にmaster-host
等が記載されていると起動しないので...