はじめに
PostgreSQLというと、動作させるのはLinuxで、可用性の向上というとストリーミングレプリケーションが主流だと思います。
最近Windows ServerでPostgreSQLを使う機会があったので、WSFCによるHAクラスタを組んでみたメモを残しておきたいと思います。
※WSFC : Windows Server Failover Cluster
事前に準備するもの
個人的な検証なので、環境は自分のPCで仮想サーバを立てました。
- PCはWindows 10 (x64)
- OSはWindows Server 2019 Standard(もちろん無料試用版)
- 仮想化ソフトにVMWare Workstation 15 Pro (VMware Workstation Player、VitrualBoxでも良いよ)
- PostgreSQLはPostgreSQL V12.3-2。ここからからダウンロードできます。
- PostgreSQL確認用クライアントソフトはHeidiSQL
環境構成
仮想サーバは3台作ります。
ADサーバ 1台、DBサーバ 2台です。
ADサーバはドメインサーバ(WSFC用)と共有ストレージ(iSCSIターゲットサーバ)、DBアクセスクライアント用に使います。
DBサーバにはPostgreSQLとWSFCをインストールして使います。
iSCSIイニシエータも設定します。
仮想マシンに割り当てるリソースや、IPアドレスなどの情報は次のようにしました。
仮想マシンの情報
サーバ名 | ホスト名 | vCPU | vMEM | vNIC | vDISK | IPアドレス |
---|---|---|---|---|---|---|
ADサーバ | AD01 | 2個 | 4GB | 1個 | OS用:60GB、iSCSI用:10GB | 192.168.246.200 |
DBサーバ#1 | POSDB01 | 2個 | 4GB | 1個 | OS用:60GB | 192.168.246.101 |
DBサーバ#2 | POSDB02 | 2個 | 4GB | 1個 | OS用:60GB | 192.168.246.102 |
ドメインの情報
ドメイン名 |
---|
dev.pos-d.com |
クラスタの情報
クラスター名 | クラスター管理用の IPアドレス |
クライアント アクセス ポイント名 | クライアント アクセス ポイントの IPアドレス |
---|---|---|---|
pos123wsfc | 192.168.246.151 | postgresql-clsdb | 192.168.246.162 |
なお、動かすことを目的としているので、ネットワークの冗長化だとか、クラスタ間のハートビートだとか、そういうものは行いません。
そのため、ネットワークのセグメントも1つだけです。作業もローカルのAdministratorやドメインのAdministratorで行います。
(ちゃんとした環境ではマネしないように)
こんな感じで構築してくよ
ざっとこんな感じで進めます。
- ADサーバとDBサーバのインストールとドメイン参加。
- PostgreSQLのインストールと設定 - その1
- iSCSI周りの構築と設定。
- WSFCの構築と設定 - その1
- PostgreSQLのインストールと設定 - その2
- WSFCの構築と設定 - その2
- 動作テスト
ポイントは、
- 5で行う、PostgreSQLのデータベースクラスタを共有ディスクに配置する
- 6で行う、データベースの起動・停止をWSFCで行うようにする
という所です。
でもやっていることは難しくないので、サクサクっといきましょう。
いざ構築!
1.ADサーバとDBサーバのインストールとドメイン参加
-
ADサーバとDBサーバ 2台にWindowsをGUIありの標準インストールします。
(VMware Workstation を使っている場合は、VMware Toolもインストールします) -
IPアドレス、ホスト名を設定します。
-
各サーバに役割と機能を追加します。
サーバ名 | 役割 | 機能 |
---|---|---|
ADサーバ | 「Active Directory ドメインサービス」 「ファイル サービスと記憶域サービス」から「iSCSI ターゲット サーバー」 |
- |
DBサーバ | - | 「フェールオーバー クラスタリング」 |
4.ADサーバをドメインコントローラーに昇格させます。
サーバーマネージャの右上の旗のところに△のアイコンがつくのでそれをクリックします。
「このサーバーをドメインコントローラに昇格する」というリンクをクリックして、ウィザードを起動します。
変えるところだけ書きます。
- 配置構成
配置操作:[新しいフォレストを追加する]
ルートドメイン名:[dev.pos-d.com]
- ドメイン コントローラー オプション
パスワード:[(好きなパスワード入れてください)]
- DNSオプション
(そのまま[次へ])
- 追加オプション
NetBIOS ドメイン名:[(表示されるままで良いです)]
- パス
(そのまま[次へ])
- オプションの確認
(そのまま[次へ])
- 前提条件のチェック
(そのまま[インストール])
これでドメインサーバができました。
5.ディスクのフォーマット
ADサーバ
iSCSI用のディスクが未フォーマットのままだと思います。ここでフォーマットしておきます。
[スタート] - [Windows 管理ツール] から [コンピュータの管理]
[ディスクの管理]から、オフラインになっているディスクが出てくると思うので、これを
オンライン → ディスクの初期化 → 新しいシンプルボリュームの作成
を行います。
ここでドライブレターは、Eドライブにしておきます。
2.PostgreSQLのインストールと設定 - その1
DBサーバ#1 / DBサーバ#2
PostgreSQLをインストールします。
特に難しいことはありません。
- Installation Directory
(デフォルトのままで良いです)
- Select Components
(デフォルトのままで良いです。全部チェックされた状態。)
- Data Directory
(デフォルトのままで良いです)
- Password
(好きなパスワード入れてください)
- Port
5432 (デフォルトのままで良いです)
- Advanced Options
Locale:[Japanese, Japan]
インストールが終わると、Stack Builderを実行しますか?と聞かれますが、実行不要なのでチェックを外して終了してしまいましょう。
3.iSCSI周りの構築と設定
DBサーバ#1 / DBサーバ#2
iSCSIイニシエータを起動します。
[スタート] - [Windows 管理ツール] から [iSCSI イニシエータ]
を開きます。
ここで、初回アクセスの場合は「Microsoft iSCSIサービスが実行されていません」と出ます。
リブートするたびに手動起動したくないので自動起動にしてしまいます。[はい]を選んでください。
「iSCSIイニシエーターのプロパティ」ダイアログが表示されますが、一旦ここまで。
ADサーバ
次にADサーバでiSCSIターゲットの設定を行います。
ここでDBサーバに見せる用の仮想ディスクを作成します。
仮想ディスクはデータベース格納用の仮想ディスクと、WSFC用のクォーラムディスク、の2つを作成します。
また、イニシエータからの接続許可設定を行います。
サーバーマネージャーを起動し、[ファイル サービスと記憶域サービス]から[iSCSI]
を選択します。
まだiSCSI仮想ディスクは作られていないと思うので、
画面中の[iSCSI仮想ディスクを作成するには、新しいiSCSI仮想ディスクウィザードを開始してください。]をクリックします。
以降、ウィザードに沿って作成していきます。
まずはデータベース格納用の仮想ディスクから。
- iSCSI 仮想ディスクの場所
今回、iSCSI仮想ディスクはEドライブに作成するので、[ボリュームで選択]のところではEドライブを選択します。
こうすると、Eドライブに E:\iSCSIVirtualDisk というフォルダができて、この配下に仮想ディスク用のファイルが出来上がります。
- iSCSI 仮想ディスク名
好きな名前を入れます。ここに入れた名前が仮想ディスクファイルのファイル名(拡張子 .vhdx が自動で付く)にもなります。
「dbdisk」と入れました。
- iSCSI 仮想ディスクのサイズ
検証用なので小さくて大丈夫です。サイズは5GBにしました。
[容量可変]を選択します。
- iSCSIターゲット
[新しいiSCSIターゲット] を選択します。
- ターゲット名およびアクセス
iSCSIターゲット名を入れます。
「DB-iSCSITarget」と入れました。
- アクセスサーバーの指定
作成するiSCSIターゲットへのアクセス許可を行うイニシエータを登録します。
[追加]より登録していきます。
[イニシエーター コンピュータをID で照会する] より、DBサーバを登録します。
2台とも登録するのを忘れないでください。
- 認証サービスを有効にする
検証用なので特に認証設定は行いません。
- 確認
内容確認して、大丈夫なら[作成]します。
これで仮想ディスクとiSCSIターゲットが作成されました。
同じようにクォーラムディスク用のiSCSI仮想ディスクを作成します。
- iSCSI 仮想ディスクの場所
[ボリュームで選択]のところでEドライブを選択します。
- iSCSI 仮想ディスク名
好きな名前を入れます。
「quorum」と入れました。
- iSCSI 仮想ディスクのサイズ
クォーラムディスクは1GBで十分です。
[容量可変]を選択します。
- iSCSIターゲット
[既存のiSCSIターゲット] を選択します。
こうすると、先ほど作成した dbdisk と一緒に公開することができます。
アクセス許可するiSCSIイニシエータも同じになります。
- 確認
内容確認して、大丈夫なら[作成]します。
DBサーバ#1 / DBサーバ#2
iSCSIイニシエーターへの接続許可は行いましたが、iSCSIターゲットの状態は未接続のままだと思います。
DBサーバに戻って、iSCSIイニシエーターから接続します。(サーバを行ったり来たりで忙しいですね!)
iSCSIイニシエーターの設定ですが、何てことはありません。
[クイック接続]でiSCSIターゲットサーバのIPアドレスを入れて[クイック接続]ボタンをクリック
とすれば接続できます。
これをDBサーバ2台ともで実施します。
これでiSCSI仮想ディスクに接続できました。
DBサーバ#1
次にこのディスクを通常のディスクのように初期化(フォーマット)して、使えるようにします。
DBサーバ#1から実施します。
[スタート] - [Windows 管理ツール] から [コンピュータの管理]
を開きます。
[ディスクの管理]から、オフラインになっているディスクが2つ出てくると思うので、
オンライン → ディスクの初期化 → 新しいシンプルボリュームの作成
を行います。
ここでデータベース用ディスク(サイズが5GBのもの)のドライブレターは、Eドライブにしておきます。
クォーラムディスク用(サイズが1GBのもの)はドライブレターは付けません。不要です。
DBサーバ#2
次にDBサーバ#2での作業です。
ディスクはDBサーバ#1でフォーマットまでしてしまっているので、オンラインにするだけです。
[スタート] - [Windows 管理ツール] から [コンピュータの管理]
を開きます。
[ディスクの管理]から、オフラインになっているディスクが2つ出てくると思うので、これをオンラインにします。
4.WSFCの構築と設定 - その1
DBサーバ#1
[スタート] - [Windows 管理ツール] から [フォールオーバー クラスター マネージャー]
を開きます。
いきなりクラスターを作ってもいいのですが、[構成の検証]を試してみましょう。
[構成の検証]から、クラスターを作成するサーバを選択するだけです。
テストオプションは[全てのテストを実行する(推奨)]を選択します。
サクサクと構成の検証が進み、最後に検証結果が出ます。
致命的([失敗]となっているもの)なものが無ければ大丈夫です。
[警告]はおそらく、パッチが最新状態ではないとか、ネットワークの冗長性が無いとかくらいだと思いますが、今回は検証優先なので気にしなくて大丈夫です。
このまま引き続き、クラスターの作成に移ります。
ここも難しいことはありません。
設定するのは、クラスター名とクラスター管理用のIPアドレスだけです。
今回は次のようにしました。
クラスター名 | クラスター管理用のIPアドレス |
---|---|
pos123wsfc | 192.168.246.151 |
[確認]で[使用可能な記憶域をすべてクラスターに追加する]にチェックを入れておきます。
エラーなく作成されればOKです。
軽くテストしてみましょう。
フォールオーバー クラスター マネージャーから、
pos123wsfc.dev.pos-d.com
- 記憶域
- ディスク
と選んでいくと、クラスターの管理下に置かれたディスクが2つ表示されます。
この2つがオンラインになっていることを確認します。
次に、所有者ノードが変更できるか試してみましょう。
画面からはDBサーバ#2が所有者となっていますね。
クラスターディスク2 を選んで、[使用可能な記憶域の移動]をクリックします。
すると 最適なノード 、ノード選択 が選べるので、ノードの選択を選び、DBサーバ#1 を選択して[OK]します。
5.PostgreSQLのインストールと設定 - その2
次はPostgreSQLの設定変更です。(疲れましたね。そろそろお茶にしますか。( -ω-) _旦 )
ここではPostgreSQLインストールで同時に作られるデータベースクラスタを共有ディスクに移動させて、いよいよHAクラスタらしくしていきます。
DBサーバ#1
まずは移動に先だって、Windowsサービスで起動しているDBを止めます。
[スタート] - [Windows 管理ツール] から [サービス]を開きます。
サービスの中に「postgresql-x64-12 - PostgreSQL Server 12」という名前のサービスがあるので、そのサービスのプロパティを開きます。
スタートアップの種類を「自動」から「無効」に変更して、サービスを[停止]させます。
停止したら、データベースクラスタを移動させます。
まず、Eドライブに E:\PostgreSQL-DB というディレクトリを作ります。
次に、データベースクラスタが配置されている C:\Program Files\PostgreSQL\12 まで移動し、data\ というディレクトリを[切り取り]して、
E:\PostgreSQL-DB というディレクトリの下に[貼り付け]します。
ここで注意するのは、[コピー]&[貼り付け]ではなく、[切り取り]&[貼り付け] ということ。
[コピー]だと、必要な権限が保持されないままの貼り付けになってしまうので、[切り取り]で移動させます。
移動させたデータベースクラスタをWindowsサービス登録します。
コマンドプロンプトから実行します。
サービス登録には、PostgreSQLに用意されている pg_ctl というコマンドを使います。
'"' も入力します。
"C:\Program Files\PostgreSQL\12\bin\pg_ctl.exe" register -D "E:\PostgreSQL-DB\data" -N "postgresql-clsdb" -S demand
コマンドの意味としては、
-D でデータベークラスタの位置を指定。
-N でWindows サービスに表示される名前を指定。
-S でWindows サービスでの起動状態を指定。手動起動の"demand" を指定。
になります。
登録されたら、
[スタート] - [Windows 管理ツール] から [サービス]
を開いてみてください。
既に開いている場合は最新の状態に更新、でも良いです。
登録されているサービスの一覧に「postgresql-clsdb」があればOKです。
手動で起動・停止ができるか確認してみてください。
DBサーバ#2
まずは、Windowsサービスで起動しているDBを止めます。
[スタート] - [Windows 管理ツール] から [サービス]を開きます。
サービスの中に「postgresql-x64-12 - PostgreSQL Server 12」という名前のサービスがあるので、そのサービスのプロパティを開きます。
スタートアップの種類を「自動」から「無効」に変更して、サービスを[停止]させます。
DBサーバ#1ではこの後にデータベースクラスタを移動させましたが、DBサーバ#2では共有ディスクにあるデータベースクラスタを参照するので移動はしません。
フォールオーバー クラスター マネージャーを開き、データベース用ディスクの所有ノードをDBサーバ#2に移動させてください。
その後、DBサーバ#2でデータベースクラスタをWindowsサービス登録します。
コマンドプロンプトから実行します。
"C:\Program Files\PostgreSQL\12\bin\pg_ctl.exe" register -D "E:\PostgreSQL-DB\data" -N "postgresql-clsdb" -S demand
登録されているサービスの一覧に、「postgresql-clsdb」があればOKです。
手動で起動・停止ができるか確認してみてください。
フォールオーバー クラスター マネージャーを開き、データベース用ディスクの所有ノードをDBサーバ#1に移動させておいてください。
DBサーバ#1
さて、次に、postgresql.confの設定を変更します。
E:\PostgreSQL-DB\data 配下にあります。
このファイルをメモ帳などで開き、restart_after_crash というパラメータを検索してください。
既定では、
# restart_after_crash = on
でコメントアウトされていますが(デフォルトは on )、
restart_after_crash = off
として、コメント"#" を外してください。
これは何のパラメータかというと、PostgreSQLのプロセスが何かしらの理由で突然死した場合、PostgreSQLはプロセスの再起動を試みます。
でも、WSFCでは監視しているプロセスが逝ってしまったら別ノードにフェールオーバーするので、プロセスの再起動処理は不要になります。
このパラメータをoffにすることで、無駄な再起動処理を抑止します。
6.WSFCの構築と設定 - その2
あと少しです。
WSFCでPostgreSQLを起動停止できるようにし、フェールオーバー/フェールバックできるようにします。
ここでは、役割を追加します。
WSFCで先ほど登録した「postgresql-clsdb」サービスを汎用サービスとして登録します。
DBサーバ#1
フォールオーバー クラスター マネージャーから、
pos123wsfc.dev.pos-d.com
- 役割
で、[役割]を右クリックして、役割の構成を選びます。

高可用性ウィザードが開くので、順に設定していきます。
- 役割の選択
「汎用サービス」
- サービスの選択
「postgresql-clsdb」
- クライアント アクセス ポイント
名前 : 「postgresql-clsdb」
IPアドレス:192.168.246.162
- 記憶域の選択
データベース格納用ディスク を選びます。
ここではクラスター ディスク 2になります。
- レジストリ設定のレプリケート
特に設定しません
- 確認
内容確認して、大丈夫なら作成します。
作成が無事終わると、役割の一覧に作成した役割が表示されているはずです。
次は依存関係の設定です。
リソースがオンラインになる前にオンラインにする必要があるリソースを設定します。
これは、サービスが起動する条件として、共有ディスクが見えていること、IPアドレス(VIP)が振られていることが前提になるため、その設定を行います。
役割から「postgresql-clsdb」を選び、下のペインンから サーバー名 → 名前 と選択します。
初期ではIPアドレスが登録されているので、ここに共有ディスクを追加します。
登録する順番としては、
1番目に、共有ディスク
2番目に、IPアドレス
となるようにしておきます。
1番上の行を選択し、[挿入]をクリックします。プルダウンから共有ディスクを選択します。
WSFCの設定はここまでです。
ちゃんとフェールオーバー/フェールバックができるか確認してみます。
役割から「postgresql-clsdb」を選択し、右クリックして移動 → ノードの選択 を選択し、DBサーバ#2を選択します。
正しく設定されていれば、
オフライン → 所有者ノードの切り替え(DBサーバ#2へ) → オンライン
と、状態が遷移していくはずです。
これでクラスタの構築は完了です。
7.動作テスト
クライアントソフトからアクセスの確認を行ってみます。
まずは、先にDBサーバで外部接続を許可する設定が必要です。クライアント認証ファイルに設定を追加します。
E:\PostgreSQL-DB\data\pg_hba.conf
にアクセスするPCのセグメントからのアクセス許可設定を入れてください。
今回は、
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 192.168.246.0/24 md5 ----> この行を追加
ADサーバのセグメントである192.168.246.0/24からのアクセスを全て許可しました。
また、DBサーバ#1 / DBサーバ#2のWindows Defender ファイアウォールに、Port.5432(tcp)へのアクセス許可のルールを追加してください。(隠れてしまいましたが、ローカルポートに 5432 を指定してあります)
ここまで出来たら、定番のHeidiSQLというフリーソフトでアクセスしてみようと思います。
インストールはADサーバに行います。サクサクっとインストールしてしまってください。
- ネットワーク種別
「PostgreSQL (TCP/IP)」
- Library
「libpq-12.dll」
-ホスト名
DBサーバにアクセスするためのIPアドレスは、VIPの「192.168.246.162」を指定します。
- ユーザー
デフォルトユーザの「postgres」です。
- パスワード
PostgreSQLをインストールするときに設定したパスワードを入れてください。
- データベース
「postgres」を選択します。ここで何も選択できない場合は、DBサーバにアクセスできていない可能性があります。Windows Defender ファイアウォール等の設定を見直してください。
[開く]をクリックして接続出来たら、フォールオーバー クラスター マネージャーでノードを移動したりしてみましょう。
移動のたびに再接続になりますが、どちらのノードに移動していてもアクセス可能になっていると思います。
というダイアログが出てきた場合は、必要なバージョンのVC++ Runtimeがインストールされていない可能性があります。Microsoftのサイトから「Japanese - Japan」のパッケージをを入手してインストールしてください。
終わりに
WindowsでPostgreSQLを使用する場合のクラスタ構築についてでした。
Linuxで構築される機会の多いPostgreSQLですが、あえてWindowsで構築するケースもあるかもしれません。(あるかなぁ。。)
その時の参考になれば幸いです。