このところ楽天をはじめとして,MySQLを活用した大規模な事例が増えている(関連記事)。このような大規模,かつサービス停止の許されないシステムを支えているのが,MySQLのレプリケーション機能である。
「レプリケーション」とは,対象物とまったく同じ物を製作する処理だ。同じような意味に「ミラー」があるが,意味するところは物理的なコピーである。「レプリケーション」は,論理的な複製であり,対象物の全体や一部といった範囲を限定できる点が異なる。
このような機能は,大がかりな準備と高度な技術が必要と考えている方も多いだろう。しかし,MySQLのレプリケーション機能は,非常に簡単に利用することができる。今回は,現行バージョンでも利用可能なレプリケーション機能を解説する。
Masterの更新がSlaveに反映される
| ||
| ||
|
また,2台以上の構成や1台のマシンにMasterとSlaveを同時稼働させるなど,複雑な構成も可能だ。
MasterとSlaveの同期には,MasterのBinaryLog(binlog)が重要な役割を果たす(図2[拡大表示])。Masterのデータベース更新内容は,BinaryLogに保存される。BinaryLogは,更新処理内容,クエリーの実行時間などの情報がバイナリ形式で格納されている。
Slaveは,定期的にMasterのBinaryLogを参照して,更新内容を把握し反映する。Slaveが同期のために行った更新は,RelayLogに記録が残る。
レプリケーションの設定は簡単
MySQLのレプリケーションの設定は非常に簡単である。デモ環境として用意したのは,MasterがWindows 2000,SlaveにLinuxである。MySQLは異なるOSの間でもレプリケーションが可能だ(図3[拡大表示])。
IPアドレスは,Masterが「192.168.1.101」,Slaveが「192.168.1.100」とする。Masterのデータベース「databank」の中にテーブル「member」を作成した。データベース「databank」をSalveに複製する。
Masterを設定する
(1) Slaveがアクセスするためのレプリケーションユーザーを作成し権限を設定する。
まず,SQLコマンドで,ユーザー「satou」に権限「file」を与える。
mysql> grant file on *.* to satou;
Query OK,0 rows affected (0.01 sec)
次にSQLコマンドで,IPアドレス「192.168.1.100」からアクセスするユーザー「satou」に権限「file」と「replication slave」を与え,パスワード「pass」とする。
mysql> grant file,replication slave on *.* to satou@192.168.1.100 IDENTIFIED BY 'pass';
Query OK,0 rows affected (0.04 sec)
(2) 環境設定ファイル「C:¥WINNT¥my.ini」(Windows2000の場合)に以下の3行を追加する。
[mysqld]
server-id = 77 サーバーID(識別用なので他のサーバーと重複しない値)
log-bin BinaryLogの有効化
(3) MySQLを再起動する。
Slaveを設定する
(1) 環境設定ファイル「/etc/my.cnf」(Linux環境の場合)に以下の5行を追加する。
[mysqld]
server-id=7 サーバーID(識別用なので他のサーバーと重複しない値)
master-host = 192.168.1.101 MasterのIPアドレス
master-user= satou レプリケーション・ユーザー名
master-password = pass レプリケーション・ユーザーのパスワード
replicate-do-db = databank レプリケーションを行うデータベース名
(2) あらかじめMasterのデータベース「databank」の内容をSlaveに複写する。
(3) MySQLを再起動する。
Slaveの設定の補足とレプリケーションに関するSQLコマンド
Slaveの環境設定ファイルの記述内容は,Masterへの接続情報や対象範囲を指定する項目である(表1)。
表1●Slaveの環境設定ファイルに記述する内容(代表的なもの)
項目 | 内容 | |
master-host | MasterのIPアドレスやホスト名 | |
master-port | MasterのPort | |
master-user | Replicationユーザ名 | |
master-password | Replicationユーザのパスワード | |
replicate-do-db | 対象となるデータベース名 | |
replicate-ignore-db | 対象外となるデータベース名 | |
replicate-do-table | 対象となるテーブル名 | 指定方法:データベース名.テーブル名 |
replicate-ignore-table | 対象外となるテーブル名 |
レプリケーションに関する代表的なSQLコマンドを表2にまとめる。
表2●レプリケーションに関するSQLコマンド(代表的なもの)
コマンド | 機能 |
SLAVE START | レプリケーションの開始/再開 |
SLAVE STOP | レプリケーションの停止 |
RESET SLAVE | Slaveの状態をリセット |
SHOW MASTER STATUS | Masterの状態表示 |
SHOW SLAVE STATUS | Slaveの状態表示 |
CHENGE MASTER TO … | Slaveの参照先であるMasterの情報を変更する。 表1の項目を指定できる(ハイフンはアンダーバーに変える) 例:CHENGE MASTER TO master_password = ’123’; |
レプリケーションの動作を確認する
環境設定ファイルを変更しMySQLを再起動すれば,BinaryLogが有効となり,Slaveのアクセスを受けられる状態になる。Masterの状態は,SQLコマンド「show master status」にて確認できる。File欄に現在のBinaryLogファイル名と位置が表示される。
mysql> show master status; +--------------------+----------+--------------+------------------+ | File | Position | Binlog_do_db | Binlog_ignore_db | +--------------------+----------+--------------+------------------+ | zend-satou-bin.001 | 5439 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
環境設定ファイルを変更しMySQLを再起動すれば,Masterにアクセスが始まり,同期が有効となる。Slaveの状態は,SQLコマンド「show slave status\G」にて確認できる。Master_Log_FileとRead_Master_Log_PosがMasterのSQLコマンド「show master status」の内容と同じなら同期している。
mysql> show slave status¥G *************************** 1. row *************************** Master_Host: 192.168.1.101 Master_User: satou Master_Port: 3306 Connect_retry: 60 Master_Log_File: zend-satou-bin.001 Read_Master_Log_Pos: 5439 Relay_Log_File: localhost-relay-bin.002 Relay_Log_Pos: 5619 Relay_Master_Log_File: zend-satou-bin.001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_do_db: databank Replicate_ignore_db: Last_errno: 0 Last_error: Skip_counter: 0 Exec_master_log_pos: 5439 Relay_log_space: 5619 1 row in set (0.00 sec)
エラーが発生した場合の対処法
レプリケーションが動作しない場合には,以下の点を確認する。特にMasterのレプリケーションユーザーの権限設定とSlaveの環境設定ファイルの内容が噛み合わずエラーとなることが多い。
・MasterのBinaryLogが有効か?
・SlaveのMasterおよびレプリケーション・ユーザーが間違っていないか?
・MasterのErroeLogにエラーが記録されていないか?
テーブル作成時のレプリケーション
| ||
| ||
|
レプリケーションの停止と再開
Slaveは,SQLコマンド「Slave Stop」と「Slave Start」によって,レプリケーションを一次停止できる。停止中のMasterの更新は,レプリケーション再開後にSlaveに反映される(図5[拡大表示])。
MySQL Administratorの表示
前回解説したMySQL Administratorには,レプリケーションを確認する機能もある。MasterにてMySQL Administratorを実行すると状態を見ることができる(写真1[拡大表示])。
少々駆け足となったが,レプリケーションの設定と動作をご理解いただけただろうか。このようにMySQLのレプリケーション機能は手軽に導入することができる。ぜひ,経験しておきたい。
クラスタリング機能も2004年第3四半期にリリース
レプリケーションより一歩進んだ冗長化の方法としてクラスタリングがある。あるサーバーに障害が発生した際,残りのサーバーが処理を継続するフェールオーバーを自動的に実行する機能である。
クラスタリングに関しては,4月にMySQL社から,「MySQL Cluster」が発表された(関連記事)。MySQL本体と同様,GPLと商用ライセンスのデュアル・ライセンスで提供される。2004年第3四半期にリリースされる予定だが,MySQL社が買収したAlzato社の有償製品がベースとなっているので,早い段階から高い完成度が得られると思う(関連記事)。現在は,ソースコード・レベルの公開となっているが,もう少し具体的な段階になったら,ぜひこのコーナーで紹介したい。
■著者紹介 佐藤栄一(さとうえいいち)
ゼンド・オープンソースシステムズ株式会社 アーキテクト MySQL担当。ゼンド・オープンソースシステムズは,オープンソースによるシステム構築を提案し,情報化投資削減の実現を目指して平成14年12月に設立。PHPのコア技術者が設立したイスラエルZend Technologiesと提携関係にあり,Zend製品の販売,サポートおよびLAMPおよびLAPPによるシステム構築を推進している。平成15年8月より,MySQL ABのリセーラとしてライセンス,サポート,コンサルティングの提供を行っている。