<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="http://www.seirios.org/seirios/dokuwiki/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>ほほほのほ - serverapp:database:mysqld</title>
        <description></description>
        <link>http://www.seirios.org/seirios/dokuwiki/</link>
        <lastBuildDate>Sun, 10 May 2026 02:45:49 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>http://www.seirios.org/seirios/dokuwiki/lib/exe/fetch.php?media=wiki:dokuwiki.svg</url>
            <title>ほほほのほ</title>
            <link>http://www.seirios.org/seirios/dokuwiki/</link>
        </image>
        <item>
            <title>MySQLdを冗長構成にする</title>
            <link>http://www.seirios.org/seirios/dokuwiki/doku.php?id=serverapp:database:mysqld:semisyncrep</link>
            <description>
&lt;h2 class=&quot;sectionedit1&quot; id=&quot;mysqldを冗長構成にする&quot;&gt;MySQLdを冗長構成にする&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;&lt;em class=&quot;u&quot;&gt; Last Update: 2014/10/14 &lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
近年インターネットに公開されている様々なシステムは、LAMP(Linux/Apache/MySQL/PHP)を利用しているものが多い。
その上、最近では高可用性が要求されるような状況が増えてきている。
&lt;/p&gt;

&lt;p&gt;
このようなシステムを構築する際に問題になるのが、システムの冗長性を確保して、サービスシステム内の一部が停止してもサービス自体は継続できるようにする手法である。
&lt;/p&gt;

&lt;p&gt;
このような時に、Web側システムはLoadBalancer等をうまく使うことで冗長性を確保できる「場合もある」が、DBはそう簡単に問屋がおろしてくれない。
これは、DBが扱うデータがatomicでなければならず、その状態を保持することが難しいからである。
&lt;/p&gt;

&lt;p&gt;
ここでは、MySQL 5.5.31を利用した冗長構成作成に関して記録しておく。
&lt;/p&gt;

&lt;p&gt;
なお、MySQLはOracleに買収されたので、&lt;a href=&quot;https://mariadb.org&quot; class=&quot;urlextern&quot; title=&quot;https://mariadb.org&quot;&gt;MariaDB&lt;/a&gt;がForkされた。MariaDB5.5では以下の手法は利用できた。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;MySQLd\u3092\u5197\u9577\u69cb\u6210\u306b\u3059\u308b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;mysqld\u3092\u5197\u9577\u69cb\u6210\u306b\u3059\u308b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-1141&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit2&quot; id=&quot;参考url&quot;&gt;参考URL&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www-jp.mysql.com&quot; class=&quot;urlextern&quot; title=&quot;http://www-jp.mysql.com&quot;&gt;MySQL.jp&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://ja.wikipedia.org/wiki/MySQL&quot; class=&quot;urlextern&quot; title=&quot;http://ja.wikipedia.org/wiki/MySQL&quot;&gt;WikiPedia MySQL&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://blog.technology-knowledge.jp/2008/04/15/117/&quot; class=&quot;urlextern&quot; title=&quot;http://blog.technology-knowledge.jp/2008/04/15/117/&quot;&gt;MySQLClusterを試す&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.mysqlpracticewiki.com/index.php/メインページ&quot; class=&quot;urlextern&quot; title=&quot;http://www.mysqlpracticewiki.com/index.php/メインページ&quot;&gt;MySQL Practice Wiki&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.publickey1.jp/blog/11/denamysql_1.html&quot; class=&quot;urlextern&quot; title=&quot;http://www.publickey1.jp/blog/11/denamysql_1.html&quot;&gt;MySQL-MHA&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://www.s-quad.com/wordpress/?s=MySQL&quot; class=&quot;urlextern&quot; title=&quot;http://www.s-quad.com/wordpress/?s=MySQL&quot;&gt;QuickKnowLedge&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://wiki.rookie-inc.com/os/centos/mysql/replication&quot; class=&quot;urlextern&quot; title=&quot;http://wiki.rookie-inc.com/os/centos/mysql/replication&quot;&gt;MySQL Replication&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://wiki.rookie-inc.com/os/centos/mysql/semisyncrep&quot; class=&quot;urlextern&quot; title=&quot;http://wiki.rookie-inc.com/os/centos/mysql/semisyncrep&quot;&gt;MySQL SemiSync Replication&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://mariadb.org&quot; class=&quot;urlextern&quot; title=&quot;https://mariadb.org&quot;&gt;MariaDB&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://kb.askmonty.org/en/galera/&quot; class=&quot;urlextern&quot; title=&quot;https://kb.askmonty.org/en/galera/&quot;&gt;MariaDB Galera Cluster&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u53c2\u8003URL&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u53c2\u8003url&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1142-1840&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;手法検討&quot;&gt;手法検討&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
MySQLdを冗長構成にする方法としては、一般に以下の3つがある。
&lt;/p&gt;
&lt;div class=&quot;table sectionedit4&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;thead&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 leftalign&quot;&gt; 手法                  &lt;/th&gt;&lt;th class=&quot;col1 leftalign&quot;&gt; 同期      &lt;/th&gt;&lt;th class=&quot;col2 leftalign&quot;&gt; 備考（個人的なイメージとも云う）                                                               &lt;/th&gt;
	&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Replication           &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; async     &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; 標準で利用できる。比較的簡単。障害時にデータがLostする可能性がある                             &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Cluster               &lt;/td&gt;&lt;td class=&quot;col1 leftalign&quot;&gt; sync      &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; 詳しく知らない。Cluster用のMySQLdが必要。チューニングが難しい。システムが大きくなる。          &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; semi-sync Replication &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; semi-sync &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; 標準で利用できるが、Pluginが必要。比較的簡単。障害時のData lostの可能性は低いが、性能も低下する &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1952-2620&amp;quot;} --&gt;
&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u624b\u6cd5\u691c\u8a0e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u624b\u6cd5\u691c\u8a0e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1841-2621&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit5&quot; id=&quot;replication&quot;&gt;Replication&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Replicationは、最も設定が簡単でその割に比較的よく動作するので、従来(5.3以前)は非常によく利用されていた。
Replicationの問題は、Master-Slave間で同期する際に、同期にタイムラグがあることである。
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;client           master              slave
      --(SQL)---&amp;gt; 処理
      &amp;lt;--(返事)--      --(binlog)--&amp;gt; 処理
                      &amp;lt;---(同期)--- &lt;/pre&gt;

&lt;p&gt;
SlaveがMasterからバイナリLOGを取得し、更新を実行することで同期するしくみ。
このような処理の流れなので、同期はasyncとなる。その結果、タイミングによってデータに不整合が起きる可能性がある。
&lt;/p&gt;
&lt;div class=&quot;table sectionedit6&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;thead&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 leftalign&quot;&gt; 障害       &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Service継続 &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Connection継続 &lt;/th&gt;&lt;th class=&quot;col3&quot;&gt; Transaction継続 &lt;/th&gt;&lt;th class=&quot;col4&quot;&gt; 同期 &lt;/th&gt;
	&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Master停止 &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ×             &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ×              &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 停止 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Slave停止  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ◯            &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ◯             &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 停止 &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table1&amp;quot;,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;3347-3583&amp;quot;} --&gt;
&lt;p&gt;
障害機を復帰させる際には、一度サービスを停止し、DBの同期をとる必要がある。
復帰させる際の停止を避けるには、Slaveを2台準備し、1台の停止では同期が外れないようにするなどの対策をとる必要がある。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Replication&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;replication&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2622-3865&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit7&quot; id=&quot;cluster&quot;&gt;Cluster&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Clusterには詳しくないが、Clusterは、Replicationと異なり、システム側で同期を保障する構成である。
MySQLでClusterを構築するには、少なくとも
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Data node (データ/レコードの保存場所)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; SQL node (SQL文の構文解析等を担当するノード)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Management node (管理ノード)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
の3機能が必要になる。縮退すれば最低3台から構築できるが、冗長化を考えるなら、一般には最低で5台のServer(Data x2/SQL x2/Mgmt x1)を準備すべきであろう。(Clusterの実験をするだけなら3台から構築できる)
&lt;/p&gt;

&lt;p&gt;
Web ApplicationのためにMySQL Clusterを利用するなら、サーバー停止などの場合の運用も考慮するとWebServerにhttpd+SQL nodeを入れ、WebServerのApplicationからlocalhostのSQL nodeを参照するようにするのが比較的良い構成と考えられる。こうすれば、WebServerとSQL nodeの通信の部分を非常に単純化して考えられる。近年しばしば利用されるFastCGIを利用するなら、FastCGI ServerにSQL nodeを入れればよい。
&lt;/p&gt;
&lt;div class=&quot;table sectionedit8&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;thead&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 leftalign&quot;&gt; 障害            &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Service継続 &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Connection継続 &lt;/th&gt;&lt;th class=&quot;col3&quot;&gt; Transaction継続 &lt;/th&gt;&lt;th class=&quot;col4&quot;&gt; 同期 &lt;/th&gt;
	&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; SQL node停止    &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  △            &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  △             &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 継続 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Data node停止   &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ◯            &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ◯             &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 継続 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Mgmt node停止   &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ◯            &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ◯             &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 継続 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; SQL-Data間障害  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ◯            &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ×             &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 継続 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Data-Data間障害 &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ◯            &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ×             &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 状況による &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table2&amp;quot;,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;4999-5508&amp;quot;} --&gt;
&lt;p&gt;
もちろん、常識的に考えて、全Data nodeが非同期に死んだ場合など、同期を継続できない状況は考え得る。
&lt;/p&gt;

&lt;p&gt;
なお、Clusterを構築する場合、ネットワークの設計だけでなく、データ構造などもしっかり検討する必要がある。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Cluster&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cluster&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;3866-5805&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit9&quot; id=&quot;semi-synchronous_replication&quot;&gt;Semi-Synchronous Replication&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Semi-Synchronous Replication(以下Semi-Sync)は、(いわゆる標準の)Replicationの(同期が外れやすい)問題に対する解決策の一つとして利用できる。
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;client           master           slave
      --(SQL)---&amp;gt; 処理
                       --(同期)--&amp;gt; 前処理 (binlogのcacheing)
                       &amp;lt;--(返事)--
      &amp;lt;--(返事)--                  後処理 (DBファイルへの変更のCommit)&lt;/pre&gt;

&lt;p&gt;
Semi-Syncでは、上記のような流れで処理が行われるため、データの破損は非常に起こりにくい形になっている。実際、データの破損が起こる条件を想定することは難しい。
その代わりに、この構成の場合、ClientがSQL処理終了を受けとるまでの時間が長くなる。
&lt;/p&gt;

&lt;p&gt;
masterがslaveに送った同期処理は、slave側で一度記録された段階でslaveからmasterに返事が返る。その後、slaveではゆっくり同期処理をする。
その為、「完全な同期状態ではない」瞬間が存在することになる。Semi-Syncと呼ばれるのはその為である。
&lt;/p&gt;

&lt;p&gt;
実際には、slaveが「返事を行った後、同期処理を終了するまで」の段階で障害が発生したとしても、単に同期処理前までRollbackし、再度同期処理を行うことで同期状態を維持する。その為、実質上masterとslaveが非同期な状態になるシチュエーションはほとんど無いと考えられる。
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 但し、実装上の問題や誤解がある可能性はあるので、気になるかたは十分に調査することをお勧めする。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;table sectionedit10&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;thead&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 leftalign&quot;&gt; 障害       &lt;/th&gt;&lt;th class=&quot;col1&quot;&gt; Service継続 &lt;/th&gt;&lt;th class=&quot;col2&quot;&gt; Connection継続 &lt;/th&gt;&lt;th class=&quot;col3&quot;&gt; Transaction継続 &lt;/th&gt;&lt;th class=&quot;col4&quot;&gt; 同期 &lt;/th&gt;
	&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Master停止 &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ×             &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ×              &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 継続 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Slave停止  &lt;/td&gt;&lt;td class=&quot;col1 centeralign&quot;&gt;  ◯         &lt;/td&gt;&lt;td class=&quot;col2 centeralign&quot;&gt;  ◯            &lt;/td&gt;&lt;td class=&quot;col3 centeralign&quot;&gt;  ◯             &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; 継続 &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table3&amp;quot;,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;7486-7722&amp;quot;} --&gt;
&lt;p&gt;
障害機を復帰させる場合、通常はサービスを停止する必要はない。復帰時点で再度同期される。つまり、非同期のReplicationでどうしても必要になるFailbackを考慮する必要は無くなる事が期待できる。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Semi-Synchronous Replication&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;semi-synchronous_replication&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;5806-7990&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit11&quot; id=&quot;注意点&quot;&gt;注意点&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
上記説明の際に、DBプログラミングを行う際に必要な注意事項は記載していない。
DBプログラミングは、データのAtom性を確保するために、DB側だけでなくプログラム側でも注意すべき点があるが、そこには触れないものとする。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u6ce8\u610f\u70b9&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u6ce8\u610f\u70b9&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;7991-8315&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit12&quot; id=&quot;手法&quot;&gt;手法&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
上記及びその他の理由（割愛）により、Semi-Sync ReplicationとKeepalivedを用いて、MySQLdを冗長化する。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u624b\u6cd5&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u624b\u6cd5&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;8316-8462&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit13&quot; id=&quot;keepalived&quot;&gt;Keepalived&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Semi-Sync ReplicationでMultiMaster Replicationを組むことで、いわゆるMultiHeadでありかつFailback操作が不要のDBシステムが組める。
&lt;/p&gt;

&lt;p&gt;
しかし、MultiHead DBで非同期処理をする場合、SQL Queryを出すApplicationの側で考慮すべき事項が非常に多い。特に、データのAtomic性に関しては非常に短時間であっても保障されない場合がある。Slave側がMasterにAckを帰した直後からData操作が終了するまでの間は、MasterとSlaveのDataは同期していない（つまりSlave側のDataは古い）状態になる。これは、特にトランザクションの多いDBで問題が発生する。
このような用途ならばClusterやOracle/DB2等を利用するべきであろう。
&lt;/p&gt;

&lt;p&gt;
Semi-Sync ReplicationでMultihead DBを組むのが(実用上)ベストだと筆者が思う状況は、
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;既存のWebアプリ&lt;/strong&gt;で&lt;strong&gt;MySQLを利用し&lt;/strong&gt;ており&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;サービス停止にセンシティブ&lt;/strong&gt;な状況&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
である。つまり、
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 本来MySQL Serverとしては1台を想定している「DBの冗長化を考えていないWebアプリケーション」を&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; DB側で何とかして冗長化して使う&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
場合である。要するに、
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; SQLクエリを飛ばす側からはMySQLが1台に見えていて欲しい&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; MySQLサーバーは冗長にしたい&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
という場合である。
&lt;/p&gt;

&lt;p&gt;
このような要望に答えるための実装にはいくつかあるが、今回はKeepalivedを利用する。
&lt;/p&gt;

&lt;p&gt;
Keepalivedは「VRRP」を利用して、「あるサービスが死んだ」ら「それをトリガーとしてVRRP的切替を行う」daemonである。
&lt;/p&gt;

&lt;p&gt;
これを利用することで、アプリケーションからは『冗長化されたMySQLサーバー』を『いつも通り』に利用できるようになる。
&lt;/p&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;plugin_wrap_start&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;0-&amp;quot;} --&gt;&lt;div class=&quot;wrap_round wrap_box plugin_wrap&quot;&gt;
&lt;p&gt;
技術的には半端なかき方をしてますので、気持ちだけわかってください
&lt;/p&gt;
&lt;/div&gt;&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;plugin_wrap_end&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;0-&amp;quot;} --&gt;
&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Keepalived&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;keepalived&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;8463-10443&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit16&quot; id=&quot;構成&quot;&gt;構成&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;div class=&quot;table sectionedit17&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;thead&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;th class=&quot;col0 centeralign&quot;&gt;  HW       &lt;/th&gt;&lt;th class=&quot;col1 centeralign&quot;&gt;  &lt;abbr title=&quot;Operating System&quot;&gt;OS&lt;/abbr&gt;        &lt;/th&gt;&lt;th class=&quot;col2 centeralign&quot;&gt;  MySQL  &lt;/th&gt;&lt;th class=&quot;col3&quot;&gt; keepalived &lt;/th&gt;&lt;th class=&quot;col4 centeralign&quot;&gt;  その他                          &lt;/th&gt;
	&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; XCP上のVM &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; CentOS 6.4 &lt;/td&gt;&lt;td class=&quot;col2 leftalign&quot;&gt; 5.5.31  &lt;/td&gt;&lt;td class=&quot;col3 leftalign&quot;&gt; 1.2.7      &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; MySQLdはremiで公開されているもの &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table4&amp;quot;,&amp;quot;secid&amp;quot;:17,&amp;quot;range&amp;quot;:&amp;quot;10462-10647&amp;quot;} --&gt;
&lt;p&gt;
上記VMを2台(以下 my01, my02とする)構築し、冗長系を構築した。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u69cb\u6210&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u69cb\u6210&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;10444-10732&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit18&quot; id=&quot;構築&quot;&gt;構築&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
CentOSのInstall等は全て割愛。注意点は
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; remi repositoryからMySQL関連のpackageをyumで投入&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; compat-mysql51.x86_64&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; mysql.x86_64&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; mysql-libs.x86_64&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; mysql-server.x86_64&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; keepalivedをyumで投入&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u69cb\u7bc9&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u69cb\u7bc9&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:18,&amp;quot;range&amp;quot;:&amp;quot;10733-10989&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit19&quot; id=&quot;mysql_初期構成&quot;&gt;MySQL 初期構成&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; /etc/my.cnfを修正(my01/my02)&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;...
[mysqld]
...
skip-external-locking
character-set-server=utf8
skip-character-set-client-handshake
skip-name-resolve

# Replication関連
log-bin   = /some/where/mysql-bin	 &amp;lt;- 必須。どこかにbin-logを保存すること
relay-log = /some/where/mysqld-relay-bin

server-id	= 1			 &amp;lt;- マシン毎に変えること。(my01は1、my02は2を設定した)

binlog_format=mixed
max_binlog_size=100M
expire_logs_days=7
sync_binlog=1
log_slave_updates

# SemiSync関連設定
#rpl_semi_sync_master_enabled =1	 &amp;lt;- 当初はcomment outすること
#rpl_semi_sync_slave_enabled = 1
#rpl_semi_sync_master_timeout=10&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; my01(Master側)でmysqldを起動&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; service mysqld start&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; 通常の最小限の設定をする。(rootアカウントにパスワードをつけるなど)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; Replication用のアカウントを作成する&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;my01# mysql -u root -p
mysql&amp;gt; GRANT REPLICATION SLAVE ON *.* TO replication@&amp;#039;my01&amp;#039; IDENTIFIED BY &amp;#039;****----****&amp;#039;;		&amp;lt;- Account作成
mysql&amp;gt; GRANT REPLICATION SLAVE ON *.* TO replication@&amp;#039;my02&amp;#039; IDENTIFIED BY &amp;#039;****----****&amp;#039;;		&amp;lt;- Account作成

mysql&amp;gt; select user,host,password from mysql.user;							&amp;lt;- 確認&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; 今回は、初期構築段階からの設定なので割愛するが、ここでMasterとSlaveの手動での同期を取っておく。&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;mysql&amp;gt; FLUSH TABLES WITH READ LOCK;
mysql&amp;gt; SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |     1222 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql&amp;gt; ^D
my01# cd /var/lib/mysql/             &amp;lt;-- MySQLのデータディレクトリへ移動
my01# tar czf ~/xxxxxDB.tgz xxxxxDB  &amp;lt;-- データベースをバックアップ
my01# scp xxxxxDB.tgz my02:
my01# mysql -u root -p
mysql&amp;gt; UNLOCK TABLES;
mysql&amp;gt; ^D
=====
my02#
my02# cd /var/lib/mysql/             &amp;lt;-- MySQLのデータディレクトリへ移動
my02# tar xzf ~/xxxxxDB.tgz	     &amp;lt;-- Databaseファイルを展開&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; my02(slave側)でmysqldを起動&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; service mysqld start&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; Replication設定を行う&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;mysql&amp;gt; CHANGE MASTER TO
        MASTER_HOST=my01,
        MASTER_USER=&amp;#039;replication&amp;#039;,
        MASTER_PASSWORD=&amp;#039;****----****&amp;#039;,
        MASTER_LOG_FILE=&amp;#039;mysql-bin.000003&amp;#039;,	&amp;lt;- master statusで表示されたファイル名を投入
        MASTER_LOG_POS=1222;			&amp;lt;- master statusで表示されたPositionを投入&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; 今回はMultimaster構成にするので、以下も実施&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;my02# mysql -u root -p
mysql&amp;gt; show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      750 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql&amp;gt; ^D
my02#
=====
my01# mysql -u root -p
mysql&amp;gt; CHANGE MASTER TO
        MASTER_HOST=my02,
        MASTER_USER=&amp;#039;replication&amp;#039;,
        MASTER_PASSWORD=&amp;#039;****----****&amp;#039;,
        MASTER_LOG_FILE=&amp;#039;mysql-bin.000003&amp;#039;,	&amp;lt;- master statusで表示されたファイル名を投入
        MASTER_LOG_POS=750;			&amp;lt;- master statusで表示されたPositionを投入
mysql&amp;gt; ^D
my01#&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; ここまで終わった段階で、両方のマシンをslaveとして動かす。&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;mysql&amp;gt; slave start;
mysql&amp;gt; show slave status\G			&amp;lt;- 確認
....
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
....&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; 両方がYesであることを確認&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; これで Multimaster Async Replicationとして動作開始&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;MySQL \u521d\u671f\u69cb\u6210&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;mysql_\u521d\u671f\u69cb\u6210&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:19,&amp;quot;range&amp;quot;:&amp;quot;10990-14882&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit20&quot; id=&quot;semi-synchronous_replication1&quot;&gt;Semi-Synchronous Replication&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;plugin_wrap_start&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;secid&amp;quot;:21,&amp;quot;range&amp;quot;:&amp;quot;0-&amp;quot;} --&gt;&lt;div class=&quot;wrap_round wrap_important plugin_wrap&quot;&gt;
&lt;p&gt;
MariaDB 5.5.31でも動作&lt;del&gt;する可能性がありますが未検証です。&lt;/del&gt;しました。
&lt;/p&gt;
&lt;/div&gt;&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;plugin_wrap_end&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;secid&amp;quot;:22,&amp;quot;range&amp;quot;:&amp;quot;0-&amp;quot;} --&gt;
&lt;p&gt;
ここまでくればあと少し。一気に行きます。
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; my01/02で以下を実行&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;mysql&amp;gt; INSTALL PLUGIN rpl_semi_sync_master SONAME &amp;#039;semisync_master.so&amp;#039;;
mysql&amp;gt; INSTALL PLUGIN rpl_semi_sync_slave SONAME &amp;#039;semisync_slave.so&amp;#039;;
mysql&amp;gt; show plugins;
+--------------------------+----------+--------------------+--------------------+---------+
| Name                     | Status   | Type               | Library            | License |
+--------------------------+----------+--------------------+--------------------+---------+
| binlog                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password    | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| mysql_old_password       | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| MyISAM                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CSV                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MYISAM               | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| ARCHIVE                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS        | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM            | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU   | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| PERFORMANCE_SCHEMA       | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| FEDERATED                | DISABLED | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| partition                | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| rpl_semi_sync_master     | ACTIVE   | REPLICATION        | semisync_master.so | GPL     | &amp;lt;-- ここ
| rpl_semi_sync_slave      | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     | &amp;lt;-- ここ
+--------------------------+----------+--------------------+--------------------+---------+
25 rows in set (0.00 sec)&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; my.cnfを書き換える&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level3&quot;&gt;&lt;div class=&quot;li&quot;&gt; Semi-Sync関連の設定を生かす&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level2 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; mysqldの操作&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level3&quot;&gt;&lt;div class=&quot;li&quot;&gt; service mysqld stop&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level3&quot;&gt;&lt;div class=&quot;li&quot;&gt; service mysqld start&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level2 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; mysqldの状態を確認&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level3&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;mysql&amp;gt; show variables like &amp;#039;%semi%&amp;#039;;
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |		&amp;lt;===
| rpl_semi_sync_master_timeout       | 10    |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
| rpl_semi_sync_slave_enabled        | ON    |		&amp;lt;===
| rpl_semi_sync_slave_trace_level    | 32    |
+------------------------------------+-------+
6 rows in set (0.01 sec)

mysql&amp;gt; SHOW STATUS LIKE &amp;quot;rpl%&amp;quot;;
+--------------------------------------------+-------------+
| Variable_name                              | Value       |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients               | 1           |
| Rpl_semi_sync_master_net_avg_wait_time     | 0           |
| Rpl_semi_sync_master_net_wait_time         | 0           |
| Rpl_semi_sync_master_net_waits             | 0           |
| Rpl_semi_sync_master_no_times              | 0           |
| Rpl_semi_sync_master_no_tx                 | 0           |
| Rpl_semi_sync_master_status                | ON          |	&amp;lt;===
| Rpl_semi_sync_master_timefunc_failures     | 0           |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0           |
| Rpl_semi_sync_master_tx_wait_time          | 0           |
| Rpl_semi_sync_master_tx_waits              | 0           |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0           |
| Rpl_semi_sync_master_wait_sessions         | 0           |
| Rpl_semi_sync_master_yes_tx                | 0           |
| Rpl_semi_sync_slave_status                 | ON          |	&amp;lt;===
| Rpl_status                                 | AUTH_MASTER |
+--------------------------------------------+-------------+
16 rows in set (0.00 sec)&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Semi-Synchronous Replication&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;semi-synchronous_replication1&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:20,&amp;quot;range&amp;quot;:&amp;quot;14883-20093&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit23&quot; id=&quot;落ち穂拾い&quot;&gt;落ち穂拾い&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
今の状態で、mysqldはMultimaster Semi-Synchronous Replicationが組めている状態になる。
あとは、keepalivedでClientからの通信を受けるIPアドレスを生かすだけ。
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; keepalived&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code&quot;&gt;# cd /etc/keepalived
# mv keepalived.conf keepalived.conf.dist
# vi keepalived.conf
===== ここから =====
#
# Keepalived configuration file for 
#	WPSd01 MySQL Semi-Sync Replica Server
#
#	$ID:$
#

global_defs {
	notification_email {
		foo@example.com
	}
	notification_email_from keepalived@my01.example.com
	smtp_server 127.0.0.1
	smtp_connect_timeout 30
	router_id my01
}

vrrp_instance my01 {
	state BACKUP
	interface eth0
	garp_master_delay 1
	virtual_router_id 1
	priority 100
	advert_int 1
	smtp_alert
	authentication {
		auth_type PASS
		auth_pass ----****----
	}
	virtual_ipaddress {
		192.0.2.1/29 dev eth1
	}
}

virtual_server 192.0.2.1 3306 {
	delay_loop 3
	lvs_method DR
	protocol TCP

	real_server 192.0.2.2 3306 {
		TCP_CHECK {
			connect_port 3306
			connect_timeout 10
		}
		notify_down &amp;quot;/etc/keepalived/shutdown_keepalived.sh down&amp;quot;
	}
}
===== ここまで =====
# vi shutdown_keepalived.sh
===== ここから =====
#! /bin/bash
# daemon shutdown script called from Keepalived.
#
#       $ID:$
#

if [ $# -ne 0 ]; then
	# Notify fault
	if [ $1 = &amp;quot;fault&amp;quot; ]; then
		/etc/rc.d/init.d/keepalived stop
		/etc/rc.d/init.d/mysqld stop
	fi

	# Notify down
	if [ $1 = &amp;quot;down&amp;quot; ]; then
		sleep 5
		mysqlans=`/usr/bin/mysql -u slave -p&amp;quot;WPS Replica&amp;quot; -h 127.0.0.1 &amp;lt; &amp;quot;/etc/keepalived/showstat.sql&amp;quot; | /bin/grep Bytes_received`

		if [ &amp;quot;&amp;quot; = &amp;quot;$mysqlans&amp;quot; ]; then
			/etc/rc.d/init.d/mysqld restart
			/etc/rc.d/init.d/mysqld status
			if [ $? -ne 0 ]; then
				/bin/bash /etc/keepalived/shutdown_keepalived.sh fault
			fi
		fi
	fi
fi
===== ここまで =====
# vi showstat.sql
===== ここから =====
show status;
===== ここまで =====&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
これでOKのはず。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u843d\u3061\u7a42\u62fe\u3044&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u843d\u3061\u7a42\u62fe\u3044&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:23,&amp;quot;range&amp;quot;:&amp;quot;20094-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 14 May 2018 04:36:12 +0000</pubDate>
        </item>
    </channel>
</rss>
