このガイドでは、SSL暗号化接続を使用してMySQLでデータベース複製を構成する方法について説明します。
MySQLレプリケーションはデータベースを同期します。これにより、別のサーバーにデータベースの正確なコピーを保持できます。 メインサーバー上のすべてのデータベース更新は、別のサーバーに自動的に複製されます。これにより、ハードウェア障害からデータベースを保護できます。 この記事では、SSL接続を使用して、server1.example.comサーバー(IPアドレス192.168.0.100)からserver2.example.comサーバー(IPアドレス192.168.0.101)へのexampledbデータベース複製を実装する方法を示します。
両方のサーバーはDebian Lennyで動作しますが、構成はほとんどすべてのディストリビューションに変更なしで適用できます。 maindbにのみ既にテーブルとデータが存在するexampledbデータベース。 すべてのコマンドはルート権限で実行されます。
MySQLサーバーが両方のサーバーにインストールされていない場合は、プライマリサーバーとセカンダリサーバーでコマンドを実行してインストールを続行します。
aptitude install mysql-server mysql-client
プライマリサーバーとセカンダリサーバーの両方で、MySQLのルートパスワードを入力するように求められます。
次に、MySQLでのSSL接続サポートを確認しましょう。 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サポートを有効にするには、/ etc / mysql /にあるmy.cnfファイルを編集する必要があります
vi /etc/mysql/my.cnf
* Security Features行を見つけて、ssl行を追加します
[...]
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が有効になっていることを示しています。
次に、/ etc / mysql / my.cnfの行bind-address = 127.0.0.1をコメントアウトして、すべてのインターフェイスでリッスンするようにMySQLを構成します。
server1:
vi /etc/mysql/my.cnf [...]
MySQLの復元:
/etc/init.d/mysql restart
それでは、ポートで何がハングしているのか見てみましょう。
netstat -tap | grep mysql server1:~
どうやら、MySQLはすべてのインターフェイスでブロードキャストされます。
次に、SSL接続用のCA、サーバー、およびクライアント証明書を作成する必要があります。 通常、/ 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
ここで、証明書ca-cert.pem、client-cert.pem、およびclient-key.pemを2番目のサーバーに転送する必要があります。 2番目のサーバーにディレクトリを作成します。
server2:
mkdir /etc/mysql/newcerts
server1に戻り、証明書を次のように渡します。
server1:
scp /etc/mysql/newcerts/ca-cert.pem root@192.168.0.101:/etc/mysql/newcerts scp /etc/mysql/newcerts/client-cert.pem root@192.168.0.101:/etc/mysql/newcerts scp /etc/mysql/newcerts/client-key.pem root@192.168.0.101:/etc/mysql/newcerts
次に、server1 /etc/mysql/my.cnfを開き、行ssl-ca、ssl-cert、およびssl-keyのコメントを外して、* Security Featuresエリアに変更を加えます。
vi /etc/mysql/my.cnf [...]
MySQLを再起動します。
/etc/init.d/mysql restart
次に、server1上のデータベースにアクセスするために、server2で使用されるレプリケーションユーザーslave_userを作成します。
mysql -u root -p GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;
REQUIRE SSL行はオプションです。この行を離れると、slave_userは暗号化された接続と暗号化されていない接続を介して接続できます。 SSLを使用する場合、暗号化された接続のみが許可されます。
(レプリケーションユーザーが既に作成されており、SSL接続のみを指定する必要がある場合は、次のようにユーザーを変更する必要があります。
GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;
)
FLUSH PRIVILEGES; quit;
さらに、レプリケーションのためにログを保存するMySQLを指定する必要があります。また、どのサーバーがメインで、どのサーバーがレプリケーションであるかを示す必要があります。
vi /etc/mysql/my.cnf [...]
MySQLの再起動
/etc/init.d/mysql restart
次に、いくつかの操作を実行する必要があります。
1. server1のexampledbデータベースをブロックします
2.マスターステータスserver1を見つける
3. SQL exampledbのダンプを作成します(server2へのインポート用)
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コンソールを離れることなく(データベースロックが解除されるため)、それをバックアップしてserver2に転送します。
server1:
cd /tmp mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql scp snapshot.sql root@192.168.0.101:/tmp
操作後、データベースを安全にロック解除できます
server1:
UNLOCK TABLES; quit;
これで、server1のセットアップが完了しました。 マッスル設定を開いて、server2をセットアップしましょう。
server2:
vi /etc/mysql/my.cnf
次の行設定があることを確認します(設定していない場合は追加します)。
[...] server-id=2 master-connect-retry=60 replicate-do-db=exampledb [...]
server-id = 2の値は一意であり、server1にある値と異なる必要があります
MySQLを再起動します。
/etc/init.d/mysql restart
レプリケーションの構成を開始する前に、空のデータベースを作成します。
mysql -u root -p CREATE DATABASE exampledb; quit;
これで、server2のsnapshot.sqlデータベースのダンプをインポートできます
/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-学習したserver1上のログファイルの値は、SHOW MASTER STATUSコマンドを実行します。
* MASTER_LOG_POS-SHOW MASTER STATUSコマンドを実行して取得した値。
* MASTER_SSL-SSLを使用してプライマリサーバーとセカンダリサーバーの間に接続を作成します
* MASTER_SSL_CA-CA証明書へのパス(server2)
* MASTER_SSL_CERT-client-cert.pem証明書(server2)へのパス
* MASTER_SSL_KEY-client-key.pem証明書(server2)へのパス
そして最後に
START SLAVE;
次に、server2のステータスを確認します
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;
以上で、サーバーのセットアップは完了です。 すべてを正しく行った場合、レプリケーションは正しく構成され、動作可能です。
ご清聴ありがとうございました!
PS紙片または誤って作成された提案を見つけた場合は、PMに通知してください。