<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pacemaker &#8211; SRA OSS Tech Blog</title>
	<atom:link href="https://www.sraoss.co.jp/tech-blog/tag/pacemaker/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<description>OSS専門の技術ブログ。PostgreSQL、Zabbixを中心に10種類以上のOSSの解説、アップデート情報、運用ヒントを提供。</description>
	<lastBuildDate>Fri, 23 Oct 2026 06:56:40 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/07/blog-icon-150x150.png</url>
	<title>Pacemaker &#8211; SRA OSS Tech Blog</title>
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pacemaker におけるスロットリング (Throttle) の仕組み</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/throttling/</link>
		
		<dc:creator><![CDATA[彭 博 (Bo Peng)]]></dc:creator>
		<pubDate>Fri, 06 Mar 2026 02:11:45 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=19976</guid>

					<description><![CDATA[Pacemaker を運用していると、次のようなログを目にすることがあります。 notice: High CPU load detected info: New throttle mode debug: New job  ...]]></description>
										<content:encoded><![CDATA[<p><a href="https://clusterlabs.org/projects/pacemaker/" target="_blank" rel="noopener">Pacemaker</a> を運用していると、次のようなログを目にすることがあります。</p>
<pre>notice: High CPU load detected
info: New throttle mode
debug: New job limit is 1</pre>
<p>このログを初めて見たとき、「クラスタに異常が発生したのではないか」と不安に感じる方もいるかもしれません。しかし結論から言うと、これらのログは障害ではありません。クラスタノードの負荷が高くなったため、Pacemaker の 負荷保護機構 (スロットリング) が正常に動作したことを示すログです。</p>
<p>本記事では、Pacemaker の運用で頻繁に遭遇する負荷スロットリングについて、ログの意味を読み解きながら分かりやすく解説します。なお、本記事は <strong>Pacemaker 3.0.1</strong> を前提としています。</p>
<p><span id="more-19976"></span></p>
<h2>負荷スロットリングとは何か</h2>
<p>Pacemaker の負荷スロットリングとは、ノードの負荷が高くなった際にリソースアクション (<code>start / stop / monitor</code> など) の同時実行数を自動的に減らす安全機構です。Pacemaker はクラスタの状態を維持するために、リソースの起動や停止、監視など多くの処理を常に実行しています。これらは通常、並列に実行されることで迅速なフェイルオーバーや復旧を実現しています。</p>
<p>しかし、ノードがすでに高負荷状態のときに大量のリソース操作を同時実行すると、状況がさらに悪化する可能性があります。<code>monitor</code> のタイムアウトやフェイルオーバーの誤発生、さらには <code>STONITH</code> の誤発動などが連鎖的に発生し、クラスタ全体が不安定な状態に陥ることがあります。</p>
<p>このような事態を防ぐために、Pacemaker は自らの動作を意図的に減速させます。これが<strong>スロットリング</strong>です。</p>
<h2>通常時の並列制御の仕組み</h2>
<p>Pacemaker のリソースアクションは、通常時でも無制限に並列実行されるわけではありません。次の 2 つのパラメータで制御されています。</p>
<ul>
<li>node-action-limit（ノード単位）</li>
<li>batch-limit（クラスタ全体）</li>
</ul>
<h3>node-action-limit</h3>
<p><code>node-action-limit</code> は、ノード単位で同時実行できるアクション数の上限を決めるパラメータです。デフォルト値は 0 (自動) であり、次の式で自動計算されます。</p>
<pre>node-action-limit = CPUコア数 × 2</pre>
<p>たとえば 4 コアのサーバであれば、最大 8 個のリソース操作を同時に実行できます。この設計により、通常時は効率よくリソース操作を処理できるようになっています。</p>
<h3>batch-limit</h3>
<p><code>batch-limit</code> はクラスタ全体での同時実行数を制御します。<code>node-action-limit</code> が「各ノード単位の上限」であるのに対し、<code>batch-limit</code> は「クラスタ全体で同時に実行できるアクション数の上限」です。デフォルト値は 0（自動）で、Pacemaker がクラスタの状態や負荷状況を見ながら動的に調整します。</p>
<p>では、ノードが高負荷になった場合はどうなるのでしょうか。ここから動的スロットリングについて見ていきます。</p>
<h2>代表的な負荷制御ログ</h2>
<p>Pacemaker は、ノード負荷に応じたスロットリングが発生すると、次のようなログを出力します。</p>
<p>ここでは debug ログを有効化した場合の出力例を示します。</p>
<pre>debug: Current load is 1.110000 across 4 core(s)
notice: High CPU load detected: 8.040000
info: New throttle mode: high load (was medium)
debug: Node node1 has high load and supports at most 8 jobs; new job limit 1</pre>
<p>以降では、これらのログがそれぞれ何を意味しているのかを順番に解説していきます。</p>
<h3>Current load (現在のノード負荷)</h3>
<pre>debug: Current load is 1.110000 across 4 core(s)</pre>
<p>このログは、Pacemaker が現在のノード負荷をどのように認識しているかを示しています。</p>
<p>Pacemaker が負荷判定に使用している指標は load average です。ここで表示されている「Current load」は、<code>/proc/loadavg</code> の先頭フィールドである 1 分平均の load average を示しています。</p>
<h3>High CPU load detected (高負荷の検出)</h3>
<pre>notice: High CPU load detected: 8.040000</pre>
<p>このメッセージは、load average が Pacemaker の定義するしきい値を超えたことを示しています。</p>
<p>しきい値は load-threshold (デフォルト 80%) を基準に、CPU コア数から自動的に計算されます。Pacemaker は load average に対して、low / medium / high の 3 段階のしきい値を次の式で算出します。</p>
<pre>low    = load-threshold × CPUコア数 × 1.2
medium = load-threshold × CPUコア数 × 1.6
high   = load-threshold × CPUコア数 × 2.0</pre>
<p>例えば CPU 4 コア、load-threshold = 80% の場合、各段階のしきい値は次のようになります。</p>
<pre>low    = 0.8 × 4 × 1.2 = 3.84
medium = 0.8 × 4 × 1.6 = 5.12
high   = 0.8 × 4 × 2.0 = 6.40</pre>
<p>4 コア環境では、load average が 6.4 を超えた時点で High 判定となります。そのため、ログに表示されている 8.04 は、Pacemaker が明確に「高負荷」と判断した状態であることを意味します。</p>
<h3>New throttle mode (スロットルモードの遷移)</h3>
<p>高負荷が検出されると、Pacemaker はスロットルモードを変更します。</p>
<pre>info: New throttle mode: high load (was medium)</pre>
<p>このログは、CPU 負荷の段階に応じて、Pacemaker が並列実行数を制御するスロットルモードを medium から high に変更したことを示しています。Pacemaker は高負荷時に自らのアクション発行がさらに負荷を悪化させることを防ぐため、ジョブの同時実行数を段階的に制限します。</p>
<p>なお、古いバージョンではスロットルモードがビット表記で表示されることがあります。</p>
<table>
<tbody>
<tr>
<th>ビット値</th>
<th>スロットルモード</th>
</tr>
<tr>
<td>0000</td>
<td>なし</td>
</tr>
<tr>
<td>0001</td>
<td>low</td>
</tr>
<tr>
<td>0010</td>
<td>medium</td>
</tr>
<tr>
<td>0100</td>
<td>high</td>
</tr>
<tr>
<td>1000</td>
<td>extreme</td>
</tr>
</tbody>
</table>
<p>スロットルモードが頻繁に変動している場合は、CPU 負荷が継続的に高い状態にある可能性があります。その場合は ps や top などを用いて高負荷の原因となっているプロセスを特定する必要があります。</p>
<h3>New job limit is 1 の意味</h3>
<pre>debug: Node node1 has high load and supports at most 8 jobs; new job limit 1</pre>
<p>このログは、ノードの高負荷を検知した結果、Pacemaker が同時実行できるジョブ数を制限したことを示しています。</p>
<p>通常時、Pacemaker は CPU コア数 × 2 のジョブを同時に実行できます。例えば 4 コアのノードであれば、デフォルトでは最大 8 ジョブを並列実行できます。負荷の上昇に応じて同時実行数は段階的に引き下げられ、high モード に到達すると最終的に 1 まで縮小されます。</p>
<p>つまりこのログは、Pacemaker がクラスタの安定性を優先し、意図的に並列処理を最小化した状態を示しています。</p>
<h2>動作検証</h2>
<p><code>stress-ng</code> を使用して CPU 負荷を段階的に上げると、スロットルモードがどのように遷移するかを確認できます。ここでは、その挙動をログから読み取ります。</p>
<p>以下のログから分かるように、負荷の上昇に伴いスロットルモードは <code>low → medium → high</code> と段階的に遷移し、それに合わせて job limit が <code>8 → 4 → 2 → 1</code> と減少していきます。<br />
これは Pacemaker が想定どおりに負荷保護を実施していることを示しています。</p>
<pre>debug: Current load is 0.020000 across 4 core(s)
debug: Current load is 0.070000 across 4 core(s)
debug: Current load is 0.240000 across 4 core(s)
debug: Current load is 1.110000 across 4 core(s)
debug: Noticeable CPU load detected: 4.750000
debug: Current load is 4.750000 across 4 core(s)
info: New throttle mode: <strong>low load</strong> (was negligible)
debug: Node node1 has low load and supports at most 8 jobs; <strong>new job limit 4</strong>
info: Moderate CPU load detected: 6.060000
debug: Current load is 6.060000 across 4 core(s)
info: New throttle mode: <strong>medium load</strong> (was low)
debug: Node node1 has medium load and supports at most 8 jobs; <strong>new job limit 2</strong>
notice: High CPU load detected: 8.040000
debug: Current load is 8.040000 across 4 core(s)
info: New throttle mode: <strong>high load</strong> (was medium)
debug: Node node1 has high load and supports at most 8 jobs; <strong>new job limit 1</strong>
notice: High CPU load detected: 9.860000
debug: Current load is 9.860000 across 4 core(s)
notice: High CPU load detected: 11.480000
debug: Current load is 11.480000 across 4 core(s)</pre>
<h2>おわりに</h2>
<p>今回は、Pacemaker の負荷スロットリングの動作について、ログの意味や挙動を中心に解説しました。</p>
<p>「High CPU load detected」や「New throttle mode」といったメッセージは、障害ではなく、クラスタを安定させるための自己防衛機構が正常に動作していることを示しています。ただし、この状態が頻繁に発生する場合は、ノードに継続的な高負荷が発生している可能性があります。CPU 使用率や実行中プロセスを確認し、負荷の原因を特定・改善することが重要です。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>クォーラムデバイスの紹介</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/quorum-device/</link>
		
		<dc:creator><![CDATA[彭 博 (Bo Peng)]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 00:44:13 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=19861</guid>

					<description><![CDATA[前回の記事では、スプリットブレインの発生メカニズムおよび Pacemaker/Corosync におけるその対策について解説しました。 本記事では、スプリットブレイン対策の中でも、2 ノードクラスタにおけるクォーラム確立 ...]]></description>
										<content:encoded><![CDATA[<p><a href="https://www.sraoss.co.jp/tech-blog/pacemaker/split-brain/">前回の記事</a>では、スプリットブレインの発生メカニズムおよび Pacemaker/Corosync におけるその対策について解説しました。</p>
<p>本記事では、スプリットブレイン対策の中でも、2 ノードクラスタにおけるクォーラム確立を支援する<strong>「クォーラムデバイス」</strong>に焦点を当て、その仕組みと基本的な使い方について紹介します。</p>
<p><span id="more-19861"></span></p>
<h2>クォーラムデバイスの仕組み</h2>
<p>クォーラムデバイスは、ノード間通信が切断された際に、どのノード (またはパーティション) がクラスタの運用を継続すべきかを判断するための外部投票ノードです。</p>
<p>偶数ノードで構成されたクラスタでは、ネットワーク分断時に投票数が同数となり、クォーラム (過半数) が成立しないという問題があります。特に2ノードクラスタでは、インターコネクトが切断されると双方が相手を障害と誤認し、スプリットブレイン状態に陥るリスクが高くなります。</p>
<p>このような構成では、クラスタノードとは別に調停役となるクォーラムデバイスを追加することで、クラスタ全体の投票数が奇数となり、過半数による多数決が成立します。その結果、スプリットブレイン発生時でも、どちらのノードがクラスタを継続すべきかを適切に判断できるようになります。</p>
<p>2ノードクラスタの場合、通常は各ノードが1票ずつを持ちますが、クォーラムデバイスを追加すると合計3票となります。ネットワーク分断が発生した際には、クォーラムデバイスの投票を含めた多数決により、過半数を得たノードのみがクラスタ管理を継続できます。これにより、両ノードが同時にリソースを稼働させる事態を防止できます。</p>
<p>偶数ノード構成、特に2ノードクラスタではスプリットブレインのリスクが高いため、クォーラムデバイスの利用が推奨されます。</p>
<h3>クォーラムデバイスを利用したクラスタ構成</h3>
<p>以下は、クォーラムデバイスを利用したクラスタ構成です。</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-19883" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice.png" alt="" width="2560" height="1754" /></p>
<p>クォーラムデバイスを利用する場合、クラスタノードには corosync-qdevice をインストールし、調停役となるサーバには corosync-qnetd をインストールします。corosync-qnetd デーモンはクラスタ外部で動作し、投票を行います。分断時には corosync-qnetd の判定結果に基づき、過半数を得たノードのみがクラスタを維持し、過半数を得られなかったノードはクラスタサービスを停止します。</p>
<h3>corosync-qnetd の判定アルゴリズム</h3>
<p>corosync-qnetd は、以下の判定アルゴリズムに対応しています。</p>
<ul>
<li><strong>ffsplit (fifty-fifty split)</strong>：デフォルトのアルゴリズムです。アクティブなノード数が最も多いパーティションに 1 票を与えます。クラスタが同数（1:1）に分断された場合は、<code>tie_breaker</code> の設定に基づいて投票先を決定します。デフォルトでは、最も小さな node ID を含むパーティションに 1 票を与えます。</li>
<li><strong>lms (last-man-standing)</strong>：corosync-qnetd サーバと通信できるノードが 1 台のみになった場合、そのノードに 1 票を与えます。</li>
</ul>
<h3>クォーラムデバイス構成時の注意点</h3>
<p>クォーラムデバイスを構成する際には、以下の点を考慮する必要があります。</p>
<ul>
<li>クォーラムデバイスはクラスタノードとは別のサーバで動作させる必要があります。既存のクラスタノード上で実行しないでください。</li>
<li>可能であれば、クォーラムデバイスを Corosync が使用するネットワークとは異なるネットワークに配置します。</li>
<li>複数のクラスタで 1 つのクォーラムデバイスを共有できますが、1 つのクラスタに複数のクォーラムデバイスを構成することはできません。</li>
</ul>
<h2>検証環境と前提条件</h2>
<p>本記事では、クォーラムデバイスを利用した 2 ノードクラスタ構成で動作検証を行います。</p>
<p>クラスタ構成およびクォーラムデバイスは以下になります。</p>
<table>
<tbody>
<tr>
<th width="220"></th>
<th width="220">ホスト名</th>
<th width="220">IPアドレス</th>
</tr>
<tr>
<td rowspan="2">クラスタノード</td>
<td>node1</td>
<td>192.168.100.101</td>
</tr>
<tr>
<td>node2</td>
<td>192.168.100.102</td>
</tr>
<tr>
<td>クォーラムデバイスとして動作するノード</td>
<td>qdevice</td>
<td>192.168.100.100</td>
</tr>
</tbody>
</table>
<p>今回は検証目的で RHEL クローン OS の Rocky Linux 環境を用いて検証を行います。Rocky Linux では Red Hat High Availability Add-On 相当のパッケージが highavailability リポジトリに含まれているため、今回はそちらのリポジトリを利用してインストールします。バージョン情報は以下になります。</p>
<table>
<tbody>
<tr>
<th>OS</th>
<td>Rocky Linux 10.1</td>
</tr>
<tr>
<th>Pacemaker</th>
<td>3.0.1</td>
</tr>
<tr>
<th>Corosync</th>
<td>3.1.9</td>
</tr>
<tr>
<th>PCS</th>
<td>0.12.1</td>
</tr>
<tr>
<th>corosync-qdevice</th>
<td>3.0.3</td>
</tr>
<tr>
<th>corosync-qnetd</th>
<td>3.0.3</td>
</tr>
</tbody>
</table>
<p>すべてのクラスタノードおよびクォーラムデバイスとして動作するノードにおいて、<code>/etc/hosts</code> にホスト名と IP アドレスを設定します。</p>
<pre># vi /etc/hosts
(以下を追加)
192.168.100.101 node1
192.168.100.102 node2
192.168.100.100 qdevice
</pre>
<h2>Pacemaker のインストールおよびクラスタの初期設定</h2>
<p>1. Pacemaker をインストールします。</p>
<p>各クラスタノードで highavailability リポジトリを有効にし、Pacemaker 関連パッケージをインストールします。</p>
<pre>(node1、node2 で実行)
# dnf install -y --enablerepo=highavailability pacemaker pcs
</pre>
<p>※ RHEL 環境を利用している場合は、Red Hat 社によって提供される Red Hat High Availability Add-On のパッケージを利用してインストールしてください。詳細については<a href="https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/10/html/configuring_and_managing_high_availability_clusters/installing-cluster-software" target="_blank" rel="noopener">こちら</a>を参照してください。</p>
<p>2. firewalld デーモンが起動している場合は、クラスタ通信に必要なポートを許可するように以下のコマンドを実行します。</p>
<pre>(node1、node2 で実行)
# firewall-cmd --permanent --add-service=high-availability
# <span class="strong strong">firewall-cmd --reload</span></pre>
<p>3. 両ノードで <code>hacluster</code> ユーザのパスワードを設定します。</p>
<pre>(node1、node2で実行)
# passwd hacluster
Changing password for user hacluster.
New password: (haclusterユーザのパスワードを入力)
Retype new password: (haclusterユーザのパスワードを入力)
passwd: all authentication tokens updated successfully.
</pre>
<p>4. 両ノードで以下のコマンドを実行し、pcsd の自動起動を有効化します。</p>
<pre>(node1、node2 で実行)
# systemctl start pcsd.service
# systemctl enable pcsd.service</pre>
<p>5. いずれかのノードからクラスタを構成するノードに対して、<code>hacluster</code> ユーザの認証を行います。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs host auth node1 node2 -u hacluster
Password: (haclusterユーザのパスワードを入力)
node1: Authorized
node2: Authorized
</pre>
<p>6. クラスタを作成します。クラスタの名前を <code>test_cluster</code> とします。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs cluster setup test_cluster node1 addr=192.168.100.101 node2 addr=192.168.100.102
Destroying cluster on hosts: 'node1', 'node2'...
node1: Successfully destroyed cluster
node2: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'node1', 'node2'
node1: successful removal of the file 'pcsd settings'
node2: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'node1', 'node2'
node1: successful distribution of the file 'corosync authkey'
node1: successful distribution of the file 'pacemaker authkey'
node2: successful distribution of the file 'corosync authkey'
node2: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'node1', 'node2'
node1: successful distribution of the file 'corosync.conf'
node2: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
</pre>
<p>7. クラスタを起動します。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs cluster start --all
</pre>
<p><code>pcs status</code> コマンドを使用して、作成したクラスタのステータスを表示します。node1、node2 が Online になっていることを確認します。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs status
Cluster name: test_cluster
...
Node List:
  * Online: [ node1 node2 ]
</pre>
<p>8. クラスタを安全に運用するために、フェンシングの設定が必要になりますが、今回はクォーラムデバイスを検証することを目的としているため、以下のコマンドを実行し、フェンシングを無効にします。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs property set stonith-enabled=false
</pre>
<p>9. 検証用の Dummy リソースを作成します。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs resource create Dummy ocf:heartbeat:Dummy
</pre>
<p>リソースが作成されていることを確認します。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs status
Cluster name: test_cluster
...
Full List of Resources:
* Dummy (ocf:heartbeat:Dummy): Started node1
</pre>
<p>以上で、Pacemaker クラスタの初期設定は完了です。</p>
<h3>クォーラムデバイスを使わない場合の動作確認</h3>
<p>ここでは、クォーラムデバイスを使用しない状態で、2 ノード間のインターコネクト通信を切断した場合の挙動を確認します。</p>
<p>まず、疑似障害を起こすため、node1 と node2 間のインターコネクト通信を切断します。</p>
<p>しばらく待ってから <code>pcs status</code> コマンドを実行し、クラスタの状態を確認します。すると、両ノードがそれぞれ DC (Designated Controller) として選出され、それぞれのノード上でリソースが起動していることが確認できます。</p>
<pre>(node1 で実行) 
[root@node1 ~]# pcs status
Cluster name: test_cluster
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: node1 (version 3.0.1-3.el10-b1a23a6) - partition with quorum
...
Node List:
  * Online: [ node1 ]
  * OFFLINE: [ node2 ]

Full List of Resources:
  * Dummy       (ocf:heartbeat:Dummy):   Started node1
</pre>
<pre>(node2 で実行) 
[root@node2 ~]# pcs status
Cluster name: test_cluster
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: node2 (version 3.0.1-3.el10-b1a23a6) - partition with quorum
...
Node List:
  * Online: [ node2 ]
  * OFFLINE: [ node1 ]

Full List of Resources:
  * Dummy       (ocf:heartbeat:Dummy):   Started node2
</pre>
<p>これは、両ノードが自身を稼働系と誤認識している状態であり、典型的なスプリットブレイン状態です。</p>
<h2>クォーラムデバイスのインストールおよび設定</h2>
<p>ここでは、既存のクラスタ (node1、node2) にクォーラムデバイスを追加し、スプリットブレイン防止について動作検証を通して効果を検証します。</p>
<h3>クォーラムデバイスのインストール</h3>
<p>1. 既存のクラスタノード node1 と node2 に corosync-qdevice をインストールします。</p>
<pre>(node1、node2 で実行)
# dnf install -y --enablerepo=highavailability corosync-qdevice</pre>
<p>2. クォーラムデバイスとして使用されるノード qdevice に pcs および corosync-qnetd をインストールします。</p>
<pre>(qdevice で実行)
[root@qdevice ~]# dnf install -y --enablerepo=highavailability pcs corosync-qnetd</pre>
<p>3. qdevice 上で pcsd サービスを起動し、自動起動の設定を行います。</p>
<pre>(qdevice で実行)
[root@qdevice ~]# systemctl start pcsd.service
[root@qdevice ~]# systemctl enable pcsd.service
</pre>
<p>4. firewalld デーモンが起動している場合は、クラスタで必要なポートを有効化するように以下のコマンドを実行します。</p>
<pre>(qdevice で実行)
[root@qdevice ~]# firewall-cmd --permanent --add-service=high-availability
[root@qdevice ~]# firewall-cmd --reload
</pre>
<h3>クォーラムデバイスの設定</h3>
<p>ここでは、既存のクラスタにクォーラムデバイスを追加する手順を記載します。</p>
<p>1. クォーラムデバイスモデル net を指定し、クォーラムデバイスのセットアップおよび起動を行います。また、システム起動時にクォーラムデバイスが起動するように設定します。</p>
<pre>(qdevice で実行) 
[root@qdevice:~]# pcs qdevice setup model net --enable --start
Quorum device 'net' initialized
quorum device enabled
Starting quorum device...
quorum device started
</pre>
<p>起動後、<code>pcs qdevice status net --full</code> を実行し、クォーラムデバイスの状態を確認します。</p>
<pre>(qdevice で実行)
[root@qdevice ~]# pcs qdevice status net --full
QNetd address:                  *:5403
TLS:                            Supported (client certificate required)
Connected clients:              0
Connected clusters:             0
Maximum send/receive size:      32768/32768 bytes
</pre>
<p>2. クラスタノードの pcs がクォーラムデバイス qdevice にアクセスできるように、<code>hacluster</code> ユーザの認証を行います。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs host auth qdevice -u hacluster
Password: (hacluster ユーザのパスワードを入力)
qdevice: Authorized
</pre>
<p>3. クォーラムデバイスをクラスタに追加します。</p>
<p>クォーラムデバイスを追加する前に、後で比較するために、クォーラムデバイスの現在の設定と状況を確認できます。<br />
このコマンドの出力から、クラスタがクォーラムデバイスを使用しておらず、各ノードの Qdevice メンバーシップのステータスが NR (Not Registered：登録されていない) であることが分かります。</p>
<pre>[root@node1 ~]# pcs quorum config
[root@node1 ~]# pcs quorum status
Quorum information
------------------
Date:            Sun Feb 2 11:39:03 2026
Quorum provider: corosync_votequorum
Nodes:           2
Node ID:         1
Ring ID:         1.1d
Quorate:         Yes

Votequorum information
----------------------
Expected votes:   2
Highest expected: 2
Total votes:      2
Quorum:           1
Flags:            2Node Quorate WaitForAll

Membership information
----------------------
    Nodeid      Votes    Qdevice Name
         1          1    NR      node1 (local)
         2          1    NR      node2
</pre>
<p>以下のコマンドを実行し、クォーラムデバイスをクラスタに追加します。<code>host</code> にクォーラムデバイスとして動作するノードのホスト名、<code>algorithm</code> に使用するアルゴリズム (ffsplit) を指定します。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs quorum device add model net host=qdevice algorithm=ffsplit
Setting up qdevice certificates on nodes...
node1: Succeeded
node2: Succeeded
Enabling corosync-qdevice...
node1: not enabling corosync-qdevice: corosync is not enabled
node2: not enabling corosync-qdevice: corosync is not enabled
Sending updated corosync.conf to nodes...
node2: Succeeded
node1: Succeeded
node1: Corosync configuration reloaded
Starting corosync-qdevice...
node2: corosync-qdevice started
node1: corosync-qdevice started
</pre>
<p>上記コマンドを実行後、クォーラムデバイスの設定を確認するには、<code>pcs quorum config</code> を実行します。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs quorum config
Device:
  votes: 1
  Model: net
    algorithm: ffsplit
    host: qdevice
</pre>
<p>4. クラスタノード側からクォーラムデバイスの状態を確認します。</p>
<p>クォーラムデバイスをクラスタに追加した後、まずはクラスタノード側から、クォーラムデバイスが正しく認識・動作しているかを確認します。</p>
<pre>(node1 または node2 のいずれかで実行)
# pcs quorum status
Quorum information
------------------
Date:             Sun Feb  2 11:45:38 2026
Quorum provider:  corosync_votequorum
Nodes:            2
Node ID:          1
Ring ID:          1.1d
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   3
Highest expected: 3
Total votes:      3
Quorum:           2  
Flags:            Quorate Qdevice 

Membership information
----------------------
    Nodeid      Votes    Qdevice Name
         1          1    A,V,NMW node1 (local)
         2          1    A,V,NMW node2
         0          1            Qdevice
</pre>
<p>この Membership information は、現在のクォーラム判定に参加しているメンバー (投票者) 一覧を表しています。Qdevice が 1 vote を持つメンバーとして参加していることが分かります。</p>
<p>なお、<code>A,V,NMW</code> は votequorum におけるノード状態フラグであり、それぞれの意味は次のとおりです。</p>
<ul>
<li><strong>A/NA</strong>
<ul>
<li>A (Active)：クォーラムデバイスがそのノードに対して有効な状態</li>
<li>NA (Not Active)：クォーラムデバイスがそのノードに対して無効な状態</li>
</ul>
</li>
<li><strong>V/NV</strong>
<ul>
<li>V (Voting)：クォーラムデバイスがそのノードへ投票を与えている</li>
<li>NV (Not Voting)：クォーラムデバイスがそのノードに投票を与えていない</li>
</ul>
</li>
<li><strong>MW/NMW</strong>
<ul>
<li data-start="369" data-end="440">MW (Master Wins)：master_wins フラグが有効</li>
<li data-start="369" data-end="440">NMW (Not Master Wins)：master_wins フラグが無効 (デフォルト)</li>
</ul>
</li>
</ul>
<p>続いて、<code>pcs quorum device status</code> コマンドを使って、クォーラムデバイスとの接続状態やアルゴリズム設定を確認します。</p>
<pre>(node1 または node2 のいずれかで実行)
[root@node1 ~]# pcs quorum device status
Qdevice information
-------------------
Model:                  Net
Node ID:                1
Configured node list:
      0 Node ID = 1
      1 Node ID = 2
Membership node list:   1, 2

Qdevice-net information
----------------------
Cluster name:           test_cluster
QNetd host:             qdevice:5403
Algorithm:              Fifty-Fifty split
Tie-breaker:            Node with lowest node ID
State:                  Connected
</pre>
<p>Qdevice-net information の結果から、判定アルゴリズムと決定ルールを確認できます。</p>
<ul>
<li><strong>Algorithm: Fifty-Fifty split</strong> は、クラスタが同数に分断された場合（2 ノードクラスタでは 1:1 の分断）に適用される判定アルゴリズムです。</li>
<li><strong>Tie-breaker: Node with lowest node ID</strong> は、分断時に最も小さな node ID を含むパーティションを primary component（quorum を持つ側）として選択する決定ルールを示しています。</li>
</ul>
<p>5. 次に、クォーラムデバイス側で、corosync-qnetd デーモンの状態を確認します。</p>
<p>以下のコマンドを実行します。</p>
<pre>(qdevice サーバで実行)
[root@qdevice:~]# pcs qdevice status net --full
QNetd address:                  *:5403
TLS:                            Supported (client certificate required)
Connected clients:              2
Connected clusters:             1
Maximum send/receive size:      32768/32768 bytes
Cluster "test_cluster":
    Algorithm:          Fifty-Fifty split (KAP Tie-breaker)
    Tie-breaker:        Node with lowest node ID
    Node ID 1:
        Client address:         ::ffff:192.168.100.101:33624
        HB interval:            8000ms
        Configured node list:   1, 2
        Ring ID:                1.1d
        Membership node list:   1, 2
        Heuristics:             Undefined (membership: Undefined, regular: Undefined)
        TLS active:             Yes (client certificate verified)
        Vote:                   No change (ACK)
    Node ID 2:
        Client address:         ::ffff:192.168.100.102:32998
        HB interval:            8000ms
        Configured node list:   1, 2
        Ring ID:                1.1d
        Membership node list:   1, 2
        Heuristics:             Undefined (membership: Undefined, regular: Undefined)
        TLS active:             Yes (client certificate verified)
        Vote:                   ACK (ACK)
</pre>
<p>両ノードとも、同一の Membership node list、正常な ACK 応答となっており、qnetd から見てもクラスタは健全な状態であることが確認できます。</p>
<h2>クォーラムデバイスを使ったクラスタの動作確認</h2>
<p>前の検証では、クォーラムデバイスを使用しない 2 ノードクラスタにおいて、ノード間のネットワークを切断すると、両ノードがそれぞれ <code>DC</code> となり、リソースを起動してしまう (いわゆるスプリットブレイン状態) ことを確認しました。</p>
<p>ここでは、クォーラムデバイスを導入した場合に、同じ障害を発生させたときの挙動がどのように変わるのかを確認します。</p>
<h3>正常時の状態確認</h3>
<p>まずは、ネットワーク切断前の状態を確認します。</p>
<pre>[root@node1 ~]# pcs status
Cluster name: test_cluster
Cluster Summary:
* Stack: corosync (Pacemaker is running)
* Current DC: node1 (version 3.0.1-3.el10-b1a23a6) - partition with quorum
* Last updated: Mon Feb 2 13:51:22 2026 on node1
* Last change: Mon Feb 2 13:36:39 2026 by root via root on node1
* 2 nodes configured
* 1 resource instance configured

Node List:
* Online: [ node1 node2 ]

Full List of Resources:
* Dummy (ocf:heartbeat:Dummy): Started node1

</pre>
<p>Quorum 情報を確認すると、Qdevice が投票に参加していることが分かります。</p>
<pre>[root@node1:~]# pcs quorum status
Quorum information
------------------
Date:             Mon Feb  2 13:55:20 2026
Quorum provider:  corosync_votequorum
Nodes:            2
Node ID:          1
Ring ID:          1.26
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   3
Highest expected: 3
Total votes:      3
Quorum:           2  
Flags:            Quorate Qdevice 

Membership information
----------------------
    Nodeid      Votes    Qdevice Name
         1          1    A,V,NMW node1 (local)
         2          1    A,V,NMW node2
         0          1            Qdevice
</pre>
<h3>ノード間ネットワークの切断</h3>
<p>次に、疑似障害として node1 と node2 間のインターコネクト通信を切断します。（Qdevice との通信は維持された状態）</p>
<h3>障害発生後の状態確認</h3>
<p>node1 と node2 間のネットワークを切断した後、それぞれのノードで <code>pcs status</code> を実行し、クラスタの状態を確認します。</p>
<pre>[root@node1 ~]# pcs status
Cluster name: test_cluster
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: node1 (version 3.0.1-3.el10-b1a23a6) - partition with quorum
  * Last updated: Mon Feb  2 15:14:59 2026 on node1
  * Last change:  Mon Feb  2 15:14:13 2026 by root via root on node1
  * 2 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ node1 ]
  * OFFLINE: [ node2 ]

Full List of Resources:
  * Dummy       (ocf:heartbeat:Dummy):   Started node1
</pre>
<p>node1 は クォーラムデバイスからの投票を含めて quorum を維持しており、引き続き DC として選出され、リソースを起動した状態で稼働しています。</p>
<pre>[root@node2 ~]# pcs status
Cluster name: test_cluster
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: node2 (version 3.0.1-3.el10-b1a23a6) - partition WITHOUT quorum
  * Last updated: Mon Feb  2 15:15:04 2026 on node2
  * Last change:  Mon Feb  2 15:14:14 2026 by root via root on node1
  * 2 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ node2 ]
  * OFFLINE: [ node1 ]

Full List of Resources:
  * Dummy       (ocf:heartbeat:Dummy):   Stopped
</pre>
<p>node2 はクラスタ内では単独ノードとなり、クォーラムを満たせない状態 (partition WITHOUT quorum) となっています。その結果、DC にはなっているものの、quorum を持たないため、リソースは起動されない、という状態になっています。</p>
<h4>クォーラム状態の確認</h4>
<p>次に、node1 側で <code>pcs quorum status</code> を実行し、クォーラム状態を確認します。</p>
<pre>[root@node1 /]# pcs quorum status
Quorum information
------------------
Date:             Mon Feb  2 15:16:14 2026
Quorum provider:  corosync_votequorum
Nodes:            1
Node ID:          1
Ring ID:          1.86
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   3
Highest expected: 3
Total votes:      2
Quorum:           2  
Flags:            Quorate Qdevice 

Membership information
----------------------
    Nodeid      Votes    Qdevice Name
         1          1    A,V,NMW node1 (local)
         0          1            Qdevice
</pre>
<p>この結果から分かる通り、node1 と Qdevice がそれぞれ 1 vote を保持し、合計 2 votes（quorum＝2）となるため、node1 側では quorum が維持されています。クォーラムデバイスは、デフォルト設定では存続しているノードのうち、最も小さな node ID を持つノードを含むパーティションを選択します。今回の構成では node1 が選択され、node2 側は quorum を失う結果となりました。</p>
<h4>ログの確認</h4>
<p>node2 側のログを確認すると、quorum 喪失に伴う挙動が明確に分かります。</p>
<pre>(node2ログ)
Feb 2 15:14:48 node2 pacemaker-controld[4354]: notice: Node node1 state is now lost
Feb 2 15:14:48 node2 corosync[4330]: [QUORUM] This node is within the non-primary component and will NOT provide any services.
</pre>
<p>このログは、このノードは non-primary component (quorum を持たない側) に属しており、サービスを提供してはならない、ことを示しています。</p>
<p>続く Pacemaker のログでも、quorum 喪失によりリソース管理が抑止されていることが分かります。</p>
<pre>(node2ログ)
Feb 2 15:14:49 node2 pacemaker-schedulerd[4353]: warning: Fencing and resource management disabled due to lack of quorum
Feb 2 15:14:49 node2 pacemaker-schedulerd[4353]: notice: Actions: Start Dummy ( node2 ) due to no quorum (blocked)
</pre>
<h2>おわりに</h2>
<p>本記事では、2 ノードクラスタにおけるスプリットブレイン対策として、クォーラムデバイスの仕組みと設定方法、そして実際の動作検証結果について解説しました。</p>
<p>クォーラムデバイスを導入しない場合、ノード間のネットワーク分断時に双方が自身を正当なクラスタと判断し、同時にリソースを起動してしまう可能性があります。一方で、クォーラムデバイスを追加することで投票数が奇数となり、外部の調停役による判定が加わることで、過半数を得た側のみがサービスを継続できるようになります。これにより、2 ノードクラスタ特有のスプリットブレインリスクを大きく低減できます。</p>
<p>特に、コストや設計上の理由から 2 ノード構成を採用せざるを得ない環境や、環境要件や構成上の制約により電源制御を用いたフェンシングを採用しない場合には、クォーラムデバイスは有効な補完策となります。</p>
<p>本記事が、2 ノードクラスタの設計やスプリットブレイン対策を検討されている方の参考になれば幸いです。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pacemaker クラスタのスプリットブレイン対策</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/split-brain/</link>
		
		<dc:creator><![CDATA[彭 博 (Bo Peng)]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 00:00:05 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=12068</guid>

					<description><![CDATA[システムを安定して稼働させるためには、冗長化構成が不可欠です。冗長化構成を採用することで、稼働系サーバに障害が発生してサービスが停止した場合でも、待機系サーバへ自動的に切り替えることができ、ダウンタイムを最小限に抑えられ ...]]></description>
										<content:encoded><![CDATA[<p>システムを安定して稼働させるためには、冗長化構成が不可欠です。冗長化構成を採用することで、稼働系サーバに障害が発生してサービスが停止した場合でも、待機系サーバへ自動的に切り替えることができ、ダウンタイムを最小限に抑えられます。</p>
<p>一方で、冗長化によって単一障害点は解消できるものの、クラスタノード間の通信が途絶えた場合には「スプリットブレイン」状態に陥るリスクが残ります。スプリットブレインが発生すると、複数のノードが同時に稼働系として振る舞い、IP アドレスの競合やファイルシステムの二重マウントなどが発生する可能性があります。最悪の場合、データ破損といった深刻な障害につながる恐れもあります。</p>
<p>そのため、クラスタ構成を安定して運用するうえで、スプリットブレイン対策は欠かせないポイントです。</p>
<p>本記事では、<a href="https://clusterlabs.org/projects/pacemaker/" target="_blank" rel="noopener">Pacemaker/Corosync</a> クラスタで広く利用されているスプリットブレイン対策の仕組みについて解説します。</p>
<p><span id="more-12068"></span></p>
<h2>スプリットブレインとは</h2>
<p>スプリットブレインとは、クラスタを構成するノード間の通信が途絶えた際に、各ノードが互いの状態を正しく認識できなくなり、複数のノードが同時に稼働系として動作してしまう状態を指します。</p>
<p>通常、クラスタではノード同士が定期的にハートビート通信を行い、相互監視を行っています。しかし、ネットワーク障害などにより通信が分断されると、各ノードは相手を「障害」と誤認する可能性があります。この状態では、同一サービスやリソースが複数ノードで同時に起動されるため、IP  アドレスの競合、ファイルシステムの二重マウント、共有データへの同時書き込み、などが発生する可能性があります。</p>
<p><img decoding="async" class="aligncenter size-full wp-image-19853" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-scaled.png" alt="" width="2560" height="1051" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-scaled.png 2560w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-300x123.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-1024x421.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-768x315.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-1536x631.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-2048x841.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-304x125.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/splitbrain-282x116.png 282w" sizes="(max-width: 2560px) 100vw, 2560px" /></p>
<h2>スプリットブレイン対策</h2>
<p>Pacemaker/Corosync クラスタでは、スプリットブレインを防止するために複数の仕組みが用意されています。</p>
<h3>Stonith によるフェンシング</h3>
<p>STONITH (Shoot The Other Node In The Head) は、クラスタ環境で発生し得るスプリットブレインを防止するためのフェンシング手法です。ノード間の通信が途絶えた場合に、インターコネクト (クラスタ通信用ネットワーク) とは独立した経路を用いて問題のあるノードを強制的に停止または再起動させることで、データ破壊やサービスの二重起動を防ぎます。具体的には、IPMI などのハードウェア制御ボードや、共有ストレージを介した制御を利用して、異常が発生したノードを停止/再起動させます。</p>
<p>具体的には、以下のような仕組みが利用されます。</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>IPMI などのハードウェア制御ボード</li>
<li>仮想化基盤の API</li>
<li>共有ストレージを利用した制御 (SBD など)</li>
</ul>
<p><img decoding="async" class="aligncenter size-full wp-image-19879" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1.png" alt="" width="2509" height="1781" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1.png 2509w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1-300x213.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1-1024x727.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1-768x545.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1-1536x1090.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1-2048x1454.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1-301x214.png 301w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith1-282x200.png 282w" sizes="(max-width: 2509px) 100vw, 2509px" /><br />
<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-19874" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2.png" alt="" width="2532" height="1497" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2.png 2532w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2-300x177.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2-1024x605.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2-768x454.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2-1536x908.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2-2048x1211.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2-304x180.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/stonith2-282x167.png 282w" sizes="auto, (max-width: 2532px) 100vw, 2532px" /></p>
<p>Pacemaker/Corosync を利用した HA クラスタにおいて、STONITH は最も確実で推奨されるスプリットブレイン対策です。</p>
<h3>リソースの排他制御</h3>
<p>リソースの排他制御により、複数ノードでの同時起動を防止する方法もあります。sfex や VIPCheck は、排他制御を実現するリソースエージェントです。</p>
<p>sfex は共有ディスクを使った排他制御を実現するリソースエージェントとなります。稼働系ノードが共有ディスク上に定期的に書き込みを行うことで排他状態を維持し、ノード間通信が途絶えた場合に、両系が同時に稼働系となることを防止します。</p>
<p>VIPCheck は仮想 IP 状態をチェックすることで排他制御を実現します。共有ディスクが利用できない環境でも、リソースの二重起動を抑止できます。</p>
<p>なお、sfex および VIPCheck は Linux-HA Japan が提供するリソースエージェントであり、RHEL HA Add-on の標準パッケージには含まれていません。</p>
<h3>クォーラムによる多数決制御</h3>
<p>クォーラムとは、クラスタ処理を継続するために必要な最低限の投票数のことを指します。スプリットブレイン対策として広く使われている一般的な手法です。</p>
<p>一般的に、3台以上のノードでクラスタを構成し、過半数を獲得したパーティションのみがクラスタを継続できる仕組みです。過半数を満たさない場合はクォーラムを喪失し、<code>no-quorum-policy</code> の設定に従ってリソース停止やフェンシングが実行されます。</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-19925" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-scaled.png" alt="" width="2560" height="1143" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-scaled.png 2560w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-300x134.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-1024x457.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-768x343.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-1536x686.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-2048x915.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-304x136.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/quorum-282x126.png 282w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></p>
<p>Pacemaker における <code>no-quorum-policy</code> の各設定値の動作は以下の通りです。</p>
<ul>
<li><strong>stop (デフォルト)</strong><br />
クォーラムを喪失したノード上のすべてのリソースを停止します。</li>
<li><strong>freeze</strong><br />
現在動作しているリソースはそのまま維持しますが、新規起動や再配置は行いません。</li>
<li><strong>ignore</strong><br />
クォーラム喪失を無視し、通常どおりリソース管理を継続します。</li>
<li><strong>demote</strong><br />
Master/Slave (Promotable) リソースが存在する場合、Master を Slave に降格します。</li>
<li><strong>suicide</strong><br />
クォーラムを喪失したノードをフェンシングします。</li>
</ul>
<h3></h3>
<h3>クォーラムデバイス</h3>
<p>クォーラムデバイスは、ノード間通信が切断された際に、どのノード (またはパーティション) がクラスタの運用を継続すべきかを判断するための外部投票ノードです。特に偶数ノードで構成されたクラスタでは、ネットワーク分断時に投票数が同数となり、クォーラム (過半数) が成立しないという問題があります。なかでも2ノードクラスタでは、インターコネクトが切断されると双方が相手を障害と誤認し、スプリットブレイン状態に陥るリスクが高まります。</p>
<p>このような構成では、クラスタノードとは別に調停役となるクォーラムデバイスを追加することで、クラスタ全体の投票数が奇数となり、過半数による多数決が成立します。その結果、スプリットブレイン発生時でも、どちらのノードがクラスタを継続すべきかを適切に判断できるようになります。</p>
<p>2ノードクラスタの場合、通常は各ノードが1票ずつを持ちますが、クォーラムデバイスを追加すると合計3票となります。ネットワーク分断が発生した際には、クォーラムデバイスの投票を含めた多数決により、過半数を得たノードのみがクラスタ管理を継続できます。これにより、両ノードが同時にリソースを稼働させる事態を防止できます。</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-19865" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-scaled.png" alt="" width="2560" height="1754" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-scaled.png 2560w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-300x206.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-1024x701.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-768x526.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-1536x1052.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-2048x1403.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-304x208.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/02/qdevice-282x193.png 282w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></p>
<p>クォーラムデバイスを利用する場合、クラスタノードには corosync-qdevice をインストールし、調停役となるサーバには corosync-qnetd をインストールします。corosync-qnetd デーモンはクラスタ外部で動作し、投票を行います。分断時には corosync-qnetd の判定結果に基づき、過半数を得たノードのみがクラスタを維持し、過半数を得られなかったノードはクラスタサービスを停止します。</p>
<p>偶数ノード構成、特に2ノードクラスタではスプリットブレインのリスクが高いため、クォーラムデバイスの利用が推奨されます。</p>
<p>クォーラムデバイスの具体的な設定方法や、ネットワーク分断時の挙動を含む詳細な動作確認については、<a href="https://www.sraoss.co.jp/tech-blog/pacemaker/quorum-device/">こちらの記事</a>にて詳しく解説していますので、あわせてご参照ください。</p>
<h2>おわりに</h2>
<p>本記事では、スプリットブレイン対策として広く利用される以下の仕組みについて解説しました。</p>
<ul>
<li>STONITH によるフェンシング</li>
<li>リソースの排他制御</li>
<li>クォーラムによる多数決制御</li>
<li>クォーラムデバイス</li>
</ul>
<p>Pacemaker には多数のフェンスエージェントが用意されており、物理サーバ、仮想化基盤、共有ディスク環境など、それぞれの構成に応じたフェンシング方式を選択できます。HA クラスタにおいては、フェンシングの実装が最も確実なスプリットブレイン対策といえます。</p>
<p>一方で、環境要件や構成上の制約により電源制御を用いたフェンシングを採用しない場合には、クォーラム制御やクォーラムデバイスの利用によって多数決の仕組みを補強する方法があります。特に2ノードクラスタでは、クォーラムデバイスを追加することで投票数を奇数化し、分断時の判断を明確にできます。</p>
<p>HA クラスタでは、冗長化するだけでは不十分で、障害時の挙動まで考えた設計が欠かせません。本記事が、より安全で堅牢なクラスタ構築の参考になれば幸いです。</li>
</ul>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pacemaker のプロセス構成と状態遷移の仕組み</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/pacemaker-processes/</link>
		
		<dc:creator><![CDATA[彭 博 (Bo Peng)]]></dc:creator>
		<pubDate>Wed, 24 Sep 2025 03:35:04 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=18565</guid>

					<description><![CDATA[Pacemaker/Corosync は、Linux 環境で高可用性クラスタを構築するためのオープンソースのクラスタリングソフトウェアです。複数ノードにまたがるリソースの起動、停止、監視を自動的に行い、障害発生時にはフェ ...]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.clusterlabs.org/pacemaker/" target="_blank" rel="noopener">Pacemaker/Corosync</a> は、Linux 環境で高可用性クラスタを構築するためのオープンソースのクラスタリングソフトウェアです。複数ノードにまたがるリソースの起動、停止、監視を自動的に行い、障害発生時にはフェイルオーバーを実施することで、システムの継続稼働を実現します。</p>
<p><span id="more-18565"></span></p>
<p>内部的には複数のデーモンプロセスがそれぞれ役割を担い、連携しながら動作しています。本記事では、Pacemaker/Corosync のプロセス構成とプロセス間のデータ処理の流れ、さらに状態遷移の仕組みについて解説します。</p>
<p>※バージョンによって挙動が異なる場合があるため、本記事では Pacemaker 2.1 を前提としています。</p>
<h2>Pacemaker/Corosync のプロセス構成</h2>
<p>Pacemaker の内部では、複数のデーモンプロセスが役割を分担し、クラスタ全体の監視、制御、リソース管理を行います。一方、Corosync はクラスタを構成するノード間の通信や死活監視、クォーラム管理を担当するプロセスです。両者が連携することで、障害が発生した場合でもサービスを継続できる、高可用性クラスタを実現できます。</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18568" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-scaled.png" alt="" width="2560" height="1643" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-scaled.png 2560w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-300x192.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-1024x657.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-768x493.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-1536x986.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-2048x1314.png 2048w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-304x195.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/09/processes-282x181.png 282w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></p>
<p>&nbsp;</p>
<p>主要なプロセスの役割は以下のとおりです。</p>
<h3><strong>pacemakerd</strong></h3>
<p>Pacemaker クラスタ全体の管理を担う親デーモンであり、以下の各サブデーモンプロセスの起動・監視を行い、異常時は再起動します。</p>
<h3><strong>pacemaker-based</strong></h3>
<p>クラスタの設定や状態情報を保持する CIB (Cluster Information Base、詳細は後述) を管理するプロセスです。CIB は XML 形式で構造化されており、クラスタ設定やリソースの構成、ノードの状態などが記録されています。<code>pacemaker-based</code> は CIB の読み書きを行い、常に最新の情報を反映させるとともに、複数ノード間で内容が一致するよう同期処理を行い、クラスタ全体の一貫性を維持します。</p>
<h3><strong>pacemaker-attrd</strong></h3>
<p>クラスタノードやリソースに関する動的属性情報 (稼働状況、フェイルカウントなど) を管理するプロセスです。<code>pacemaker-attrd</code> は各ノードから収集した属性情報を保持し、必要に応じてクラスタ全体に伝達します。</p>
<h3><strong>pacemaker-schedulerd</strong></h3>
<p>CIB の情報をもとに、どのノードでどのリソースを動かすかを決定するプロセスです。フェイルオーバー時のリソース配置計画もここで決定されます。</p>
<h3><strong>pacemaker-controld</strong></h3>
<p>Pacemaker クラスタにおける「調整役」を担うプロセスです。このプロセスは <code>pacemaker-schedulerd</code> が決定した計画に基づき、各ノード上の <code>pacemaker-execd</code> に対してリソースの起動、停止、監視を指示します。</p>
<h3><strong>pacemaker-execd</strong></h3>
<p>ローカルノード上でリソースエージェントの起動、停止、監視を実行するプロセスです。操作結果は <code>pacemaker-controld</code> に報告され、クラスタ全体の判断材料として利用されます。</p>
<h3><strong>pacemaker-fenced</strong></h3>
<p>障害を起こしたノードを強制的にリブートまたはシャットダウンするフェンシングを担当するプロセスです。データ破壊や二重書き込みなどの重大な障害を防ぐため、STONITH デバイスを操作して信頼できないノードをクラスタから隔離します。</p>
<p>なお、Pacemaker 2.0 系ではプロセス名が変更されました。ただし、機能自体は従来と同じです。旧プロセス名との対応関係を以下の表に示します。</p>
<table>
<thead>
<tr>
<th width="300"><strong>旧プロセス名</strong></th>
<th width="300"><strong>新プロセス名</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>cib</td>
<td>pacemaker-based</td>
</tr>
<tr>
<td>attrd</td>
<td>pacemaker-attrd</td>
</tr>
<tr>
<td>pengine</td>
<td>pacemaker-schedulerd</td>
</tr>
<tr>
<td>crmd</td>
<td>pacemaker-controld</td>
</tr>
<tr>
<td>lrmd</td>
<td>pacemaker-execd</td>
</tr>
<tr>
<td>stonithd</td>
<td>pacemaker-fenced</td>
</tr>
</tbody>
</table>
<h2>CIB (Cluster Information Base) とは</h2>
<p>Pacemaker では、各プロセスが CIB を中心に情報を共有・同期することで、クラスタ全体の一貫性を保っています。</p>
<p>CIB は XML 形式で管理されるクラスタ情報のデータベースであり、クラスタの構成や各リソースの状態を記録します。CIB には、クラスタの状態変化に応じてリアルタイムで更新される動的な情報が保持されており、クラスタ全体の整合性を維持するうえで重要な役割を担っています。各ノード上の <code>pacemaker-based</code> プロセスが CIB を管理し、更新や同期を行うことで、<code>pacemaker-schedulerd</code> は常に最新の情報に基づいてリソースの配置やフェイルオーバーの判断を行うことができます。</p>
<p>CIB の構造は主に以下のセクションで構成されています。</p>
<pre>&lt;cib crm_feature_set="3.19.6" ...&gt;
  &lt;configuration&gt;
    &lt;!-- クラスタ設定（リソース定義、制約、ノード設定など） --&gt;
  &lt;/configuration&gt;
  &lt;status&gt;
    &lt;!-- 実行中のリソースの状態やノードの状態 --&gt;
  &lt;/status&gt;
&lt;/cib&gt;
</pre>
<h2>プロセス間データ処理の流れと状態遷移の仕組み</h2>
<p>Pacemaker では、複数のサブデーモンが連携してクラスタを制御します。その中心的役割を担う <strong data-start="367" data-end="389">pacemaker-controld</strong> は、クラスタの「頭脳」として動作し、ノードの参加・離脱、リソースの起動・停止、フェイルオーバーなど、クラスタ内で発生する各種イベントに応じて内部状態を遷移させつつ、クラスタ全体を制御します。</p>
<p>代表的な状態は次のとおりです。</p>
<table>
<thead>
<tr>
<th width="300"><strong>状態</strong></th>
<th width="300"><strong>説明</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>S_STARTING</td>
<td>初期化中</td>
</tr>
<tr>
<td>S_PENDING</td>
<td>クラスタ構成情報や他ノードの参加を待機中</td>
</tr>
<tr>
<td>S_ELECTION</td>
<td>DC を決定するための選挙中</td>
</tr>
<tr>
<td>S_INTEGRATION</td>
<td>他ノードの JOIN 要求を受け入れ、クラスタ統合を進める</td>
</tr>
<tr>
<td>S_FINALIZE_JOIN</td>
<td>JOIN を確定し、クラスタメンバーシップを確立</td>
</tr>
<tr>
<td>S_POLICY_ENGINE</td>
<td>リソース配置計算を実施中</td>
</tr>
<tr>
<td>S_TRANSITION_ENGINE</td>
<td>リソース操作を実行中</td>
</tr>
<tr>
<td>S_IDLE</td>
<td>安定状態</td>
</tr>
</tbody>
</table>
<p>次に、一例として 起動時および障害発生時における状態遷移の流れについて解説します。</p>
<h3>起動時の状態遷移</h3>
<p>クラスタの起動時、Pacemaker の各サブデーモンは協調しながら、ノード間でメンバーシップを確立し、リソース配置を決定します。このプロセスは段階的に進み、各状態で必要な初期化や情報収集、計算処理が行われた上で、最終的にクラスタは安定状態に到達します。</p>
<pre><strong>起動</strong>
│  
│  <span style="font-size: 12px;">親デーモン pacemakerd が起動し、各サブデーモンをを順次起動</span>
│  <span style="font-size: 12px;">(controld, schedulerd, execd, based, attrd, fenced)</span>
│
▼
<strong>S_STARTING (初期化開始)</strong>
│
│  <span style="font-size: 12px;">自ノード (node1) の状態を unknown → member に更新</span>
│  <span style="font-size: 12px;">CIB 読み込み、Corosync 接続</span>
│  <span style="font-size: 12px;">他ノードの参加を待機</span>
│
▼
<strong>S_PENDING (待機)</strong>
│
│  <span style="font-size: 12px;">node2 の参加を検知</span>
│  <span style="font-size: 12px;">DC 選挙開始</span>
│
▼
<strong>S_ELECTION (DC選挙)</strong>
│
│  <span style="font-size: 12px;">投票の結果、node1 が DC に選出</span>
│
▼
<strong>S_INTEGRATION (ノード統合)</strong>
│
│  <span style="font-size: 12px;">JOIN 要求を受け入れ、node2 をクラスタに統合</span>
|
▼
<strong>S_FINALIZE_JOIN (JOIN確定)</strong>
│ 
│  <span style="font-size: 12px;">クラスタメンバーシップを確定</span>
│  
│  <span style="font-size: 12px;">* pacemaker-based</span>
│     <span style="font-size: 12px;">JOIN が完了したノード情報を CIB に反映</span>
│  
▼
<strong>S_POLICY_ENGINE</strong>
│
│  <span style="font-size: 12px;">* pacemaker-schedulerd</span>
│     <span style="font-size: 12px;">DC (node1) が決定後、リソース配置計算を開始</span>
│     <span style="font-size: 12px;">クラスタ全体のリソースの起動／配置プランを生成</span>
│     <span style="font-size: 12px;">計算結果を pacemaker-controld に渡す</span>
│
▼
<strong>S_TRANSITION_ENGINE</strong>
│
│  <span style="font-size: 12px;">* pacemaker-execd</span>
│     <span style="font-size: 12px;">pacemaker-controld の指示に従って start/stop/monitor を実行</span>
│     <span style="font-size: 12px;">成否を pacemaker-controld にフィードバック</span>
│
│  <span style="font-size: 12px;">* pacemaker-controld</span>
│     <span style="font-size: 12px;">リソース操作の成功を確認</span>
│
▼
<strong>S_IDLE (安定状態)</strong>
│
│  <span style="font-size: 12px;">リソース操作がすべて正常終了</span>
│  <span style="font-size: 12px;">クラスタは安定状態に遷移</span>
│
</pre>
<h3>障害発生時の状態遷移</h3>
<p>クラスタ稼働中にリソース障害やノード障害が発生した場合、Pacemaker はそのイベントを検知し、自動的に回復処理を行います。障害発生時は、クラスタが持つ最新の CIB 情報に基づいて、フェイルオーバーや再起動などのアクションを決定し、適切に実行します。</p>
<pre><strong>S_IDLE (安定状態)</strong>
│
│  <span style="font-size: 12px;">クラスタは安定稼働中</span>
│  <span style="font-size: 12px;">* pacemaker-execd (node1)</span>
│     <span style="font-size: 12px;">VIP_monitor_10000 が定期的に実行される</span>
│     <span style="font-size: 12px;">結果: 失敗 (rc=7, not running)</span>
│     <span style="font-size: 12px;">この結果を pacemaker-controld に返却</span>
│  
│  <span style="font-size: 12px;">* pacemaker-controld (node1)</span>
│     <span style="font-size: 12px;">monitor 失敗を検知</span>
│     <span style="font-size: 12px;">CIB 更新要求を pacemaker-based に送信</span>
│  
│  <span style="font-size: 12px;">* pacemaker-based (node1)</span>
│     <span style="font-size: 12px;">CIB 更新要求を処理</span>
│     <span style="font-size: 12px;">CIB をディスクに書き込み</span>
│
│  <span style="font-size: 12px;">* pacemaker-attrd (node1)</span>
│     <span style="font-size: 12px;">属性を更新：</span>
│        <span style="font-size: 10px;">・last-failure-VIP#monitor_10000[node1] = 1756193718</span>
│        <span style="font-size: 10px;">・fail-count-VIP#monitor_10000[node1] = 1</span>
│     <span style="font-size: 12px;">CIB に反映</span>
│
▼
<strong>S_POLICY_ENGINE (リソース配置計算)</strong>
│
│  <span style="font-size: 12px;">* pacemaker-schedulerd (node1)</span>
│     <span style="font-size: 12px;">CIB の変更を検知し、リソース配置計算を再実行</span>
│     <span style="font-size: 12px;">migration-threshold=1 のため node1 での再起動不可と判断</span>
│     <span style="font-size: 12px;">VIP を node2 へ移動する決定</span>
│     <span style="font-size: 12px;">Transition 10（遷移グラフ）を生成：</span>
│       <span style="font-size: 10px;">・VIP_stop on node1</span>
│       <span style="font-size: 10px;">・VIP_start on node2</span>
│       <span style="font-size: 10px;">・VIP_monitor_10000 on node2 (recurring)</span>
│
▼
<strong>S_TRANSITION_ENGINE (アクション実行)</strong>
│
│  <span style="font-size: 12px;">* pacemaker-controld (node1)</span>
│     <span style="font-size: 12px;">pacemaker-schedulerd から受け取った Transition 10 を順次実行</span>
│     <span style="font-size: 12px;">まず pacemaker-execd (node1) に VIP_stop を要求</span>
│  
│  <span style="font-size: 12px;">* pacemaker-execd (node1)</span>
│     <span style="font-size: 12px;">VIP_stop を実行し、結果を pacemaker-controld に返却</span>
│
│  <span style="font-size: 12px;">* pacemaker-controld (node1)</span>
│     <span style="font-size: 12px;">次に node2 に VIP_start を指示</span>
│
│  <span style="font-size: 12px;">* pacemaker-execd (node2)</span>
│     <span style="font-size: 12px;">VIP_start を実行</span>
│     <span style="font-size: 12px;">VIP_monitor_10000 を開始</span>
│     <span style="font-size: 12px;">結果を pacemaker-controld (node2) に返却</span>
│
▼
<strong>S_IDLE (安定状態復帰)</strong>
│
│  <span style="font-size: 12px;">VIP が node2 上で正常稼働開始</span>
│  <span style="font-size: 12px;">monitor 監視も復帰</span>
│  <span style="font-size: 12px;">クラスタは再び安定状態へ移行</span>
│
</pre>
<h2>おわりに</h2>
<p data-start="48" data-end="134">今回は、Pacemaker/Corosync のプロセス構成と、<code>pacemaker-controld</code> を中心とした状態遷移の仕組みについて解説しました。</p>
<p data-start="136" data-end="286">Pacemaker は複数のデーモンプロセスが協調して動作しており、CIB を中心とした情報共有や状態遷移の制御を正しく理解することで、クラスタの挙動をより深く把握できます。これにより、トラブルシューティングやクラスタ構成の最適化を行う際に大いに役立つでしょう。</p>
<p data-start="136" data-end="286"><div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>
</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pacemaker Booth を用いたディザスタリカバリ</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/pacemaker-booth/</link>
		
		<dc:creator><![CDATA[彭 博 (Bo Peng)]]></dc:creator>
		<pubDate>Wed, 31 Aug 2022 00:58:58 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Booth]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=10868</guid>

					<description><![CDATA[Booth は、Pacemaker で物理ネットワークが異なるサイト間のクラスタ管理を行うアドオン機能で、サイトにチケットを付与することで、リソースが稼働するサイトを制御します。Booth を使うことで災害対策として遠隔 ...]]></description>
										<content:encoded><![CDATA[<p><a href="https://clusterlabs.org/pacemaker/doc/2.1/Pacemaker_Explained/html/multi-site-clusters.html#" target="_blank" rel="noopener">Booth</a> は、Pacemaker で物理ネットワークが異なるサイト間のクラスタ管理を行うアドオン機能で、サイトにチケットを付与することで、リソースが稼働するサイトを制御します。Booth を使うことで災害対策として遠隔地サイトにまたがるクラスタを実現できます。</p>
<p>本記事では、Booth の概要、インストール・設定方法、基本的な使い方について紹介します。</p>
<p><span id="more-10868"></span></p>
<h2>Booth とは</h2>
<p>Pacemaker は WAN 経由で複数のサイトのクラスタ状態を管理できないため、サイトの障害やサイト間のネットワークに問題が発生した場合には、別のサイトが稼働中であるかどうかは Pacemaker が判断できません。各サイトの状態の確認およびサイト間の切り替えは人間の判断で行うか、クラスタチケット管理 (CTR) 機能を用いて自動的に行います。</p>
<p>CTR 機能を使うと、マルチサイトクラスタにおいて、チケットが付与されたサイトが稼働系になり、そのチケットに依存するリソースを起動する権限が与えられます。<br />
チケットが取り消された場合は、サイトが待機系に切り替わり、そのチケットに依存するリソースが停止状態になります。</p>
<p>Pacemaker で CTR を実現するには、アドオン機能である Booth を導入する必要があります。</p>
<p>Booth を利用することで、地理的に離れた複数のサイトを跨いでチケット管理を行うことができ、チケットを付与/取り消しすることで、サイト間での稼働系/待機系の切り替えや自動フェイルオーバ、リソースの起動/停止を制御することが可能になります。</p>
<h3>Booth によるチケット管理の仕組み</h3>
<p>Booth を用いたマルチサイトクラスタ環境では、通常のサイト (稼働系サイト/待機系サイト) に加えて、アービトレータ (調停役) と呼ばれるもう1つのサイト (1つのノード) を追加する必要があります。</p>
<p>ネットワーク障害等によりサイト間の通信が途絶えた場合には、別のサイトの障害なのか、サイト間のネットワークの障害なのかを区別する方法はないため、スプリットブレインに陥る可能性があります。これはクラスタ環境での固有の問題となります。そのため、フェイルオーバなどの決定について多数決による合意形成のために3つのサイトが必要です。3つ目のサイト (アービトレータ) を導入することで、合意形成によってサイト間のフェイルオーバーを制御することができ、スプリットブレインに陥ることを防ぎます。</p>
<p>以下はマルチサイトクラスタの基本的な構成となります。</p>
<p><img loading="lazy" decoding="async" class=" wp-image-10870 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2022/08/Booth.png" alt="" width="1009" height="579" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2022/08/Booth.png 1128w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2022/08/Booth-300x172.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2022/08/Booth-1024x587.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2022/08/Booth-768x441.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2022/08/Booth-304x174.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2022/08/Booth-282x162.png 282w" sizes="auto, (max-width: 1009px) 100vw, 1009px" /></p>
<p>両方のサイトおよびアービトレータで boothd デーモンが起動しており、お互い通信し、情報交換します。稼働系のサイトに障害が発生した場合、Booth の合意形成によって待機系のサイトにチケットを付与し、待機系のサイトを自動的に稼働系に昇格させます。</p>
<p>Booth を利用することで、チケット管理の自動化ができ、複数の拠点にまたがるマルチサイトクラスタでの自動フェイルオーバが可能になり、ダウンタイムを最小限に抑えることができます。</p>
<h2>クラスタ構成</h2>
<p>本記事では、2つのクラスタサイト (2ノード構成) および1つのアービトレータを含むマルチサイトクラスタを構築します。</p>
<p>クラスタ構成は以下になります。</p>
<table>
<tbody>
<tr>
<th width="150"></th>
<th width="150">仮想IP</th>
<th width="150">ホスト名</th>
<th width="150">IPアドレス</th>
</tr>
<tr>
<td rowspan="2">サイトA</td>
<td rowspan="2">192.168.101.100</td>
<td>clusterA-1</td>
<td>192.168.101.101</td>
</tr>
<tr>
<td>clusterA-2</td>
<td>192.168.101.102</td>
</tr>
<tr>
<td rowspan="2">サイトB</td>
<td rowspan="2">192.168.102.100</td>
<td>clusterB-1</td>
<td>192.168.102.101</td>
</tr>
<tr>
<td>clusterB-2</td>
<td>192.168.102.102</td>
</tr>
<tr>
<td>サイトC</td>
<td>192.168.100.100</td>
<td>arbitrator</td>
</tr>
</tbody>
</table>
<p>仮想IPは Booth 間通信で利用されるIPアドレスとなります。</p>
<h2>前提条件</h2>
<ul>
<li>今回は検証目的で RHEL クローン OS の Rocky Linux 環境を用いて検証を行います。Rocky Linux では Red Hat High Availability Add-On 相当のパッケージが HighAvailability リポジトリに含まれているため、今回はそちらのリポジトリを利用してインストールします。バージョン情報は以下になります。</li>
</ul>
<table>
<tbody>
<tr>
<th>OS</th>
<td>Rocky Linux 8.6</td>
</tr>
<tr>
<th>Pacemaker</th>
<td>2.1.2</td>
</tr>
<tr>
<th>Corosync</th>
<td>3.1.5</td>
</tr>
<tr>
<th>PCS</th>
<td>0.10.12</td>
</tr>
<tr>
<th>Booth</th>
<td>1.0</td>
</tr>
</tbody>
</table>
<ul>
<li>アービトレータを含むすべてのノードの /etc/hosts にノード情報が登録されています。</li>
</ul>
<pre>(両サイトのすべてのノードおよびアービトレータで実行)
# vi /etc/hosts
(以下を追加)
192.168.101.101 clusterA-1
192.168.101.102 clusterA-2
192.168.102.101 clusterB-1
192.168.102.102 clusterB-2
192.168.100.100 arbitrator</pre>
<h2>Pacemaker のインストールおよびクラスタの初期設定</h2>
<p>ここでは、Pacemaker のインストールおよびクラスタの初期設定の手順を記載します。</p>
<p>1. Pacemaker をインストールします。</p>
<p>両サイトのすべてのノードで Rocky Linux の HighAvailability リポジトリを有効にして Pacemaker をインストールします。</p>
<pre>(両サイトのすべてのノードで実行)
# yum install -y --enablerepo=ha pacemaker pcs fence-agents-all</pre>
<p>RHEL 環境を利用している場合は、Red Hat 社によって提供される Red Hat High Availability Add-On のパッケージを利用してインストールしてください。詳細については<a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_high_availability_clusters/assembly_getting-started-with-pacemaker-configuring-and-managing-high-availability-clusters" target="_blank" rel="noopener">こちら</a>を参照してください。</p>
<p>2. firewalld デーモンが起動している場合は、クラスタで必要なポートを有効化するように以下のコマンドを実行します。</p>
<pre>(両サイトのすべてのノードおよびアービトレータで実行)
# firewall-cmd --permanent --add-service=high-availability
# <span class="strong strong">firewall-cmd --reload</span></pre>
<p>3. 両サイトのすべてのノードで hacluster ユーザのパスワードを設定します。</p>
<pre>(両サイトのすべてのノードで実行)
# passwd hacluster
Changing password for user hacluster.
New password: (haclusterユーザのパスワードを入力)
Retype new password: (haclusterユーザのパスワードを入力)
passwd: all authentication tokens updated successfully.</pre>
<p>4. 両サイトのすべてのノードで以下のコマンドを実行し、pcsd の自動起動を有効化します。</p>
<pre>(両サイトのすべてのノードで実行)
# systemctl start pcsd.service
# systemctl enable pcsd.service</pre>
<p>5. 両サイトでクラスタを構成するノードに対して、hacluster ユーザの認証を行います。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs host auth clusterA-1 clusterA-2 -u hacluster
Password: (haclusterユーザのパスワードを入力)
clusterA-1: Authorized
clusterA-2: Authorized</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs host auth clusterB-1 clusterB-2 -u hacluster
Password: (haclusterユーザのパスワードを入力)
clusterB-1: Authorized
clusterB-2: Authorized</pre>
<p>6. 両サイトでクラスタを作成します。それぞれの名前を clusterA、clusterB とします。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs cluster setup clusterA clusterA-1 clusterA-2
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs cluster setup clusterB clusterB-1 clusterB-2</pre>
<p>7. 両サイトでクラスタを起動します。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs cluster start --all
[root@clusterA-1 ~]# pcs status
Cluster name: clusterA
...
Node List:
* <strong>Online: [ clusterA-1 clusterA-2 ]</strong>
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs cluster start --all
[root@clusterB-1 ~]# pcs status
Cluster name: clusterB
...
Node List:
* <strong>Online: [ clusterB-1 clusterB-2 ]</strong></pre>
<p>8. クラスタを安全に運用するために、フェンシングの設定が必要になりますが、今回は Booth によるマルチサイトクラスタを説明することを目的としているため、以下のコマンドを実行し、フェンシングを無効にします。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs property set stonith-enabled=false
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs property set stonith-enabled=false</pre>
<p>9. 両サイトで検証用のリソースグループを作成します。今回は、Apache および IPaddr2 を含むリソースグループを作成します。作成手順は<a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_high_availability_clusters/assembly_getting-started-with-pacemaker-configuring-and-managing-high-availability-clusters">こちら</a>を参照してください。</p>
<p>リソースが作成されていることを確認します。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs status
Cluster name: clusterA
...
Full List of Resources:
  * Resource Group: apachegroup:
    * WebSite   (ocf::heartbeat:apache):         Started clusterA-1
    * VIP       (ocf::heartbeat:IPaddr2):        Started clusterA-1
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs status
Cluster name: clusterB
...
Full List of Resources:
  * Resource Group: apachegroup:
    * WebSite   (ocf::heartbeat:apache):         Started clusterB-1
    * VIP       (ocf::heartbeat:IPaddr2):        Started clusterB-1
</pre>
<p>以上で、Pacemaker クラスタの初期設定は完了です。</p>
<h2>Booth のインストールおよび設定</h2>
<p>ここでは、Booth のインストールおよび設定手順を記載します。</p>
<p>1. Booth をインストールします。</p>
<p>両サイトのすべてのノードに booth-core および booth-site パッケージをインストールします。</p>
<pre>(両サイトのすべてのノードで実行)
# yum install -y --enablerepo=ha booth-site booth-core</pre>
<p>アービトレータノードに pcs、booth-core、および booth-arbitrator パッケージをインストールします。</p>
<pre>(アービトレータノードで実行)
[root@arbitrator ~]# yum install -y --enablerepo=ha pcs booth-core booth-arbitrator</pre>
<p>2. Booth の設定を行います。</p>
<p>Booth の設定やチケットは、まず片方のサイトで 作成した後、すべてのクラスタノードおよびアービトレータで設定の同期を行うという流れになります。<br />
今回は、まずサイトAのノード1で設定を行います。</p>
<p>サイトAのノード1で以下のコマンドを実行し、Booth の設定を行います。<br />
sites に各サイトの仮想IP、arbitrators にアービトレータノードのIPアドレスを指定します。</p>
<pre>(サイトAのノード1で実行)
[root@clusterA-1 ~]# pcs booth setup sites 192.168.101.100 192.168.102.100 arbitrators 192.168.100.100</pre>
<p>3. チケットを作成します。</p>
<p>サイトAのノード1でチケットを作成します。</p>
<pre>(サイトAのノード1で実行)
[root@clusterA-1 ~]# pcs booth ticket add apacheticket expire=120 acquire-after=60 timeout=5</pre>
<p>それぞれのオプションの意味は以下の通りです。</p>
<ul>
<li>timeout: Booth 間パケット送信のタイムアウト時間。</li>
<li>expire: 通信が失敗した後のチケットの有効期限。有効期限を過ぎるとチケットが取り消される (revoke)。</li>
<li>acquire-after: チケットが取り消された後、他のサイトに付与されるまでの時間。</li>
</ul>
<p>Booth の設定は /etc/booth/booth.conf ファイルに書き込まれます。<br />
現在の設定を確認するには <code>pcs booth config</code> を実行します。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs booth config
authfile = /etc/booth/booth.key
site = 192.168.101.100
site = 192.168.102.100
arbitrator = 192.168.100.100
ticket = "apacheticket"
  acquire-after = 60
  expire = 120
  timeout = 5
</pre>
<p>その他の設定オプションについては<a href="https://github.com/ClusterLabs/booth/blob/main/docs/boothd.8.txt#configuration-file" target="_blank" rel="noopener">こちら</a>を参照してください。</p>
<p>4. 現在のクラスタのすべてのノードに対して Booth 設定の同期を行います。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs booth sync
Sending booth configuration to cluster nodes...
clusterA-1: Booth config saved
clusterA-2: Booth config saved</pre>
<p>5. アービトレータノードで Booth 設定を同期します。</p>
<pre>(アービトレータノードで実行)
[root@arbitrator ~]# pcs host auth clusterA-1 -u hacluster
Password: (haclusterユーザのパスワードを入力)
clusterA-1: Authorized
</pre>
<pre>(アービトレータノードで実行)
[root@arbitrator ~]# pcs booth pull clusterA-1
Fetching booth config from node 'clusterA-1'...
Booth config saved</pre>
<p>6. サイトBで Booth 設定を同期します。</p>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs host auth clusterA-1 -u hacluster
Password: (haclusterユーザのパスワードを入力)
clusterA-1: Authorized
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs booth pull clusterA-1

[root@clusterB-1 ~]# pcs booth sync</pre>
<p>7. アービトレータノードで Booth を起動します。</p>
<p><strong>サイトAおよびサイトBでは、Booth は Pacemaker のリソースとして管理され、Pacemakerによって起動するため、各クラスタノードで Booth を手動で起動しないでください。</strong></p>
<pre>(アービトレータノードで実行)
[root@arbitrator ~]# pcs booth start
[root@arbitrator ~]# pcs booth enable</pre>
<p>8. 両サイトで Booth リソースを作成します。IPアドレスにそれぞれのクラスタの仮想IPを指定します。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs booth create ip 192.168.101.100</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs booth create ip 192.168.102.100</pre>
<p>上記コマンドを実行すると、booth-ip および booth-service を含むリソースグループ booth-booth-group が作成されます。</p>
<p>9. 両サイトで作成した検証用のリソースグループ apachegroup にチケット制約を追加します。</p>
<p>チケット制約とは、チケットがクラスタサイトに付与された場合にのみ、リソースの起動を許可する制約となります。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs constraint ticket add apacheticket apachegroup
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs constraint ticket add apacheticket apachegroup
</pre>
<p>上記チケット制約を追加すると、apachegroup のリソースが Stopped になり、チケットが付与されるまで起動しません。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs status
Cluster name: clusterA
...
Full List of Resources:
  * Resource Group: apachegroup:
    * WebSite   (ocf::heartbeat:apache):         <strong>Stopped</strong>
    * VIP       (ocf::heartbeat:IPaddr2):        <strong>Stopped</strong>
  * Resource Group: booth-booth-group:
    * booth-booth-ip    (ocf::heartbeat:IPaddr2):        Started clusterA-2
    * booth-booth-service       (ocf::pacemaker:booth-site):     Started clusterA-2
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs status
Cluster name: clusterB
...
Full List of Resources:
  * Resource Group: apachegroup:
    * WebSite   (ocf::heartbeat:apache):         <strong>Stopped</strong>
    * VIP       (ocf::heartbeat:IPaddr2):        <strong>Stopped</strong>
  * Resource Group: booth-booth-group:
    * booth-booth-ip    (ocf::heartbeat:IPaddr2):        Started clusterB-2
    * booth-booth-service       (ocf::pacemaker:booth-site):     Started clusterB-2
</pre>
<p>現在設定されているチケット制約確認するには、<code>pcs constraint ticket</code> を実行します。</p>
<p>10. 片方のサイトにチケットを付与します。</p>
<p>ここでは、サイトAを稼働系にするために、サイトAのいずれかのノードで以下のコマンドを実行し、チケットを付与します。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs booth ticket grant apacheticket

</pre>
<p>サイトAのクラスタにチケットを付与すると、サイトAのクラスタのリソースが起動します。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs status
Cluster name: clusterA
...
Node List:
  * Online: [ clusterA-1 clusterA-2 ]

Full List of Resources:
  * Resource Group: apachegroup:
    * WebSite   (ocf::heartbeat:apache):         <strong>Started clusterA-1</strong>
    * VIP       (ocf::heartbeat:IPaddr2):        <strong>Started clusterA-1</strong>
  * Resource Group: booth-booth-group:
    * booth-booth-ip    (ocf::heartbeat:IPaddr2):        Started clusterA-2
    * booth-booth-service       (ocf::pacemaker:booth-site):     Started clusterA-2
</pre>
<p>サイトBでは、チケットが付与されていないため、リソースが Stopped のままの状態となります。</p>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs status
Cluster name: clusterB
...
Node List:
  * Online: [ clusterB-1 clusterB-2 ]

Full List of Resources:
  * Resource Group: apachegroup:
    * WebSite   (ocf::heartbeat:apache):         <strong>Stopped</strong>
    * VIP       (ocf::heartbeat:IPaddr2):        <strong>Stopped</strong>
  * Resource Group: booth-booth-group:
    * booth-booth-ip    (ocf::heartbeat:IPaddr2):        Started clusterB-2
    * booth-booth-service       (ocf::pacemaker:booth-site):     Started clusterB-2
</pre>
<p>以上で、Booth の設定は完了です。</p>
<h2>Booth の基本的な使い方</h2>
<h3>Booth クラスタの状態の確認</h3>
<p>現在の稼働系サイト、チケットや Booth 間の接続詳細情報などを確認するには、<code>pcs booth status</code> を実行します。</p>
<pre>(いずれかのノードで実行)
[root@clusterA-1 ~]# pcs booth status
TICKETS:
ticket: apacheticket, leader: 192.168.101.100, expires: 2022-08-17 13:07:03

PEERS:
site         192.168.102.100, last recv: 2022-08-17 13:05:03
        Sent pkts:13 error:0 resends:0
        Recv pkts:12 error:0 authfail:0 invalid:0

arbitrator   192.168.100.100, last recv: 2022-08-17 13:05:03
        Sent pkts:13 error:0 resends:0
        Recv pkts:12 error:0 authfail:0 invalid:0
</pre>
<h3>フェイルオーバ</h3>
<p>稼働系サイトに障害が発生した場合の自動フェイルオーバを検証します。</p>
<p>稼働系サイトAのクラスタを停止します。</p>
<pre>(サイトAのいずれかのノードで実行)
[root@clusterA-1 ~]# pcs cluster stop --all</pre>
<p>しばらくすると、サイトBにチケットが付与され、リソースが起動することを確認します。</p>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs booth status
TICKETS:
<strong>ticket: apacheticket, leader: 192.168.102.100, expires: 2022-08-17 13:21:10</strong>

PEERS:
site         192.168.101.100, last recv: 2022-08-17 13:12:04
        Sent pkts:86 error:0 resends:49
        Recv pkts:26 error:0 authfail:0 invalid:0

arbitrator   192.168.100.100, last recv: 2022-08-17 13:19:09
        Sent pkts:13 error:0 resends:0
        Recv pkts:12 error:0 authfail:0 invalid:0
</pre>
<pre>(サイトBのいずれかのノードで実行)
[root@clusterB-1 ~]# pcs status
Cluster name: clusterB
...
Node List:
  * Online: [ clusterB-1 clusterB-2 ]

Full List of Resources:
  * Resource Group: apachegroup:
    * WebSite   (ocf::heartbeat:apache):         <strong>Started clusterB-1</strong>
    * VIP       (ocf::heartbeat:IPaddr2):        <strong>Started clusterB-1</strong>
  * Resource Group: booth-booth-group:
    * booth-booth-ip    (ocf::heartbeat:IPaddr2):        Started clusterB-2
    * booth-booth-service       (ocf::pacemaker:booth-site):     Started clusterB-2
</pre>
<p>サイトBに以下のようなログが出力され、チケットがサイトBに付与されていることが分かります。</p>
<pre>Aug 17 13:15:03 clusterB-2 booth: [4088]: warning: apacheticket (Fllw/0/0): lost at 192.168.101.100
Aug 17 13:15:04 clusterB-2 booth: [4088]: info: apacheticket (Fllw/1/0): starting new election (term=1)
Aug 17 13:15:09 clusterB-2 booth: [4088]: info: apacheticket (Cndi/1/0): elections finished
<strong>Aug 17 13:15:09 clusterB-2 booth: [4088]: info: apacheticket (Lead/1/119997): granted successfully here</strong>
</pre>
<p>手動でフェイルオーバさせたい場合には、稼働系でチケットの取り消し (revoke) した後、待機系に付与 (grant) するという流れになります。</p>
<p>例えば、サイトAが稼働系の場合は、まず、サイトAからチケットを取り消します。<br />
サイトの仮想IPを明示的に指定して <code>pcs booth ticket revoke/grant</code> を実行する場合は、どちらのノードでも実行可能です。</p>
<pre>(いずれかのノードで実行)
[root@clusterA-1 ~]# pcs booth ticket revoke apacheticket 192.168.101.100
</pre>
<p>次に、待機系サイトBにチケットを付与します。</p>
<pre>(いずれかのノードで実行)
[root@clusterA-1 ~]# pcs booth ticket grant apacheticket 192.168.102.100
</pre>
<p>サイトBにチケットを付与すると、サイトBが稼働系になり、リソースが起動します。</p>
<h3>マルチサイトクラスタにおける DRBD の使用</h3>
<p>マルチサイトクラスタで DRBD を使用する場合には、DRBD のデータを WAN を介して待機系サイトにレプリケーションする仕組みが必要になります。</p>
<p>DRBD Proxy を使うことで、WAN 環境のような遠距離レプリケーションを効率的に行えます。DRBD Proxy は LINBIT 社が提供している有償オプション製品であり、詳細については<a href="https://linbit.com/drbd-proxy/" target="_blank" rel="noopener">こちら</a>を参照してください。</p>
<h2>おわりに</h2>
<p>今回は、Pacemaker のアドオン機能 Booth を用いてマルチサイトクラスタの構築・設定方法や基本的な使い方について紹介しました。</p>
<p>Booth を使うことで、地理的に離れた複数の拠点にまたがる高可用性クラスタを構築できます。システムの高可用性や災害対策を検討している方に、本記事の内容がお役に立てれば幸いです。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RedisをPacemakerで冗長化する</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/redis-pacemaker/</link>
		
		<dc:creator><![CDATA[山本 博之 (Hiroyuki Yamamoto)]]></dc:creator>
		<pubDate>Thu, 01 Aug 2019 04:10:26 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[KVS]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=3233</guid>

					<description><![CDATA[本稿では、Pacemaker/Corosyncを使用してRedisのクラスタを構成する方法をご紹介します。 RedisはSentinelでマスター・スレーブ構成の管理を行うことができますが、最低3個のSentinelが必 ...]]></description>
										<content:encoded><![CDATA[<p>本稿では、Pacemaker/Corosyncを使用してRedisのクラスタを構成する方法をご紹介します。<br />
RedisはSentinelでマスター・スレーブ構成の管理を行うことができますが、最低3個のSentinelが必要になります。また、仮想IPについては自前でスクリプトを作成するなどの工夫が必要になります。</p>
<p><span id="more-3233"></span></p>
<p>2ノードで完結させたい場合や、その他のリソースもあわせて管理したい場合はPacemaker/Corosyncを使用するのが便利です。Pacemakerには標準でRedisのリソースエージェントが含まれているため、比較的容易にRedisのクラスタを構築することができます。</p>
<h3>前提</h3>
<p>以下の環境を前提とします。今回はOS標準のPacemakerを使用します。</p>
<ul>
<li>OS: CentOS 7.4</li>
<li>パッケージ:
<ul>
<li>redis-5.0.5-1.el7.remi</li>
<li>pacemaker-1.1.19-8.el7_6.4</li>
<li>corosync-2.4.3-4.el7</li>
</ul>
</li>
</ul>
<table>
<tbody>
<tr>
<th>ホスト名</th>
<th>IPアドレス</th>
</tr>
<tr>
<td>server1</td>
<td>192.168.237.101</td>
</tr>
<tr>
<td>server2</td>
<td>192.168.237.102</td>
</tr>
<tr>
<td>(VIP)</td>
<td>192.168.237.150</td>
</tr>
</tbody>
</table>
<p>RedisとPacemakerのクラスタ構成は以下のようになります。</p>
<figure id="attachment_3277" aria-describedby="caption-attachment-3277" style="width: 600px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="wp-image-3277" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2019/07/redis-pacemaker.png" alt="" width="600" height="400" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2019/07/redis-pacemaker.png 837w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2019/07/redis-pacemaker-300x200.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2019/07/redis-pacemaker-768x512.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2019/07/redis-pacemaker-304x203.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2019/07/redis-pacemaker-282x188.png 282w" sizes="auto, (max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-3277" class="wp-caption-text">RedisとPacemakerの構成</figcaption></figure>
<h3>Pacemakerのインストールと初期設定</h3>
<p>両方のノードに必要なパッケージをインストールします。なお、Redisのインストールおよびマスター・スレーブレプリケーションの設定は完了しているものとします。</p>
<pre># yum install corosync pacemaker pcs fence-agents-all</pre>
<p>クラスタを新規作成します。</p>
<pre>server1# pcs cluster auth server1 server2 -u hacluster -p (haclusterユーザのパスワード) --force
server1# pcs cluster setup --name cluster1 server1 server2</pre>
<p>corosync.conf の quorum の設定に以下を追加します。これは2ノードクラスタで片方のノード単独で起動できるようにするために必要です(理由は後述します)。</p>
<pre>quorum {
    provider: corosync_votequorum
    two_node: 1
    wait_for_all: 0  ★追加
}</pre>
<p>クラスタを起動します。</p>
<pre>server1# pcs cluster start --all

server1# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: server1 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Mon Jul  1 16:57:00 2019
Last change: Mon Jul  1 16:56:58 2019 by root via cibadmin on server1

2 nodes configured
0 resources configured

Online: [ server1 server2 ]

No resources


Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled</pre>
<p>今回は動作確認のためSTONITHを無効化し、1回の障害検知でフェイルオーバーするように設定します。</p>
<pre># pcs property set stonith-enabled=false
# pcs resource defaults resource-stickiness=INFINITY migration-threshold=1</pre>
<h3>Pacemakerリソースの作成</h3>
<p>仮想IPリソースを作成します。</p>
<pre># pcs resource create VIP ocf:heartbeat:IPaddr2 
  ip=192.168.237.150 cidr_netmask=24 nic=eth1 
  op monitor interval=10s</pre>
<p>Redisのマスター・スレーブリソースを作成します。Pacemakerのマスター・スレーブリソースは、複数のノードに複製され、主従関係をもつリソースです。リソースエージェントは resource-agents パッケージに含まれる ocf:heartbeat:redis を使用します。以下の例では、redisリソースおよびそのマスター・スレーブリソースを一度に作成しています。マスター・スレーブリソースはデフォルトで「&lt;リソースID&gt;-master」(redis-master)という名前が付きます。</p>
<pre># pcs resource create redis ocf:heartbeat:redis 
  op start timeout=300s 
  op monitor interval=5s 
  op monitor interval=3s role=Master 
  master</pre>
<p>VIPリソースとRedisのマスター・スレーブリソースのマスター側を colocation 制約で同じサーバに結び付けます。</p>
<pre># pcs constraint colocation add VIP with master redis-master score=INFINITY
</pre>
<p>この時点でリソースは起動しますが、一度両ノードのPacemakerを停止します。設定中にリソースを起動させたくない場合は先に両ノードをスタンバイモード(pcs node standby/unstandby)にしておいてもよいです。</p>
<pre>server2# systemctl stop pacemaker
server1# systemctl stop pacemaker</pre>
<h3>クラスタの起動</h3>
<p>Masterにしたいノード(server1)でPacemakerを起動します。</p>
<pre>server1# systemctl start pacemaker
server1# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: server1 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Fri Jul 19 14:20:49 2019
Last change: Fri Jul 19 14:15:52 2019 by root via crm_attribute on server2

2 nodes configured
3 resources configured

Online: [ server1 ]
OFFLINE: [ server2 ]

Full list of resources:

 VIP    (ocf::heartbeat:IPaddr2):       <strong>Started server1</strong>
 Master/Slave Set: redis-master [redis]
     <strong>Masters: [ server1 ]</strong>
     Stopped: [ server2 ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled</pre>
<p>server1ですべてのリソースの起動が完了したことを確認したら、server2のPacemakerを起動します。</p>
<pre>server2# systemctl start pacemaker</pre>
<p>しばらく待ち、リソースの起動が正常に完了すると以下のようになります。</p>
<pre># pcs status
Cluster name: cluster1
Stack: corosync
Current DC: server1 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Fri Jul 19 14:24:24 2019
Last change: Fri Jul 19 14:15:52 2019 by root via crm_attribute on server2

2 nodes configured
3 resources configured

Online: [ server1 server2 ]

Full list of resources:

 VIP    (ocf::heartbeat:IPaddr2):       <strong>Started server1</strong>
 Master/Slave Set: redis-master [redis]
     <strong>Masters: [ server1 ]</strong>
     <strong>Slaves: [ server2 ]</strong>

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

# pcs constraint
Location Constraints:
Ordering Constraints:
Colocation Constraints:
  VIP with redis-master (score:INFINITY) (rsc-role:Started) (with-rsc-role:Master)
Ticket Constraints:</pre>
<p>Redisのレプリケーションが正常に行われていることを確認します。</p>
<pre>server1# redis-cli info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.237.102,port=6379,state=online,offset=1372,lag=0

server2# redis-cli info replication
# Replication
role:slave
master_host:server1
master_port:6379
master_link_status:up</pre>
<p>また、MasterノードにVIPが割り振られていることを確認します。</p>
<pre>server1# ip -4 addr show dev eth1
3: eth1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.237.101/24 brd 192.168.237.255 scope global eth1
       valid_lft forever preferred_lft forever
    <strong>inet 192.168.237.150/24 brd 192.168.237.255 scope global secondary eth1</strong>
       valid_lft forever preferred_lft forever

server2# ip -4 addr show dev eth1
3: eth1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.237.102/24 brd 192.168.237.255 scope global eth1
       valid_lft forever preferred_lft forever</pre>
<h3>フェイルオーバー</h3>
<p>RedisのMasterプロセスに障害を発生させ、server2がMasterになることを確認します。</p>
<pre>server1# killall redis-server
server1# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: server1 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Fri Jul 19 15:34:23 2019
Last change: Fri Jul 19 15:33:18 2019 by root via crm_attribute on server2

2 nodes configured
3 resources configured

Online: [ server1 server2 ]

Full list of resources:

 VIP    (ocf::heartbeat:IPaddr2):       <strong>Started server2</strong>
 Master/Slave Set: redis-master [redis]
     <strong>Masters: [ server2 ]</strong>
     Stopped: [ server1 ]

Failed Actions:
* redis_demote_0 on server1 'not running' (7): call=49, status=complete, exitreason='',
    last-rc-change='Fri Jul 19 15:33:18 2019', queued=0ms, exec=85ms


Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled</pre>
<p>redis リソースをクリーンアップし、server1がSlaveとして復旧することを確認します。</p>
<pre>server1# pcs resource cleanup redis
Cleaned up redis:0 on server2
Cleaned up redis:0 on server1
Cleaned up redis:1 on server2
Cleaned up redis:1 on server1
Waiting for 1 replies from the CRMd. OK

# pcs status resources
 VIP    (ocf::heartbeat:IPaddr2):       Started server2
 Master/Slave Set: redis-master [redis]
     Masters: [ server2 ]
     Slaves: [ server1 ]</pre>
<h3>リソース起動時の注意点</h3>
<p>Pacemaker/Corosyncの2ノードクラスタのデフォルトでは、両ノードのPacemakerが起動した時点でリソースを起動します。この場合、RedisのMasterとSlaveはほぼ同時に起動し、Masterの準備が完了していない状態でSlaveが接続しようとするため、レプリケーションの開始に失敗する場合があります。これを防ぐため、上記手順ではCorosyncの設定を変更し、Masterの起動を待ってからSlaveを起動するようにしています。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DRBD9 と Pacemaker の構成</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/drbd9-pacemaker/</link>
		
		<dc:creator><![CDATA[山本 博之 (Hiroyuki Yamamoto)]]></dc:creator>
		<pubDate>Wed, 05 Dec 2018 07:20:03 +0000</pubDate>
				<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=677</guid>

					<description><![CDATA[本記事では、Linuxの分散ストレージシステムであるDRBDの最新版であるDRBD9とPacemakerを組み合わせた構成について、基本的な構成でのインストール手順およびDRBD8の場合との違いなどについて解説していきま ...]]></description>
										<content:encoded><![CDATA[<p>本記事では、Linuxの分散ストレージシステムであるDRBDの最新版であるDRBD9とPacemakerを組み合わせた構成について、基本的な構成でのインストール手順およびDRBD8の場合との違いなどについて解説していきます。</p>
<h2>1. DRBD9について</h2>
<p>DRBDは複数台のLinuxサーバで、ネットワーク経由で共有ストレージを構築するためのシステムです。</p>
<p>DRBD9はDRBD8.xから以下のような機能が強化されています。</p>
<ul>
<li>自動プロモーション機能によりマウント時に自動でプライマリへの昇格・セカンダリへの降格が行えるようになった</li>
<li>drbdmanage コマンドによりノードやボリュームの追加・削除が簡単に行えるようになった</li>
<li>1階層で最大31ノードまでの多ノード構成が可能(DRBD8まではスタック構成のみ可)</li>
</ul>
<p>特に、自動プロモーション機能によりPacemakerでクラスタを組む場合に大幅に設定を簡略化できるようになりました。</p>
<p><span id="more-677"></span></p>
<h2>2. 構成</h2>
<p>本記事では以下のサーバ構成を想定します。</p>
<table>
<tbody>
<tr>
<th>ホスト名</th>
<th>IPアドレス</th>
<th>デバイス</th>
<th>サイズ</th>
</tr>
<tr>
<td>server1</td>
<td>192.168.1.11</td>
<td>/dev/sdb</td>
<td>5GB</td>
</tr>
<tr>
<td>server2</td>
<td>192.168.1.12</td>
<td>/dev/sdb</td>
<td>5GB</td>
</tr>
<tr>
<td>仮想IP</td>
<td>192.168.1.101</td>
</tr>
</tbody>
</table>
<h2>3. パッケージのインストール</h2>
<p>本記事ではELRepoリポジトリ(http://elrepo.org)のrpmパッケージをインストールします。/</p>
<p>両ノードにDRBD9をインストールします。</p>
<pre># rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum install kmod-drbd90 drbd90-utils</pre>
<h2>4. 設定ファイルの作成</h2>
<p>drbdmanage を使用せず自分でDRBDのリソースを管理する場合はリソースの設定ファイルを作成します。</p>
<p>/etc/drbd.d/drbd0.res として設定ファイルを作成します。</p>
<pre>resource drbd0 {
        protocol C;

        disk /dev/sdb1;
        device /dev/drbd0;
        meta-disk internal;
        on server1 {
                address 192.168.1.11:7789;
        }
        on server2 {
                address 192.168.1.12:7789;
        }
}</pre>
<p>/etc/drbd.d/global_common.conf に以下の設定を追加します。自動プロモーションはデフォルトで有効のため、「auto-promote yes;」は追加しなくてもOKです。</p>
<pre>global {
        <strong>usage-count no;</strong>
        ...
}

common {
        ...
        options {
                <strong>auto-promote yes;</strong>
        }
        ...
}</pre>
<h2>5. DRBDデバイスの作成</h2>
<p>両ノードのディスクsdbにsdb1パーティションを作成し、先頭を0初期化します。<br />
<strong>※対象のディスクのデータはすべて削除されるので注意!</strong></p>
<pre># cfdisk /dev/sdb
# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1</pre>
<p>両ノードでメタデータを作成します。</p>
<pre># drbdadm create-md drbd0</pre>
<p>リソースを有効化します。</p>
<pre>[root@server1 ~]# drbdadm up drbd0
[root@server1 ~]# drbdadm status drbd0
drbd0 role:Secondary
  disk:Inconsistent
  server2 connection:Connecting

[root@server2 ~]# drbdadm up drbd0
[root@server2 ~]# drbdadm status drbd0
drbd0 role:Secondary
  disk:Inconsistent
  server1 role:Secondary
    peer-disk:Inconsistent

[root@server1 ~]# drbdadm status drbd0
drbd0 role:Secondary
  disk:Inconsistent
  server2 role:Secondary
    peer-disk:Inconsistent</pre>
<p>この時点ではまだデバイスの同期が行われていないため、「Inconsistent」状態になります。</p>
<h2>6. デバイスの初期同期</h2>
<p>server1を同期元として指定し、同期を開始します。</p>
<pre>[root@server1 ~]# drbdadm primary --force drbd0</pre>
<p>同期が完了した場合、両方のディスクが「UpToDate」になります。</p>
<pre>[root@server1 ~]# drbdadm status drbd0
drbd0 role:<strong>Primary</strong>
  disk:<strong>UpToDate</strong>
  server2 role:Secondary
    peer-disk:<strong>UpToDate</strong>

[root@server2 ~]# drbdadm status drbd0
drbd0 role:Secondary
  disk:<strong>UpToDate</strong>
  server1 role:Primary
    peer-disk:<strong>UpToDate</strong></pre>
<p>なお、 DRBD 8.xでは cat /proc/drbd でもステータスを確認できましたが、DRBD9では利用できませんのでご注意ください。</p>
<h2>7. ファイルシステムの作成</h2>
<p>現在プライマリとなっているノードでDRBDデバイス上にファイルシステムを作成します。</p>
<pre>[root@server1 ~]# mkfs.ext4 /dev/drbd0
...

[root@server1 ~]# mkdir /mnt/drbd
[root@server1 ~]# mount /dev/drbd0 /mnt/drbd
[root@server1 ~]# df /mnt/drbd
ファイルシス   1K-ブロック  使用   使用可 使用% マウント位置
/dev/drbd0         5029276 20472  4730288    1% /mnt/drbd</pre>
<p>テストファイルを作成し、プライマリを移動して複製されていることを確認します。</p>
<pre>[root@server1 ~]# echo test &gt; /mnt/drbd/test.txt
[root@server1 ~]# umount /dev/drbd0
[root@server1 ~]# drbdadm secondary drbd0

[root@server2 ~]# drbdadm primary drbd0
[root@server2 ~]# mount /dev/drbd0 /mnt/drbd
[root@server2 ~]# ls /mnt/drbd
lost+found test.txt
[root@server2 ~]# cat /mnt/drbd/test.txt
test
[root@server2 ~]# umount /dev/drbd0
[root@server2 ~]# drbdadm secondary drbd0</pre>
<h2>8. DRBDの自動起動設定</h2>
<p>OS起動時にDRBDが起動するように設定します。</p>
<pre>[root@server1 ~]# systemctl enable drbd
Created symlink from /etc/systemd/system/multi-user.target.wants/drbd.service to /usr/lib/systemd/system/drbd.service.
[root@server2 ~]# systemctl enable drbd
Created symlink from /etc/systemd/system/multi-user.target.wants/drbd.service to /usr/lib/systemd/system/drbd.service.</pre>
<p>両ノードのOSを再起動し、DRBDが両方Secondary状態で起動することを確認します。</p>
<h2>9. 自動プロモーション</h2>
<p>自動プロモーションが有効になっているので、mount操作を実行すると自動的にPrimaryに昇格され、<br />
umountで自動的にSecondaryに降格されます。</p>
<pre>[root@server1 ~]# drbdadm status drbd0
drbd0 role:Secondary
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate
[root@server1 ~]# mount /dev/drbd0 /mnt/drbd
[root@server1 ~]# drbdadm status drbd0
drbd0 role:<strong>Primary</strong>
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate</pre>
<p>なお、既にPrimaryになっているノードがある状態でmount実行しようとすると以下のように失敗します。</p>
<pre>drbd drbd0: Auto-promote failed: Multiple primaries not allowed by config</pre>
<p>また、注意点として、一度 drbdadmコマンドで手動でPrimary/Secondaryを切り替えると、自動プロモーションは無効になります。再度有効にするにはDRBDを再起動する必要があります。</p>
<h2>10. Pacemaker/Corosyncの設定</h2>
<p>Pacemaker/CorosyncでDRBDデバイス上のファイルシステムを管理する設定を行います。</p>
<p>DRBDリソースの昇格・降格はDRBDの自動プロモーションにより制御されるため、従来のようにPacemakerでMaster/Slaveリソースを作成する必要がなくなり、設定を大幅に簡略化できます。また、DRBDの管理をDRBD自体に任せることにより、DRBDのスプリットブレインが発生しにくくなるメリットもあります。</p>
<p>ここではFilesystemリソースとIPaddr2(仮想IP)リソースをグループ化して管理します。なお、Pacemaker/Corosyncのインストール自体は完了しているものとします。</p>
<pre># pcs resource create VIP ocf:heartbeat:IPaddr2 
    ip=192.168.1.101 cidr_netmask=24 op monitor interval=10s
# pcs resource create FS ocf:heartbeat:Filesystem 
    device=/dev/drbd0 directory=/mnt/drbd fstype=ext4 
    op start timeout=60s on-fail=restart 
    op stop timeout=60s on-fail=block 
    op monitor interval=10s timeout=60s on-fail=restart
# pcs resource group add Group-FS FS VIP</pre>
<p>ファイルシステムリソースが仮想IPリソースと同じノードで起動し、DRBDリソースがPrimaryとなり実際にマウントされていることを確認します。</p>
<pre># pcs status
  ...
  Resource Group: Group-FS
      FS (ocf::heartbeat:Filesystem):    Started <strong>server1</strong>
      VIP        (ocf::heartbeat:IPaddr2):       Started <strong>server1</strong>

[root@server1 ~]# drbdadm status
drbd0 role:Primary
  disk:UpToDate
  server2 role:Secondary
    peer-disk:UpToDate

[root@server1 ~]# df /mnt/drbd
ファイルシス   1K-ブロック  使用  使用可 使用% マウント位置
/dev/drbd0         5029276 37916 4712844    1% /mnt/drbd</pre>
<p>server1をスタンバイモードにしてserver2にスイッチオーバーすることを確認します。</p>
<pre>[root@server1 ~]# pcs cluster standby server1
[root@server1 ~]# pcs status
...
Node server1: standby
Online: [ server2 ]

Full list of resources:

 Resource Group: Group-FS
     FS (ocf::heartbeat:Filesystem):    Started <strong>server2</strong>
     VIP        (ocf::heartbeat:IPaddr2):       Started <strong>server2</strong>

[root@server2 ~]# drbdadm status
drbd0 role:Primary
  disk:UpToDate
  server1 role:Secondary
    peer-disk:UpToDate

[root@server2 ~]# df /mnt/drbd
ファイルシス   1K-ブロック  使用  使用可 使用% マウント位置
/dev/drbd0         5029276 37916 4712844    1% /mnt/drbd</pre>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pacemakerクラスタのアップデート方法</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/pacemaker-cluster-update/</link>
		
		<dc:creator><![CDATA[山本 博之 (Hiroyuki Yamamoto)]]></dc:creator>
		<pubDate>Mon, 23 Jul 2018 05:20:16 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[OSS]]></category>
		<category><![CDATA[アップデート]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=112</guid>

					<description><![CDATA[Pacemakerで構築したクラスタシステムの運用を続けていると、Pacemakerで冗長化しているソフトウェアや、Pacemaker自体を新しいバージョンにアップデートする必要が生じる場合があります。主な理由としては以 ...]]></description>
										<content:encoded><![CDATA[<p>Pacemakerで構築したクラスタシステムの運用を続けていると、Pacemakerで冗長化しているソフトウェアや、Pacemaker自体を新しいバージョンにアップデートする必要が生じる場合があります。主な理由としては以下が挙げられます。</p>
<ul>
<li>脆弱性の修正</li>
<li>重要な不具合の修正</li>
<li>サポート期間の終了</li>
</ul>
<p>単体で動作しているソフトウェアの場合は、「サービス停止→パッケージ更新→サービス起動」のように比較的簡単な方法でアップデートが可能ですが、クラスタを組んでいる場合は、事前にいくつかの方法を検討した上で計画的に実施する必要があります。</p>
<p><span id="more-112"></span></p>
<h2>クラスタ全体を停止してまとめてアップデートする方法</h2>
<p>この方法は最も確実ですが、クラスタを停止している間はサービスが利用できません。<br />
ある程度のサービス停止が許容できる場合はこの方法を選択してもよいでしょう。<br />
また、メジャーバージョンアップ等でデータや設定の互換性がなくなる場合もこの方法をとることになります。</p>
<h2>ローリングアップデートについて</h2>
<p>ローリングアップデートとは、サービスを継続しながら各サーバを順次アップデートしていく方法です。</p>
<figure id="attachment_120" aria-describedby="caption-attachment-120" style="width: 400px" class="wp-caption alignright"><img loading="lazy" decoding="async" class="wp-image-120" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/06/rolling-update1-886x1024.png" alt="" width="400" height="462" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/06/rolling-update1-886x1024.png 886w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/06/rolling-update1-260x300.png 260w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/06/rolling-update1-768x888.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/06/rolling-update1-185x214.png 185w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/06/rolling-update1-225x260.png 225w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/06/rolling-update1.png 899w" sizes="auto, (max-width: 400px) 100vw, 400px" /><figcaption id="caption-attachment-120" class="wp-caption-text">ローリングアップデートのイメージ</figcaption></figure>
<p>まずスタンバイサーバに対してアップデートを実施し、スタンバイサーバをプライマリサーバに切り替え、旧プライマリサーバ(現スタンバイサーバ)に対してアップデートを実施します。</p>
<p>この方法の場合、アップデート前後でソフトウェアの互換性が保たれていることが前提となります。<br />
メジャーバージョンアップ等でデータや設定に互換性がなくなる場合は、この方法をとることが困難となります。</p>
<p>以下、具体的にローリングアップデートを行う手順をみていきます。</p>
<p>なお、前提とする環境はRHEL7.xおよびLinux-HA Japan提供のPacemaker/Corosyncとなります。</p>
<h2>リソースとして管理されているサービスのアップデート</h2>
<p>Pacemaker配下のリソースとして管理されているサービス(例: Apache, PostgreSQL)をアップデートする場合は、メンテナンスモードを使用することが一般的です。メンテナンスモードを有効にすると、リソースはunmanaged状態となり、リソースの起動・停止・監視が行われなくなります。<br />
メンテナンスモード状態で各サービスのアップデートを行い、作業が完了したらメンテナンスモードを解除します。</p>
<h3>クラスタ全体をメンテナンスモードにする場合</h3>
<p>1. クラスタ全体をメンテナンスモードにします。</p>
<pre>(crm)# crm configure property maintenance-mode=true
(pcs)# pcs property set maintenance-mode=true</pre>
<p>crm_mon -rfA1もしくはpcs statusで状態を確認すると、両ノードのリソースは以下のように (unmanaged) と表示されます。</p>
<pre>Clone Set: ping-clone [ping] (unmanaged)
 ping (ocf::pacemaker:ping): Started server2 (unmanaged)
 ping (ocf::pacemaker:ping): Started server1 (unmanaged)</pre>
<p>2. 両ノードで各ソフトウェアのメンテナンスやアップデートなどの作業を行います。このときプライマリ側でサービスを停止してもフェイルオーバーは発生しません。</p>
<p>3. メンテナンスモードを解除します。</p>
<pre>(crm)# crm configure property maintenance-mode=false
(pcs)# pcs property set maintenance-mode=false</pre>
<p>注: メンテナンスモードを解除するとき、各リソースの状態はメンテナンスモードに入る前と同一の状態になっている必要があります。状態が異なる場合は予期せぬフェイルオーバーなどが発生する場合があります。</p>
<h3>ノード単位でメンテナンスモードにする場合</h3>
<p>1. スタンバイノード(メンテナンス対象ノード)で以下を実行します。デフォルトはコマンドを実行したノードが対象となるため、ノード名は省略できます。</p>
<pre>(crm)# crm node maintenance &lt;スタンバイノード名&gt;
(pcs)# pcs node maintenance &lt;スタンバイノード名&gt;</pre>
<p>crm_mon -rfA1もしくはpcs statusで状態を確認すると、メンテナンスモード中のノードのリソースは以下のように (unmanaged) と表示されます。</p>
<pre>Clone Set: ping-clone [ping]
 ping (ocf::pacemaker:ping): Started server2 (unmanaged)
 Started: [ server1 ]

Node Attributes:
 * Node server1:
 + pingd : 100
 * Node server2:
 + maintenance : on
 + pingd : 100</pre>
<p>2. メンテナンス対象ノードで各ソフトウェアのメンテナンスやアップデートなどの作業を行います。</p>
<p>3. メンテナンスモードを解除します。</p>
<pre>(crm)# crm node ready &lt;スタンバイノード名&gt;
(pcs)# pcs node unmaintenance &lt;スタンバイノード名&gt;</pre>
<p>4. リソースをプライマリノードからスタンバイノードへフェイルオーバーします。<br />
以下はプライマリノードを一度standbyモードにしてリソースをフェイルオーバーさせています。</p>
<pre>(crm)# crm node standby &lt;プライマリノード名&gt;
(crm)# crm node online &lt;プライマリノード名&gt;
(pcs)# pcs cluster standby &lt;プライマリノード名&gt;
(pcs)# pcs cluster unstandby &lt;プライマリノード名&gt;</pre>
<p>5. 現スタンバイ(旧プライマリ)ノードで同様に1.～3.のメンテナンス作業を実施します。</p>
<p>6. 必要に応じてリソースのフェイルバックを行います。</p>
<h3>スタンバイモードを利用する場合</h3>
<p>メンテナンスモードの代わりにスタンバイモードを使用し、ノードのリソースを停止させた状態でアップデートを実施してもよいです。サービスの起動を Pacemaker に任せるため、こちらのほうが比較的確実かもしれません。</p>
<p>1. スタンバイノード(メンテナンス対象ノード)で以下を実行し、スタンバイモードに移行します。</p>
<pre>(crm)# crm node standby &lt;スタンバイノード名&gt;
(pcs)# pcs cluster standby &lt;スタンバイノード名&gt;</pre>
<p>2. メンテナンス対象ノードで各ソフトウェアのメンテナンスやアップデートなどの作業を行います。</p>
<p>3. スタンバイモードを解除します。</p>
<pre>(crm)# crm node online &lt;スタンバイノード名&gt;
(pcs)# pcs cluster unstandby &lt;スタンバイノード名&gt;</pre>
<p>4. プライマリノードで1.を実行し、スタンバイモードに移行します。このときリソースはスタンバイノードへフェイルオーバーします。</p>
<p>5. 現スタンバイ(旧プライマリ)ノードで同様に2.～3.のメンテナンス作業を実施します。</p>
<p>6. 必要に応じてリソースのフェイルバックを行います。</p>
<h2>Pacemaker/Corosyncのアップデート</h2>
<p>Pacemaker/Corosyncのアップデートを行う場合は、各ノードでPacemaker/Corosyncを一時的に停止する必要があります。</p>
<p>1. スタンバイサーバの Pacemaker を停止します。</p>
<pre># systemctl stop pacemaker</pre>
<p>2. スタンバイサーバの Pacemaker/Corosync のアップデートを実施します。</p>
<pre># yum update ...</pre>
<p>3. スタンバイサーバの Pacemaker を起動します。</p>
<pre># systemctl start pacemaker</pre>
<p>4. クラスタの状態が正常であることを確認したら、リソースをプライマリノードからスタンバイノードへフェイルオーバーします。<br />
以下はプライマリノードを一度standbyモードにしてリソースをフェイルオーバーさせています。</p>
<pre>(crm)# crm node standby &lt;プライマリノード名&gt;
(crm)# crm node online &lt;プライマリノード名&gt;
(pcs)# pcs cluster standby &lt;プライマリノード名&gt;
(pcs)# pcs cluster unstandby &lt;プライマリノード名&gt;</pre>
<p>5. 現スタンバイ(旧プライマリ)ノードで同様に1.～3.のメンテナンス作業を実施します。</p>
<p>6. 必要に応じてリソースのフェイルバックを行います。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pacemaker/Corosync の設定値について</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/pacemaker-config-values/</link>
		
		<dc:creator><![CDATA[山本 博之 (Hiroyuki Yamamoto)]]></dc:creator>
		<pubDate>Tue, 17 Jul 2018 05:00:37 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=92</guid>

					<description><![CDATA[Pacemaker/Corosync には多数の設定項目があります。その中の必須項目以外はデフォルト値が適用されますが、そのデフォルト値は動作環境や要件によっては、必ずしも適切でないことも多いです。本記事では主な設定項目 ...]]></description>
										<content:encoded><![CDATA[<p>Pacemaker/Corosync には多数の設定項目があります。その中の必須項目以外はデフォルト値が適用されますが、そのデフォルト値は動作環境や要件によっては、必ずしも適切でないことも多いです。本記事では主な設定項目のデフォルト値や、注意点などについて説明します。</p>
<h2>Pacemakerの設定のデフォルト値について</h2>
<p>Pacemakerの設定には主に以下の種類があります。</p>
<ul>
<li>クラスタのプロパティ</li>
<li>リソースのパラメータ</li>
<li>制約のパラメータ</li>
</ul>
<p><span id="more-92"></span></p>
<p>各種設定のデフォルト値は以下のドキュメントに記載されています。</p>
<ul>
<li><a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/high_availability_add-on_reference/index">High Availability Add-On リファレンス</a></li>
<li><a href="https://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/1.1/html/Pacemaker_Explained/index.html">ClusterLabs Pacemaker 1.1 Configuration Explained</a></li>
</ul>
<p>以下、主に検討が必要な設定項目について説明します。</p>
<h3>クラスタのプロパティ</h3>
<ul>
<li><strong>no-quorum-policy:</strong> クラスタがquorumを持っていないときの動作を定義します。デフォルトはstop(全リソース停止)です。<br />
2台構成の場合は、片方が停止しても動作を続行できるよう、ignore(全リソースはそのまま動作を続行)を指定します。</li>
<li><strong>stonith-enabled:</strong> フェンシング(STONITH)を有効にするかどうかを指定します。デフォルトはtrue(有効)です。<br />
これが有効、かつSTONITHリソースが未設定の場合リソースが起動できません。</li>
<li><strong>cluster-recheck-interval:</strong> クラスタのチェック間隔を指定します。デフォルトは15分です。<br />
failure-timeout(failcountを自動クリアするまでの時間)など、時間ベースの動作が反映されるまでの時間に影響します。</li>
</ul>
<p>クラスタの設定のデフォルト値についてはRed Hat社の以下のページも参照ください。</p>
<ul>
<li><a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/high_availability_add-on_reference/index#tb-clusterprops-HAAR">High Availability Add-On リファレンス &#8211; 12.1. クラスタープロパティとオプションの要約</a></li>
</ul>
<h3>リソースのパラメータ</h3>
<p>リソースのパラメータには共通のものと、特定のリソース固有のものがあります。<br />
共通のものについてはクラスタにおけるデフォルト値を設定することができます。</p>
<ul>
<li><strong>migration-threshold:</strong> リソースをフェイルオーバーするまでの障害の発生回数(failcount)を指定します。デフォルトはINFINITY(無効)です。<br />
failcountがこの値に達するまでPacemakerはリソースの再起動により復旧を試みます。</li>
<li><strong>failure-timeout:</strong> 障害検知によりfailcountがカウントされた後、一定時間障害が発生しなかった場合にfailcount自動でクリアします。デフォルトは0(無効)です。<br />
この値を短くしても、実際に条件を満たしたかどうかがチェックされるのはcluster-recheck-interval(デフォルト:15分)の間隔となるため、failcountの自動クリアを早くしたい場合は両方の値を調整する必要があります。</li>
</ul>
<p>リソース固有のパラメータについては、以下のコマンドで確認することができます。</p>
<pre>(crm) crm ra info &lt;リソース名&gt;
(pcs) pcs resource describe &lt;リソース名&gt;

(ocf:pacemaker:pingリソースの場合の例)

# crm ra info ping
node connectivity (ocf:pacemaker:ping)

Every time the monitor action is run, this resource agent records (in the CIB) the current number of nodes the host can
 connect to using the system fping (preferred) or ping tool.

Parameters (*: required, []: default):

pidfile (string, [/var/run/ping-ping]):
    PID file

dampen (integer, [5s]): Dampening interval
    The time to wait (dampening) further changes occur
...
Operations' defaults (advisory minimum):

    start timeout=60
    stop timeout=20
    monitor timeout=60 interval=10

# pcs resource describe ping
Assumed agent name 'ocf:pacemaker:ping' (deduced from 'ping')
ocf:pacemaker:ping - node connectivity

Every time the monitor action is run, this resource agent records (in the CIB) the current number of nodes the host can
 connect to using the system fping (preferred) or ping tool.

Resource options:
  pidfile: PID file
  dampen: The time to wait (dampening) further changes occur
  name: The name of the attributes to set. This is the name to be used in the constraints.
  multiplier: The number by which to multiply the number of connected ping nodes by
  host_list (required): A space separated list of ping nodes to count.
...

Default operations:
  start: interval=0s timeout=60
  stop: interval=0s timeout=20
  monitor: interval=10 timeout=60
</pre>
<p>リソースの設定のデフォルト値についてはRed Hat社の以下のページも参照ください。</p>
<p><a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/high_availability_add-on_reference/index#tb-resource-options-HAAR">High Availability Add-On リファレンス &#8211; 6.4. リソースのメタオプション</a></p>
<h2>Corosyncの設定のデフォルト値について</h2>
<p>Corosyncの設定のデフォルト値はman corosync.confで表示されるマニュアルページにに記載されています。</p>
<h3>totem {}</h3>
<p>クラスタ間の通信方法などを定義します。</p>
<ul>
<li><strong>transport:</strong> クラスタ間の通信プロトコル。デフォルトはudp(UDPマルチキャスト通信)です。udpuにするとUDPユニキャスト通信となります。</li>
<li><strong>token:</strong> Corosync間の通信のタイムアウト値を指定します。デフォルトは1000ミリ秒(1秒)です。<br />
デフォルト値は多くの場合短すぎるため、要件に応じて10000ミリ秒(10秒)程度に長くすることを検討してください。</li>
</ul>
<pre>totem {
    version: 2
    crypto_cipher: none
    crypto_hash: none
    cluster_name: cluster1
    transport: udpu
    token: 10000
}</pre>
<h3>quorum {}</h3>
<ul>
<li><strong>two_node:</strong> 2ノードクラスタの場合1を指定する必要があります。デフォルトは無効です。</li>
</ul>
<pre>quorum {
    provider: corosync_votequorum
    two_node: 1
}</pre>
<h2>設定値の単位について</h2>
<p>Pacemakerの場合、監視間隔やタイムアウトなどの時間の指定は「10s」「1m」「10000ms」などの単位が指定できます。単位を指定しない場合は秒数として扱われます。以下の単位が使用できます。</p>
<table>
<tbody>
<tr>
<td>s, sec</td>
<td>秒(接尾辞なしと同じ)</td>
</tr>
<tr>
<td>ms, msec</td>
<td>ミリ秒</td>
</tr>
<tr>
<td>us, usec</td>
<td>マイクロ秒</td>
</tr>
<tr>
<td>m, min</td>
<td>分</td>
</tr>
<tr>
<td>h, hr</td>
<td>時</td>
</tr>
</tbody>
</table>
<p>(複数の単位を使用した例)</p>
<pre>crm configure primitive ping ocf:pacemaker:ping 
  params host_list="x.x.x.x" 
  op start interval="0s" timeout="1m" on-fail="restart" 
  op monitor interval="10000ms" timeout="60s" on-fail="restart" 
  op stop interval="0" timeout="60" on-fail="fence"

pcs resource create ping ocf:pacemaker:ping 
  host_list="x.x.x.x" 
  op start interval="0s" timeout="1m" on-fail="restart" 
  op monitor interval="10000ms" timeout="60s" on-fail="restart" 
  op stop interval="0" timeout="60" on-fail="fence"
</pre>
<p>Corosyncの場合、tokenなどの時間はミリ秒単位で指定します。単位は指定できません。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RHEL HA Add-on / Linux-HA Japan版Pacemakerの比較</title>
		<link>https://www.sraoss.co.jp/tech-blog/pacemaker/rhel-ha-add-on-linux-ha-japan-pacemaker-compare/</link>
		
		<dc:creator><![CDATA[山本 博之 (Hiroyuki Yamamoto)]]></dc:creator>
		<pubDate>Tue, 03 Jul 2018 00:50:06 +0000</pubDate>
				<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[OSS]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=77</guid>

					<description><![CDATA[Pacemaker/Corosyncはオープンソースソフトウェア(OSS)のメジャーなHAクラスタソフトウェアです。 今回の記事では、RHEL7でPacemaker/Corosyncを使ってHAクラスタを構築する際に利用 ...]]></description>
										<content:encoded><![CDATA[<p>Pacemaker/Corosyncはオープンソースソフトウェア(OSS)のメジャーなHAクラスタソフトウェアです。</p>
<p>今回の記事では、RHEL7でPacemaker/Corosyncを使ってHAクラスタを構築する際に利用できる2種類のパッケージについて解説します。Web上ではLinux-HA Japanに関する情報は比較的多く見つかりますが、RHEL HA Add-Onについてはあまり情報がないように思われますので、本記事が参考になれば幸いです。</p>
<p><span id="more-77"></span></p>
<h2>RHEL HA Add-On</h2>
<p>RHEL High Availability Add-On (以下HA Add-On)は、 Red Hat社によって提供されるRed Hat Enterprise Linux (以下RHEL)向けのHAクラスタパッケージ集です。Pacemaker、Corosyncおよび各種ツールにより構成されています。</p>
<p><a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/high_availability_add-on_overview/index" target="_blank" rel="noopener">High Availability Add-On の概要</a></p>
<h2>Linux-HA Japan</h2>
<p>Linux-HA Japanは、Linux上でHAクラスタを構築するための各種ソフトウェアの提供やメンテナンスを行っている、国内のコミュニティベースのプロジェクトです。</p>
<p><a href="http://linux-ha.osdn.jp/" target="_blank" rel="noopener">Linux-HA Japan プロジェクト</a></p>
<h2>それぞれの特長</h2>
<p>RHEL HA Add-On は、RHEL 6/7本体に対するオプションの形で販売されており、購入することでパッケージおよびサポートを利用することができます。<br />
RHEL 6.5以降およびRHEL 7では、Pacemaker, Corosyncおよび各種関連パッケージ群で構成されています。RHEL 6.4以前まではPacemakerの代わりにRGManagerというツールが使用されていました。それぞれの違いはRed Hat社の以下のページを参照ください。</p>
<p><a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/ap-ha-rhel6-rhel7-HAAR">Red Hat Enterprise Linux 6 および Red Hat Enterprise Linux 7 でのクラスターの作成</a></p>
<p>なお、CentOSなどのRHEL互換ディストリビューションにはHA Add-On相当のパッケージも含まれています。</p>
<p>Linux-HA JapanではRHEL/CentOS 6/7用のrpmパッケージが配布されており、無償でダウンロード、利用することができます。<br />
こちらもPacemaker, Corosyncおよび各種関連パッケージ群で構成されています。</p>
<p>なお、HA Add-On、Linux-HA Japanのパッケージを混在させて使うことはできません。</p>
<h2>機能の差異</h2>
<p>どちらもPacemaker+Corosyncという構成は同じですが、それぞれ細かな差異があります。</p>
<h3>RHEL HA Add-On</h3>
<ul>
<li>管理コマンドはpcsのみ</li>
<li>クォーラムデバイス機能(corosync-qdevice)が含まれる
<ul>
<li>テクノロジープレビューという位置付け</li>
</ul>
</li>
<li>フェンシング(STONITH)機能はfence-agentsのみ</li>
</ul>
<h3>Linux-HA Japan</h3>
<ul>
<li>管理コマンドはpcsとcrmshの両方を同梱
<ul>
<li>Linux-HA Japanではcrmshの利用を推奨</li>
<li>pcsはテクノロジープレビューという位置付け</li>
</ul>
</li>
<li>フェンシング(STONITH)機能としてfence-agentsとcluster-glueの両方を同梱
<ul>
<li>Linux-HA Japanではcluster-glueの利用を推奨</li>
</ul>
</li>
<li>同梱のリソースエージェント(リソース管理モジュール)の種類が多い
<ul>
<li>HA Add-Onにのみ含まれるものもある</li>
</ul>
</li>
<li>リソースエージェントとしてディスク監視を行うLinux-HA Japan独自開発のpm_diskdなどを同梱</li>
</ul>
<p>2018年5月現在、RHEL7版Pacemaker/Corosyncの各パッケージのバージョンは以下の差異があります。</p>
<table>
<tbody>
<tr>
<th>HA Add-On</th>
<th>Linux-HA Japan</th>
</tr>
<tr>
<td>pacemaker-1.1.18-11</td>
<td>pacemaker-1.1.17-1</td>
</tr>
<tr>
<td>corosync-2.4.3-2</td>
<td>corosync-2.4.2-2</td>
</tr>
<tr>
<td>resource-agents-3.9.5-124</td>
<td>resource-agents-4.0.1-2</td>
</tr>
<tr>
<td>fence-agents-4.0.11-86</td>
<td>fence-agents-4.0.25-1</td>
</tr>
<tr>
<td>&#8211;</td>
<td>cluster-glue-1.0.12-3</td>
</tr>
<tr>
<td>pcs-0.9.158-6</td>
<td>pcs-0.9.159-1</td>
</tr>
<tr>
<td>&#8211;</td>
<td>crmsh-2.1.9-1</td>
</tr>
</tbody>
</table>
<h2>選択のポイント</h2>
<p>RHEL HA Add-OnはRHELの有償オプションですが、Red Hat社の正式なサポートが受けられるというメリットがあります。国内ではWeb上の情報はあまり多くありません。</p>
<p>Linux-HA Japanについては無償で利用でき、Linux-HA Japan独自開発のツールおよびcrmshが利用できます。コミュニティベースのため、正式なサポートはありません。国内では多くの利用実績があり、Web上でも情報が比較的多く得られます。</p>
<p>なお、弊社のOSSサポート・OSSプロフェッショナルサポートサービスでは、いずれのパッケージにおいてもサポートサービスを提供しております。</p>
<p><a href="https://www.sraoss.co.jp/prod_serv/support/" target="_blank" rel="noopener">SRA OSS, Inc. 日本支社 &#8211; サポートメニュー</a></p>
<h2>参考情報</h2>
<p><a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/high_availability_add-on_overview/index" target="_blank" rel="noopener">High Availability Add-On の概要</a><br />
<a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/index" target="_blank" rel="noopener">High Availability Add-On リファレンス</a><br />
<a href="http://linux-ha.osdn.jp/wp/manual/pacemaker_outline" target="_blank" rel="noopener">Linux-HA Japan &#8211; Pacemakerの概要</a><br />
<a href="http://linux-ha.osdn.jp/wp/manual" target="_blank" rel="noopener">Linux-HA Japan &#8211; マニュアル</a></p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/oss-pro-support/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-oss" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、各種OSS のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
