「MySQLレプリカ」の編集履歴(バックアップ)一覧はこちら

MySQLレプリカ」(2009/01/14 (水) 12:25:46) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

#contents *Master-Slave構成でレプリケーションした時のメリット 冗長化 MasterがダウンしたときにSlaveを使用することで、ダウンタイムを少なくすることができる。 負荷分散 重たい処理(SELECT)をSlave側に処理させることで、負荷を分散できる。 *注意:UPDATEなどの更新処理に関しては、Master側での処理は必須である。 バックアップ DBのバックアップをSlave側で行うことができる。 取得時には不完全なデータとならないように書き込みをロックして行う必要があるが、 Slave側で行うことでMaster側はロックする必要がなく、ユーザ利用ができる。 *ダンプの取り方を工夫することで完全なスナップショットがとれる。(別セクションにて解説) *レプリケーションの動作 1.Masterサーバで実行された更新系クエリ(Insert,Update等)はバイナリログに蓄える 2.Slave側が接続してきたら、前回の接続からの変更分をSlave側に送信する 3.Slave側はMasterから受け取ったクエリを一旦リレーログに蓄える 4.Slave側でリレーログを順次クエリを実行してDBを同期 *レプリケーション動作にはBinlogDump、I/O、SQLの3つのスレッドが連携して動作する。 *設定手順(Master-Slave構成) +Master側の設定の確認 バイナリログの設定とサーバIDを重複しないように設定する。 [mysqld] log-bin server-id=11 +アカウントの作成 Slave側からMaster側へ接続するためのレプリカの専用IDをMaster側に接続する。 REPLICATION SLAVE権限を付与すること。 mysql> GRANT REPLICATION SLAVE ON *.* TO rep@192.168.1.10 IDENTIFIED BY 'password'; +データベースのバックアップ Master側のデータをSlave側へコピーを行う。その際にMaster側では更新がされないようにロックをしてから行う。 参考までにコピー対象ファイル; データベース、ibdata、バイナリログファイル mysql> FLUSH TABLES WITH READ LOCK;(Master側でデータベースをロックする) mysql> SHOW MASTER STATUS;(Master側でロックされた状態に確認する) +-----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-----------------+----------+--------------+------------------+ | 3306-bin.000022 | 312 | | | +-----------------+----------+--------------+------------------+ 1 row in set (0.00 sec) ロック状態の時に取得したFile名とPosition番号を控えておく。これらは、Slaveを立ち上げる際に使用する。 +レプリケーションをしたいDBをバックアップする。バックアップ方法はtar等で取得する。 +ロックを解除する データベースをバックアップしたら書き込みロックの解除して、通常の運用にもどす。 mysql>UNLOCK TABLES; +取得したMaster側のデータベースのバックアップをSlave側へコピーして展開する。 +Slave側の設定 バイナリログの設定とサーバIDを重複しないように設定する。 [mysqld] log-bin server-id=12 #レプリケーションを行わないデータベース名 replicate-ignore-db=mysql relay-log=./log/slave-relay-bin.log net_read_timeout=60 +設定が完了したらSlave側のmysqldを起動する。 +レプリケーションの開始の設定 mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.10', <== Masterのホスト名/IPアドレス MASTER_USER='rep', <== Master接続に使用するユーザー名 MASTER_PASSWORD='rep', <== パスワード MASTER_LOG_FILE='3306-bin.000022', <==3で確認したFile MASTER_LOG_POS=312; <==3 で確認したPosition +レプリケーションの開始 mysql>START SLAVE; 書き込みロックを解除した以降のMaster側の変更内容がSlave側に反映される。 これ以降は、Master側での変更はSlave側にも反映されるようになる。 *動作確認 +Master側での確認 mysql>show processlist\G; ・・・・・略 *************************** 3. row *************************** Id: 10 User: rep Host: host db: NULL Command: Binlog Dump・・・・・・・・・・Binlog Dumpが起動しているかどうか Time: 36 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL 3 rows in set (0.00 sec) +Slave側での確認 "Slave_IO_Running"と"Slave_SQL_Running"がともに"Yes"であることを確認する。 mysql>show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: xxx.xxx.xxx.xxx Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: 3306-bin.000022 Read_Master_Log_Pos: 312 Relay_Log_File: xxx001-relay-bin.000001 Relay_Log_Pos: 46 Relay_Master_Log_File: 3306-bin.000022 Slave_IO_Running: Yes・・・・・・・・・・Yesであることを確認 Slave_SQL_Running: Yes・・・・・・・・・・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: 312 Relay_Log_Space: 46 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 +ログの確認 /var/log/mysql.log 081128 14:48:32 [Note] Slave I/O thread: connected to master 'rep@xxx.xxx.xxx.xxx:3306', replication started in log '3306-bin.000022' at position 312 081128 14:48:32 [Note] Slave SQL thread initialized, starting replication in log '3306-bin.000022' at position 312, relay log './xxx001-relay-bin.000001' position: 4 *参考コマンド SHOW MASTER STATUS (Master用)・・・・・バイナリログの状態表示 SHOW BINLOG EVENTS (Master用)・・・・・バイナリログの中身の表示

表示オプション

横に並べて表示:
変化行の前後のみ表示: