現在、Windows 2012 サーバーでアプリケーションを制御できるように ac# アプリをセットアップしています。
建築:
マスター サーバー - Windows サービスから読み取り/書き込みデータベースとして実行される Postgres x64 9.3。ホット スタンバイ モードとレプリケーション スロットを備えています。
スレーブ サーバー - レプリケーション スロットを介して読み取り専用のホットスタンバイ サーバーとして Windows サービスから実行される Postgres x64 9.3。
次のコードを使用してサービスを停止する予定です。
service = new ServiceController("postgresql-x64-9.4");
try
{
TimeSpan timeout = TimeSpan.FromMilliseconds(5000);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
log.writeLog(data, "success", "Postgres Stopped");
}
catch (Exception e)
{
log.writeLog(data, "ERROR", e.Message + " - " + e.InnerException);
msg = Encoding.ASCII.GetBytes("ERROR");
break;
}
ただし、両方のデータベースの整合性に関してこれが安全かどうか疑問に思っていました。
pg_ctlにはシャットダウンモードがあり、「スマート」モードはアクティブなプロセスを待機し、データベースを停止する前に接続などを閉じます。Windowsサービスを停止しても同じですか?はい、明らかにこれを達成するために pg_ctl を使用できますが、他の何よりも興味を持っています。
アクティブなレプリケーションに関して軽減する必要があるリスクはありますか? または、サーバーが同期されるまでサービスは存続しますか? 「停止」のタイミングは、データベースの書き込み負荷が高くない時点で行われるため、基本的に同期している必要があります。「停止」コードを開始する前に、これをテストすることもできます。
これは、マスター サーバーが停止している間、レプリケートされたスレーブを「ライブ」のままにし、読み取り専用スレーブ モードのままにすることを目的としています。
前もって感謝します