弊社ではほとんどのシステムのデータベースにMySQLを利用しています。レプリケーションの設定をしているのはポイ探だけですが、ある程度サイトが大きくなると更新系のSQLはMaster、検索系のSQLはSlaveと分けると快適に動作するサイトになります。ただ、レプリケーションの設定をしているとSlaveがエラーで止まっていたり、Masterに巨大なバイナリログが溜まっていたりします。そこでMySQLのレプリケーション運用時の注意点をいくつか書きます。
1.レプリケーションでSlaveが停止した場合(Slave側の処理)
めったにSlaveが停止することはありませんが、何らかの影響でMasterが固まってサーバを再起動場合などに起きることがあります。ポイ探のサーバでも数回起きたことがあります。
まずはSHOW SLAVE STATUS\GでSlaveのステータスをチェックします。
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: MasterのIPアドレス Master_User: レプリケーション用ユーザ名 Master_Port: ポート番号 Connect_Retry: 60 Master_Log_File: Master-bin.000040 Read_Master_Log_Pos: 9275561 Relay_Log_File: Slave-bin.000115 Relay_Log_Pos: 2477298 Relay_Master_Log_File: Master-bin.000040 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: 9275561 Relay_Log_Space: 2477298 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 1 row in set (0.01 sec)
ここでSlave_SQL_RunningがYesになっている場合は問題ありませんが、Noになっている場合はSlaveが止まっている状態です。Last_ErrorにエラーになっているSQLが表示されますのでそのSQLをチェックして下さい。
SQLをスキップして問題ない場合は、該当のSQLをスキップします。
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; mysql> START SLAVE;
もう一度SHOW SLAVE STATUS\Gを実行し、Slave_SQL_Runningをチェックします。たいていはYesになりますが、再度Noになっている場合は、上記を何度か繰り返すと正常に起動します。ほとんどSlaveが止まることはありませんが、何度か経験していますので、定期的にSlaveのステータスはチェックしましょう。
2.Masterのバイナリログを自動削除(Master側の処理)
Masterのデータディレクトリに巨大なバイナリファイルが存在している場合は、そのファイルを消すとディスクスペースが空きます。my.cnfにexpire_logs_daysを追加し、日数を指定します。0~99までの範囲で指定でき、0はログを削除しません(デフォルト)。単位は日ですので、ある程度余裕を持った値を設定します。
[mysqld] set-variable = expire_logs_days=99
上記の設定では99日前のバイナリログは自動で削除されることになります。但し、MySQLの起動時やログのローテション事に実行されるため、日付が過ぎた状態でもログが残っている場合はあります。手動でも削除することができますが、自動設定のほうが運用は楽になりますのでこちらがおすすめです。ただし、定期的にSlaveのステータスをチェックしていないと、Masterのバイナリログがなければ同期がとれなくなりますのでご注意下さい。