0 フォロワー · 18 投稿

ミラーリングは、ハイアベイラビリティ、災害復旧、データベースバックアップ、およびOLAPソリューションのためのインターシステムズのテクノロジーです。 ドキュメント

InterSystems公式 Masahito Miura · 7月 30, 2025

インターシステムズは InterSystems IRIS® data platform のバージョン 2025.2 をリリースしました。2025.2 は Continuous Delivery(CD)リリースです。InterSystems IRIS for Health™ および HealthShare®Health Connect™ のバージョン 2025.2 はセキュリティ・アップデートによるミラーリングの制限のため、現在提供されていません (詳細は後述)。

リリースハイライト

このリリースでは、セキュリティ、開発者エクスペリエンス、運用および相互運用性にわたってインパクトのある機能強化が導入されています。注目すべき新機能は以下のとおりです:

1.   新しい IRISSECURITY データベースによるセキュリティ強化

  o    セキュリティー・データは新しい IRISSECURITY データベースに移されました。このデータベースは暗号化することができます。

  o    新しいロール %SecurityAdministrator は、一元管理をサポートします。

  o    セキュリティ関連のグローバルとテーブルへの直接アクセスは非推奨です。代わりに提供されている API を適切なパーミッションで使用してください。

0
0 56
記事 Megumi Kakechi · 6月 20, 2025 5m read

これは InterSystems FAQ サイトの記事です。
こちらの記事では、非ミラー環境にミラー環境でオンラインバックアップしたバックアップファイルをリストアする方法をご紹介します。

手順は大きく分けて2つになります。

1.バックアップファイルからリストアを行う

2.データベースファイルのミラー属性を削除する


1.バックアップファイルからリストアを行う

以下は、^DBREST ユーティリティによる対話形式のリストア方法になります。

0
0 36
記事 Megumi Kakechi · 7月 10, 2024 5m read

これは InterSystems FAQ サイトの記事です。
 

こちらの記事では、「IRISでシャドウイングの代わりにミラーリングを構成する方法」を紹介しました。

今回は、「プログラムでシャドウイングの代わりにミラーリングを構成する方法(Windows版)」を紹介します。
【今回のサンプル・ミラー構成について】

  正サーバ(ミラー・プライマリ) 副サーバ(ミラー・非同期)
ミラー名 MIRRORSET MIRRORSET
ミラーメンバ名 MACHINEA MACHINEC
IPアドレス 35.77.84.159 54.248.39.237


では、ミラーの構成手順をご紹介します。手順は以下になります。
 

<ミラーリングのプライマリ設定>     // MACHINEA(正サーバ)

1. ISCAgentの自動起動設定および起動         ※Windowsコマンドプロンプトで実行

C:\Users\Administrator>sc config ISCAgent start=auto
C:\Users\Administrator>sc start ISCAgent

 

2. [システム管理] > [構成] > [ミラーサービスの有効化]     ※IRISターミナルで実行

0
0 220
記事 Toshihiko Minamoto · 6月 2, 2022 15m read

コミュニティの皆さん、こんにちは。

今までにミラーリング環境をセットアップされたことはありますか? プライベートネットワーク、仮想 IP アドレス、および SSL 構成を設定したことはありますか? この作業を何度か繰り返すと、証明書の生成や各 IRIS インスタンスの構成にはたくさんの手動による作業が必要で、時間がかかる作業であることに気づきました。 頻繁にこの作業を行わなければならない方にとっては、面倒な作業です。

たとえば、品質管理チームでは、新しいバージョンのアプリケーションをテストするたびに、新しい環境を作成しなければならないでしょう。 サポートチームであれば、複雑な問題を再現する環境を作成しなくてはならないかもしれません。

となれば、こういった環境を素早く作成できるツールが絶対に必要です。

この記事では、以下を使用するミラー環境のセットアップ例を紹介します。

  • アービター
  • プライマリ
  • バックアップフェイルオーバーメンバー
  • 読み書きレポート非同期メンバー
  • ノード間でジャーナルを転送するための SSL 構成
  • ミラー用のプライベートネットワーク
  • 仮想 IP アドレス
  • ミラーリングされたデータベース

ネットワークスキーマ

一見すると、ちょっと複雑であり、たくさんのコードが必要なように見えますが、ご心配いりません。 OpenExchange には、ほとんどの操作を簡単に実行できるライブラリがあります。

この記事では、プロセスをニーズに適合させる方法を例示することを目的としていますが、セキュリティ事項においてはベストプラクティスガイドではありません。 では、ここで使用するサンプルを作成しましょう。

ツールとライブラリ

  • PKI-script: 公開鍵基盤(PKI)は、自己署名された証明書を生成して権限サーバーを得られるようにする、IRIS に統合された機能です。 Pete Greskoff の素晴らしい記事によると、PKI Script ライブラリは、すべての操作をプログラムで実行し、管理ポータルでのあらゆる手動操作を回避することを目標としています。 このライブラリには、ミラーリング用のユーティリティメソッドが含まれますが、 証明書がすでにある場合は、PKI-Script の代わりにその証明書を使用できます。

  • config-api: このライブラリは、IRIS の構成に使用されます。 ミラーリング構成は、バージョン 1.1.0 以来サポートされています。 このライブラリの使用方法については詳しく説明しません。 これについてはいくつかの記事がすでに公開されていますので、 そちらをご覧ください。 手短に言えば、config-api は IRIS テンプレート構成ファイル(JSON 形式)の作成と読み込みを簡単に行うために使用されます。

  • ZPM

  • Docker

GitHub ページ

すべての必要なリソースは、iris-mirroring-samples リポジトリにあります。

システムの準備

既存のリポジトリをクローンします。

git clone https://github.com/lscalese/iris-mirroring-samples
cd iris-mirroring-samples

リポジトリをクローンする代わりにサンプルを新規作成する場合は、新しいディレクトリと、backupconfig-files というサブカテゴリを作成します。 irissession.sh をダウンロードします。

mkdir -p iris-mirroring-samples/backup iris-mirroring-samples/config-files
cd  iris-mirroring-samples
wget -O session.sh https://raw.githubusercontent.com/lscalese/iris-mirroring-samples/master/session.sh

後で「アクセス拒否」の問題が発生しないように、irisowner グループと irisowner ユーザーを作成し、バックアップディレクトリのグループを irisowner に変更する必要があります。

sudo useradd --uid 51773 --user-group irisowner
sudo groupmod --gid 51773 irisowner
sudo chgrp irisowner ./backup

このディレクトリは、最初のミラーメンバーをセットアップした後に、他のノードとデータベースバックアップを共有するためのボリュームとして使用されます。

IRIS ライセンスを取得する

IRIS Community エディションでは、ミラーリングを使用できません。 有効な IRIS コンテナーライセンスをまだお持ちでない場合は、資格情報を使用して Worldwide Response Center(WRC)にお問い合わせください。 「アクション」-->「オンライン配布」、次に「評価」ボタンをクリックし、「評価ライセンス」を選択してフォームに入力します。 ライセンスファイルの iris.key をこのディレクトリにコピーします。

InterSystems Containers Registry にログインする

便宜上、InterSystems Containers Registry(ICR)を使用して、Docker イメージをプルします。 Docker ログイン\パスワードが不明な場合は、WRC 資格情報を使用して SSO.UI.User.ApplicationTokens.cls にアクセスすると、ICR トークンを取得できます。

docker login -u="YourWRCLogin" -p="YourICRToken" containers.intersystems.com

myappdata データベースとグローバルマッピングを作成する

ここでは実際には myappdata データベースの作成を行いませんが、Docker ビルド時にそれを作成するように構成を準備します。 そのためには、JSON 形式で単純なファイルを作成します。IRIS インスタンスに読み込むには config-api ライブラリが使用されます。

config-files/simple-config.json ファイルを作成します。

{
   "Defaults":{
       "DBDATADIR" : "${MGRDIR}myappdata/",
       "DBDATANAME" : "MYAPPDATA"

   },
   "SYS.Databases":{
       "${DBDATADIR}" : {}
   },
   "Databases":{
       "${DBDATANAME}" : {
           "Directory" : "${DBDATADIR}"
       }
   },
   "MapGlobals":{
       "USER": [{
           "Name" : "demo.*",
           "Database" : "${DBDATANAME}"
       }]
   },
   "Security.Services" : {
       "%Service_Mirror" : {                      /* このインスタンスのミラーサービスを有効にします */
           "Enabled" : true
       }
   }
}

この構成ファイルを使用すると、デフォルトの設定で新しいデータベースを作成し、USER ネームスペースに demo.* というグローバルマッピングを指定できます。

config-api 構成ファイルの機能に関する詳細については、関連する記事または GitHub ページをご覧ください。

Docker ファイル

Docker ファイルは既存の Docker テンプレートを基盤としていますが、作業ディレクトリの作成、仮想 IP を使用するためのツールのインストール、ZPM のインストールなどを行うように変更する必要があります。

IRIS イメージは、すべてのミラーメンバーで同一です。 ミラーリングは、ロール(最初のメンバー、フェイルオーバーバックアップ、または読み書きレポート)に応じて正しい構成を使って開始するコンテナにセットアップされます。 以下の Dockerfile のコメントをご覧ください。

ARG IMAGE=containers.intersystems.com/intersystems/iris:2021.1.0.215.0
# WRC からイメージをダウンロードする必要はありません。 イメージはビルド時に ICR からプルされます。
FROM $IMAGE

USER root

#
COPY session.sh /
COPY iris.key /usr/irissys/mgr/iris.key

# /opt/demo を作業ディレクトリとし、構成ファイルやその他のインストールファイルをそこに保存します。
# arping コマンドを得るために、iputils-arping をインストールします。  仮想 IP の構成に必要です。
# 最新の ZPM バージョンをダウンロードします(ZPM は Communty エディションにのみ含まれます)。 
RUN mkdir /opt/demo && \
   chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/demo && \
   chmod 666 /usr/irissys/mgr/iris.key && \
   apt-get update && apt-get install iputils-arping && \
   wget -O /opt/demo/zpm.xml https://pm.community.intersystems.com/packages/zpm/latest/installer

USER ${ISC_PACKAGE_MGRUSER}

WORKDIR /opt/demo

# デフォルトミラーのロールを master に設定します。
# これはランタイム時に docker-compose ファイルでオーバーライドされます(最初のインスタンス、バックアップ、およびレポートのマスター)
ARG IRIS_MIRROR_ROLE=master

# config-files ディレクトリの内容を /opt/demo にコピーします。
# 現時点では、データベースとグローバルマッピングをセットアップする simple-config のみを作成しました。
# この記事の後の方で、ミラーのセットアップを行う他の構成ファイルを追加します。
ADD config-files .

SHELL [ "/session.sh" ]

# ZPM をインストールします。
# ZPM を使用して、config-api と pki-script をインストールします。
# 以下の操作を行うために、config-api を使って simple-config.json ファイルを読み込みます。
#  - 「myappdata」データベースを作成する
#  - 「myappdata」データベースのグローバル「demo.*」の「USER」ネームスペースにグローバルマッピングを追加する
# 基本的に、ここが、ObjectScript アプリケーションをインストールするエントリポイントです。 
# このサンプルでは、simple-config.json を読み込んで、単純なデータベースとグローバルマッピングを作成します。
RUN \
Do $SYSTEM.OBJ.Load("/opt/demo/zpm.xml", "ck") \
zpm "install config-api" \
zpm "install pki-script" \
Set sc = ##class(Api.Config.Services.Loader).Load("/opt/demo/simple-config.json")

# ミラー初期化スクリプトをコピーします。 
COPY init_mirror.sh /

# 起動後のスクリプト実行して、ミラーリングを構成します。
# init_mirror.sh の内容は、この記事の後の方で記述されます。 
CMD ["-a", "/init_mirror.sh"]

IRIS イメージをビルドする

Dockerfile の準備ができたので、イメージをビルドできます。

docker build --no-cache --tag mirror-demo:latest .

このイメージは、プライマリ、バックアップ、およびレポートノードの実行に使用されます。

最初のミラーメンバー構成ファイルを準備する

config-api ライブラリではミラーの構成が可能であるため、最初のミラーメンバー専用の構成ファイル config-files/mirror-master.json を作成する必要があります。

便宜上、コメントは直接 JSON に記述されています。 コメントなしの mirror-master.json はこちらからダウンロードできます。 すべての IP アドレスは、Docker-compose ファイルのあるノードにそれぞれ割り当てられます。

{
   "Defaults":{                                   /* すべての変数を含むセクション */
       "MirrorName" : "Demo",                     /* ミラー名 */
       "ArbiterNode" : "172.16.238.10|2188",      /* アービターノードの IP アドレスとポート */
       "VirtualAddress" : "172.16.238.100/24",    /* 仮想 IP アドレス */
       "VirtualAddressInterface" : "eth0",        /* 仮想 IP アドレスに使用されるネットワークインターフェース */
       "MirrorAddress" : "172.16.220.20",         /* プライベートミラーネットワーク内のこのノードの IP アドレス */
       "AgentAddress" : "172.16.238.20",           /* このノードの IP アドレス(Agent は同じマシンにインストールされています) */
       "SystemName" : "master",                   /* ミラー内のこのインスタンスの名前 */
       "DBDir" : "${MGRDIR}myappdata/",           /* Demo ミラーい追加するデータベースディレクトリ */
       "DBName" : "MYAPPDATA"                     /* ミラー内のデータベース名 */
   },
   "SYS.MirrorMaster" : {
       "${MirrorName}" : {
           "Config" : {
               "Name" : "${MirrorName}",
               "SystemName" : "${SystemName}",
               "UseSSL" : true,
               "ArbiterNode" : "${ArbiterNode}",
               "VirtualAddress" : "${VirtualAddress}",
               "VirtualAddressInterface" : "${VirtualAddressInterface}",
               "MirrorAddress": "${MirrorAddress}",
               "AgentAddress": "${AgentAddress}"
           },
           "Databases" : [{                   /* ミラーに追加するデータベースのリスト */
               "Directory" : "${DBDir}",
               "MirrorDBName" : "${DBName}"
           }],
           "SSLInfo" : {                      /* SSL 構成、証明書は PKI で生成されます */
               "CAFile" : "/usr/irissys/mgr/CAServer/CA_Server.cer",
               "CertificateFile" : "/usr/irissys/mgr/master_client.cer",
               "PrivateKeyFile" : "/usr/irissys/mgr/master_client.key",
               "PrivateKeyPassword" : "",
               "PrivateKeyType" : "2"
           }
       }
   }
}

フェイルオーバーミラーメンバー構成ファイルを準備する

フェイルオーバーバックアップメンバーの config-files/mirror-backup.json 構成ファイルを作成します。

最初のメンバーに似ています。

{
   "Defaults":{                              /* すべての変数を含むセクション */
       "MirrorName" : "Demo",                /* 参加するミラー */
       "AgentAddress" : "172.16.238.20",      /* 最初のミラーメンバーの Agent IP アドレス */
       "SystemName" : "backup",              /* ミラー内のこのインスタンス名 */
       "PrimaryInstanceName" : "IRIS",       /* 最初のミラーメンバーの IRIS インスタンス名 */
       "VirtualAddressInterface" : "eth0",   /* 仮想 IP アドレスに使用されるネットワークインターフェース */
       "DBDir" : "${MGRDIR}myappdata/",      /* ミラーの DB */
       "MirrorAddress" : "172.16.220.30"     /* プライベートネットワーク内のこのノードの IP アドレス */
   },
   "SYS.MirrorFailOver" : {
       "${MirrorName}" : {
           "Config": {
               "Name" : "${MirrorName}",
               "SystemName" : "${SystemName}",
               "InstanceName" : "${PrimaryInstanceName}",
               "AgentAddress" : "${AgentAddress}",
               "AgentPort" : "2188",
               "AsyncMember" : false,
               "AsyncMemberType" : ""
           },
           "Databases" : [{
                "Directory" : "${DBDir}"
           }],
           "LocalInfo" : {
               "VirtualAddressInterface" : "${VirtualAddressInterface}",
               "MirrorAddress": "${MirrorAddress}"
           },
           "SSLInfo" : {
               "CAFile" : "/usr/irissys/mgr/CA_Server.cer",
               "CertificateFile" : "/usr/irissys/mgr/backup_client.cer",
               "PrivateKeyFile" : "/usr/irissys/mgr/backup_client.key",
               "PrivateKeyPassword" : "",
               "PrivateKeyType" : "2"
           }
       }
   }
}

読み書き非同期メンバー構成ファイルを準備する

フェイルオーバー構成ファイルに非常に良く似ています。 違いは、AsyncMemberAsyncMemberType、および MirrorAddress の値です。 ./config-files/mirror-report.json ファイルを作成します。

{
   "Defaults":{
       "MirrorName" : "Demo",
       "AgentAddress" : "172.16.238.20",
       "SystemName" : "report",
       "PrimaryInstanceName" : "IRIS",
       "VirtualAddressInterface" : "eth0",
       "DBDir" : "${MGRDIR}myappdata/",
       "MirrorAddress" : "172.16.220.40"
   },
   "SYS.MirrorFailOver" : {
       "${MirrorName}" : {
           "Config": {
               "Name" : "${MirrorName}",
               "SystemName" : "${SystemName}",
               "InstanceName" : "${PrimaryInstanceName}",
               "AgentAddress" : "${AgentAddress}",
               "AgentPort" : "2188",
               "AsyncMember" : true,
               "AsyncMemberType" : "rw"
           },
           "Databases" : [{
                "Directory" : "${DBDir}"
           }],
           "LocalInfo" : {
               "VirtualAddressInterface" : "${VirtualAddressInterface}",
               "MirrorAddress": "${MirrorAddress}"
           },
           "SSLInfo" : {
               "CAFile" : "/usr/irissys/mgr/CA_Server.cer",
               "CertificateFile" : "/usr/irissys/mgr/report_client.cer",
               "PrivateKeyFile" : "/usr/irissys/mgr/report_client.key",
               "PrivateKeyPassword" : "",
               "PrivateKeyType" : "2"
           }
       }
   }
}

IRIS ノードを構成して証明書を生成する

すべての構成ファイルの準備が整いました! Dockerfile の最後の行は、CMD ["-a", "/init_mirror.sh"] です。 次に、証明書を生成して、関連する構成ファイルで各 IRIS ノードをセットアップするこのスクリプトを記述する必要があります。

以下のこのスクリプトでわかるように、証明書を生成するためのコードはいたって単純です。

  • マスターの場合は、Do ##class(lscalese.pki.Utils).MirrorMaster(,"",,,,"backup,report") とします。 PKI サーバー、PKI クライアント、証明書のリクエストの構成、検証を待機、証明書の取得、以降のノード別のリクエストを 5 分間自動的に検証、を行います。 自動的に受け入れられるリクエストは、ホストの backupreport に制限されます。
  • バックアップとレポートノードの場合は、Do ##class(lscalese.pki.Utils).MirrorBackup("${PKISERVER}","") とします。 PKI クライアントを構成、証明書をリクエスト、検証を待機、証明書を取得、を行います。
#!/bin/bash

# ミラーをテストするために使用されるデータベース。
DATABASE=/usr/irissys/mgr/myappdata

# ディレクトリには、他のノードでリストアするための、マスターがバックアップした myappdata が含まれます。
BACKUP_FOLDER=/opt/backup

# マスターノード用の config-api JSON 形式のミラー構成ファイル。
MASTER_CONFIG=/opt/demo/mirror-master.json

# フェイルオーバーとバックアップノード用の config-api JSON 形式のミラー構成ファイル。
BACKUP_CONFIG=/opt/demo/mirror-backup.json

# レポートと非同期ノード用の config-api JSON 形式のミラー構成ファイル。
REPORT_CONFIG=/opt/demo/mirror-report.json

# ミラー名...
MIRROR_NAME=DEMO

# ミラーメンバーのリスト。
MIRROR_MEMBERS=BACKUP,REPORT

# PKI サーバーのホスト:ポート(PKI サーバーはマスターインスタンスにインストールされます)
PKISERVER=master:52773

# マスターで実行。
# このインスタンスの公開鍵基盤サーバーを構成し、SSL を使用してミラーを構成するための証明書を生成します。
#   https://community.intersystems.com/post/creating-ssl-enabled-mirror-intersystems-iris-using-public-key-infrastructure-pki に記載された記事と
#   https://openexchange.intersystems.com/package/PKI-Script の関連ツールをご覧ください。
# config-api と /opt/demo/simple-config.json ファイルを使用して、マイナー構成を読み込みます。
# 「backup」と「report」という他のメンバーのミラーへの参加を自動的に許可するジョブを開始します(最大 600 秒の遅延でポータル管理の手動検証を回避します)。

master() {
rm -rf $BACKUP_FOLDER/IRIS.DAT
iris session $ISC_PACKAGE_INSTANCENAME -U %SYS <<- END
Do ##class(lscalese.pki.Utils).MirrorMaster(,"")
Set sc = ##class(Api.Config.Services.Loader).Load("${MASTER_CONFIG}")
Set ^log.mirrorconfig(\$i(^log.mirrorconfig)) = \$SYSTEM.Status.GetOneErrorText(sc)
Job ##class(Api.Config.Services.SYS.MirrorMaster).AuthorizeNewMembers("${MIRROR_MEMBERS}","${MIRROR_NAME}",600)
Hang 2
Halt
END
}

# マスターが実行。myappdata データベースのバックアップを作成します。
make_backup() {
iris session $ISC_PACKAGE_INSTANCENAME -U %SYS "##class(SYS.Database).DismountDatabase(\"${DATABASE}\")"
md5sum ${DATABASE}/IRIS.DAT
cp ${DATABASE}/IRIS.DAT ${BACKUP_FOLDER}/IRIS.TMP
mv ${BACKUP_FOLDER}/IRIS.TMP ${BACKUP_FOLDER}/IRIS.DAT
# バックアップはコンテナ外に保存されます。
# chmod 777 により、ホストからこのファイルを削除する必要がある場合に、アクセス拒否が
# 発生しないようにします。
chmod 777 ${BACKUP_FOLDER}/IRIS.DAT
iris session $ISC_PACKAGE_INSTANCENAME -U %SYS "##class(SYS.Database).MountDatabase(\"${DATABASE}\")"
}

# ミラーリングされたデータベース「myappdata」をリストアします。  このリストアプロセスは、フェイルオーバー「backup」と「report」ノードで実行されます。
restore_backup() {
sleep 5
while [ ! -f $BACKUP_FOLDER/IRIS.DAT ]; do sleep 1; done
sleep 2
iris session $ISC_PACKAGE_INSTANCENAME -U %SYS "##class(SYS.Database).DismountDatabase(\"${DATABASE}\")"
cp $BACKUP_FOLDER/IRIS.DAT $DATABASE/IRIS.DAT
md5sum $DATABASE/IRIS.DAT
iris session $ISC_PACKAGE_INSTANCENAME -U %SYS "##class(SYS.Database).MountDatabase(\"${DATABASE}\")"
}

# 「backup」メンバーを構成します。
#  - 証明書をインストールしてミラーと SSL 接続するように PKI クライアントを構成します。
#  - このインスタンスが backup の場合は /opt/demo/mirror-backup.json 構成ファイルを読み込みます。
#    このインスタンスが report(非同期読み書きミラーノード)である場合は /opt/demo/mirror-report.json を読み込みます。
other_node() {
sleep 5
iris session $ISC_PACKAGE_INSTANCENAME -U %SYS <<- END
Do ##class(lscalese.pki.Utils).MirrorBackup("${PKISERVER}","")
Set sc = ##class(Api.Config.Services.Loader).Load("$1")
Halt
END
}

if [ "$IRIS_MIRROR_ROLE" == "master" ]
then
 master
 make_backup
elif [ "$IRIS_MIRROR_ROLE" == "backup" ]
then
 restore_backup
 other_node $BACKUP_CONFIG
else
 restore_backup
 other_node $REPORT_CONFIG
fi

exit 0

Docker-compose ファイル

まず、4 つのコンテナがあります。 Docker-compose ファイルは、サンプルのオーケストレーションにピッタリです。

version: '3.7'

services:
 arbiter:
   image: containers.intersystems.com/intersystems/arbiter:2021.1.0.215.0
   init: true
   container_name: mirror-demo-arbiter
   command:
     - /usr/local/etc/irissys/startISCAgent.sh 2188
   networks:
     app_net:
       ipv4_address: 172.16.238.10
   extra_hosts:
     - "master:172.16.238.20"
     - "backup:172.16.238.30"
     - "report:172.16.238.40"
   cap_add:
     - NET_ADMIN

 master:
   build: .
   image: mirror-demo
   container_name: mirror-demo-master
   networks:
     app_net:
       ipv4_address: 172.16.238.20
     mirror_net:
       ipv4_address: 172.16.220.20
   environment:
     - IRIS_MIRROR_ROLE=master
   ports:
     - 81:52773
   volumes:
     - ./backup:/opt/backup
   hostname: master
   extra_hosts:
     - "backup:172.16.238.30"
     - "report:172.16.238.40"
   cap_add:
     - NET_ADMIN

 backup:
   image: mirror-demo
   container_name: mirror-demo-backup
   networks:
     app_net:
       ipv4_address: 172.16.238.30
     mirror_net:
       ipv4_address: 172.16.220.30
   ports:
     - 82:52773
   environment:
     - IRIS_MIRROR_ROLE=backup
   volumes:
     - ./backup:/opt/backup
   hostname: backup
   extra_hosts:
     - "master:172.16.238.20"
     - "report:172.16.238.40"
   cap_add:
     - NET_ADMIN

 report:
   image: mirror-demo
   container_name: mirror-demo-report
   networks:
     app_net:
       ipv4_address: 172.16.238.40
     mirror_net:
       ipv4_address: 172.16.220.40
   ports:
     - 83:52773
   environment:
     - IRIS_MIRROR_ROLE=report
   volumes:
     - ./backup:/opt/backup
   hostname: report
   extra_hosts:
     - "master:172.16.238.20"
     - "report:172.16.238.40"
   cap_add:
     - NET_ADMIN
 networks:
 app_net:
   ipam:
     driver: default
     config:
       - subnet: "172.16.238.0/24"
# Mirror Private Network
 mirror_net:
   ipam:
     driver: default
     config:
       - subnet: "172.16.220.0/24"

コンテナを実行する

docker-compose up

各インスタンスのミラーステータスがそれぞれ以下のように良好になるのを待ちます。

  • マスターノードのステータス: Primary
  • バックアップノードのステータス: Backup
  • レポートノードのステータス: Connected

システムによる仮想 IP の取得が困難であるため、これにはしばらく時間がかかります。 試行は何度も繰り返されるため、messages.logAddVirtualAddress failed が書き込まれます。

最終的には、docker ログに以下のメッセージが表示されます。

mirror-demo-master | 01/09/22-11:02:08:227 (684) 1 [Utility.Event] Becoming primary mirror server
...
mirror-demo-backup | 01/09/22-11:03:06:398 (801) 0 [Utility.Event] Found MASTER as primary, becoming backup
...
mirror-demo-report | 01/09/22-11:03:10:745 (736) 0 [Generic.Event] MirrorClient: Connected to primary: MASTER (ver 4)

また、 http://localhost:81/csp/sys/utilhome.csp のポータルでミラーステータスを確認することも可能です。

ミラーステータス

ポータルへのアクセス

Docker-compose において、ポート 81、82、および 83 を、それぞれの管理ポータルにアクセスできるようにマッピングします。 これは、すべてのインスタンスで使用できるデフォルトのログイン\パスワードです。

テスト

ミラー・モニタ(管理ポータル、デフォルトのユーザー名とパスワード): http://localhost:81/csp/sys/op/%25CSP.UI.Portal.Mirror.Monitor.zenミラー・モニタ

ミラーの設定を確認します。http://localhost:81/csp/sys/mgr/%25CSP.UI.Portal.Mirror.EditFailover.zen?$NAMESPACE=%25SYS

ミラーの構成

テストは、demo. で始まるグローバルを設定するだけで開始できます。 USER ネームスペースに demo.* というグローバルマッピングを構成したことを思い出しましょう。

プライマリサーバーで、ターミナルセッションを開きます。

docker exec -it mirror-demo-master irissession iris
Set ^demo.test = $zdt($h,3,1)

バックアップノードでデータを使用できるかを確認します。

docker exec -it mirror-demo-backup irissession iris
Write ^demo.test

レポートノードでデータを使用できるかを確認します。

docker exec -it mirror-demo-report irissession iris
Write ^demo.test

うまくいきました! 完全にプログラムで作成したミラー環境の準備が整いました。 もう少し完成度を高めるには、Web ゲートウェイと IRIS の間でhttps と暗号化を使用する Web ゲートウェイを追加することができますが、これは次の記事に取っておきます。

独自のスクリプトを作成することに決めたときに、この記事が役立つことを願っています。

出典

この記事のコンテンツは、以下からヒントをいただきました。

0
0 402
お知らせ Mihoko Iijima · 5月 8, 2022

開発者のみなさん、こんにちは!

2022年3月9日開催「InterSystems Japan Virtual Summit 2022」のセッション「ミラーリングを使用した HA および DR の構成例」のアーカイブを YouTube に公開いたしました。

(プレイリストはこちら


ミラーリングは、IRIS インスタンス間のデータベースの複製およびフェイルオーバを行う機能です。

動画では、ミラーリングを利用した高可用(HA)なシステムおよびディザスタリカバリ(DR)に対応したシステムの構成例についてご紹介します。

ぜひご参照ください。

<iframe width="521" height="293" src="https://www.youtube.com/embed/sp5wfKbqHuQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

【目次】

00:35 ミラーリングの概要

03:20 ミラーリングの種類と機能:フェイルオーバ・ミラー・メンバ

05:07 ミラーリングの種類と機能:非同期ミラー・メンバ

06:33 DR 非同期ミラー・メンバの昇格・降格

07:29 DR 非同期ミラー・メンバの昇格・降格の機能を利用した災害復旧での対応例

10:07 ISCAgent について

11:12 Arbiter について

13:06 ミラーリングの構成例

0
0 230
記事 Tomoko Furuzono · 3月 1, 2022 2m read

これは、InterSystems FAQサイトの記事です。

ミラー構成削除時に、ミラー・データベースのミラー属性を削除するオプションを指定しないと、通常データベースに戻すことができず、次回マウント時に読み取り専用でデータベースがマウントされます。 読み書き可能なデータベースに戻すためには、システムルーチン ^MIRROR を使用してミラー属性を削除する必要があります。
手順は以下のとおりです。(%SYSネームスペースで実行します。)

0
0 262
記事 Megumi Kakechi · 1月 12, 2022 5m read

これは、InterSystems FAQサイトの記事です。
ミラージャーナルファイルの削除(パージ)のタイミングは以下のようになります。

・プライマリ・フェイルオーバー・メンバ

 以下の期限のうち長い方に該当するもの
 -ローカルジャーナルファイルの削除条件が満たされたとき ("ジャーナル設定の構成" を参照)  
 -バックアップメンバとすべての非同期メンバに受信されたとき
  ただし、非同期メンバが14日間(既定値)を経過してもジャーナルファイルを受信しない場合は、そのジャーナルファイルは削除対象になります。
  「既定の14日間」は、以下のコマンドで設定が可能になります。
  この保持期間を過ぎると、ジャーナルが削除されてしまいその非同期メンバでは同期が取れなくなるのでご注意ください。

%SYS>write ##class(SYS.Mirror).JrnPurgeDefaultWait(10)       // 引数で保持期間を渡す


・バックアップ・フェイルオーバー・メンバ およびすべての災害復旧 (DR) 非同期メンバ

0
0 293
記事 Makiko Kokubun · 5月 18, 2021 1m read

*この動画は、2021年2月に開催された「InterSystems Japan Virtual Summit 2021」のアーカイブです。
 

InterSystems IRISではシャドウイングは非推奨の為、Caché/Ensembleからのマイグレーションに伴い、シャドウイングをご使用頂いているお客様はミラーリングへ移行する必要があります。

この動画では、ミラーリングの概要およびミラーリングの構成例、シャドウイングとの運用上の違いや注意点についてご説明します。

シャドウイングから移行される場合のミラーリングの構成としては、DR非同期またはレポーティング非同期になります。 ミラーリングとシャドウイングでは、データベースファイルやジャーナルファイルの取り扱いが異なります。
この点につきまして、動画の後半に紹介しておりますのでご参考下さい。

マイグレーションについては、こちらの動画も合わせてご覧ください。
(動画)InterSystems IRIS へのマイグレーション

0
0 265
記事 Megumi Kakechi · 4月 29, 2021 2m read

これは InterSystems FAQ サイトの記事です。

InterSystems のミラーリングを使用することで、以下2つの目的を達成できます。

  1. 自動フェイルオーバ
  2. ディザスタリカバリや、ビジネスインテリジェンスのためのデータベースの複製

1 については、2台の InterSystems 製品を利用し、プライマリサーバの InterSystems 製品に障害が発生した場合は、もう片方の InterSystems 製品に自動フェイルオーバが行えるミラーリング構成です。

2 については、1台のプライマリサーバである InterSystems 製品から、遠隔地も含め、任意の拠点にある複数台の InterSystems 製品へ(=非同期ミラーメンバ)データベースファイル(InterSystems IRISは「IRIS.DAT」、Caché/Ensemble/HealthShareは「CACHE.DAT」)のミラーリングを行います。
(また、複数のプライマリサーバから1台の非同期メンバのInterSystems 製品へのミラーリングも行えます。)
 

詳細は以下ドキュメントをご参照ください。
InterSystems IRIS ミラーリングについて【IRIS】
ミラーリングについて
 

あわせて、以下の記事も是非ご覧ください。
Cache Mirroring 101:簡単なガイドとよくある質問  
 

★おまけ

0
0 725
記事 Toshihiko Minamoto · 4月 19, 2021 12m read

++更新日:2018年8月1日

Cachéデータベースミラーリングに組み込まれているInterSystems仮想IP(VIP)アドレスの使用には、特定の制限があります。 具体的に言うと、ミラーメンバーが同じネットワークサブネットに存在する場合にのみ使用できるというところです。 複数のデータセンターを使用した場合は、ネットワークの複雑さが増すため、ネットワークサブネットが物理的なデータセンターを越えて「延伸」されることはさほどありません(より詳細な説明はこちらです)。 同様の理由で、データベースがクラウドでホストされている場合、仮想IPは使用できないことがよくあります。

ロードバランサー(物理的または仮想)などのネットワークトラフィック管理のアプライアンスを使用して、クライアントアプリケーションやデバイスに単一のアドレスを提示することで、同レベルの透過性を実現できます。 ネットワークトラフィックマネージャは、クライアントを現在のミラープライマリの実際のIPアドレスに自動的にリダイレクトします。 この自動化は、災害後のHAフェイルオーバーとDRプロモーションの両方のニーズを満たすことを目的としています。 

ネットワークトラフィックマネージャーの統合

今日の市場には、ネットワークトラフィックのリダイレクトに対応する多数のオプションが存在します。  アプリケーション要件に基づいてネットワークフローを制御するために、これらのオプションはそれぞれ似たような方法論もしくは複数の方法論に対応しています。  これらの方法論を単純化するために、 データベース _サーバー呼び出し型API、ネットワークアプライアンスポーリング、_または両方を組み合わせたものの、3つのカテゴリを検討していきます。  

次のセクションでは、これらの方法論をそれぞれ概説し、各々をInterSystems製品と統合する方法について説明していきます。  すべてのシナリオでアービターは、ミラーメンバーが直接通信できない場合に安全なフェイルオーバーの判断を下すために使用されます。  アービターの詳細は、こちらを参照してください。

この記事では、図の例は、プライマリ、バックアップ、およびDR非同期の3つのミラーメンバーを示すものとします。  ただし、ユーザーの構成には、ミラーメンバーがより多く含まれている場合、またはより少なく含まれている場合があるということは理解しております。

オプション1:ネットワークアプライアンスのポーリング(推奨

この方法では、ネットワーク負荷分散アプライアンスは、組み込みのポーリングメカニズムを使用して、両方のミラーメンバーと通信することでプライマリミラーメンバーを決定します。 

2017.1で利用可能なCSP Gatewayの_mirror_status.cxw_ページを使用するポーリングメソッドは、ELBサーバープールに追加された各ミラーメンバーに対するELBヘルスモニターのポーリングメソッドとして使用できます。  プライマリミラーのみが「SUCCESS」と応答するため、ネットワークトラフィックはアクティブなプライマリミラーメンバーのみに転送されます。 

このメソッドでは、^ZMIRRORにロジックを追加する必要はありません。  ほとんどの負荷分散ネットワークアプライアンスには、ステータスチェックの実行頻度に制限があることに注意してください。  通常、最高頻度は一般的にほとんどの稼働時間サービス水準合意書で許容される5秒以上に設定されています。

次のリソースへのHTTPリクエストは、【ローカル】キャッシュ構成のミラーメンバーのステータスをテストします。

/csp/bin/mirror_status.cxw_

それ以外の場合、ミラーステータスリクエストのパスは、実際のCSPページのリクエストに使用されるのと同じ階層構造を使用し、適切なキャッシュサーバーとネームスペースに解決されます。

例:/csp/user/ パスにある構成を提供するアプリケーションのミラーステータスをテストする場合は次のようになります。

/csp/user/mirror_status.cxw_

注意:ミラーライセンスチェックを実行しても、CSPライセンスは消費されません。

ターゲットインスタンスがアクティブなプライマリメンバーであるかどうかに応じて、ゲートウェイは以下のCSP応答のいずれかを返します。

**** 成功(プライマリメンバーである)**

_=============================== _

_   HTTP/1.1 200 OK_

_   Content-Type: text/plain_

_   Connection: close_

_   Content-Length: 7_

_   SUCCESS_

**** 失敗(プライマリメンバーではない)**

===============================

_   HTTP/1.1 503 Service Unavailable_

_   Content-Type: text/plain_

_   Connection: close_

_   Content-Length: 6_

_   FAILED_

**** 失敗(キャッシュサーバーが_Mirror_Status.cxw_のリクエストをサポートしていない)**

===============================

_   HTTP/1.1 500 Internal Server Error_

_   Content-Type: text/plain_

_   Connection: close_

_   Content-Length: 6_

_   FAILED_

ポーリングの例として、次の図を検討してみましょう。

フェイルオーバーは、同期フェイルオーバーミラーメンバー間で自動的に発生します:

次の図は、DR非同期ミラーメンバーの負荷分散プールへの昇格を表しています。これは通常、同じ負荷分散ネットワークアプライアンスがすべてのミラーメンバーにサービスを提供していることを前提としています(地理的に分割されたシナリオについては、この記事の後半で説明します)。 標準のDR手順に従って、災害復旧メンバーの昇格には、人間による決定およびデータベースレベルでの簡単な管理アクションが必要になります。 ただし、そのアクションが実行されると、ネットワークアプライアンスでの管理アクションは必要ありません。新しいプライマリが自動的に検出されます。

オプション2:データベースサーバー呼び出し型API

この方法では、フェイルオーバーミラーメンバーと潜在的にDR非同期ミラーメンバーの両方で定義されたサーバープールがあり、ネットワークトラフィック管理アプライアンスが使用されます。  

ミラーメンバーがプライマリミラーメンバーになると、優先度または重み付けを調整して、ネットワークトラフィックを新しいプライマリミラーメンバーに転送するようにネットワークアプライアンスにただちに指示を出すために、ネットワークアプライアンスに対してAPI呼び出しが実行されます。  

同様のモデルは、プライマリミラーメンバーとバックアップミラーメンバーの両方が利用できなくなった場合のDR非同期ミラーメンバーの昇格にも適用されます。

このAPIは、具体的には次のようにプロシージャコールの一部として^ZMIRRORルーチンで定義されています: $$CheckBecomePrimaryOK^ZMIRROR()

このプロシージャコールの中に、REST API、コマンドラインインターフェイスなど該当するネットワークアプライアンスで利用可能なAPIロジックやメソッドを挿入します。 仮想IPの場合と同様に、これは唐突なネットワーク構成の変更であり、障害が発生したプライマリミラーメンバーと接続している既存のクライアントに対し、フェイルオーバーが発生していることを通知するアプリケーションロジックは必要としません。 障害の性質によっては、障害そのものや、アプリケーションのタイムアウトやエラー、新しいプライマリによる古いプライマリインスタンスの強制停止、あるいはクライアントが使用したTCPキープアライブタイマーの失効が原因でこれらの接続が終了する可能性があります。

その結果、ユーザーは再接続してログインする必要がでてくるかもしれません。  この動作はあなたのアプリケーションの動作によって決まります。

オプション3:地理的に分散された展開

複数のデータセンターを備えた構成や、複数のアベイラビリティーゾーンと地理的ゾーンを備えたクラウド展開など、地理的に分散された展開では、DNSベースの負荷分散とローカル負荷分散の両方を使用するシンプルでサポートしやすいモデルで地理的なリダイレクトの慣行を考慮する必要が生じます。

この組み合わせモデルでは、各データセンター、アベイラビリティーゾーン、またはクラウド地理的地域にあるネットワークロードバランサーと合わせて、Amazon Route 53、F5 Global Traffic Manager、Citrix NetScaler Global Server Load Balancing、Cisco Global SiteSelectorなどのDNSサービスと連携する追加のネットワークアプライアンスを導入します。

このモデルでは、前述のポーリング(推奨)またはAPIメソッドのいずれかが、ミラーメンバー(フェイルオーバーまたはDR非同期のいずれか)が稼働している場所に対してローカルで使用されます。  これは、トラフィックをいずれかのデータセンターに転送できるかどうかを地理的/グローバルネットワークアプライアンスに報告するために使用されます。  また、この構成では、ローカルネットワークトラフィック管理アプライアンスは、地理的/グローバルネットワークアプライアンスに独自のVIPを提示します。

通常の定常状態では、アクティブなプライマリミラーメンバーは、プライマリであることをローカルネットワークアプライアンスに報告し、「Up」ステータスを提供します。  この「Up」ステータスは、すべてのリクエストをこのアクティブなプライマリミラーメンバーに転送するためにDNSレコードを調整および維持するよう、地理的/グローバルアプライアンスに中継されます。

同じデータセンター内でフェイルオーバーが起きた場合(バックアップ同期ミラーメンバーがプライマリになった場合)は、APIまたはポーリング方式のいずれかがローカルロードバランサーで使用され、同じデータセンター内の新しいプライマリミラーメンバーにリダイレクトされます。  新しいプライマリミラーメンバーがアクティブであり、ローカルロードバランサーは引き続き「Up」ステータスで応答しているため、地理的/グローバルアプライアンスへの変更は行われません。

次の図で、ネットワークアプライアンスへのローカル統合のためにAPI方式を使用して、例を説明します。

APIまたはポーリング方式のいずれかを使用した別のデータセンターへのフェイルオーバーが起きた場合(代替データセンターの同期ミラーまたはDR非同期ミラーメンバーの場合)は、新しく昇格されたプライマリミラーメンバーがプライマリとしてローカルネットワークアプライアンスへ報告を開始します。

フェイルオーバー中は、かつてプライマリが含まれていたデータセンターは、ローカルロードバランサから地理的/グローバルへの「Up」を報告しなくなります。  地理的/グローバルアプライアンスは、トラフィックをそのローカルアプライアンスには転送しません。   代替データセンターのローカルアプライアンスは、地理的/グローバルアプライアンスに「Up」と報告し、DNSレコードの更新を呼び出して、代替データセンターのローカルロードバランサーによって提示された仮想IPに転送するようにします。

オプション4:多層的、および地理的に分散された展開

ソリューションをさらに一歩進めるには、プライベートWANの内部として、またはインターネット経由でアクセス可能なものとして、個別のWebサーバー層を導入します。  恐らくこのオプションは、大規模なエンタープライズアプリケーションの一般的な展開モデルです。 

次の例では、複数のネットワークアプライアンスを使用して、Web層とデータベース層を安全に分離およびサポートする構成例を示しています。  このモデルでは、地理的に分散された2つの場所が使用され、1つは「プライマリ」場所と見なされ、もう1つはデータベース層用「災害復旧」専用の場所です。  データベース層災害復旧の場所は、プライマリな場所が何らかの理由で運転休止になった場合に使用されます。   さらに、この例のWeb層は、アクティブ - アクティブとして示されます。つまりユーザーは、最小の遅延、最小の接続数、IPアドレス範囲、または適切と思われるその他のルーティンルールなど、さまざまなルールに基づいていずれかの場所に転送されます。

上記の例が示すように、同じ場所でフェイルオーバーが起きた場合は、自動フェイルオーバーが発生し、ローカルネットワークアプライアンスが新しいプライマリを指すようになります。  ユーザーは引き続きいずれかの場所のWebサーバーに接続し、Webサーバーは関連付けられたCSPゲートウェイで引き続き場所Aを指します。

次の例では、プライマリフェイルオーバーミラーメンバーとバックアップフェイルオーバーミラーメンバーの両方が稼働していないロケーションAでの完全フェイルオーバーまたは運転休止について検討します。  このような場合、DR非同期ミラーメンバーは、プライマリおよびバックアップフェイルオーバーミラーメンバーに手動で昇格されます。  昇格されると、新しく指定されたプライマリミラーメンバーにより、ロケーションBの負荷分散アプライアンスが前述のAPIメソッドを使用して「Up」を報告できるようになります(ポーリングメソッドもオプションの1つです)。  ローカルロードバランサーが「Up」を報告するようになった結果、DNSベースのアプライアンスはそれを認識し、データベースサーバーサービスのためにトラフィックを場所Aから場所Bにリダイレクトします。

まとめ

仮想IPを使用しないにミラーフェイルオーバーを設計するには、さまざまな組み合わせが考えられます。 これらのオプションは、最も単純な高可用性シナリオまたはフェイルオーバーとDR非同期ミラーメンバーの両方を含む複数の層を備えた複数の地域に渡る展開のいずれにも適用でき、アプリケーションの最高レベルの運用回復力を維持することを目的とした、可用性が高く災害に強いソリューションを実現できます。

この記事では、あなたのアプリケーションと可用性の要件に適したフェイルオーバーを備えたデータベースミラーリングを正常に展開するために可能なさまざまな組み合わせと活用事例に関して説明いたしました。

0
0 550
InterSystems公式 Yoichi Miyashita · 3月 25, 2021

対象バージョン: 
   Caché/Ensemble、InterSystems IRIS および IRIS for Health のすべてのバージョン、上記のデータプラットフォームバージョンに基づくすべての HealthShare 製品

対象プラットフォーム: すべて

InterSystemsは、非常にまれな状況でプライマリミラーメンバー以外のミラーメンバーでデータの不整合を引き起こす可能性がある問題を修正しました。
この問題は、上記の InterSystems 製品のバージョンで発生する可能性があります。

[発生する問題]
ミラーリングを使用しているシステムでデータの不整合性が発生します。

[問題の詳細]
この問題は、ミラーリングされたシステムでの通常の操作中にエラーなく発生します。
この問題によりミラーメンバーで一部のジャーナルレコードのデジャーナル処理が失敗し、ミラーメンバー間でデータの不整合が発生します。
これは、フェイルオーバーメンバーと非同期メンバーの両方で発生する可能性があります。

0
0 234
記事 Toshihiko Minamoto · 3月 17, 2021 31m read

この記事では、従来のIRISミラーリング構成の代わりに、Kubernetesの Deploymentと分散永続ストレージを使って高可用性IRIS構成を構築します。 このデプロイでは、ノード、ストレージ、アベイラビリティーゾーンといったインフラストラクチャ関連の障害に耐えることが可能です。 以下に説明する方法を使用することで、RTOがわずかに延長されますが、デプロイの複雑さが大幅に軽減されます。

図1 - 従来のミラーリング構成と分散ストレージを使ったKubernetesの比較

この記事に記載されているすべてのソースコードは、https://github.com/antonum/ha-iris-k8s より入手できます。
要約

3ノードクラスタを実行しており、Kubernetesにいくらか詳しい方は、このまま以下のコードを使用してください。

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
kubectl apply -f https://github.com/antonum/ha-iris-k8s/raw/main/tldr.yaml

上記の2行の意味がよくわからない方、またはこれらを実行できるシステムがない場合は、「高可用性要件」のセクションにお進みください。 説明しながら進めていきます。

最初の行は、Longhornというオープンソースの分散Kubernetesストレージをインストールしています。 2行目は、DurableSYS用にLonghornベースのボリュームを使って、InterSystems IRISデプロイをインストールしています。

すべてのポッドが実行状態になるまで待ちます。 kubectl get pods -A

上記の手順を済ませると、http://<IRIS Service Public IP>:52773/csp/sys/%25CSP.Portal.Home.zenにあるIRIS管理ポータル(デフォルトのパスワードは「SYS」)にアクセスできるようになります。また、次のようにしてIRISコマンドラインも使用できるようになります。

kubectl exec -it iris-podName-xxxx -- iris session iris

障害をシミュレートする

では、実際に操作してみましょう。 ただし、操作の前に、データベースにデータを追加して、IRISがオンラインになったときに存在することを確認してください。

kubectl exec -it iris-6d8896d584-8lzn5 -- iris session iris
USER>set ^k8stest($i(^k8stest))=$zdt($h)_" running on "_$system.INetInfo.LocalHostName()
USER>zw ^k8stest
^k8stest=1
^k8stest(1)="01/14/2021 14:13:19 running on iris-6d8896d584-8lzn5"

ここからが「カオスエンジニアリング」の始まりです。

# IRISを停止 - コンテナは自動的に再開します
kubectl exec -it iris-6d8896d584-8lzn5 -- iris stop iris quietly
 
# ポッドを削除 - ポッドが再作成されます
kubectl delete pod iris-6d8896d584-8lzn5
 
# irisポッドの配信によりノードを「強制ドレイン」 - ポッドは別のノードで再作成されます
kubectl drain aks-agentpool-29845772-vmss000001 --delete-local-data --ignore-daemonsets --force
 
# ノードを削除 - ポッドは別のノードで再作成されます
# ただし、kubectlでは削除できないので、 そのインスタンスまたはVMを見つけて、強制終了します。
マシンにアクセスできる場合は、電源を切るかネットワークケーブルを外します。 冗談ではありません!

高可用性要件

 

以下の障害に耐えられるシステムを構築しています。

  • コンテナ/VM内のIRISインスタンス。 IRIS - レベル障害
  • ポッド/コンテナの障害
  • 個々のクラスタノードの一時的な使用不能。 アベイラビリティーゾーンが一時的にオフラインになる場合などが挙げられます。
  • 個々のクラスタノードまたはディスクの永久的障害。

基本的に、「障害をシミュレートする」セクションで試したシナリオです。

上記のいずれかの障害が発生すると、システムは人間が手をいれなくてもオンラインになり、データも失われません。 データの永続性が保証する範囲には一応制限がありますが、 ジャーナルサイクルとアプリケーション内のトランザクションの使用状況に応じて、IRISで実現されます(https://docs.intersystems.com/irisforhealthlatestj/csp/docbook/Doc.View.cls?KEY=GCDI_journal#GCDI_journal_writecycle)。いずれにしても、RPO(目標復旧ポイント)は2秒未満です。

システムの他のコンポーネント(Kubernetes APIサービス、etcdデータベース、ロードバランサーサービス、DNSなど)はスコープ外であり、通常、Azure AKSやAWS EKSなどのマネージドKubernetesサービスで管理されます。

別の言い方をすれば、個別の計算コンポーネントやストレージコンポーネントの障害はユーザーが処理するものであり、その他のコンポーネントの障害はインフラストラクチャ/クラウドプロバイダーが対処するものと言えます。

アーキテクチャ

InterSystems IRISの高可用性について言えば、これまでミラーリングの使用が勧められてきました。 ミラーリングでは、データは、常時オンライン状態にある2つのIRISインスタンスが同期的に複製されます。 各ノードにはデータベースの完全なコピーが維持され、プライマリノードがオフラインになると、ユーザーはバックアップノードに接続し直すことができます。 基本的に、ミラーリング手法では、計算とストレージの両方の冗長性は、IRISが管理するものです。

ミラーをさまざまなアベイラビリティーゾーンにデプロイしたミラーリングにより、計算処理とストレージの障害に備えた必要な冗長性を実現し、わずか数秒という優れたRTO(目標復旧時間または障害後にシステムがオンラインに復旧するまでにかかる時間)を達成することができます。 AWSクラウドでミラーリングされたIRISのデプロイテンプレートは、https://jp.community.intersystems.com/node/486206から入手できます。

一方で、ミラーリングには、設定やバックアップ/復旧手順が複雑で、セキュリティ設定とローカルのデータベース以外のファイルの複製機能が不足しているという欠点があります。

コンテナオーケストレータ―にはKubernetesなど(今や2021年。ほかにオーケストレーターってありますか?!)がありますが、これらは、障害時に、Deploymentオブジェクトが障害のあるIRISポッド/コンテナを自動的に再起動することで、計算冗長性を実現しています。 Kubernetesアーキテクチャ図に、実行中のIRISノードが1つしかないのはこのためです。 2つ目のIRISノードを常時実行し続ける代わりに、計算可用性をKubernetesにアウトソースしています。 Kubernetesは、元のIRISポッドが何らかの理由でエラーとなった場合に、IRISポッドの再作成を確保します。

図2 フェイルオーバーのシナリオ

ここまでよろしいでしょうか。 IRISノードに障害が発生すると、Kubernetesは単に新しいノードを作成します。 クラスタによって異なりますが、計算障害が発生してからIRISがオンラインになるまでには、10~90秒かかります。 ミラーリングではわずか2秒で復旧されるわけですから、これはダウングレードとなりますが、万が一サービス停止となった場合に許容できる範囲であれば、複雑さが緩和されることは大きなメリットと言えます。 ミラーリングの構成は不要です。 セキュリティ設定やファイル複製を気にする必要もありません。

率直に言うと、KubernetesでIRISを実行し、コンテナにログインしても、高可用性環境で実行していることには気づくこともないでしょう。 単一インスタンスのIRISデプロイと全く同じように見え、何ら感触にも変化はありません。

では、ストレージはどうでしょうか。 データベースを扱っているわけですから気になります。 どのようなフェイルオーバーのシナリオであっても、システムはデータの永続性も処理する必要があります。 ミラーリングは、IRISノードのローカルである計算ノードに依存しているため、 ノードが停止するか、一時的に使用不可になってしまえば、そのノードのストレージも停止してしまいます。 ミラーリング構成では、IRISがIRISレベルでデータベースを複製するのはこれに対処するためです。

コンテナの再起動時に元の状態を維持したデータベースを使用できるだけでなく、ノードやネットワークのセグメント全体(アベイラビリティーゾーン)が停止するといったイベントに備えて、冗長性を提供できるストレージが必要です。 ほんの数年前、これを解決できる簡単な答えは存在しませんでした。 上の図から推測できるように、今ではその答えを得ています。 分散コンテナストレージです。

分散ストレージは、基盤のホストボリュームを抽象化し、k8sクラスタのすべてのノードが使用できる共同の1つのクラスターとして提示します。 この記事では、インストールが非常に簡単なLonghorn(https://longhorn.io)という無料のオープンソースのストレージを使用しますが、 OpenEBS、Porworx、StorageOSといったほかのストレージも利用できます。同じ機能が提供されています。 CNCF IncubatingプロジェクトであるRook Cephも検討する価値があるでしょう。 この種のハイエンドとしては、NetAppやPureStorageといったエンタープライズ級のストレージソリューションがあります。

手順

「要約」セクションでは、1回にすべてをインストールしました。 インストールと検証の手順の説明は、付録Bをご覧ください。

Kubernetesストレージ

まずは、コンテナとストレージ全般について、またIRISがどこに適合するのかについて説明しましょう。

デフォルトでは、コンテナ内のすべてのデータは揮発性であるため、 コンテナが停止すればデータは消失します。 Dockerでは、ボリュームの概念を使用することができるため、 基本的に、ホストOSのディレクトリをコンテナに公開することができます。

docker run --detach
  --publish 52773:52773
  --volume /data/dur:/dur
  --env ISC_DATA_DIRECTORY=/dur/iconfig
  --name iris21 --init intersystems/iris:2020.3.0.221.0

上記の例では、IRISコンテナを起動し、host-localの「/data/dur」ディレクトリを、「/dur」マウントポイントのコンテナからアクセスできるようにしています。 つまり、コンテナがこのディレクトリに何かを格納している場合、それは保持され、コンテナの次回起動時に使用できるようになります。

IRIS側では、ISC_DATA_DIRECTORYを指定することで、IRISに、コンテナの再起動時に損失してはいけないすべてのデータを特定のディレクトリに格納するように指示することができます。 ドキュメントの「Durable SYS」というIRISの機能をご覧ください( https://docs.intersystems.com/irisforhealthlatestj/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_durable_running)。

Kubernetesでの構文は異なりますが、概念は同じです。

IRISの基本的なKubernetes Deploymentは以下のようになります。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iris
spec:
  selector:
    matchLabels:
      app: iris
  strategy:
    type: Recreate
  replicas: 1
  template:
    metadata:
      labels:
        app: iris
    spec:
      containers:
      - image: store/intersystems/iris-community:2020.4.0.524.0
        name: iris
        env:
        - name: ISC_DATA_DIRECTORY
          value: /external/iris
        ports:
        - containerPort: 52773
          name: smp-http
        volumeMounts:
        - name: iris-external-sys
          mountPath: /external
      volumes:
      - name: iris-external-sys
        persistentVolumeClaim:
          claimName: iris-pvc

 

上記のデプロイ仕様では、「volumes」の部分にストレージボリュームがリストされています。 このボリュームには、「iris-pvc」などのpersistentVolumeClaimを介して、コンテナの外部からアクセスできます。 volumeMountsは、このボリュームをコンテナ内に公開します。 「iris-external-sys」は、ボリュームマウントを特定のボリュームに関連付ける識別子です。 実際には複数のボリュームが存在する可能性があり、ほかのボリュームと区別するためにこの名前が使用されるわけですから、 「steve」と名付けることも可能です。

すでにお馴染みのISC_DATA_DIRECTORYは、IRISが特定のマウントポイントを使用して、コンテナの再起動後も存続する必要のあるすべてのデータを格納するように指示する環境変数です。

では、persistentVolumeClaimのiris-pvcを見てみましょう。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: iris-pvc
spec:
  storageClassName: longhorn
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

 

かなりわかりやすいと思います。 「longhorn」ストレージクラスを使って、1つのノードでのみ読み取り/書き込みとしてマウント可能な、10ギガバイトを要求しています。

ここで重要なのは、storageClassName: longhornです。

AKSクラスタで利用できるストレージクラスを確認してみましょう。

kubectl get StorageClass
NAME                             PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
azurefile                        kubernetes.io/azure-file        Delete          Immediate           true                   10d
azurefile-premium                kubernetes.io/azure-file        Delete          Immediate           true                   10d
default (default)                kubernetes.io/azure-disk        Delete          Immediate           true                   10d
longhorn                         driver.longhorn.io              Delete          Immediate           true                   10d
managed-premium                  kubernetes.io/azure-disk        Delete          Immediate           true                   10d

Azureのストレージクラスはほとんどありませんが、これらは、デフォルトでインストールされたクラスと、以下の一番最初のコマンドの一部でインストールしたLonghornのクラスです。

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

永続ボリュームクレームの定義に含まれる#storageClassName: longhornをコメントアウトすると、現在「default」としてマークされているストレージクラスが使用されます。これは、通常のAzureディスクです。

分散ストレージが必要な理由を説明するために、この記事の始めに説明した、longhornストレージを使用しない「カオスエンジニアリング」実験をもう一度行ってみましょう。 最初の2つのシナリオ(IRISの停止とポッドの削除)は正常に完了し、システムは稼働状態に回復します。 ノードをドレインまたは強制終了しようとすると、システムは障害状態になります。

#forcefully drain the node
kubectl drain aks-agentpool-71521505-vmss000001 --delete-local-data --ignore-daemonsets

kubectl describe pods ...   Type     Reason            Age                  From               Message   ----     ------            ----                 ----               -------   Warning  FailedScheduling  57s (x9 over 2m41s)  default-scheduler  0/3 nodes are available: 1 node(s) were unschedulable, 2 node(s) had volume node affinity conflict.

基本的に、KubernetesはクラスタのIRISポッドを再起動しようとしますが、最初に起動されていたノードは利用できないため、ほかの2つのノードに「ボリュームノードアフィニティの競合」が発生しています。 このストレージタイプでは、基本的にボリュームはノードホストで使用可能なディスクに関連付けられているため、最初に作成されたノードでしか使用できないのです。

ストレージクラスにlonghornを使用すると、「強制ドレイン」と「ノードの強制終了」の2つの実験は正常に完了し、間もなくしてIRISポッドの動作が再開します。 これを実現するために、Longhornは3ノードクラスタをで使用可能なストレージを制御し、3つのすべてのノードにデータを複製しています。 ノードの1つが永久的に使用不可になると、Longhornは迅速にクラスタストレージを修復します。 「ノードの強制終了」シナリオでは、IRISポッドはほかの2つのボリュームレプリカを使ってすぐに別のノードで再起動されます。 するとAKSは失われたノードに置き換わる新しいノードをプロビジョニングし、準備ができたら、Longhorn がそのノードに必要なデータを再構築します。 すべては自動的に行われるため、ユーザーが手を入れる必要はありません。

図3 置換されたノードにボリュームレプリカを再構築するLonghorn

k8sデプロイについて

デプロイの他の側面をいくつか見てみましょう。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iris
spec:
  selector:
    matchLabels:
      app: iris
  strategy:
    type: Recreate
  replicas: 1
  template:
    metadata:
      labels:
        app: iris
    spec:
      containers:
      - image: store/intersystems/iris-community:2020.4.0.524.0
        name: iris
        env:
        - name: ISC_DATA_DIRECTORY
          value: /external/iris
        - name: ISC_CPF_MERGE_FILE
          value: /external/merge/merge.cpf
        ports:
        - containerPort: 52773
          name: smp-http
        volumeMounts:
        - name: iris-external-sys
          mountPath: /external
        - name: cpf-merge
          mountPath: /external/merge
        livenessProbe:
          initialDelaySeconds: 25
          periodSeconds: 10
          exec:
            command:
            - /bin/sh
            - -c
            - "iris qlist iris | grep running"
      volumes:
      - name: iris-external-sys
        persistentVolumeClaim:
          claimName: iris-pvc
      - name: cpf-merge
        configMap:
          name: iris-cpf-merge

 

strategy: Recreateとreplicas: 1では、Kubernetesに、常にIRISポッドの1つのインスタンスのみを実行し続けることを指示しています。 これが「ポッドの削除」シナリオを処理する部分です。

livenessProbeのセクションでは、IRISが常時、コンテナ内で稼働し、「IRIS停止」シナリオを処理できるようにしています。 initialDelaySecondsは、IRISが起動するまでの猶予期間です。 IRISがデプロイを起動するのにかなりの時間が掛かっている場合は、これを増やすと良いでしょう。

IRISのCPF MERGE機能を使用すると、コンテナの起動時に、iris.cpf構成ファイルのコンテンツを変更することができます。 関連するドキュメントについては、 https://docs.intersystems.com/irisforhealthlatestj/csp/docbook/DocBook.UI.Page.cls?KEY=RACS_cpf#RACS_cpf_edit_mergeをご覧ください。 この例では、Kubernetesの構成図を使って、マージファイルのコンテンツを管理しています( https://github.com/antonum/ha-iris-k8s/blob/main/iris-cpf-merge.yaml)。ここでは、IRISインスタンスが使用するグローバルバッファとgmheapの値を調整していますが、iris.cpfファイルにあるものはすべて調整できます。 デフォルトのIRISパスワードでさえも、CPFマージファイルの「PasswordHash」フィールドで変更可能です。 詳細については、https://docs.intersystems.com/irisforhealthlatestj/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_images_password_authをご覧ください。

永続ボリュームクレーム(https://github.com/antonum/ha-iris-k8s/blob/main/iris-pvc.yaml)デプロイ(https://github.com/antonum/ha-iris-k8s/blob/main/iris-deployment.yaml)とCPFマージコンテンツを使った構成図(https://github.com/antonum/ha-iris-k8s/blob/main/iris-cpf-merge.yaml)のほかに、デプロイには、IRISデプロイをパブリックインターネットに公開するサービスが必要です(https://github.com/antonum/ha-iris-k8s/blob/main/iris-svc.yaml)。

kubectl get svc
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)           AGE
iris-svc     LoadBalancer   10.0.18.169   40.88.123.45   52773:31589/TCP   3d1h
kubernetes   ClusterIP      10.0.0.1      <none>          443/TCP           10d

iris-svcの外部IPは、http://40.88.123.45:52773/csp/sys/%25CSP.Portal.Home.zenを介してIRIS管理ポータルにアクセスするために使用できます。 デフォルトのパスワードは「SYS」です。

ストレージのバックアップ/復元とスケーリング

Longhornには、ボリュームの構成と管理を行えるウェブベースのUIがあります。

kubectlを使用して、ポッドや実行中のlonghorn-uiコンポーネントを特定し、ポート転送を確立できます。

kubectl -n longhorn-system get pods
# longhorn-uiのポッドIDに注意してください。

kubectl port-forward longhorn-ui-df95bdf85-gpnjv 9000:8000 -n longhorn-system

Longhorn UIは、http://localhost:9000で利用できるようになります。

図4 LonghornのUI

Kubernetesコンテナストレージのほとんどのソリューションでは、高可用性のほか、バックアップ、スナップショット、および復元のための便利なオプションが用意されています。 詳細は実装によって異なりますが、一般的には、バックアップをVolumeSnapshotに関連付ける方法です。 この方法はLonghornでも利用できます。 使用しているKubernetesのバージョンとプロバイダーによっては、ボリュームスナップショット機能( https://github.com/kubernetes-csi/external-snapshotter)もインストールする必要があります。

そのようなボリュームショットの例には、「iris-volume-snapshot.yaml」が挙げられます。 使用する前に、バックアップを、LonghornのS3バケットまたはNFSボリュームに構成する必要があります。 https://longhorn.io/docs/1.0.1/snapshots-and-backups/backup-and-restore/set-backup-target/

# IRISボリュームのクラッシュコンシステントなバックアップを取得する
kubectl apply -f iris-volume-snapshot.yaml

IRISでは、バックアップ/スナップショットを取得する前にExternal Freezeを実行し、後でThawを実行することをお勧めします。 詳細については、https://docs.intersystems.com/irisforhealthlatestj/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&CLASSNAME=Backup.General#ExternalFreezeをご覧ください。  

IRISボリュームのサイズを増やすには、IRISが使用する、永続ボリュームクレーム(iris-pvc.yamlファイル)のストレージリクエストを調整します。

...
  resources:
    requests:
      storage: 10Gi #change this value to required

そして、pvcの仕様を再適用します。 Longhornは、実行中のポッドにボリュームが接続されている場合、この変更を実際に適用することはできません。 そのため、ボリュームサイズが増えるように、デプロイでレプリカ数を一時的にゼロに変更します。

高可用性 - 概要

この記事の冒頭で、高可用性の基準を設定しました。 このアーキテクチャでは、次のようにそれを実現します。

障害の領域

自動的に緩和処置を行う機能

コンテナ/VM内のIRISインスタンス。 IRIS - レベル障害

IRISが機能停止となった場合、デプロイのLiveness Probeによってコンテナが再起動されます。

ポッド/コンテナの障害

デプロイによってポッドが再作成されます。

個々のクラスタノードの一時的な使用不能。 アベイラビリティーゾーンがオフラインになる場合などが挙げられます。

デプロイによって別のノードにポッドが再作成されます。 Longhornによって、別のノードでデータが使用できるようになります。

個々のクラスタノードまたはディスクの永久的障害。

上記と同様かつ、k8sクラスタオートスケーラーによって、破損したノードが新しいノードに置き換えられます。 Longhornによって、新しいノードにデータが再構築されます。

ゾンビやその他の考慮事項

DockerコンテナでのIRISの実行を理解している方であれば、「--init」フラグを使用したことがあるでしょう。

docker run --rm -p 52773:52773 --init store/intersystems/iris-community:2020.4.0.524.0

このフラグは、「ゾンビプロセス」の形成を防止することを目的としています。 Kubernetesでは、「shareProcessNamespace: true」を使用する(セキュリティの考慮事項が適用されます)か、コンテナで「tini」を使用することができます。 以下に、tiniを使用したDockerfileの例を示します。

FROM iris-community:2020.4.0.524.0
...
# Tiniを追加します
USER root
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
USER irisowner
ENTRYPOINT ["/tini", "--", "/iris-main"]

2021年以降、すべてのInterSystemsが提供するコンテナイメージには、デフォルトでtiniが含まれています。

いくつかのパラメーターを調整することで、「ノードの強制ドレイン/ノードの強制終了」シナリオのフェイルオーバー時間をさらに短縮することができます。

Longhornのポッド削除ポリシー(https://longhorn.io/docs/1.1.0/references/settings/#pod-deletion-policy-when-node-is-down)およびkubernetes taintベースのエビクション機能(https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/#taint-based-evictions)をご覧ください。

免責事項

InterSystemsに勤務する者として、この内容を記載しておく必要があります。この記事では、分散型Kubernetesブロックストレージの一例としてLonghornを使用しています。 InterSystemsは、個々のストレージソリューションや製品を検証ないしは公式なサポート声明を発行していません。 特定のストレージソリューションがニーズに適合しているかどうかは、ユーザー自身がテストして検証する必要があります。

分散ストレージには、ノードローカルストレージとは大きく異なるパフォーマンス特性も備わっています。 特に書き込み操作の場合、データが永続化された状態とみなされるには、データを複数の場所に書き込む必要があります。 必ずワークロードをテストし、CSIドライバが提供する特定の動作とオプションを理解するようにしてください。

InterSystemsでは基本的に、Longhornなどの特定のストレージjソリューションを検証あるいは承認していません。これは、個々のHDDブランドやサーバーハードウェアメーカーを検証しないのと同じです。 個人的には、Longhornは扱いやすいと感じています。プロジェクトのGitHubページ(https://github.com/longhorn/longhorn)では、その開発チームは積極的に応答し、よく助けていただいています。 

まとめ

Kubernetesエコシステムは、過去数年間で大きな進化を遂げました。今日では、分散ブロックストレージソリューションを使用することで、IRISインスタンスやクラスタノード、さらにはアベイラビリティーゾーンの障害を維持できる高可用性構成を構築できるようにもなっています。

計算とストレージの高可用性をKubernetesコンポーネントにアウトソースできるため、従来のIRISミラーリングに比べ、システムの構成と管理が大幅に単純化しています。 ただしこの構成では、ミラーリング構成ほどのRTOとストレージレベルのパフォーマンスは得られないことがあります。

この記事では、Azure AKSをマネージドKubernetesとLonghorn分散ストレージシステムとして使用し、可用性の高いIRIS構成を構築しました。 ほかにも、AWS EKS、マネージドK8s向けのGoogle Kubernetes Engine、StorageOS、Portworx、OpenEBSなどの様々な分散コンテナストレージを探ってみると良いでしょう。エンタープライズ級のストレージソリューションには、NetApp、PureStorage、Dell EMCなどもあります。

付録A: クラウドでのKubernetesクラスタの作成

パブリッククラウドプロバイダーが提供するマネージドKubernetesサービスを使うと、このセットアップに必要なk8sクラスタを簡単に作成できます。 この記事で説明したデプロイには、AzureのAKSデフォルト構成をそのまますぐに使用することができます。

3ノードで新しいAKSクラスタを作成します。 それ以外はすべてデフォルトのままにします。

図5 AKSクラスタの作成

ローカルコンピュータにkubectlをインストールします。https://kubernetes.io/docs/tasks/tools/install-kubectl/

ローカルkubectlにASKクラスタを登録します。

 

図6 kubectlにAKSクラスタを登録

登録が済んだら、この記事の最初に戻って、longhornとIRISデプロイをインストールします。

AWS EKSでのインストールは、もう少し複雑です。 ノードグループのすべてのインスタンスにopen-iscsiがインストトールされていることを確認する必要があります。

sudo yum install iscsi-initiator-utils -y

GKEでのLonghornのインストールには追加の手順があります。https://longhorn.io/docs/1.0.1/advanced-resources/os-distro-specific/csi-on-gke/をご覧ください。

付録B: インストール手順

手順1 - Kubernetesクラスタとkubectl

3ノードk8sクラスタが必要です。 Azureでのクラスタの構成方法は付録Aをご覧ください。

$ kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-agentpool-29845772-vmss000000   Ready    agent   10d   v1.18.10
aks-agentpool-29845772-vmss000001   Ready    agent   10d   v1.18.10
aks-agentpool-29845772-vmss000002   Ready    agent   10d   v1.18.10

手順2 - Longhornをインストールする

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

「longhorn-system」ネームスペースのすべてのポッドが実行状態であることを確認してください。 これには数分かかる場合があります。

$ kubectl get pods -n longhorn-system
NAME                                       READY   STATUS    RESTARTS   AGE
csi-attacher-74db7cf6d9-jgdxq              1/1     Running   0          10d
csi-attacher-74db7cf6d9-l99fs              1/1     Running   1          11d
...
longhorn-manager-flljf                     1/1     Running   2          11d
longhorn-manager-x76n2                     1/1     Running   1          11d
longhorn-ui-df95bdf85-gpnjv                1/1     Running   0          11d

詳細とトラブルシューティングについては、Longhornインストールガイド(https://longhorn.io/docs/1.1.0/deploy/install/install-with-kubectl)をご覧ください。

手順3 - GitHubリポジトリのクローンを作成する

$ git clone https://github.com/antonum/ha-iris-k8s.git
$ cd ha-iris-k8s
$ ls
LICENSE                   iris-deployment.yaml      iris-volume-snapshot.yaml
README.md                 iris-pvc.yaml             longhorn-aws-secret.yaml
iris-cpf-merge.yaml       iris-svc.yaml             tldr.yaml

手順4 - コンポーネントを1つずつデプロイして検証する

tldr.yamlファイルには、デプロイに必要なすべてのコンポーンネントが1つのバンドルとして含まれています。 ここでは、コンポーネントを1つずつインストールし、それぞれのセットアップを個別に検証します。

# 以前にtldr.yamlを適用したことがある場合は、削除します。
$ kubectl delete -f https://github.com/antonum/ha-iris-k8s/raw/main/tldr.yaml

永続ボリュームクレームを作成します

$ kubectl apply -f iris-pvc.yaml persistentvolumeclaim/iris-pvc created

$ kubectl get pvc NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE iris-pvc   Bound    pvc-fbfaf5cf-7a75-4073-862e-09f8fd190e49   10Gi       RWO            longhorn       10s

構成図を作成します

$ kubectl apply -f iris-cpf-merge.yaml

$ kubectl describe cm iris-cpf-merge Name:         iris-cpf-merge Namespace:    default Labels:       <none> Annotations:  <none>

Data

merge.cpf:

[config] globals=0,0,800,0,0,0 gmheap=256000 Events:  <none>

irisデプロイを作成します

$  kubectl apply -f iris-deployment.yaml deployment.apps/iris created

$ kubectl get pods                     NAME                    READY   STATUS              RESTARTS   AGE iris-65dcfd9f97-v2rwn   0/1     ContainerCreating   0          11s

ポッド名を書き留めます。 この名前は、次のコマンドでポッドに接続する際に使用します。

$ kubectl exec -it iris-65dcfd9f97-v2rwn   -- bash

irisowner@iris-65dcfd9f97-v2rwn:~$ iris session iris Node: iris-65dcfd9f97-v2rwn, Instance: IRIS

USER>w $zv IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2020.4 (Build 524U) Thu Oct 22 2020 13:04:25 EDT

h<enter>でIRISシェルを終了

exit<enter>でポッドを終了

IRISコンテナのログにアクセスします

$ kubectl logs iris-65dcfd9f97-v2rwn ... [INFO] ...started InterSystems IRIS instance IRIS 01/18/21-23:09:11:312 (1173) 0 [Utility.Event] Private webserver started on 52773 01/18/21-23:09:11:312 (1173) 0 [Utility.Event] Processing Shadows section (this system as shadow) 01/18/21-23:09:11:321 (1173) 0 [Utility.Event] Processing Monitor section 01/18/21-23:09:11:381 (1323) 0 [Utility.Event] Starting TASKMGR 01/18/21-23:09:11:392 (1324) 0 [Utility.Event] [SYSTEM MONITOR] System Monitor started in %SYS 01/18/21-23:09:11:399 (1173) 0 [Utility.Event] Shard license: 0 01/18/21-23:09:11:778 (1162) 0 [Database.SparseDBExpansion] Expanding capacity of sparse database /external/iris/mgr/iristemp/ by 10 MB.

irisサービスを作成します

$ kubectl apply -f iris-svc.yaml    service/iris-svc created

$ kubectl get svc NAME         TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)           AGE iris-svc     LoadBalancer   10.0.214.236   20.62.241.89   52773:30128/TCP   15s

手順5 - 管理ポータルにアクセスする

最後に、サービスの外部IP(http://20.62.241.89:52773/csp/sys/%25CSP.Portal.Home.zen)を使って、IRISの管理ポータルに接続します。ユーザー名は「_SYSTEM」、パスワードは「SYS」です。 初回ログイン時にパスワードの変更が求められます。

 

0
0 1217
記事 Tomohiro Iwamoto · 2月 16, 2021 19m read

目的

CloudFormationの記事は、Linux系のものが多いですが、Windowsでも自動化したいという需要がありそうですので、オリジナル記事を元に、CloudFormationを使用してミラークラスターをWindowsサーバにデプロイする例を実装してみました。また、簡単な実行例も追加しました。
ソースコード一式はこちらのGitレポジトリにあります。

更新: 2021年3月1日 ワンライナーで踏み台ホスト経由でWindowsに公開鍵認証する方法を追記しました

更新: 2022年11月29日 QuickStartの形式に合わせて大幅に変更しました。以前の内容はこちらに保存してあります。

更新: 2022年12月21日 踏み台ホストの使用を止め、代わりにAWS System Manager(SSM)を有効化しました。プライベートサブネット上のインスタンスへのアクセスが簡素化されます。以前の内容はこちらに保存してあります。

事前準備

QuickStartのデプロイ方法に従います。

非公開のS3バケットにIRISのキット及びライセンスキーをアップロードします。

  • IRISをWindowsにデプロイする場合
S3BucketName=<my bucket>
aws s3 mb s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-win_x64.exe s3://$S3BucketName
  • IRISをLinux(AmazonLinuxあるいはRedHat7/x64)にデプロイする場合
S3BucketName=<my bucket>
aws s3 mb s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
  • IRISをLinux(Ubuntu/x64)にデプロイする場合
S3BucketName=<my bucket>
aws s3 mb s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-lnxubuntu2004x64.tar.gz s3://$S3BucketName

このテンプレートは、AmazonLinuxを使用しています。RedHat7もしくはUbuntuを利用する場合は、別途「カスタマイズ候補」のチャプターの作業が必要です

また、事前にAWS上に用意されているテンプレートではなく、カスタマイズを行ったテンプレートを使用するので、下記を実行します。

QSS3BucketNameはS3BucketNameと同じでも、異なっていても構いません。

$ git clone https://github.com/IRISMeister/AWSIRISDeployment.git --recursive
$ cd AWSIRISDeployment

Windowsにデプロイする場合

QSS3BucketName=<my bucket>
aws s3 cp quickstart-intersystems-iris-windows s3://$QSS3BucketName/quickstart-intersystems-iris-windows --recursive
aws s3 cp submodules/quickstart-aws-vpc/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc --recursive
aws s3 cp submodules/quickstart-linux-bastion/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive
aws s3 cp submodules/quickstart-linux-bastion/scripts s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive

Linuxにデプロイする場合

QSS3BucketName=<my bucket>
aws s3 cp quickstart-intersystems-iris s3://$QSS3BucketName/quickstart-intersystems-iris --recursive
aws s3 cp submodules/quickstart-aws-vpc/templates s3://$QSS3BucketName/quickstart-intersystems-iris/submodules/quickstart-aws-vpc --recursive
aws s3 cp submodules/quickstart-linux-bastion/templates s3://$QSS3BucketName/quickstart-intersystems-iris/submodules/quickstart-linux-bastion --recursive
aws s3 cp submodules/quickstart-linux-bastion/scripts s3://$QSS3BucketName/quickstart-intersystems-iris/submodules/quickstart-linux-bastion --recursive

実行例

以下、既存VPCにWindows版IRISのミラー構成をデプロイする際の実行例です。

VPCを新規作成する場合は、下記のVPC関連の事前準備は不要です。

事前準備

VPC関連

既存VPC上に、以下のリソースを事前に用意しました。

デプロイ実行時にNATゲートウエイが無いと、スタックの作成に失敗します。必ず用意してください。

  • パブリックサブネット
    image

  • プライベートサブネット
    image

  • ルートテーブル/ルート
    image

  • ルートテーブル/サブネットの関連付け
    image

  • NATゲートウエイ
    image

S3への各種ファイルのアップロード

S3BucketName=iwamoto-cf-templates
aws s3 mb s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-win_x64.exe s3://$S3BucketName

git clone https://github.com/IRISMeister/AWSIRISDeployment.git
cd AWSIRISDeployment
# キットファイル格納先と同じbucketを使用しています
QSS3BucketName=iwamoto-cf-templates
aws s3 cp quickstart-intersystems-iris-windows s3://$QSS3BucketName/quickstart-intersystems-iris-windows --recursive
aws s3 cp submodules/quickstart-aws-vpc/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc --recursive
aws s3 cp submodules/quickstart-linux-bastion/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive
aws s3 cp submodules/quickstart-linux-bastion/scripts s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive

このような内容になります。

aws s3 ls s3://$QSS3BucketName --recursive
2022-06-15 07:48:57  675737136 IRIS-2022.1.0.209.0-win_x64.exe
2022-10-12 01:09:57   16139988 ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz
2022-03-29 07:11:24        546 iris.key
2022-11-25 09:15:50          0 quickstart-intersystems-iris-windows/
2022-11-25 09:16:05          0 quickstart-intersystems-iris-windows/scripts/
2022-11-28 05:34:49       6008 quickstart-intersystems-iris-windows/scripts/MirrorInstaller.xml
2022-11-28 13:34:52          0 quickstart-intersystems-iris-windows/submodules/
2022-11-28 13:34:52          0 quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc/
2022-11-28 13:34:52          0 quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc/templates/
2022-11-28 13:34:52      59966 quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc/templates/aws-vpc.template.yaml
2022-11-28 13:34:52          0 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/
2022-11-28 13:34:52          0 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/
2022-11-28 13:34:52        531 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/auditing_configure.sh
2022-11-28 13:34:52        881 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/banner_message.txt
2022-11-28 13:34:52      11763 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/bastion_bootstrap.sh
2022-11-28 13:34:52          0 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/templates/
2022-11-28 13:34:52      24068 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/templates/linux-bastion.template
2022-11-25 09:16:16          0 quickstart-intersystems-iris-windows/templates/
2022-11-28 09:35:42       6059 quickstart-intersystems-iris-windows/templates/iris-cluster-arbiter-node.template.yaml
2022-11-28 09:35:42      21529 quickstart-intersystems-iris-windows/templates/iris-cluster-iris-node.template.yaml
2022-11-28 09:35:42      13736 quickstart-intersystems-iris-windows/templates/iris-cluster-main.template.yaml
2022-11-28 09:35:43      10403 quickstart-intersystems-iris-windows/templates/iris-entrypoint-new-vpc.template.yaml

(オプション)全パラメータ設定済みyamlの編集

繰り返し実行することを考慮して、パラメータを全て指定した状態のテンプレートを作成しておくと便利です。

vi test-iris-cluster-main-windows.yaml

編集後のファイルをうっかり公開してしまわないよう注意してください

編集時の注意

  • BastionSubnetIdParameterには、異なるAZに属する2つのpublic subnetを指定してください。
  • InstanceSubnetIdParameterには、異なるAZに属する3つのsubnetを指定してください。はじめの2つがIRISホスト、最後に指定したサブネットがArbiterホストが稼働するサブネットになります。
  • IRISをインストールするホストは、インストール作業の際にインターネットへのアクセスを行います。具体的にはs3アクセスのためにaws cliが必要(amazon linuxと違ってUbuntuにはプリインストールされていません)なのですが、その他にもchocolateyを使用してaws cliをインストールしています。NATゲートウェイ等を構成済みのプライベートサブネットを構築済みで無い場合は、こちらを参考にして一時的に追加してください。

NATゲートウェイは存在するだけでコストが発生します。(VM起動直後のS/Wインストール時など)必要な時に作成し、不要になったらすぐ削除したかったので、別のCFテンプレートにしています。

コンソールからCloudFormationの実行

  1. スタックを「新しいリソースを使用」して作成します。

テンプレートソースには「テンプレートファイルのアップロード」を選択し、先ほど編集したファイル(test-iris-cluster-main-windows.yaml)を指定します。

「スタックの詳細を指定」画面でパラメータを設定します。

パラメータ設定値例
BastionSubnetIdParametersubnet-0f7c4xxxxxxxxxxxx,subnet-05b42xxxxxxxxxxxx
IRISPasswordParameterSYS1
InstanceSubnetIdParametersubnet-0180bxxxxxxxxxxxx,subnet-03272xxxxxxxxxxxx,subnet-08e8fxxxxxxxxxxxx
QSS3BucketNameiwamoto-cf-templates
QSS3BucketRegionap-northeast-1
QSS3KeyPrefixquickstart-intersystems-iris-windows/
S3BucketNameParameteriwamoto-cf-templates
SshKeyParameteraws
VpcIdParametervpc-0e538xxxxxxxxxxxx

「スタックオプションの設定」画面に特に設定はありません。実行がうまくいかない場合は、スタックの作成オプションの「失敗時のロールバック」を無効にしておくと、作成された環境がロールバックされずに残りますので、問題の解析がしやすくなります(不要になったら、忘れずに削除すること)。

「レビュー」画面で、「The following resource(s) require capabilities:」で、下記にチェックをいれる必要があります。

  • AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。
  • AWS CloudFormation によって、次の機能が要求される場合があることを承認します: CAPABILITY_AUTO_EXPAND

「スタックの作成」ボタンを押します。複数のネストされたスタックの作成が開始されます。

  1. 出力内容を確認します。 スタックのステータスがCREATE_COMPLETEになるまで待機します(15分ほどかかりました)。
    スタック(アップロードしたスタックではなく、ネストされたxxx-IRISStack-xxxx)の出力を表示します。ギアアイコンで行の折り返し指定が出来ます。
Stackキー説明
IRIStackJDBCEndpointjdbc:IRIS://xxxx-NLB-xxxxx.elb.ap-northeast-1.amazonaws.com:51773/DATAJDBC Connection String
IRIStackNode01InstanceIdi-xxxxxxxxxxNode 01 Instance ID
IRIStackNode01PrivateIP10.0.12.85Node 01 Private IP
IRIStackNode02InstanceIdi-xxxxxxxxxxNode 02 Instance ID
IRIStackNode02PrivateIP10.0.10.159Node 02 Private IP

これらの出力値を記録しておいてください。

IRIS管理ポータルへのアクセス

Node01ホスト(ミラープライマリサーバ)の管理ポータルに接続します。下記のコマンドを実行します。

  • 踏み台ホストを使用しない場合

セッションマネージャのポート転送を利用します。事前にAWS CLIのインストール・構成SSMプラグインのインストールが必要です。私はWindows10+WSL2(Ubuntu)を使用していますので、下記を実行しました。

$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
$ sudo dpkg -i session-manager-plugin.deb
$ export instanceid=i-xxxxxxxxxx
$ aws ssm start-session --target $instanceid \
                        --document-name AWS-StartPortForwardingSession \
                        --parameters '{"portNumber":["52773"],"localPortNumber":["52773"]}'

SSHトンネルを作成する方法もあります。

  • 踏み台ホストを使用する場合
BastionPublicIP=54.168.xxx.xxx
Node01PrivateIP=10.0.12.85
ssh -i aws.pem -L 52773:$Node01PrivateIP:52773 ec2-user@$BastionPublicIP

この時点で、http://localhost:52773/csp/sys/UtilHome.csp で管理ポータルにアクセスできます。アカウントはSuperUser、パスワードはスタックのパラメータで指定したものを使用します。ミラーの状態を確認するために、管理ポータルのホーム画面の右端に「ミラー・モニターを表示」というリンクがありますので、クリックします。以下の画面のように表示されていれば正常です。

image

WindowsへのRDP接続

RDP接続する場合は、(推奨に従って)Node01をプライベートサブネットに作成している場合、ssh同様、RDPも直接接続できません。フリートマネージャーをRDPの代替えとして利用可能です。

image

フリートマネージャーを使しない場合は、下記のようなコマンドをローカルで実行し、localhostから転送する必要があります。

  • 踏み台ホストを使用しない場合
$ export instanceid=i-xxxxxxxxxx
$ aws ssm start-session --target $instanceid \
                       --document-name AWS-StartPortForwardingSession \
                       --parameters '{"portNumber":["3389"],"localPortNumber":["33389"]}'
  • 踏み台ホストを使用する場合
ssh -i aws.pem -L 33389:$Node01PrivateIP:3389 ec2-user@$BastionPublicIP

Windowsのパスワードは、AWSコンソールからのRDP接続方法で取得します。 その上で、RDPでlocalhost:33389に接続し、Administrator/取得したパスワード、でログインします。

Linuxへの接続

  • 踏み台ホストを使用しない場合

SSMのセッションマネージャを使用します。

image

あるいは、~/.ssh/configを設定することで、SSM経由でSSHアクセスすることも可能です。

$ export instanceid=i-xxxxxxxxxx
$ ssh -i aws.pem ec2-user@$instanceid
  • 踏み台ホストを使用する場合
BastionPublicIP=54.168.xxx.xx
Node01PrivateIP=10.0.12.85
ssh -i aws.pem -L 52773:$Node01PrivateIP:52773 ec2-user@$BastionPublicIP
ssh -i aws.pem -L 33389:$Node01PrivateIP:3389 ec2-user@$BastionPublicIP
ssh -i aws.pem -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@$BastionPublicIP" ec2-user@$Node01PrivateIP
or
ssh -i aws.pem -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@$BastionPublicIP" ubuntu@$Node01PrivateIP

BastionPublicIPは、事前に用意した踏み台ホストの公開IPです。

動作確認

  • 外部ロードバランサ経由のアクセス
    この時点で、JDBC経由でアクセス可能になっているはずです。JDBCEndpointを使用してアクセスします。

手順は省略します。実行にはJDBCドライバが必要です。

カスタマイズ候補

Windows

iris-cluster-iris-node.template.yamlでPSファイル等を作成しています。下記の箇所は、環境・目的に応じて変更してください。

  • Windows環境のローカライズ(timezone, firewall設定)

    • c:\cfn\scripts\Setup-config.ps1 注意) firewallを無効に設定しています
  • ドライブの作成、割り当て

    • Resourcesセクション
    Resources:
    NodeInstance:
        Properties:
        BlockDeviceMappings:
    
    • c:\cfn\scripts\drives.diskpart.txt
  • IRISインストール先など

    • c:\cfn\scripts\Install-IRIS.ps1
        $irisdir="h:\InterSystems\IRIS"
        $irissvcname="IRIS_h-_intersystems_iris"
        $irisdbdir="I:\iris\db\"
        $irisjrndir="J:\iris\jrnl\pri"
        $irisjrnaltdir="K:\iris\jrnl\alt"
    

    このpsファイルは、実行時に作成される/temp/envs.ps1と組み合わせれば、IRISの無人インストール用のスクリプトとして機能します。

  • プリインストールするソフトウェア

    • c:\cfn\scripts\Install-choco-packages.ps1
      s3からファイルを入手する場合、awscliは必須です。利便性のためnotepadplusplus, google chromeを追加インストールしています。

Linux

  • O/Sの指定

    現在、O/Sは利便性によりAmazon Linuxを指定してあります。

O/SをRedHatに変更するには下記ファイルの内容を変更してください。

quickstart-intersystems-iris\templates\iris-cluster-iris-node.template.yaml

  LatestAmiIdParameter:
    Type: AWS::EC2::Image::Id
    Default: ami-0be4c0b05bbeb2afd

O/SをUbuntuに変更するには下記ファイルの内容を変更してください。

quickstart-intersystems-iris\templates\iris-cluster-iris-node.template.yaml

  LatestAmiIdParameter:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: /aws/service/canonical/ubuntu/server/focal/stable/current/amd64/hvm/ebs-gp2/ami-id
  IRISKitNameParameter:
    Type: String
    Default: IRIS-2022.1.0.209.0-lnxubuntu2004x64

オリジナル(quickstart)との差異

デプロイ先をWindowsに変更する際に、Linux版との互換性を維持したままで、いくつかの修正を加えました。

  • Windowsの起動に時間がかかるため、デフォルトのInstance typeをm5.largeからm5.xlargeに変更。gp2をgp3に変更。IOPSを指定。

  • LatestAmiIdForIRISParameterパラメータを新設。Windowsのキット(日本語版、英語版等)の指定。

  • IRISKitNameParameterパラメータを新設。キット名の指定。

  • RDPアクセス用にSecurityGroupIngress(ポート:3389)を追加

  • SE.ShardInstallerクラス修正

    • CreateMirrorSet(), JoinAsFailover()を変更
      ##class(SYS.Mirror).CreateMirrorSet(),JoinAsFailover()実行時のECPAddressのデフォルト($system.INetInfo.LocalHostName())が、Windowsでは"EC2AMAZ-F1UF3QM"のようなWindowsホスト名になる。このホスト名では他のホストからDNSで名前解決できないので、JoinMirrorAsFailoverMember()がエラーになる。そのため、下記を追加。

    CreateMirrorSet()

    set mirror("ECPAddress") = hostName  // Windows on AWS need this
    

    JoinAsFailover()

    set MirrorInfo("ECPAddress") = hostName  // Windows on AWS need this
    
  • Roleを追加

キット用S3バケットに対するs3:GetObject
ec2:Describe*
ec2:DeleteRoute
ec2:CreateRoute
ec2:ReplaceRoute

セッションマネージャ有効化のため
AmazonSSMManagedInstanceCore

  • Linux用のcloud-initのUserData(初回起動時に実行されるshell)にO/SがUbuntu,RedHat7の場合分けを追加
  • 踏み台ホストをデプロイしない代わりにAWS System Managerを有効化

その他

1. LBのヘルスチェック値

LBのヘルスチェックのデフォルト値を使用しています。quickstart-intersystems-iris-windows\templates\iris-cluster-main.template.yamlのコメントを解除して適切な値に調整してください。

      #HealthCheckTimeoutSeconds: 10
      #HealthCheckIntervalSeconds: 10
      #UnhealthyThresholdCount: 3

2. テンプレートとAWSリソースの関係

以下、テンプレートと作成されるAWSリソースの関係です。

テンプレート名作成されるリソース
iris-cluster-iris-node.template.yamlスタンドアロン
iris-cluster-iris-main.template.yamlミラー環境
iris-entrypoint-new-vpc.template.yamlVPC+ミラー環境

AWS System Managerを有効化しているため、いずれも踏み台ホストは作成しません。必要であれば、このテンプレートを参考にして作成しください。

3. テンプレートのデフォルト値

環境の明滅を繰り返し実行する可能性がある場合、パラメータを全て指定した状態のテンプレートを別途作成しておくと便利です。

テンプレート名O/S用途
test-iris-cluster-iris-node-linux.yamlLinuxスタンドアロン
test-iris-cluster-iris-node-windows.yamlWindowsスタンドアロン
test-iris-cluster-iris-main-linux.yamlLinuxミラー環境
test-iris-cluster-iris-main-windows.yamlWindowsミラー環境
test-iris-entrypoint-new-vpc-linux.yamlLinuxVPC+ミラー環境
test-iris-entrypoint-new-vpc-windows.yamlWindowsVPC+ミラー環境

例えば、スタンドアローン構成でIRISを起動したい場合は、下記のファイルを編集します。

$ #デプロイするサブネット(InstanceSubnetIdParameterの値)には既存のパブリックサブネットを指定してください
$ vi test-iris-cluster-iris-node-linux.yaml

スタック作成時に、test-iris-cluster-iris-node-windows.yamlを指定すれば、スタンドアローン構成でIRISを起動することが出来ます。

3. WindowsへのSSH

SSMのセッションマネージャを使用します。

踏み台ホストの使用を止めたため、下記内容は無効になりました。下記の方法を試す場合は、別途、こちらのようなテンプレートを利用して踏み台ホストを作成してください。

IRIS稼働ホストにOpenSSHをインストールすれば、踏み台ホスト経由で、IRISホストにSSHする事が可能です。ただし、Linux版に比べて、Windows版のIRISではCLIで実行できることが限られているため、効果は限定的です。
IRIS稼働ホストで実行。

PS C:\Users\Administrator> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
PS C:\Users\Administrator> Start-Service sshd

Windowクライアントからアクセスする際には、Windows版OpenSSHクライアント固有の問題「posix_spawn: No such file or directory」を回避するために、Git同梱のBashを使用しました。

user@DESKTOP-XXXX MINGW64 ~ ssh -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@54.95.xxx.xxx"  Administrator@10.0.0.62
Administrator@10.0.0.62's password: RDP接続の際に取得したパスワード

(load pubkey "aws.pem": invalid format が出ますが無視)

また、ひと手間いりますが、踏み台ホストの.ssh/authorized_keys(パブリックキー)を、デプロイ先のWindowsにコピーすれば、ワンライナーで公開鍵認証できます。

user@DESKTOP-XXXX MINGW64 ~ ssh -i aws.pem -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@54.95.xxx.xxx" Administrator@10.0.0.62

Adminグループには特別の設定が必要でした。こちらのConfiguring the Serverを参考にしました。

4. cfn-init.logにPythonのエラーが出る場合

cfn-init.logに下記のようなエラーが出ることがあるようです。

2021-02-12 02:50:32,957 [ERROR] -----------------------BUILD FAILED!------------------------
2021-02-12 02:50:32,957 [ERROR] Unhandled exception during build: 'utf8' codec can't decode byte 0x83 in position 8: invalid start byte

回避されることを期待して、Install-IRIS.ps1に、以下の命令を追加しています。

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

参考にしたサイト

下記のサイトを参考にしています。

0
0 767
記事 Toshihiko Minamoto · 2月 11, 2021 27m read

InterSystems IRIS デプロイガイド - AWS CloudFormation テンプレート 

  注意: 本ガイド (特に前提条件のセクション) を理解するには、AWS に関する中級から上級レベルの知識が必要になります。 S3 バケット、EC2 インスタンスの IAM ロール、VPC、サブネットを作成する必要があります。 また、InterSystems バイナリへのアクセス (通常は WRC サイトからダウンロード可) および IRIS のライセンスキーも必要になります。
  2020 年 8月 12日
Anton Umnikov

テンプレートのソースコードは、こちらから入手していただけます: https://github.com/antonum/AWSIRISDeployment

目次

InterSystems IRIS デプロイガイド – AWS パートナーネットワーク

はじめに

前提条件と要件

所要時間

製品ライセンスとバイナリ

AWS アカウント

IAM エンティティ (ユーザー)

EC2 の IAM ロール

S3 バケット

VPC とサブネット

EC2 キーペア

必要な知識

アーキテクチャ

マルチ AZ 配置による耐障害性を備えたアーキテクチャダイアグラム (優先)

シングルインスタンンス、シングル AZ 配置のアーキテクチャダイアグラム (開発およびテスト)

デプロイメント

セキュリティ

プライベートサブネットのデータ

保存されている IRIS データの暗号化

転送中の IRIS データの暗号化

IRIS Management Portal への安全なアクセス

ログ / 監査 / モニタリング

サイジング / コスト

デプロイアセット

デプロイオプション

デプロイアセット (プロダクションに推奨)

CloudFormation テンプレートの入力パラメータ

クリーンアップ

デプロイのテスト

正常性チェック

フェイルオーバーテスト

バックアップと回復

バックアップ

インスタンスの障害

アベイラビリティーゾーン (AZ) の障害

リージョンの障害

RPO/RTO

ストレージ容量

セキュリティ証明書の期限

日常的なメンテナンス

緊急メンテナンス

サポート

トラブルシューティング

InterSystems サポートへの問い合わせ

付録

IAM Policy for EC2 instance

 

はじめに

InterSystems は、ユーザーの皆さまに InterSystems と AWS のベストプラクティスに則したかたちで独自の InterSystems IRIS® データプラットフォームをセットアップしていただけるよう CloudFormation テンプレートを提供しております。

本ガイドでは、CloudFormation テンプレートをデプロイするステップを詳しく解説していきます。 

本ガイドでは、InterSystems IRIS CloudFormation テンプレートをデプロイする 2 種類の方法をご紹介します。 1 つ目は、複数のアベイラビリティーゾーン (AZ) を使い、プロダクションのワークロードを対象とした可用性の高い方法で、2 つ目は、開発とテストのワークロードを対象に、単一のアベイラビリティーゾーンにデプロイする方法です。

前提条件と要件

このセクションでは、当社のソリューションを実行、操作していただくための前提条件と要件について詳しく説明します。

所要時間

デプロイ自体は 4 分程度で完了しますが、前提条件やテストの時間を入れると、最大 2 時間ほどかかります。

製品ライセンスとバイナリ

InterSystems のお客様には、https://wrc.intersystems.com より InterSystems IRIS のバイナリをご使用いただけます。 WRC の認証情報を使ってログインしてから、リンクに従って Actions -> SW Distributions -> InterSystems IRIS と順に移動してください。 このデプロイガイドは、InterSystems IRIS 2020.1 のビルド 197 の Red Hat プラットフォーム向けに作成されています。 IRIS のバイナリファイル名は、 ISCAgent-2020.1.0.215.0-lnxrhx64.tar.gz および IRISHealth-2020.1.0.217.1-lnxrhx64.tar.gz形式で書かれています。 InterSystems IRIS のライセンスキーは、既存のライセンスキー (iris.key) を使用いただけるはずです。 また、InterSystems IRIS Evaluation Service (https://download.intersystems.com/download/register.csp) より評価キーをリクエストしていただくこともできます。

AWS アカウント

セットアップ済みの AWS アカウントが必要です。 お持ちでない方は、 https://aws.amazon.com/getting-started/ よりセットアップしてください。

IAM エンティティ (ユーザー)

IAM (ユーザーまたはロール) を作成します。 IAM ユーザーは、AWS CloudFormation のアクションを許可するポリシーが必要です。 CloudFormation テンプレートをデプロイするのに、ルートアカウントは使わないでください。 AWS CloudFormation のアクションに加え、スタックを作成または削除する IAM ユーザーは、スタックテンプレートに依拠する別のアクセス権限も必要になります。 このデプロイでは、次のセクションで紹介するすべてのサービスへのアクセス権が必要になります。参考資料: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html

EC2 の IAM ロール

CloudFormation テンプレートは、EC2 インスタンスが S3 バケットにアクセスし、CloudWatch にログを入力するのを許可する IAM ロールが必要です。 そうようなロールに関連するポリシーの例については、「IAM Policy for EC2 instance」と題した付録をご参照ください。参考資料: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html

S3 バケット

「my bucket」という名前の S3 バケットを作成し、IRIS のバイナリファイルと iris.key をコピーします。

BUCKET=

aws s3 mb s3://$BUCKET

aws s3 cp ISCAgent-2020.1.0.215.0-lnxrhx64.tar.gz s3://$BUCKET

aws s3 cp IRISHealth-2020.1.0.217.1-lnxrhx64.tar.gz s3://$BUCKET

aws s3 cp iris.key s3://$BUCKET

VPC とサブネット

テンプレートは、IRIS を既存の VPC とサブネットにデプロイするようにデザインされています。 AZ が 3 つ以上あるリージョンでは、3 つの異なる AZ でプライベートサブネットを 3 つ作成することを推奨しています。 Bastion Host は、VPC 内にあるパブリックサブネットのいずれかに配置します。 CloudFormation テンプレート (https://docs.aws.amazon.com/codebuild/latest/userguide/cloudformation-vpc-template.html) を基に VPC とサブネットを作成するには、AWS の例に従ってください。

EC2 キーペア

このテンプレートによってプロビジョンされる EC2 インスタンスにアクセスするには、EC2 キーペアが少なくとも 1 つは必要です。 詳細は、こちらのガイドをご参照ください: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html

必要な知識

以下の AWS サービスに関する知識が必要になります。

  • Amazon Elastic Compute Cloud (Amazon EC2)
  • Amazon Virtual Private Cloud (Amazon VPC)
  • AWS CloudFormation
  • AWS Elastic Load Balancing
  • AWS S3
  • このデプロイを実行するにあたり、アカウント制限の引き上げは必要ありません。

    適切なポリシーやアクセス権限の詳細は、こちらでご確認くださいhttps://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html

    注意: AWS アソシエイト認定をお持ちのユーザーなら、十分な知識を修得していると思われます。

    アーキテクチャ

    このセクションでは、考えられる 2 つのパターンのデプロイを対象としたアーキテクチャダイアグラムをご紹介し、アーキテクチャデザインの選択肢についても解説します。

    マルチ AZ 配置による耐障害性を備えたアーキテクチャダイアグラム (優先)

    優先されるこのオプションでは、高い可用性と耐障害性を確保するために、IRIS のミラー化されたインスタンスが 2 つのアベイラビリティーゾーンでロードバランサーの後に置かれます。 アベイラビリティーゾーンが 3 以上あるリージョンでは、Arbiter ノードが 3 つ目の AZ に置かれます。

    データベースノードは、プライベートサブネットに置かれます。 Bastion Host は、同じ VPC 内のパブリックサブネットにあります。

  • Network Load Balancer は、データベースのトラフィックを現在のプライマリ IRIS ノードに移動させます。
  • Bastion Host は、IRIS EC2 インスタンスへの安全なアクセスを実現します。
  • IRIS は、すべての顧客データを暗号化された EBS ボリュームに保存します。
    1. EBS は暗号化され、AWS Key Management Service (KMS) により管理されるキーを使用します。
    2. 転送中のデータの暗号化が必要とされる規制ワークロードについては、インスタンスの r5n ファミリーを使用すると、インスタンス間のトラフィックが自動的に暗号化されるので便利です。 IRIS レベルでトラフィックを暗号化することも可能ですが、CloudFormation はこれを有効化していません (本ガイドの「転送中の IRIS データの暗号化」のセクションをご覧ください)。
  • セキュリティグループを使用すると、必要なトラフィックだけを許可できるため、アクセスを可能な限り制限できます。
  • シングルインスタンンス、シングル AZ 構成アーキテクチャダイアグラム (開発およびテスト)

    InterSystems IRIS は、開発や評価を行う目的で、1 つのアベイラビリティーゾーンにデプロイすることもできます。 データフローやアーキテクチャのコンポーネントは、前のセクションで説明したものと同じです。 このソリューションは、高い可用性も、耐障害性も提供しないため、プロダクションでの使用には適していません。

     

    デプロイメント

  • 「前提条件」のセクションで作成した IAM エンティティ (ソリューションのデプロイに必要な権限を持つ IAM エンティティ) を使って、AWS アカウントにログインします。
  • VPC、S3 バケット、IRIS バイナリ、ライセンスキーなど、前提条件がすべて整っていることを確認します。
  • 以下のリンクをクリックし、マルチ AZ 配置による耐障害性を備えた CloudFormation テンプレートをデプロイします (デプロイ先は us-east-1): https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=InterSystemsIRIS&templateURL=https://isc-tech-validation.s3.amazonaws.com/MirrorCluster.yaml
  • 「Step 1 - Create Stack」で、「Next」ボタンをクリックします。
  • 「Step 2 - Specify stack details」で、要件に合わせて CloudFormation パラメータを入力、調整します。
  • 「Next」ボタンをクリックします。
  • 「Step 3 - Configure stack options」で、オプションのタグ、権限、詳細オプションを入力、調整します。
  • 「Next」ボタンをクリックします。
  • CloudFormation の設定を確認します。
  • 「Create Stack」ボタンをクリックします。
  • CloudFormation テンプレートがデプロイされるまで、4 分ほど待ちます。
  • デプロイのステータスが「CREATE_COMPLETE」になっていれば、デプロイは成功です。
  • ステータスが「CREATE_FAILED」になっていれば、本ガイドの「トラブルシューティング」のセクションをご覧ください。
  • デプロイが完了したら、本ガイドの「正常性チェック」を実行してください。
  • セキュリティ

    このセクションでは、このガイドを実行してデプロイされる InterSystems IRIS のデフォルト設定、ベストプラクティスの概要、AWS でソリューションをセキュリティ保護するオプションについて解説します。

    プライベートサブネットのデータ

    InterSystems IRIS の EC2 インスタンスは、プライベートサブネットに配置し、それへのアクセスは Bastion Host を経由する場合か、ロードバランサーを経由するアプリケーションに限定する必要があります。

    保存されている IRIS データの暗号化

    InterSystems IRIS を実行するデータベースインスタンスでは、保存データは基になる (かつ暗号化されている) EBS ボリューム内に格納されます。 この CloudFormation テンプレートは、アカウントのデフォルトの AWS マネージドキーで暗号化される「aws/eb」という名前の EBS ボリュームを作成します。

    転送中の IRIS データの暗号化

    この CloudFormation では、クライアントとサーバー間の接続と、インスタンス間の接続はセキュリティ保護されません。 転送中のデータを暗号化する必要がある場合は、デプロイが完了してから、以下のリンクに記載されているステップを実行してください。

    SuperServer 接続 (JDBC/ODBC の接続) で SSL を有効化するステップ: https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=GCAS_ssltls#GCAS_ssltls_superserver

    IRIS EC2 インスタンス間では、耐久性を備えたマルチ AZ 構成のトラフィックも暗号化が必要になる場合があります。 これは、ミラー化に対し SSL 暗号化を有効にする (https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=GCAS_ssltls#GCAS_ssltls_mirroring) か、インスタンス間のトラフィックを自動的に暗号化する、インスタンスの r5n ファミリーに切り替えることで実現できます。

    AWS Certificate Manager (ACM) を使用すれば、Secure Sockets Layer/Transport Layer Security (SSL/TLS) 証明書のプロビジョン、管理、デプロイを簡単に行えます。

    IRIS Management Portal への安全なアクセス

    デフォルトで、IRIS Management Portal は、Bastion Host 経由でのみアクセスできるようになっています。

    ログ / 監査 / モニタリング

    InterSystems IRIS は、messages.log ファイルにログ情報を保管します。 CloudFormation では、追加のログ / モニタリングサービスはセットアップされません。 こちらに記載される構造化ログを有効化することを推奨します。https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=ALOG

    CloudFormation テンプレートは、InterSystems IRIS と CloudWatch の連携をインストールしません。 InterSystems では、https://github.com/antonum/CloudWatch-IRIS の InterSystems IRIS と CloudWatch の連携を推奨しています。  これにより、IRIS のメトリクスとログが messages.log ファイルから AWS CloudWatch に収集されます。

    CloudFormation テンプレートは、AWS CloudTrail のログを有効化しません。 CloudTrail のログを有効化するには、CloudTrail のサービスコンソールに移動し、CloudTrail のログを有効化します。 CloudTrail を使用すると、AWS インフラストラクチャで実行されるアクションに関連するアクティビティは、イベントとして CloudTrail に記録されます。 これにより、AWS アカウントのガバナンス、コンプライアンス、運用、リスクの監査を有効化できます。 

      参考資料: https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html
     

    InterSystems では、InterSystems IRIS のログとメトリクスのモニタリング、および少なくとも以下のインジケーターに対しアラートを設定することを推奨しています。

  • 重要度 2 と 3 のメッセージ
  • ライセンスの消費
  • ジャーナルとデータベースのディスク領域が不足している
  • Write Daemon のステータス
  • Lock Table ステータス
  • 上の内容に加え、ユーザーの皆さまには独自のモニタリングメトリクス、アラートメトリクス、アプリケーション固有の KPI を指定することを推奨しています。

    サイジング / コスト

    このセクションでは、本ガイドの「デプロイアセット」のセクションで説明する AWS のリソースを作成します。 このデプロイの実行中に使用される AWS サービスのコストはお客様の負担となります。 InterSystems IRIS のデプロイに最低限必要な設定をするだけでも、高い可視性とセキュリティが確保されます。

    本ガイドのテンプレートでは、InterSystems IRIS の BYOL (Bring Your Own License「ライセンスは各自で用意する」) ライセンスモデルを採用しています。

    InterSystems IRIS Marketplace のページでは、Pay Per Hour IRIS Pricing (時間課金制の IRIS 使用料金) についてご説明しています: https://aws.amazon.com/marketplace/pp/B07XRX7G6B?qid=1580742435148&sr=0-3

    BYOL モデルの料金に関する詳細は、https://www.intersystems.com/who-we-are/contact-us/ より InterSystems までお問い合わせください。

    正常に機能するプラットフォームを提供するには、以下の AWS アセットが必要です。

  • EC2 インスタンス 3 つ (EBS ボリュームとプロビジョンされた IOPS を含む)
  • Elastic Load Balancer 1 つ
  • 次のテーブルでは、デプロイ用の CloudFormation テンプレートに組み込まれる EC2 と EBS のキャパシティおよび AWS リソースのコスト (単位: $/月) に関する推奨事項を示しています。

    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" align="center" valign="top">
      <b>開発 / テスト</b>
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" align="center" valign="top">
      <b>小規模</b>
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" align="center" valign="top">
      <b>中規模</b>
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" align="center" valign="top">
      <b>大規模</b>
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      m5.large
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      2 * r5.large
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      2 * r5.4xlarge
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      2 * r5.8xlarge
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      t3.small
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      gp2 20GB
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      gp2 50GB
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      io1 512GB 1,000iops
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      io1 600GB 2,000iops
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      gp2 128GB
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      gp2 128GB
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      io1 1TB 10,000iops
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      io1 4TB 10,000iops
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      gp2 64GB
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      gp2 64GB
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      io1 256GB 1,000iops
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      io1 512GB 2,000iops
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      85.51
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      199.71
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      1506.18
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      2981.90
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      27.20
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      27.20
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      450.00
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      1286.00
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      - 
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      - 
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      1560.00
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      1820.00
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      - 
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      - 
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      351.62
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      608.79
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      127.94
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      271.34
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      3867.80
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      6696.69
    </td>
    
    <td style="border-bottom:1px solid black; width:110px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
     <a href="https://calculator.s3.amazonaws.com/index.html#r=IAD&amp;s=EC2&amp;key=files/calc-80c2b4058aa67338d41697a65e2dec0b7dcd6b31&amp;v=ver20200806gR" style="color:blue; text-decoration:underline">計算</a>
    </td>
    
    <td style="border-bottom:1px solid black; width:95px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      <a href="https://calculator.s3.amazonaws.com/index.html#r=IAD&amp;s=EC2&amp;key=files/calc-5c93e625e2dc193f85de03582f319daebfaf387f&amp;v=ver20200806gR" style="color:blue; text-decoration:underline">計算</a>
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      <a href="https://calculator.s3.amazonaws.com/index.html#r=IAD&amp;s=EC2&amp;key=files/calc-4a2db7d6d3a73380df9d4fc02966898bef2845c2&amp;v=ver20200806gR" style="color:blue; text-decoration:underline">計算</a>
    </td>
    
    <td style="border-bottom:1px solid black; width:145px; padding:0in 7px 0in 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top">
      <a href="https://calculator.s3.amazonaws.com/index.html#r=IAD&amp;s=EC2&amp;key=files/calc-b7c5bc1f63c9f58457a022e720e347cb5b80531f&amp;v=ver20200806gR" style="color:blue; text-decoration:underline">計算</a>
    </td>
    
    ワークロード
     
    EC2 DB*
    EC2 Arbiter*
    EC2 Bastion*
    EBS SYS
    EBS DB
    EBS JRN
    計算コスト
    EBS ボリュームのコスト
    EBS IOPS コスト
    サポート
    (ベーシック)
    コスト合計
    計算リンク

    *すべての EC2 インスタンスには追加で gp2 の EBS ルートボリュームが 20GB 含まれます。

    AWS の推定コストは、バージニア州北部の地域のオンデマンド料金を基に計算されています。 スナップショットとデータ転送のコストは含まれていません。 料金に関する最新情報は、AWS 料金を参照してください。

    デプロイアセット

    デプロイオプション

    InterSystems IRIS CloudFormation テンプレートには、デプロイオプションが 2 つあります。 マルチ AZ 配置オプションは、プロダクションのワークロードに適した、可用性が高く、冗長性を備えたアーキテクチャを提供します。 シングル AZ 配置オプションは、低コストのオプションで、開発やテストのワークロードに適しています。

    デプロイアセット (プロダクションでの使用に推奨)

    InterSystems IRIS のデプロイメントは、CloudFormation テンプレートを使って実行されます。同テンプレートは、入力パラメータを受け取り、それをネストされた適切なテンプレートに渡します。  それらは、条件や依存関係に従って順番に実行されます。

    作成される AWS リソース

  • VPC セキュリティグループ
  • IRIS ノードと Arbiter の EC2 インスタンス
  • Network Load Balancer (NLB) (Amazon Elastic Load Balancing (Amazon ELB))
  • CloudFormation テンプレートの入力パラメータ

    AWS 全般

  • EC2 Key Name Pair
  • EC2 インスタンスロール
  • S3

  • IRIS のディストリビューションファイルとライセンスキーがある S3 バケットの名前。
  • ネットワーク

  • リソースが起動される個別の VPC とサブネット。
  • データベース

  • データベースマスターパスワード
  • データベースノードの EC2 インスタンスタイプ
  • スタックの作成マスターテンプレートの出力は、JDBC クライアントを InterSystems IRIS に接続する際に使用できる JDBC エンドポイント、Bastion Host のパブリック IP、および両方の IRIS ノードのプライベート IP、と 4 つの出力があります。

    クリーンアップ

  • 本ガイドを実行した結果デプロイされるリソースを削除するには、AWS CloudFormation Delete ドキュメンテーションに記載されているステップを実行してください。
  • デプロイとの統合やサポートの実施中に手動で作成したその他のリソース (S3 バケットや VPC など) を削除します。
  • デプロイのテスト

    正常性チェック

    Node 01/02 Management Portal へのリンクをクリックします。 ユーザー名「SuperUser」および CloudFormation テンプレートで選択したパスワードを使ってログインします。

    System Administration -> Configuration -> Mirror Settings -> Edit Mirror と順に移動します。 システムに 2 つのファイルオーバーメンバが設定されていることを確認します。

    ミラー化されたデータベースが作成され、アクティブであることを確認します。 System Administration -> Configuration -> Local Databases と順に移動します。

    「First Look JDBC」と題したドキュメント (https://docs.intersystems.com/irislatestj/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_jdbc) の内容に従って、JDBC が Load Balancer を介して IRIS に接続されていることを確認します。 URL 変数をテンプレートの出力に表示されている値に変更し、パスワードも「SYS」からセットアップの最中に選択したパスワードに変更します。

    フェイルオーバーテスト

    Node02 で、Management Portal にアクセス (上の「正常性チェック」のセクション参照) し、Configuration->Edit Mirror と順に開きます。 ページの一番下に「このメンバはバックアップです。 プライマリに変更を加える必要があります。」 というメッセージが表示されます。

    AWS EC2 マネジメントダッシュボードで Node01 インスタンスを見つけます。 その名前は、MyStackName-Node01-1NGXXXXXX の形式で書かれています。

    Node01 インスタンスを再起動します。 これにより、インスタンス / AZ の停止がシミュレートされます。

    Node02 の「Edit Mirror」ページを再度読み込みます。 するとステータスは、このメンバはプライマリです。 変更内容は他のメンバに送信されます。 に変わるはずです。

    バックアップと回復

    バックアップ

    CloudFormation をデプロイしても、InterSystems IRIS のバックアップは有効化されません。 当社では、EBS Snapshot (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html) と IRIS Write Daemon Freeze (https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=GCDI_backup#GCDI_backup_methods_ext) の両方を使って IRIS EBS ボリュームをバックアップすることを推奨しています。

    インスタンスの障害

    異常な IRIS インスタンスは、IRIS のミラーリング機能と Load Balancer により検出され、トラフィックは別のミラーノードに移動されます。 回復可能なインスタンスはミラーに再度参加して、通常の操作が続行されます。 異常な状態が続くインスタンスがある場合は、当社のナレッジベースおよび本ガイドの「緊急メンテナンス」のセクションをご覧ください。

    アベイラビリティゾーン (AZ) の障害

    AZ の障害が発生すると、トラフィックが一時的に中断される場合があります。 インスタンスの障害発生時と同様に、この場合も IRIS のミラーリング機能と Load Balancer がトラフィックを使用可能な別の AZ に切り替えて状況に対処します。

    リージョンの障害

    本ガイドで紹介するアーキテクチャでは、マルチリージョンオペレーションをサポートする設定はデプロイされません。 IRIS の非同期ミラーリングと AWS Route53 を使用すれば、中断を最小限に抑えながらリージョンの障害に対処できる構成を作成できます。 詳細は、https://community.intersystems.com/post/intersystems-iris-example-reference-architectures-amazon-web-services-awsを参照してください。

    RPO/RTO


    目標復旧時点 (RPO)

  • シングルノードの開発 / テスト設定は、最後に正常に行われたバックアップの時刻によって定義されます。
  • Multi Zone Fault Tolerant セットアップは、フェイルオーバー発生時にデータの完全な一貫性を保証するアクティブ/アクティブ構成を提供し、最後に正常に実行されたトランザクションの RPO が使用されます。
  • 目標復旧時間 (RTO)

  • シングルノードの開発 / テスト構成におけるバックアップの復元は、本デプロイガイドの範囲外です。 EBS ボリュームのスナップショットを復元することに関する詳細は、https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-restoring-volume.htmlを参照してください。
  • Multi Zone Fault Tolerant セットアップの RTO は、一般的に、Elastic Load Balancer がトラフィックを IRIS クラスタの新しい Primary Mirror ノードに移動させるのに要する時間によって定義されます。 RTO の時間は、ミラー対応アプリケーションを作成するか、ミラーに Application Server Connection を追加することで、さらに短縮できます (https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=GHA_mirror#GHA_mirror_set_configecp を参照)。
  • ストレージ容量

    IRIS ジャーナルとデータベースの EBS ボリュームは、容量が上限に達する場合があります。 InterSystems では、IRIS Dashboard ならびに「df」のような Linux のファイルシステムツールを使い、ジャーナルとデータベースのボリュームの状態をモニタリングすることを推奨しています。

    ジャーナルとデータベースのボリュームは、EBS ガイド https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-modify-volume.htmlを使えば拡張することができます。 注意: EBS ボリュームの拡張と Linux ファイルシステムの拡張の両方のステップを実行する必要があります。 また、データベースのバックアップを実行した後に、Purge Journalsを実行すれば、ジャーナルが占めていた領域を開放することもできます。

    また、インスタンスに対して CloudWatch Agent を有効にして (この CloudFormation テンプレートでは無効)、ディスク領域をモニタリングすることも検討してもよいでしょう (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)

    セキュリティ証明書の期限

    AWS Certificate Manager (ACM) を使えば、Secure Sockets Layer/Transport Layer Security (SSL/TLS) 証明書を簡単にプロビジョン、デプロイ、管理し、またその有効期限をモニタリングできます。

    証明書の有効期限は把握しておく必要があります。 InterSystems では、証明書の有効期限をモニタリングする統合プロセスは提供していません。 AWS では、アラームのセットアップに便利な CloudFormation テンプレートが提供されています。 詳細は、こちらのリンク https://docs.aws.amazon.com/config/latest/developerguide/acm-certificate-expiration-check.html をご覧ください。

    日常的なメンテナンス

    ミラー化された構成において IRIS をアップグレードする手順については、https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=GCI_upgrade#GCI_upgrade_tasks_mirrorsを参照してください。

    継続的なタスクについて、InterSystems では以下を含む AWS と InterSystems のベストプラクティスを実施することを推奨しています。 

  • アクセスキーのローテーション
  • サービス制限の評価
  • 証明書の更新
  • IRIS ライセンスの制限と期限: https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=GCM_dashboard
  • ストレージ容量のモニタリング: https://docs.intersystems.com/irislatestj/csp/docbook/Doc.View.cls?KEY=GCM_dashboard
  • また、EC2 インスタンスに CloudWatch Agent を追加することを検討しても良いでしょう: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

    緊急メンテナンス

    EC2 インスタンスを使用できる場合は、Bastion Host 経由でインスタンスに接続しましょう。

    注意: インスタンスを停止 / 開始した後は、Bastion Host のパブリック IP が変更される場合があります。 これが、IRIS クラスタの可用性や JDBC 接続に影響することはありません。

    コマンドラインを使ってアクセスするには、以下のコマンドを使って Bastion Host 経由で IRIS ノードに接続します。

    $ chmod 400 .pem$ ssh-add .pem

    $ ssh -J ec2-user@<bastion-public-ip> ec2-user@<node-private-ip> -L 52773:1:52773

    上のコマンドを実行したら、インスタンスの Management Portal が http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen にて使用可能になります。ユーザは「SuperUser」、パスワードはスタックの作成時に入力したパスワードを使います。

    IRIS のコマンドプロンプトにアクセスするには、以下のコマンドを使います。

    $ iris session iris

    「InterSystems IRIS Management and Monitoring」ガイドを参照してください: https://docs.intersystems.com/irislatestj/csp/docbook/DocBook.UI.Page.cls?KEY=GCM

    InterSystems サポートへの問い合わせ。

    EC2 インスタンスが使用またはアクセスできない場合は、AWS サポートまでお問い合わせください。

    注意: マルチ AZ 配置のデプロイで発生する AZ やインスタンスの障害は、自動的に処理されます。

    サポート

    トラブルシューティング

    CloudFormation で「Create Stack」(スタックを作成) を実行できません「Create Stack」を実行できる適切な権限を持っていることをご確認ください。 AWS アカウントの管理者にアクセス権限をお求めください。また、問題が解決しない場合は AWS サポートまでお問い合わせください

    スタックは作成されますが、IRIS にアクセスできませんEC2 インスタンスのステータスが「CEATE COMPLETED」に変わってから、IRIS の使用準備が完全に整うまでは、およそ 2 分程度かかります。 SSH で EC2 Node のインスタンスと通信し、IRIS が稼働していることをご確認ください。

    $iris list

    アクティブな IRIS インスタンスが見当たらない場合や、“iris: command not found” というメッセージが表示される場合は、IRIS のインストールが失敗したことを意味します。 インスタンスを最初に開始するときに、インスタンスの $cat /var/log/cloud-init-output.log をチェックして、インストールに問題がなかったどうかを確認します。

    IRIS は稼働していますが、Management Portal にアクセスすることも、[Java] アプリケーションから接続することもできませんCloudFormation が作成した Security Group に、お使いのソース IP アドレスが許可されている IP アドレスとして表示されていることをご確認ください。

    InterSystems サポートへの問い合わせ

    InterSystems Worldwide Response Center (WRC) では、専門家によるテクニカルサポートを提供しています。

    InterSystems IRIS のサポートは、常に IRIS へのサブスクリプションに含まれています。

    電話、メール、オンラインでのサポートは、24 時間、年中無休でご利用いただけます。 世界 15 か国にサポートアドバイザーを配置。英語、スペイン語、ポルトガル語、イタリア語、ウェールズ語、アラビア語、ヒンディー語、中国語、タイ語、スウェーデン語、韓国語、日本語、フィンランド語、ロシア語、フランス語、ドイツ語、ヘブライ語およびハンガリー語での対応が可能です。 お客様の成功を大切にする、経験、知識ともに豊富なサポートスペシャリストが、すべてのお客様を素早くサポートいたします。

    すぐにサポートが必要な場合

    電話サポート:+1-617-621-0700 (US)+44 (0) 844 854 2917 (UK)0800615658 (NZ フリーダイヤル)1800 628 181 (AUS フリーダイヤル)

    メールサポート:support@intersystems.com

    オンラインサポート:WRC ダイレクトsupport@intersystems.com までログイン情報をお求めください。

    付録

    IAM Policy for EC2 instance

    以下の IAM ポリシーを使うことで、EC2 インスタンスは S3 バケット ‘my-bucket’ からオブジェクトを読み取り、CloudWatch にログを書き込むことができます。

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "S3BucketReadOnly",      "Effect": "Allow",      "Action": ["s3:GetObject"],      "Resource": "arn:aws:s3:::my-bucket/"    },    {      "Sid": "CloudWatchWriteLogs",      "Effect": "Allow",      "Action": [        "logs:CreateLogGroup",        "logs:CreateLogStream",        "logs:PutLogEvents",        "logs:DescribeLogStreams"      ],      "Resource": "arn:aws:logs:::"    }  ]} 

    0
    0 447
    記事 Mihoko Iijima · 12月 20, 2020 1m read

    これは InterSystems FAQ サイトの記事です

    ミラーリングが同期の対象とするのはデータベースファイルのみです。

    アプリケーションに必要なその他のファイル(CSPファイル、画像ファイル、ドキュメントファイルなど)をミラーセットを構成する二台のサーバー間で同期させるには、

    1. NASなどを導入して共有ディスク上にそれらのファイルを配置する方法
    2. または同期ソフトを導入して二台のサーバー間のファイルを同期させる方法

    などの方法が考えられます。 また、2の方法では Windows 上では RoboCopy、Linuxの場合には rsync という同期ソフトを使った実例があります。

    0
    0 101
    記事 Toshihiko Minamoto · 8月 17, 2020 25m read

    この記事では、スナップショットを使用したソリューションとの統合の例を使って、_外部バックアップ_による Caché のバックアップ方法を紹介します。 このところ私が目にするソリューションの大半は、Linux の VMware にデプロイされているため、この記事の大半では、例として、ソリューションが VMware スナップショットテクノロジーをどのように統合しているかを説明しています。

    Caché バックアップ - すぐ使えますか?

    Caché をインストールすると、Caché データベースを中断せずにバックアップできる Caché オンラインバックアップが含まれています。 しかし、システムがスケールアップするにつれ、より効率的なバックアップソリューションを検討する必要があります。 Caché データベースを含み、システムをバックアップするには、スナップショットテクノロジーに統合された_外部バックアップ_をお勧めします。

    外部バックアップに関して特別な考慮事項はありますか?

    詳しい内容は外部バックアップのオンラインドキュメンテーションに説明されていますが、 主な考慮事項は次のとおりです。

    「スナップショットの整合性を確保するために、スナップショットが作成される間、Caché はデータベースへの書き込みをfreezeする方法を提供しています。 スナップショットの作成中は、データベースファイルへの物理的な書き込みのみがfreezeされるため、ユーザーは中断されることなくメモリ内で更新を実行し続けることができます。」

    また、仮想化されたシステム上でのスナップショットプロセスの一部によって、バックアップされている VM にスタンタイムと呼ばれる短い無応答状態が発生することにも注意してください。 通常は 1 秒未満であるため、ユーザーが気付いたり、システムの動作に影響を与えたりすることはありませんが、状況によってはこの無応答状態が長引くことがあります。 無応答状態が Caché データベースミラーリングの QoS タイムアウトより長引く場合、バックアップノードはプライマリに障害が発生したとみなし、フェイルオーバーします。 この記事の後の方で、ミラーリング QoS タイムアウトを変更する必要がある場合に、スタンタイムをどのように確認できるかについて説明します。


    [InterSystems データプラットフォームとパフォーマンスに関する他の連載記事のリストはこちらにあります。](https://jp.community.intersystems.com/node/477596/)

    この記事では、Caché オンラインドキュメンテーション『Backup and Restore Guide(バックアップと復元ガイド)』も確認する必要があります。


    バックアップの選択肢

    最小限のバックアップソリューション - Caché Online Backup

    ほかのソリューションがない場合は、ダウンタイム無しでバックアップを行えるこのソリューションが InterSystems データプラットフォームに同梱されています。 _Caché オンラインバックアップ_は、Caché データベースファイルのみをバックアップするもので、データに割り当てられたデータベースのすべてのブロックをキャプチャし、出力をシーケンシャルファイルに書き込みます。 Caché Online Backup は累積バックアップと増分バックアップをサポートしています。

    VMware の文脈では、Caché Online Backup はゲスト内で発生するバックアップソリューションです。 ほかのゲスト内ソリューションと同様に、Caché Online Backup の動作は、アプリケーションが仮想化されていようが、ホストで直接実行していようが、基本的に変わりません。 Caché Online Backup は、システムバックアップと連携しながら Caché のオンラインバックアップ出力ファイルを、アプリケーションが使用しているその他すべてのファイルシステムとともに、バックアップメディアにコピーします。 最小限のシステムバックアップには、インストールディレクトリ、ジャーナルおよび代替ジャーナルディレクトリ、アプリケーションファイル、およびアプリケーションが使用する外部ファイルを含むすべてのディレクトリを含める必要があります。

    Caché Online Backup は、Caché データベースやアドホックバックアップのみをバックアップする低コストのソリューションを実装したいと考えている小規模サイト向けのエントリレベルのアプローチとして捉えてください。ミラーリングをセットアップする際のバックアップなどに役立てられます。 しかし、データベースのサイズが増加したり、Caché が顧客のデータランドスケープの一部でしかない場合は、_外部バックアップ_にスナップショットテクノロジーとサードパーティ製ユーティリティを合わせたソリューションがベストプラクティスとして推奨されます。非データベースファイルのバックアップ、より高速な復旧時間、エンタープライズ全体のデータビュー、より優れたカタログと管理用ツールなど、さまざまなメリットが得られます。


    推奨されるバックアップソリューション - 外部バックアップ

    VMware を例として使用します。VMware で仮想化すると、VM 全体を保護するための追加機能と選択肢が追加されます。 ソリューションの仮想化が完了した時点で、オペレーティングシステム、アプリケーション、データを含むシステムを .vmdk(とその他の)ファイル内に効果的にカプセル化したことになります。 これらのファイルの管理は非常に簡単で、必要となった場合にはシステム全体の復旧に使用できるため、オペレーティングシステム、ドライバ、サードパーティ製アプリケーション、データベースとデータベースファイルなどのコンポーネントを個別に復旧して構成する必要のある物理システムで同じような状況が発生した場合とは大きく異なります。


    # VMware のスナップショット

    VMware の vSphere Data Protection(VDP)や、Veeam や Commvault などのサードパーティ製バックアップソリューションでは、VMware 仮想マシンスナップショットを使用してバックアップを作成しています。 VMware スナップショットの概要を説明しますが、詳細については、VMware ドキュメンテーションを参照してください。

    スナップショットは VM 全体に適用されるものであり、オペレーティングシステムとすべてのアプリケーションまたはデータベースエンジンはスナップショットが発生していることを認識しないということに注意してください。 また、次のことにも注意してください。

    VMware スナップショット自体はバックアップではありません!

    スナップショットは、バックアップソフトウェアによるバックアップの作成を_可能にします_が、スナップショット自体はバックアップではありません。

    VDP とサードパーティ製バックアップソリューションは、バックアップアプリケーションとともに VMware スナップショットプロセスを使用して、スナップショットの作成と、非常に重要となるその削除を管理します。 おおまかに見ると、VMware スナップショットを使用した外部バックアップのイベントのプロセスと順序は次のとおりです。

    • サードパーティ製バックアップソフトウェアは ESXi ホストに対し、VMware スナップショットをトリガーするように要求します。
    • VM の .vmdk ファイルは読み取り専用状態となり、各 VM の .vmdk ファイルに子 vmdk 差分ファイルが作成されます。
    • 書き込み時コピーを使用して、VM へのすべての変更が差分ファイルに書き込まれます。 すべての読み取りは、最初に差分ファイルから行われます。
    • バックアップソフトウェアは、読み取り専用の親 .vmdk ファイルからバックアップターゲットへのコピーを管理します。
    • バックアップが完了すると、スナップショットがコミットされます(VM ディスクは、親に書き込まれた差分ファイルのブロックの書き込みと更新を再開します)。
    • VMware スナップショットが削除されます。

    バックアップソリューションは、変更ブロック追跡(CBT)などのほかの機能も使用し、増分または累積バックアップを可能にして速度と効率性(容量節約において特に重要)を実現します。また、一般的に、データの重複解除や圧縮、スケジューリング、整合性チェックなどで IP アドレスが更新された VM のマウント、VM とファイルレベルの完全復元、およびカタログ管理などの重要な機能性も追加します。

    適切に管理されていない、または長期間実行されたままの VMware スナップショットは、ストレージを過剰に消費し(データの変更量が増えるにつれ、差分ファイルが増加し続けるため)、VM の速度を低下させてしまう可能性があります。

    本番インスタンスで手動スナップショットを実行する前に、十分に検討する必要があります。 なぜ実行しようとしているのか、 スナップショットが作成された時間に戻すとどうなるか、 作成とロールバック間のすべてのアプリケーショントランザクションはどうなるか、といったことを検討してください。

    バックアップソフトウェアがスナップショットを作成し、削除しても問題ありません。 スナップショットの存続期間は、短期間であるものなのです。 また、バックアップ戦略においては、ユーザーやパフォーマンスへの影響をさらに最小限に抑えられるように、システムの使用率が低い時間を選ぶことも重要です。

    スナップショットに関する Caché データベースの考慮事項

    スナップショットを作成する前に、保留中のすべての書き込みがコミットされ、データベースが一貫した状態になるように データベースを静止させる必要があります。 Caché は、スナップショットが作成される間、データベースへの書き込みをコミットして短時間フリーズ(停止)するメソッドと API を提供しています。 こうすることで、スナップショットの作成中は、データベースファイルへの物理的な書き込みのみがフリーズされるため、ユーザーは中断されることなくメモリ内で更新を実行し続けることができます。 スナップショットがトリガーされると、データベースの書き込みが再開し、バックアップはバックアップメディアへのデータのコピーを続行します。 フリーズからの復旧は、非常に短時間(数秒)で発生します。

    書き込みを一時停止するのに加え、Caché Freeze は、ジャーナルファイルの切り替えとジャーナルへのバックアップマーカーの書き込みも処理します。 ジャーナルファイルは、物理データベースの書き込みがフリーズしている間、通常通りに書き込みを続けます。 物理データベースの書き込みがフリーズしている間にシステムがクラッシュした場合、データは、起動時に、通常通りジャーナルから復元されます。

    以下の図は、整合性のあるデータベースイメージを使用してバックアップを作成するための、VMware スナップショットを使用した Freeze と Thaw の手順を示しています。


    ![](https://community.intersystems.com/sites/default/files/inline/images/snapshot-timeline.png "スナップショットのタイムライン")

    Freeze から Thaw の時間が短いところに注目してください。読み取り専用の親をバックアップターゲットにコピーする時間でなく、スナップショットを作成する時間のみです。


    Caché の Freeze と Thaw の統合

    vSphere では、スナップショット作成のいずれか側で自動的にスクリプトを呼び出すことができ、この時に、Caché Freeze と Thaw が呼び出されます。 注意: この機能が正しく機能するために、ESXi ホストは _VMware ツール_を介してゲストオペレーティングシステムにディスクを静止するように要求します。

    VMware ツールは、ゲストオペレーティングシステムにインストールされている必要があります。

    スクリプトは、厳密な命名規則と場所のルールに準じる必要があります。 ファイルの権限も設定されていなければなりません。 以下は、Linux の VMware の場合のスクリプト名です。

    # /usr/sbin/pre-freeze-script
    # /usr/sbin/post-thaw-script
    

    以下は、InterSystems のチームが内部テストラボインスタンスに対して、Veeam バックアップで使用する Freeze と Thaw のスクリプト例ですが、ほかのソリューションでも動作するはずです。 これらの例は、vSphere 6 と Red Hat 7 で検証され、使用されています。

    これらのスクリプトは例として使用でき、方法を示すものではありますが、各自の環境で必ず検証してください!

    Freeze 前スクリプトの例:

    #!/bin/sh
    #
    # Script called by VMWare immediately prior to snapshot for backup.
    # Tested on Red Hat 7.2
    #
    
    LOGDIR=/var/log
    SNAPLOG=$LOGDIR/snapshot.log
    
    echo >> $SNAPLOG
    echo "`date`: Pre freeze script started" >> $SNAPLOG
    exit_code=0
    
    # Only for running instances
    for INST in `ccontrol qall 2>/dev/null | tail -n +3 | grep '^up' | cut -c5-  | awk '{print $1}'`; do
    
        echo "`date`: Attempting to freeze $INST" >> $SNAPLOG
    
        # Detailed instances specific log    
        LOGFILE=$LOGDIR/$INST-pre_post.log
    
        # Freeze
        csession $INST -U '%SYS' "##Class(Backup.General).ExternalFreeze(\"$LOGFILE\",,,,,,1800)" >> $SNAPLOG $
        status=$?
    
        case $status in
            5) echo "`date`:   $INST IS FROZEN" >> $SNAPLOG
               ;;
            3) echo "`date`:   $INST FREEZE FAILED" >> $SNAPLOG
               logger -p user.err "freeze of $INST failed"
               exit_code=1
               ;;
            *) echo "`date`:   ERROR: Unknown status code: $status" >> $SNAPLOG
               logger -p user.err "ERROR when freezing $INST"
               exit_code=1
               ;;
        esac
        echo "`date`:   Completed freeze of $INST" >> $SNAPLOG
    done
    
    echo "`date`: Pre freeze script finished" >> $SNAPLOG
    exit $exit_code
    

    Thaw スクリプトの例:

    #!/bin/sh
    #
    # Script called by VMWare immediately after backup snapshot has been created
    # Tested on Red Hat 7.2
    #
    
    LOGDIR=/var/log
    SNAPLOG=$LOGDIR/snapshot.log
    
    echo >> $SNAPLOG
    echo "`date`: Post thaw script started" >> $SNAPLOG
    exit_code=0
    
    if [ -d "$LOGDIR" ]; then
    
        # Only for running instances    
        for INST in `ccontrol qall 2>/dev/null | tail -n +3 | grep '^up' | cut -c5-  | awk '{print $1}'`; do
    
            echo "`date`: Attempting to thaw $INST" >> $SNAPLOG
    
            # Detailed instances specific log
            LOGFILE=$LOGDIR/$INST-pre_post.log
    
            # Thaw
            csession $INST -U%SYS "##Class(Backup.General).ExternalThaw(\"$LOGFILE\")" >> $SNAPLOG 2>&1
            status=$?
    
            case $status in
                5) echo "`date`:   $INST IS THAWED" >> $SNAPLOG
                   csession $INST -U%SYS "##Class(Backup.General).ExternalSetHistory(\"$LOGFILE\")" >> $SNAPLOG$
                   ;;
                3) echo "`date`:   $INST THAW FAILED" >> $SNAPLOG
                   logger -p user.err "thaw of $INST failed"
                   exit_code=1
                   ;;
                *) echo "`date`:   ERROR: Unknown status code: $status" >> $SNAPLOG
                   logger -p user.err "ERROR when thawing $INST"
                   exit_code=1
                   ;;
            esac
            echo "`date`:   Completed thaw of $INST" >> $SNAPLOG
        done
    fi
    
    echo "`date`: Post thaw script finished" >> $SNAPLOG
    exit $exit_code
    

    権限の設定を必ず行ってください:

    # sudo chown root.root /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script
    # sudo chmod 0700 /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script
    

    Freeze と Thaw のテスト

    スクリプトが正しく動作することをテストするには、VM でスナップショットを手動で実行し、スクリプトの出力を確認することができます。 以下のスクリーンショットは、[Take VM Snapshot(VM スナップショットの作成)]ダイアログとオプションを示します。

    選択解除- [Snapshot the virtual machine's memory(仮想マシンのメモリをスナップショットする)]

    選択 - [Quiesce guest file system (Needs VMware Tools installed)(ゲストファイルシステムを静止する: VMware ツールのインストールが必要)]チェックボックス。スナップショットを作成する際にゲストオペレーティングシステムで実行中のプロセスを一時停止し、ファイルシステムのコンテンツが既知の整合性のある状態を保つようにします。

    重要! テストの後、スナップショットを必ず削除してください!!!!

    スナップショットが作成される際に、静止フラグが真であり、仮想マシンがオンである場合、VMware ツールによって仮想マシンのファイルシステムが静止されます。 ファイルシステムの静止は、ディスク上のデータをバックアップに適した状態にするプロセスです。 このプロセスには、オペレーティングシステムのメモリ内キャッシュからディスクへのダーティバッファのフラッシュといった操作が含まれる場合があります。

    以下の出力は、操作の一環としてスナップショットを含むバックアップを実行した後に、上記の Freeze/Thaw スクリプトの例で設定された $SNAPSHOT ログファイルのコンテンツを示しています。

    Wed Jan  4 16:30:35 EST 2017: Pre freeze script started
    Wed Jan  4 16:30:35 EST 2017: Attempting to freeze H20152
    Wed Jan  4 16:30:36 EST 2017:   H20152 IS FROZEN
    Wed Jan  4 16:30:36 EST 2017:   Completed freeze of H20152
    Wed Jan  4 16:30:36 EST 2017: Pre freeze script finished
    
    Wed Jan  4 16:30:41 EST 2017: Post thaw script started
    Wed Jan  4 16:30:41 EST 2017: Attempting to thaw H20152
    Wed Jan  4 16:30:42 EST 2017:   H20152 IS THAWED
    Wed Jan  4 16:30:42 EST 2017:   Completed thaw of H20152
    Wed Jan  4 16:30:42 EST 2017: Post thaw script finished
    

    この例では、Freeze から Thaw までに 6 秒経過していることがわかります(16:30:36~16:30:42)。 この間、ユーザー操作は中断されていません。 _独自のシステムからメトリックを収集する必要があります_が、背景としては、この例は、IO ボトルネックがなく、平均 200 万 Glorefs/秒、17 万 Gloupds/秒、および毎秒あたり平均 1,100 個の物理読み取りと書き込みデーモン 1 サイクル当たりの書き込み 3,000 個の BM でアプリケーションベンチマークを実行しているシステムから得たものです。

    メモリはスナップショットの一部ではないため、再起動すると、VM は再起動して復元されることに注意してください。 データベースファイルは整合性のある状態です。 バックアップを「再開」するのではなく、ファイルを既知の時点の状態にする必要があります。 その後で、ファイルが復元されたら、ジャーナルと、アプリケーションとトランザクションの整合性に必要なその他の復元手順をロールフォワードできます。

    その他のデータ保護を追加するには、ジャーナルの切り替えを単独で実行することもでき、ジャーナルは、たとえば 1 時間ごとに別の場所にバックアップまたは複製されます。

    以下は、上記の Freeze と Thaw スクリプトの $LOGFILE の出力で、スナップショットのジャーナルの詳細を示しています。

    01/04/2017 16:30:35: Backup.General.ExternalFreeze: Suspending system
    
    Journal file switched to:
    /trak/jnl/jrnpri/h20152/H20152_20170104.011
    01/04/2017 16:30:35: Backup.General.ExternalFreeze: Start a journal restore for this backup with journal file: /trak/jnl/jrnpri/h20152/H20152_20170104.011
    
    Journal marker set at
    offset 197192 of /trak/jnl/jrnpri/h20152/H20152_20170104.011
    01/04/2017 16:30:36: Backup.General.ExternalFreeze: System suspended
    01/04/2017 16:30:41: Backup.General.ExternalThaw: Resuming system
    01/04/2017 16:30:42: Backup.General.ExternalThaw: System resumed
    

    VM スタンタイム

    VM スナップショットの作成時、バックアップが完了してスナップショットがコミットされた後、VM を短時間フリーズする必要があります。 この短時間のフリーズは、VM のスタンと呼ばれることがよくあります。 スタンタイムについてよく説明されたブログ記事は、こちらをご覧ください。 以下に要約した内容を示し、Caché データベースの考慮事項に照らして説明します。

    スタンタイムに関する記事より: 「VM スナップショットを作成するには、(i)デバイスの状態をディスクにシリアル化し、(ii)現在実行中のディスクを閉じてスナップショットポイントを作成するために、VM は「スタン」されます(無応答状態になります)。… 統合時、VM は、ディスクを閉じて統合に最適な状態にするために、「スタン」されます。」

    スタンタイムは、通常数百ミリ秒です。ただし、コミットフェーズ中にディスクの書き込みアクティビティが非常に高い場合には、スタンタイムが数秒に長引くことがあります。

    VM が、Caché データベースミラーリングに参加するプライマリまたはバックアップメンバーであり、スタンタイムがミラーのサービス品質(QoS)タイムアウトより長引く場合、ミラーはプライマリ VM に失敗としてレポートし、ミラーのテイクオーバーを開始します。

    2018 年 3 月更新: 同僚の Pter Greskoff から指摘されました。バックアップミラーメンバーは、VM スタン中またはプライマリミラーメンバーが利用不可である場合には、QoS タイムアウトの半分超という短時間でフェイルオーバーを開始することがあります。

    QoS の考慮事項とフェイルオーバーのシナリオの詳細については、「Quality of Service Timeout Guide for Mirroring(ミラーリングのサービス品質タイムアウトに関するガイド)」という素晴らしい記事を参照できますが、以下に、VM スタンタイムと QoS に関する要約を示します。

    バックアップミラーが、QoS タイムアウトの半分の時間内にプライマリミラーからメッセージを受信しない場合、ミラーはプライマリが動作しているかどうかを確認するメッセージを送信します。 それからバックアップはさらに QoS タイムアウトの半分の時間、プライマリマシンからの応答を待機します。 プライマリからの応答がない場合、プライマリは停止しているとみなされ、バックアップがテイクオーバーします。

    ビジー状態のシステムでは、プライマリからバックアップミラーにジャーナルが継続的に送信されるため、バックアップはプライマリが動作しているかどうかを確認する必要はありません。 ただし、バックアップが発生している可能性が高い静止時間中、アプリケーションがアイドル状態である場合、QoS タイムアウトの半分以上の時間、プライマリとバックアップミラーの間でメッセージのやり取りがない可能性があります。

    これは Peter が提示した例ですが、このタイムフレームを、QoS タイムアウトが :08 秒で VM スタンタイムが :07 秒のアイドル状態にあるシステムで考えてみましょう。

    • :00 プライマリは キープライブでアービターに ping し、アービターは即座に応答
    • :01 バックアップメンバーはプライマリにキープアライブを送信し、プライマリは即座に応答
    • :02
    • :03 VM スタンの開始
    • :04 プライマリはアービターにキープアライブを送信しようとするが、スタンが完了するまで到達しない
    • :05 QoS の半分の時間が経過したため、バックアップメンバーはプライマリに ping を送信
    • :06
    • :07
    • :08 QoS タイムアウトが過ぎてもアービターはプライマリからの応答を受信しないため、接続を閉じる
    • :09 バックアップはプライマリからの応答を受信していないため、接続が失われたことをアービターに確認し、テイクオーバーを開始
    • :10 VM スタンが終了するが、間に合わない!!

    上記のリンク先の記事にある「Pitfalls and Concerns when Configuring your Quality of Service Timeout(サービス品質タイムアウトを構成する際の落とし穴と考慮事項)」のセクションもお読みください。QoS を必要な期間だけ確保する際のバランスが説明されています。 QoS が長すぎる場合、特に 30 秒を超える場合も問題を引き起こす可能性があります。

    2018 年 3 月更新の終了:

    ミラーリングの QoS の詳細については、ドキュメンテーションを参照してください。

    スタンタイムを最小限に抑える戦略には、データベースアクティビティが低い場合にバックアップを実行することと、ストレージを十分にセットアップすることが挙げられます。

    上記で述べたように、スナップショットの作成時に指定できるオプションがいくつかあります。その 1 つは、スナップショットにメモリ状態を含めることです。_Caché データベースのバックアップにはメモリ状態は不要である_ことに注意してください。 メモリフラグが設定されている場合、仮想マシンの内部状態のダンプがスナップショットに含められます。 メモリスナップショットの作成には、もっと長い時間がかかります。 メモリスナップショットは、実行中の仮想マシンの状態を、スナップショットが作成された時の状態に戻すために使用されます。 これは、データベースファイルのバックアップには必要ありません。

    メモリスナップショットを作成する場合、仮想マシンの状態全体が停止しますが、スタンタイムはさまざまです。

    前述のとおり、バックアップでは、整合性のある使用可能なバックアップを保証するために、手動スナップショットで、またはバックアップソフトウェアによって、静止フラグを true に設定する必要があります。

    VMware ログでスタンタイムを確認

    ESXi 5.0 より、スナップショットのスタンタイムは、以下のようなメッセージで仮想マシンのログファイル(vmware.log)に記録されます。

    2017-01-04T22:15:58.846Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 38123 us

    スタンタイムはミリ秒単位であるため、上記の例にある 38123 us は 38123/1,000,000 秒または 0.038 秒となります。

    スタンタイムが許容範囲内であることを確認するため、またはスタンタイムが長引くせいで問題が発生していると思われる場合にトラブルシューティングを実施するため、関心のある VM のフォルダから vmware.log ファイルをダウンロードして確認することができます。 ダウンロードしたら、以下の Linux コマンドの例を使うなどして、ログを抽出しソートできます。

    vmware.log ファイルのダウンロード例

    vSphere 管理コンソールまたは ESXi ホストコマンドラインから VMware サポートバンドルを作成するなど、サポートログのダウンロードにはいくつかの方法があります。 全詳細については VMware ドキュメンテーションを参照できますが、以下は、スタンタイムを確認できるように、vmware.log ファイルを含む非常に小さなサポートバンドルを作成して収集する簡単な方法です。

    VM ファイルが配置されているディレクトリの正式な名称が必要となります。 ssh を使用してデータベース VM が実行している ESXi ホストにログオンし、コマンド vim-cmd vmsvc/getallvms を使用して vmx ファイルとそれに関連付けられた一意の正式名称を一覧表示します。

    たとえば、この記事で使用されているデータベース VM の正式な名称は次のように出力されます。 26 vsan-tc2016-db1 [vsanDatastore] e2fe4e58-dbd1-5e79-e3e2-246e9613a6f0/vsan-tc2016-db1.vmx rhel7_64Guest vmx-11

    次に、ログファイルのみを収集してバンドルするコマンドを実行します。
    vm-support -a VirtualMachines:logs

    コマンドによって、以下の例のように、サポートバンドルの場所が表示されます。 To see the files collected, check '/vmfs/volumes/datastore1 (3)/esx-esxvsan4.iscinternal.com-2016-12-30--07.19-9235879.tgz'.

    これで、sftp を使用してファイルをホストから転送し、さらに処理して確認できるようになりました。

    この例では、サポートバンドルを解凍した後に、データベース VM の正式名称に対応するパスに移動します。 この場合は、 <bundle name>/vmfs/volumes/<host long name>/e2fe4e58-dbd1-5e79-e3e2-246e9613a6f0 というパスになります。

    そこで番号付きの複数のログファイルが表示されます。最新のログファイルには番号は付きません。つまり、vmware.log と示されます。 ログはわずか数百 KB ですが、たくさんの情報が記載されています。ただし、注目するのは stun/unstun の時間のみで、grep を使うと簡単に見つけ出すことができます。 次は、その記載例です。

    $ grep Unstun vmware.log
    2017-01-04T21:30:19.662Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 1091706 us
    --- 
    2017-01-04T22:15:58.846Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 38123 us
    2017-01-04T22:15:59.573Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 298346 us
    2017-01-04T22:16:03.672Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 301099 us
    2017-01-04T22:16:06.471Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 341616 us
    2017-01-04T22:16:24.813Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 264392 us
    2017-01-04T22:16:30.921Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 221633 us
    

    この例では、2つのグループのスタンタイムを確認できます。1 つはスナップショップ作成時、そしてもう 1 つは、各ディスクのスナップショットが削除/統合された 45 分後(バックアップソフトウェアが読み取り専用 vmx ファイルのコピーを完了したとき)のものです。 上記の例では、最初のスタンタイムは 1 秒をわずかに上回っていますが、ほとんどのスタンタイムは 1 秒未満であることがわかります。

    短時間のスタンタイムは、エンドユーザーが気付くものではありませんが、 Caché データベースミラーリングなどのシステムプロセスは、インスタンスが「アライブ」であるかどうかを継続的に監視しています。 スタンタイムがミラーリング QoS タイムアウトを超える場合、ノードは接続不可能であり「停止」状態とみなされ、フェイルオーバーがトリガーされます。

    ヒント: すべてのログを確認するか、トラブルシューティングを実行する場合には、grep コマンドが役立ちます。すべての vmware*.log ファイルに対して grep を使用し、異常値、またはスタンタイムが QoS タイムアウトに達しているインスタンスを探してください。 以下のコマンドは、出力をパイプ処理し、awk で書式設定しています。

    grep Unstun vmware* | awk '{ printf ("%'"'"'d", $8)} {print " ---" $0}' | sort -nr


    最後に

    通常稼働時に定期的にシステムを監視し、スタンタイムと、ミラーリングなどの HA 向けの QoS タイムアウトへの影響を理解しておく必要があります。 前述のとおり、スタンタイムまたはスタン解除タイムを最小限に抑える戦略には、データベースとストレージのアクティビティが低い場合にバックアップを実行することと、ストレージを十分にセットアップすることが挙げられます。 常時監視の場合、ログは、VMware ログのインサイトなどのツールを使用して処理できるかもしれません。

    InterSystems データプラットフォームのバックアップと復元操作について、今後の記事で再度取り上げる予定です。 それまでは、システムのワークフローに基づいたコメントや提案がある場合は、以下のコメントセクションに投稿してください。

    0
    0 714
    記事 Toshihiko Minamoto · 7月 6, 2020 24m read

    この記事では、InterSystems Technologiesに基づく、堅牢なパフォーマンスと可用性の高いアプリケーションを提供するリファレンスアーキテクチャをサンプルとして提供します。Caché、Ensemble、HealthShare、TrakCare、およびDeepSee、iKnow、Zen、Zen Mojoといった関連する組み込みテクノロジーに適用可能です。 

    Azureには、リソースを作成して操作するための、Azure ClassicとAzure Resource Managerという2つのデプロイメントモデルがあります。 この記事で説明する情報は、Azure Resource Managerモデル(ARM)に基づきます。 

    要約 

    Microsoft Azureクラウドプラットフォームは、InterSystems製品すべてを完全にサポートできるクラウドサービスとして、IaaS(サービスとしてのインフラストラクチャ)向けの機能の豊富な環境を提供しています。 あらゆるプラットフォームやデプロイメントモデルと同様に、パフォーマンス、可用性、運用、管理手順などの環境に関わるすべての側面が正しく機能するように注意を払う必要があります。 この記事では、こういった各分野の詳細について説明しています。 

    パフォーマンス 

    0
    0 753
    記事 Toshihiko Minamoto · 4月 21, 2020 28m read

    Mirroring 101 

    Cachéミラーリングは、CachéおよびEnsembleベースのアプリケーションに適した信頼性が高く、安価で実装しやすい高可用性および災害復旧ソリューションです。 ミラーリングは幅広い計画停止シナリオや計画外停止シナリオで自動フェイルオーバーを提供するもので、通常はアプリケーションの回復時間を数秒に抑制します。 論理的にデータが複製されるため、単一障害点およびデータ破損の原因となるストレージが排除されます。 ほとんど、またはダウンタイムなしでアップグレードを実行できます。 

    ただし、Cachéミラーの展開にはかなり大がかりな計画が必要であり、さまざまな手順が要求されます。 また、他の重要なインフラストラクチャコンポーネントと同様に、運用中のミラーには継続的な監視とメンテナンスが必要とされます。 

    この記事はよくある質問のリスト、あるいはミラーリングの理解と評価ミラーの計画ミラーの設定ミラーの管理という簡単な一連のガイドとして利用することができます。 それぞれの回答には、各トピックの詳細なディスカッションへのリンクと各タスクの段階的手順へのリンクが含まれています。 

    ミラーを導入する計画を始める準備ができたら、まずはCaché高可用性ガイドの「ミラーリング」の章のミラーリングのアーキテクチャと計画セクションから必ず読み始めるようにしてください。 

    0
    0 1040