Debian LennyでSSL暗号化を使用したMySQLレプリケーション設定方法

このガイドでは、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行を追加します

 [...] # * 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が有効になっていることを示しています。

次に、/ etc / mysql / my.cnfの行bind-address = 127.0.0.1をコメントアウトして、すべてのインターフェイスでリッスンするようにMySQLを構成します。

server1:

 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接続用の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# 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番目のサーバーに転送する必要があります。 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 [...] # * 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
      
      





次に、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 [...] # 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. 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に通知してください。



All Articles