LoginSignup
3
2

More than 3 years have passed since last update.

Windows Server + PostgreSQL + WSFC 環境の構築

Posted at

はじめに

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イニシエータも設定します。

構成はこんな感じです。
wsfc-pos_10-1_999.jpg

仮想マシンに割り当てるリソースや、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で行います。
(ちゃんとした環境ではマネしないように)

こんな感じで構築してくよ

ざっとこんな感じで進めます。

  1. ADサーバとDBサーバのインストールとドメイン参加。
  2. PostgreSQLのインストールと設定 - その1
  3. iSCSI周りの構築と設定。
  4. WSFCの構築と設定 - その1
  5. PostgreSQLのインストールと設定 - その2
  6. WSFCの構築と設定 - その2
  7. 動作テスト

ポイントは、

  • 5で行う、PostgreSQLのデータベースクラスタを共有ディスクに配置する
  • 6で行う、データベースの起動・停止をWSFCで行うようにする

という所です。

でもやっていることは難しくないので、サクサクっといきましょう。

いざ構築!

1.ADサーバとDBサーバのインストールとドメイン参加

  1. ADサーバとDBサーバ 2台にWindowsをGUIありの標準インストールします。
    (VMware Workstation を使っている場合は、VMware Toolもインストールします)

  2. IPアドレス、ホスト名を設定します。

  3. 各サーバに役割と機能を追加します。

サーバ名 役割 機能
ADサーバ 「Active Directory ドメインサービス」
「ファイル サービスと記憶域サービス」から「iSCSI ターゲット サーバー」
-
DBサーバ - 「フェールオーバー クラスタリング」

4.ADサーバをドメインコントローラーに昇格させます。

サーバーマネージャの右上の旗のところに△のアイコンがつくのでそれをクリックします。

「このサーバーをドメインコントローラに昇格する」というリンクをクリックして、ウィザードを起動します。
wsfc-pos_01_016.jpg

変えるところだけ書きます。

- 配置構成
    配置操作:[新しいフォレストを追加する]
    ルートドメイン名:[dev.pos-d.com]
- ドメイン コントローラー オプション
    パスワード:[(好きなパスワード入れてください)]
- DNSオプション
    (そのまま[次へ])
- 追加オプション
    NetBIOS ドメイン名:[(表示されるままで良いです)]
- パス
    (そのまま[次へ])
- オプションの確認
    (そのまま[次へ])
- 前提条件のチェック
    (そのまま[インストール])

これでドメインサーバができました。

5.ディスクのフォーマット

ADサーバ

iSCSI用のディスクが未フォーマットのままだと思います。ここでフォーマットしておきます。

[スタート] - [Windows 管理ツール] から [コンピュータの管理]

を開きます。
wsfc-pos_05_002.jpg

[ディスクの管理]から、オフラインになっているディスクが出てくると思うので、これを

オンライン → ディスクの初期化 → 新しいシンプルボリュームの作成

を行います。

ここでドライブレターは、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つ出てくると思うので、
wsfc-pos_06-1_006.jpg

オンライン → ディスクの初期化 → 新しいシンプルボリュームの作成

を行います。

ここでデータベース用ディスク(サイズが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つ表示されます。
wsfc-pos_08-1_045.jpg

この2つがオンラインになっていることを確認します。

次に、所有者ノードが変更できるか試してみましょう。
画面からはDBサーバ#2が所有者となっていますね。
クラスターディスク2 を選んで、[使用可能な記憶域の移動]をクリックします。
すると 最適なノード 、ノード選択 が選べるので、ノードの選択を選び、DBサーバ#1 を選択して[OK]します。
wsfc-pos_08-1_047.jpg

正常に所有者ノードがDBサーバ#1に切り替わればOKです。
wsfc-pos_08-1_049.jpg

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
    - 役割

で、[役割]を右クリックして、役割の構成を選びます。

wsfc-pos_10-1_006

高可用性ウィザードが開くので、順に設定していきます。

- 役割の選択
    「汎用サービス」
- サービスの選択
    「postgresql-clsdb」
- クライアント アクセス ポイント
     名前 : 「postgresql-clsdb」
     IPアドレス:192.168.246.162
- 記憶域の選択
     データベース格納用ディスク を選びます。
     ここではクラスター ディスク 2になります。
- レジストリ設定のレプリケート
     特に設定しません
- 確認
    内容確認して、大丈夫なら作成します。

作成が無事終わると、役割の一覧に作成した役割が表示されているはずです。

次は依存関係の設定です。
リソースがオンラインになる前にオンラインにする必要があるリソースを設定します。
これは、サービスが起動する条件として、共有ディスクが見えていること、IPアドレス(VIP)が振られていることが前提になるため、その設定を行います。

役割から「postgresql-clsdb」を選び、下のペインンから サーバー名 → 名前 と選択します。

wsfc-pos_10-1_019.jpg

それからプロパティを開き、依存関係タブを選びます。
wsfc-pos_10-1_021.jpg

初期ではIPアドレスが登録されているので、ここに共有ディスクを追加します。
登録する順番としては、

1番目に、共有ディスク
2番目に、IPアドレス

となるようにしておきます。
1番上の行を選択し、[挿入]をクリックします。プルダウンから共有ディスクを選択します。
wsfc-pos_10-1_023.jpg

WSFCの設定はここまでです。
ちゃんとフェールオーバー/フェールバックができるか確認してみます。

役割から「postgresql-clsdb」を選択し、右クリックして移動 → ノードの選択 を選択し、DBサーバ#2を選択します。
wsfc-pos_10-1_026.jpg

正しく設定されていれば、
オフライン → 所有者ノードの切り替え(DBサーバ#2へ) → オンライン
と、状態が遷移していくはずです。

wsfc-pos_10-1_027.jpg

これでクラスタの構築は完了です。

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 を指定してあります)
wsfc-pos_10-1_047.jpg

ここまで出来たら、定番のHeidiSQLというフリーソフトでアクセスしてみようと思います。

インストールはADサーバに行います。サクサクっとインストールしてしまってください。

設定は、次のようになります。
wsfc-pos_10-1_900.jpg

- ネットワーク種別
    「PostgreSQL (TCP/IP)」
- Library
    「libpq-12.dll」
-ホスト名
    DBサーバにアクセスするためのIPアドレスは、VIPの「192.168.246.162」を指定します。
- ユーザー
    デフォルトユーザの「postgres」です。
- パスワード
    PostgreSQLをインストールするときに設定したパスワードを入れてください。
- データベース
    「postgres」を選択します。ここで何も選択できない場合は、DBサーバにアクセスできていない可能性があります。Windows Defender ファイアウォール等の設定を見直してください。

[開く]をクリックして接続出来たら、フォールオーバー クラスター マネージャーでノードを移動したりしてみましょう。

移動のたびに再接続になりますが、どちらのノードに移動していてもアクセス可能になっていると思います。

もし[開く]をクリックしたときに
wsfc-pos_10-1_901.jpg

というダイアログが出てきた場合は、必要なバージョンのVC++ Runtimeがインストールされていない可能性があります。Microsoftのサイトから「Japanese - Japan」のパッケージをを入手してインストールしてください。

終わりに

WindowsでPostgreSQLを使用する場合のクラスタ構築についてでした。

Linuxで構築される機会の多いPostgreSQLですが、あえてWindowsで構築するケースもあるかもしれません。(あるかなぁ。。)

その時の参考になれば幸いです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2