このところ楽天をはじめとして,MySQLを活用した大規模な事例が増えている(関連記事)。このような大規模,かつサービス停止の許されないシステムを支えているのが,MySQLのレプリケーション機能である。

 「レプリケーション」とは,対象物とまったく同じ物を製作する処理だ。同じような意味に「ミラー」があるが,意味するところは物理的なコピーである。「レプリケーション」は,論理的な複製であり,対象物の全体や一部といった範囲を限定できる点が異なる。

 このような機能は,大がかりな準備と高度な技術が必要と考えている方も多いだろう。しかし,MySQLのレプリケーション機能は,非常に簡単に利用することができる。今回は,現行バージョンでも利用可能なレプリケーション機能を解説する。

Masterの更新がSlaveに反映される

図1●MasterとSlaveの関係
図2●BinaryLogの役割
図3●デモ環境
 MySQLのレプリケーション機能は,MasterとSlaveに役割が分かれる(図1[拡大表示])。Masterとなっているデータベースの内容が,Slaveのデータベースに反映される。そのため,更新できるのは,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’;

レプリケーションの動作を確認する

  • Master

     環境設定ファイルを変更し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)
    

  • Slave

     環境設定ファイルを変更し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にエラーが記録されていないか?

    テーブル作成時のレプリケーション

    図4●テーブル作成時のレプリケーション
    図5●レプリケーションの停止と再開
    写真1●MySQL Administratorのレプリケーション状況表示画面
     レプリケーションの動作をテーブルの作成で試してみよう。今回のデモでは,データベース「databank」全体をレプリケーションしている。そのため,Masterで,テーブル「member」を基にテーブル「member2」を作成すると,ほぼ同時にSlaveにテーブル「member2」が出現する。図4[拡大表示]は,MasterとSlaveで実施した際の処理結果を時系列に表した。

    レプリケーションの停止と再開

     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社の有償製品がベースとなっているので,早い段階から高い完成度が得られると思う(関連記事)。現在は,ソースコード・レベルの公開となっているが,もう少し具体的な段階になったら,ぜひこのコーナーで紹介したい。

    佐藤栄一(Satoh Eiichi)

    ■著者紹介 佐藤栄一(さとうえいいち)
    ゼンド・オープンソースシステムズ株式会社 アーキテクト MySQL担当。ゼンド・オープンソースシステムズは,オープンソースによるシステム構築を提案し,情報化投資削減の実現を目指して平成14年12月に設立。PHPのコア技術者が設立したイスラエルZend Technologiesと提携関係にあり,Zend製品の販売,サポートおよびLAMPおよびLAPPによるシステム構築を推進している。平成15年8月より,MySQL ABのリセーラとしてライセンス,サポート,コンサルティングの提供を行っている。