【MarkLogic Server】クラスタのホスト切り替えとデータレプリケーション

はじめに
========

システムを運用していると、障害発生時やメンテナンス対応時など、ホストマシンを停止しなければならない場面が多々発生します。
しかし、24時間365日運用するシステムなどは、一部のホストを停止してもシステムの運用を継続しなければなりません。
このような場合、予備のホストに切り替えるなどの対応が必要になります。

クラスタ構成のMarkLogicサーバもホストの切り替えに対応しています。本記事では、クラスタ構成のMarkLogicサーバのホストを切り替えて運用する方法をご紹介します。

実施内容
====

クラスタ構成のMarkLogic Serverにおいてメンテナンス時や障害発生時など、ホストの切り替えが必要な場合、対象ホストのデータを別ホストに移行する手順を記載します。
各フォレストはLocal-Disk Failoverの設定により、プライマリフォレストまたはレプリカフォレストの役割を持っています。

| 対象MarkLogicバージョン | 対象OS・バージョン |
|---|---|
|8.0-4|Red Hat Enterprise Linux 7.3|

ここでは、以下のようなクラスタ構成を例として取り上げます。Host4を停止させて、新たに追加するHost5に切り替える手順を記載します。

![Cluster001.png](https://qiita-image-store.s3.amazonaws.com/0/188643/595e1c43-c794-0d15-4aad-af220d521284.png)


各フォレストの関係を以下に記載します。

<table border="1">
<tr>
<th>ホスト</th>
<th>ホストの状態</th>
<th>フォレスト名</th>
<th>プライマリ/レプリカ</th>
<th>アクセス可否</th>
<th>備考</th>
</tr>
<tr>
<td rowspan="2">Host1</td>
<td rowspan="2">起動中</td>
<td>Forest1</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest2-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest2のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host2</td>
<td rowspan="2">起動中</td>
<td>Forest2</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest1-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest1のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host3</td>
<td rowspan="2">起動中</td>
<td>Forest3</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest4-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest4のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host4</td>
<td rowspan="2">起動中</td>
<td>Forest4</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest3-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest3のレプリカ</td>
</tr>
</table>

フォレスト作成時の注意
------------

各ホストで作成するフォレストは、フォレスト新規作成時に「data directory」を設定し「host」を切り替えられるようにします。
※「data directory」が未設定の場合はフォレスト作成後「host」を変更することができません。

![Cluster006.png](https://qiita-image-store.s3.amazonaws.com/0/188643/53792dec-394c-e350-8f68-8b898ebcc5e0.png)

------------------------------------------------------------------------

実施手順概要
========

今回実施する作業の流れを記します。
実施手順はHost4に障害が発生した状況を想定し、Host5を追加してレプリケーション構成を復旧させる手順となります。

Host4を停止後、Host5をクラスタに追加します。その後、Host5にForest4とForest3-replicaを復元します。
復元されるデータはForest3とForest4-replicaのコピーとなります。停止したForest4とForest3-replicaからデータは復元されません。

### １．Host4を停止

Host4を使用不可状態にするため、Host4をシャットダウンします。
これにより、フェイルオーバーが発生し、Host3で管理しているHost4のForest4のレプリカであるForest4-replicaがプライマリフォレストになります。
また、Host4が管理していたHost3のForest3-replicaはアクセス不可能な状態となります。

![Cluster002.png](https://qiita-image-store.s3.amazonaws.com/0/188643/c830e170-4cc0-c671-b0c8-e90f824c3e22.png)

<table border="1">
<tr>
<th>ホスト</th>
<th>ホストの状態</th>
<th>フォレスト名</th>
<th>プライマリ/レプリカ</th>
<th>アクセス可否</th>
<th>備考</th>
</tr>
<tr>
<td rowspan="2">Host1</td>
<td rowspan="2">起動中</td>
<td>Forest1</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest2-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest2のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host2</td>
<td rowspan="2">起動中</td>
<td>Forest2</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest1-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest1のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host3</td>
<td rowspan="2">起動中</td>
<td>Forest3</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest4-replica</td>
<td><font color="Red">レプリカ→プライマリ</font></td>
<td>可能</td>
<td>Forest4が停止したため、フェイルオーバーによりプライマリとなる</font></td>
</tr>

<tr>
<td rowspan="2">Host4</td>
<td rowspan="2"><font color="Red">停止</font></td>
<td>Forest4</td>
<td>プライマリ</td>
<td><font color="Red">不可</font></td>
<td></td>
</tr>
<tr>
<td>Forest3-replica</td>
<td>レプリカ</td>
<td><font color="Red">不可</font></td>
<td>Forest3のレプリカフォレストは消失する</td>
</tr>
</table>

### ２．Host5を追加

切り替え先であるHost5を追加します。

![Cluster003.png](https://qiita-image-store.s3.amazonaws.com/0/188643/ae95c442-699a-585f-30a6-01b2500ff7bf.png)

<table border="1">
<tr>
<th>ホスト</th>
<th>ホストの状態</th>
<th>フォレスト名</th>
<th>プライマリ/レプリカ</th>
<th>アクセス可否</th>
<th>備考</th>
</tr>
<tr>
<td rowspan="2">Host1</td>
<td rowspan="2">起動中</td>
<td>Forest1</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest2-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest2のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host2</td>
<td rowspan="2">起動中</td>
<td>Forest2</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest1-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest1のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host3</td>
<td rowspan="2">起動中</td>
<td>Forest3</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest4-replica</td>
<td>プライマリ</td>
<td>可能</td>
<td>Forest4のプライマリ</font></td>
</tr>

<tr>
<td rowspan="2">Host4</td>
<td rowspan="2">停止</td>
<td>Forest4</td>
<td>プライマリ</td>
<td>不可</td>
<td></td>
</tr>
<tr>
<td>Forest3-replica</td>
<td>レプリカ</td>
<td>不可</td>
<td></td>
</tr>

<tr>
<td rowspan="2"><font color="Red">Host5</font></td>
<td rowspan="2"><font color="Red">起動中</font></td>
<td　rowspan="2">-</td>
<td　rowspan="2">-</td>
<td　rowspan="2">-</td>
<td　rowspan="2">Host5追加直後はForest無し</td>
</tr>
</table>

### ３．Host5へのフォレスト切り替え

Host4が管理していたフォレストをHost5に切り替えます。
これにより、Forest3のレプリカフォレストであるForest3-replicaがHost5に自動で作成されます。
また、プライマリフォレストであるForest4-replicaのレプリケーションデータが、Host5に自動で作成されます。

![Cluster004.png](https://qiita-image-store.s3.amazonaws.com/0/188643/e7b3a448-018c-0c44-3d1c-07af0584a22a.png)

<table border="1">
<tr>
<th>ホスト</th>
<th>ホストの状態</th>
<th>フォレスト名</th>
<th>プライマリ/レプリカ</th>
<th>アクセス可否</th>
<th>備考</th>
</tr>
<tr>
<td rowspan="2">Host1</td>
<td rowspan="2">起動中</td>
<td>Forest1</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest2-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest2のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host2</td>
<td rowspan="2">起動中</td>
<td>Forest2</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest1-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest1のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host3</td>
<td rowspan="2">起動中</td>
<td>Forest3</td>
<td>プライマリ</td>
<td>可能</td>
<td></td>
</tr>
<tr>
<td>Forest4-replica</td>
<td>プライマリ</td>
<td>可能</td>
<td>Forest4のプライマリ</font></td>
</tr>

<tr>
<td rowspan="2">Host4</td>
<td rowspan="2">停止</td>
<td>Forest4</td>
<td><font color="Red">-</font></td>
<td>不可</td>
<td>フォレストの設定をHost5へ切り替えたことにより、Forest4-replicaとのプライマリ/レプリカの関係がなくなる</td>
</tr>
<tr>
<td>Forest3-replica</td>
<td><font color="Red">-</font></td>
<td>不可</td>
<td>フォレストの設定をHost5へ切り替えたことにより、Forest3とのプライマリ/レプリカの関係がなくなる</td>
</tr>


<tr>
<td rowspan="2">Host5</td>
<td rowspan="2">起動中</td>
<td><font color="Red">Forest4</font></td>
<td><font color="Red">レプリカ</font></td>
<td><font color="Red">可能</font></td>
<td>Forest4の設定をHost5に切り替える。切り替え直後はForest4-replicaのレプリカとなる</td>
</tr>
<tr>
<td><font color="Red">Forest3-replica</font></td>
<td><font color="Red">レプリカ</font></td>
<td><font color="Red">可能</font></td>
<td>Forest3-replicaの設定をHost5に切り替える</td>
</tr>
</table>


### ４．Forest4-replicaの再起動

Host5に作成されたForest4はレプリカフォレストとなっているため、プライマリフォレストに変更する必要があります。
そのため、Forest4-replicaを再起動します。

![Cluster005.png](https://qiita-image-store.s3.amazonaws.com/0/188643/913726e9-fdac-fd96-a376-6aeb226b0e7d.png)

<table border="1">
<tr>
<th>ホスト</th>
<th>ホストの状態</th>
<th>フォレスト名</th>
<th>プライマリ/レプリカ</th>
<th>アクセス可否</th>
<th>備考</th>
</tr>
<tr>
<td rowspan="2">Host1</td>
<td rowspan="2">起動中</td>
<td>Forest1</td>
<td>プライマリ</td>
<td>可能</td>
<td>-</td>
</tr>
<tr>
<td>Forest2-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest2のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host2</td>
<td rowspan="2">起動中</td>
<td>Forest2</td>
<td>プライマリ</td>
<td>可能</td>
<td>-</td>
</tr>
<tr>
<td>Forest1-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>Forest1のレプリカ</td>
</tr>

<tr>
<td rowspan="2">Host3</td>
<td rowspan="2">起動中</td>
<td>Forest3</td>
<td>プライマリ</td>
<td>可能</td>
<td>-</td>
</tr>
<tr>
<td>Forest4-replica</td>
<td><font color="Red">プライマリ→レプリカ</font></td>
<td>可能</td>
<td>-</td>
</tr>

<tr>
<td rowspan="2">Host4</td>
<td rowspan="2">停止</td>
<td>Forest4</td>
<td>-</td>
<td>不可</td>
<td>-</td>
</tr>
<tr>
<td>Forest3-replica</td>
<td>-</td>
<td>不可</td>
<td>-</td>
</tr>


<tr>
<td rowspan="2">Host5</td>
<td rowspan="2">起動中</td>
<td>Forest4</td>
<td><font color="Red">レプリカ→プライマリ</font></td>
<td>可能</td>
<td>Forest4-replicaの再起動により、Forest4がプライマリとなる</td>
</tr>
<tr>
<td>Forest3-replica</td>
<td>レプリカ</td>
<td>可能</td>
<td>-</td>
</tr>
</table>

実施手順詳細
========

１．Host4を停止
---------------

・Host4のサーバのStatusが「disconnected」になっていることを確認します。

![Cluster007.png](https://qiita-image-store.s3.amazonaws.com/0/188643/b38b465b-8154-1c44-d8f8-30ea6768ac0b.png)

・Host4のフォレストをアタッチしているDBのStatusタブより、Host4のフォレストがエラーとなっていることを確認します。

![Cluster008.png](https://qiita-image-store.s3.amazonaws.com/0/188643/f0d03465-4a14-ad4c-5725-ebb01c419742.png)

・Forest4のレプリカがopenになっていることを確認します。また、Forest4がdisabledになっていることを確認します。

![Cluster009.png](https://qiita-image-store.s3.amazonaws.com/0/188643/620a50f5-2690-ac2f-3241-4dfffdedd70d.png)

２．Host5を追加
---------------

クラスタに新規でHost5を追加します。この時、追加したHost5にはフォレストが1つも作成されていない状態となっていることを確認します。

![Cluster010.png](https://qiita-image-store.s3.amazonaws.com/0/188643/92c56691-0a90-e051-e3d8-114aff9ab301.png)

３．Host5へのフォレスト切り替え
-------------------------------

・対象フォレストのConfigureタブより、hostの設定値をHost5に切り替えます。

![Cluster011.png](https://qiita-image-store.s3.amazonaws.com/0/188643/937fe872-70a4-d124-2bc1-d35ef7323ed0.png)

![Cluster012.png](https://qiita-image-store.s3.amazonaws.com/0/188643/c5f5a969-ecba-5a0e-6611-1dbc9e4a1a05.png)

・上記の設定を行うと、Forest4とForest3-replicaのフォレストの配置先がHost5となり、Statusがsync replicatingとなります。

![Cluster013.png](https://qiita-image-store.s3.amazonaws.com/0/188643/0352dc72-0ce6-68fc-ad8b-c5ca564a54f6.png)

４．Forest4-replicaの再起動
---------------------------

現在の状態では、Forest4-replicaのデータを参照している状態となっているため、Forest4を参照するよう変更します。

・Forest4-replicaを再起動します。

![Cluster014.png](https://qiita-image-store.s3.amazonaws.com/0/188643/bf572e1d-2d16-18f1-4936-9c991e8ad667.png)

・Forest4のStatusがopenになっていることを確認します。

![Cluster015.png](https://qiita-image-store.s3.amazonaws.com/0/188643/cc0fedfd-2f4a-e87c-5d7f-c12c57da9c69.png)

おわりに
========

ホストの切り替えはどのフォレストがプライマリフォレストとなっているか把握して作業する必要があります。
新しいノードのデータレプリケーションが完了したらプライマリフォレストを確認し、適切な状態に戻しましょう！


```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$