ようへいの日々精進XP

よかろうもん

MySQL のレプリケーションを SSL でやってみました

要件

構成

以下のような感じ。

f:id:inokara:20130609103635p:plain

インターネットを介して二台のサーバーで稼働している MySQL にてレプリケーションを行う。その際に SSL で通信を暗号化する。

手順

MySQL SSL 対応確認、設定

  • こちら を参考にマスター、スレーブともに MySQLSSL 対応しておく
  • スレーブ側も必要かは要確認

レプリケーションユーザー作成

マスター側のにレプリケーション用のユーザーを作成する。このときに注意するのは 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_AllowedYes になっていることを確認する。それだけでは安心出来ないので以下を試してみる。

確認

スレーブ側で tcpdump しながらマスタにデータベースを追加をしてみると...以下の通り暗号化されている。

f:id:inokara:20130609105852p:plain

上段はマスターサーバー、下段はスレーブサーバー。

ちょっとメモ

  • レプリケーション設定を my.cnf への設定は不要
  • master.inforelay-log.info が正常に記録されていれば my.cnf へのレプリケーション設定は不要ではと思ったり
  • 5.5 系以降は my.cnf 内に master-host 等が記載されていると起動しないので...

まとめ

  • 別件で調べていたら完全に横道それてしまった
  • 意外に簡単に SSL を使ったレプリケーションが出来たのはラッキーだった