2014/03/28

mysql replication ssh ssl

■ssl vs ssh?
現時点では、MySQLレプリケーションは送信されるバイナリログのチェックサムを確認しない。
そのため、不安定なネットワークを利用している場合にバイナリログが転送中に壊れてしまうケースがある。
ネットワーク機器のメンテナンスをしっかりと行うのは当然であるが、いくらメンテナンスを行ってもゼッタイに壊れないということはないだろう。
そんな場合はSSLを利用するといい。マスターとスレーブ間をSSLで接続すれば、データが壊れてしまった場合にはSSLが検知してくれるし、勝手に再送も行ってくれる。

ssl認証関係の下記などの作成して、mysqlを設定する

CA のキーを生成

mkdir /etc/mysql-ssl
cd /etc/mysql-ssl

1. Create CA cert, private key
openssl genrsa -out ca-key.pem 2048

2. Create CA cert, certificate"CA の証明書を作成
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem

3. Create Server certificate, key"
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem

4. Create Server certificate, cert"
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

slave:
 CHANGE MASTER TO MASTER_HOST='11.11.11.1',MASTER_PORT=1,MASTER_USER='1',MASTER_PASSWORD='1',MASTER_SSL=1,MASTER_SSL_CA = '/data/ssl/ca-cert.pem',MASTER_LOG_FILE='mysql-bin.000821',MASTER_LOG_POS=426103029;

master:
 ssl-ca=/data/ssl/ca-cert.pem
 ssl-cert=/data/ssl/server-cert.pem
 ssl-key=/data/ssl/server-key.pem




・MySQLでSSLの設定をするのは面倒だ!という人はSSHトンネリングを利用するといい。
次のようにsshコマンドをスレーブ上で実行すると、マスターのポート3306がスレーブの3307にマッピングされる。
shell> ssh -f master-hostname -L 3307:localhost:3306 -N -4

その後、スレーブ側でCHANGE MASTER TOを行えば良い。
   
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3307;
mysql> START SLAVE;

ちなみに、127.0.0.1:3307への接続が:失敗する場合、"open failed: administratively prohibited: open failed"というエラーが表示さるようであれば、
マスター上でフォワーディングが許可されていない可能性がある。/etc/[ssh/]sshd_configを編集して、AllowTcpForwarding=1を設定しよう。

・レプリケーションのチェックサムはMySQL 6.0から搭載される予定である。それまではSSLまたはSSHトンネリングで凌ごう。