レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

mysqlの準同期レプリケーションを使ってみる

2012年11月23日 2015年5月14日
mysql replication icon

以前の記事 mysqlのレプリケーションを使う で mysqlを使った 簡単なマスタースレーブ型のレプリケーションの設定を行ってみました。
今回は、そのmysqlのレプリケーションに準同期レプリケーション(Semisynchronous Replication)を加えた設定について簡単に解説してみます。

Semisynchronous Replication : 訳がネット上では準同期レプリケーション で蔓延していますので、ここでもそのまま使用させてもらいます。
( Semiには、半分というニュアンスもあるので、同期でも良かったのかもしれませんね。要は完全ではない同期 ぐらいの意味あいでしょう。)

この機能は、MySQL バージョン 5.5 以上に追加されました。
レプリケーション(replication)とは、
直訳のとおり複製を意味します。(レプリカ(replica)と語源は一緒なので、こちらがピンとくるかもしれません)

mysqlでレプリケーションと言うと、マスター、スレーブのそれぞれのmysqlサーバーを構築することに他なりません。
マスター1台に対して、スレーブ複数台というのが一般的なmysqlサーバーの構成になります。

一般的には、マスター mysql サーバー でデータベースの更新処理(書き込み)を受け持ち、スレーブ側で参照処理(読み込み)を受け持つことで負荷を分散させたり、バックアップデータベースを作成するなど行うことができます。
レプリケーション
上の図は、その典型的なレプリケーションの例を示したものです。
ユーザは、1台のサーバーにアクセスしているつもりですが、実際のデータベースへの書き込み処理は、バックにあるマスターサーバー側で処理され、データベースの読み込み処理は、フロントのスレーブサーバーで処理されます。
特に参照がメインのサーバーでは、かなりの負荷分散が期待されます。

mysqlのレプリケーションは、よく負荷分散もしくはバックアップに用いられます。

今回は、その簡単な設定方法について解説してみたいと思います。

mysqlの準同期レプリケーションの考え方

mysqlのレプリケーションは、デフォルトの動作は、非同期レプリケーションです。
非同期なので、マスタースレーブで何らかの障害が発生し、停止した場合、 そのリカバリがどこまで必要かは、ログ情報に頼ることになり、非常にメンテナンスに手間がかかりました。

今回、この準同期レプリケーションにて、少なくともマスター側は、スレーブ側がどこまでデータを更新しているか、認識できるようになりました。(完璧ではありませんが、非同期と比較すれば格段に認識できます)

その仕組みは、非常に簡単で、
COMMITが完了した時点で、マスター側でバイナリログへ書き込み、スレーブにもそのバイナリログ情報が転送されます。
スレーブでは、バイナリログ情報が受信できたら、マスターへ応答(ACK)を送信します。スレーブは、その後データベースへ反映します。
マスターは、その応答(ACK)を受信した後、データベースへ反映します。

ここでスレーブから応答(ACK)をもらうか否かが準同期と非同期の違いになります。つまり、スレーブへは更新情報が確かに届いたかどうかをマスターは認識できることを意味します。

以下は、その処理の流れを図にしたものです。
マスタースレーブ型レプリケーションの考え方


mysqlの準同期レプリケーション設定を行う

以前の記事 mysqlのレプリケーションを使う で 設定を行った マスタースレーブ型のレプリケーションが既に動作しているものとして、以降、記載します。
( マスタースレーブ型のレプリケーションの設定方法については、mysqlのレプリケーションを使う で確認してください。 )

準同期レプリケーションの設定は、mysqlの設定ファイル(my.cnf)の編集を行うことで利用できます。
以下、マスタースレーブのそれぞれの設定について解説します。

mysqlの設定ファイル(my.cnf)を編集します。

設定ファイルのデフォルトディレクトリはOSによって異なります。
CentOS ScientificLinux : /etc/my.cnf
Debian Ubuntu : /etc/mysql/my.cnf

この設定ファイルを以下のように編集します。

マスター

...
[mysqld]
...
# Replication
server-id      = 101
log-bin        = /var/lib/mysqllogs/bin-log
# Semisynchronous Replication(Master)
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=5000
...

スレーブ

...
[mysqld]
...
# Replication
server-id      = 102
log-bin        = /var/lib/mysqllogs/bin-log
# Semisynchronous Replication(Slave)
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
...
server-id
サーバー種別番号
※1,2 という番号については、mysqlのデフォルト値として用いられる場合があるので、できれば避けた方が良いでしょう。

log-bin
バイナリログファイルサフィックス名
※この設定例では、/var/lib/mysqllogs/というディレクトリ配下に、bin-log.xxxの名前でバイナリログファイルが作成されていきます。

plugin-load
読み出すプラグイン名+プラグインファイル名
※ここでは、準同期レプリケーション用プラグインを指定します。(ここでは、マスター用とスレーブ用があるのに注意してください。)
rpl_semi_sync_master_enabled
準同期レプリケーション(マスター)の有効(=1)/無効(=0)設定
rpl_semi_sync_master_timeout
準同期レプリケーション(マスター)の応答待ち最大時間(ms) [デフォルト 10000ms(10s)]
rpl_semi_sync_slave_enabled
準同期レプリケーション(スレーブ)の有効(=1)/無効(=0)設定

上記以外にも以下のような関連するものがあります。
rpl_semi_sync_master_trace_level
マスター用の準同期レプリケーションのデバッグトレースレベル。以下の4つから選択できます。
1 = 一般レベル (例: 時間、関数(機能)、 異常をトレースします)
16 = 詳細レベル (より詳しい情報を出力します)
32 = ネット待ちレベル (ネットワークの待ちに関する情報をより詳しく出力します)
64 = 関数(機能)レベル (関数(機能)の実行、終了についてより詳しく出力します)
この変数は、マスタ側の準同期レプリケーションのプラグインがインストールされている場合にのみ使用できます。
rpl_semi_sync_slave_trace_level
スレーブ用の準同期レプリケーションのデバッグトレースレベル。マスター用と同様に上記の4つから選択できます。

rpl_semi_sync_master_wait_no_slave
準同期レプリケーションでは、トランザクションごとに、マスタは、いくつかの準同期スレーブから受信確認(ACK)のタイムアウトになるまで待ちます。 無応答がこのタイムアウト待ちの間に発生する場合、マスター側は、通常のレプリケーションに戻ります。 この変数は、マスタがスレーブ・カウントが、このタイムアウト期間中にゼロになった場合であっても、通常のレプリケーションに戻す前に、タイムアウトまで待機するかどうかを制御します。

この値がON(デフォルト)の場合、
スレーブ・カウントが タイムアウト待ちの間にゼロになった場合(例えば、スレーブが切断されている場合)でも、待機することが許されています。
つまり、その状態であってもマスタは、まだタイムアウトを待ちます。 そして、タイムアウトの待ちの間に、スレーブが再接続し、トランザクションを確認(ACK返信)するのを待つことで、準同期レプリケーションを続けようとします。

この値がOFFの場合、
スレーブ・カウントがタイムアウト待ちの間にゼロになったら、マスターは、通常のレプリケーションに戻ります。


ここで紹介している変数は、マスタ側の準同期レプリケーションのプラグインがインストールされている場合にのみ使用できます。
rpl_semi_sync_master_wait_no_slave については、下記の参照先URLで
この変数を切り替えても何も起こらないのでバグじゃないか・・・というサポートへのレポートがあります。
それに対する回答が以下のようなものです。(直訳なので、間違っているかもしれません。間違ってたらごめんなさい。

それはバグではありません。
通常のmysqlサーバーでは、スレーブが失敗したかされていないかは、マスターにはわかりません。 それを確認できる唯一の方法は、スレーブIOスレッドからの返信を待つことだけです。
本当の同期レプリケーションが必要な場合で、MySQL Cluster を試すことができるなら、まさにその制限やそれがアプリケーションにどう影響を与えることができるかを学ぶことができるでしょう。

( 参照 : http://bugs.mysql.com/bug.php?id=60425 )

この文面からする通常のmysqlサーバーでは、この変数を変更しても何も起こらない・・・と言っているようです。

mysqlを再起動します。

設定を終えたら、マスタースレーブともに、mysqlを再起動します。

$ /etc/init.d/mysqld restart
mysqld を停止中:                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]

mysqlの準同期レプリケーションの動作確認を行う

以下のように マスタースレーブで、それぞれ時系列で以下のように確認を行います。

マスター スレーブ
テスト用テーブルを作成します。
> CREATE TABLE autoinc1(
	col INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
テスト用テーブルがスレーブ側に自動的に作成されたか確認します。
> select * from autoinc1;
Empty set (0.00 sec)
ちゃんと空っぽ(Empty)と出力されていますから、確かに作成できています。
テスト用テーブルにデータを挿入します。
> BEGIN;
Query OK, 0 rows affected (0.00 sec)

> INSERT INTO autoinc1 VALUES (NULL);
Query OK, 1 row affected (0.00 sec)
ここで最後のCOMMITだけしないで、スレーブ側を停止させます。
ここでスレーブを停止します
> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)
テスト用テーブルにデータを挿入処理をコミット(実行)します。
> COMMIT;
Query OK, 0 rows affected (5.00 sec)
きれいに、rpl_semi_sync_master_timeout で設定した 5秒 待ってますね。
また、データの挿入処理が正しく行えたか確認します。
> select * from autoinc1;
+-----+
| col |
+-----+
|   1 |
+-----+

1 rows in set (0.00 sec)
正しく設定されましたね。
スレーブは停止したままなので、先のデータは存在しないはずです。
> select * from autoinc1;
Empty set (0.00 sec)
ちゃんと空っぽ(Empty)と出力されていますから、確かにスレーブは停止したままで正しく動作していますね。

続けて、スレーブを再開します。
> START SLAVE;
Query OK, 0 rows affected (0.01 sec)

> select * from autoinc1;
+-----+
| col |
+-----+
|   1 |
+-----+

1 rows in set (0.00 sec)
このようにスレーブを開始すると直ちにデータが反映されました。

どうでしょう。簡単に設定することができそうですね。

これでレプリケーションのより安全により持続性が高く運用できるようになります。

レプリケーションを利用されている方は、是非、利用したい機能です。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

mysqlでマルチマスター レプリケーションを設定してみる

以前の記事 mysqlのレプリケーションを使う で mysqlを使ったレプリケーションの設定を行ってみました。 今回は、そのmysqlのレプリ ...

mysqlのレプリケーションを使う

今回は、mysqlのレプリケーション(replication)です。 レプリケーション(replication)とは、 直訳 ...

mysqlのレプリケーションを使う(5) エラー1236の対処

以前に mysqlのレプリケーションを使う mysqlのレプリケーションを使う(3) エラー1062の対処 で、my ...

mysqlのレプリケーションを使う(3) エラー1062の対処

以前に mysqlのレプリケーションを使う mysqlのレプリケーションを使う(2) バイナリログを削除する で、m ...

MySQLのバイナリログを使ったロールバック(リストア)を行ってみる

以前の記事 MySQLのログの種類とログの仕方を調べてみた(実施例) で、MySQLのログの採取方法について簡単に解説してみました。 その中の ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.1895 [s]