2台運用の設定(日レセ5.2以降)
メニュー
2台運用の概要
日医標準レセプトソフトでは、業務を安全に運用できるように、マスタとスタンバイの2台のサーバを使った運用を推奨しています。
平常時はマスタサーバで日レセの運用を行い、ハードウェア故障などの障害発生時にスタンバイサーバに切り替えて運用(フェイルオーバ)を行うことを想定しています。
マスタサーバのみの運用でもデータベース(以降DBと省略)のバックアップがあれば、別のサーバをセットアップして運用の切り替えが可能ですが、2台運用体制で事前にスタンバイサーバを用意しておくことで運用停止時間を短くすることができます。
注意点
2台運用はサーバのハードウェア障害に備えるための概念であり、データのバックアップ用意とは多少異なります。2台運用を行っていてもオペレーションミス等によるDBの論理的破損(患者情報の削除など)は防止できません。(破損状態もスタンバイに同期されてしまうためです)。DBや重要ファイルのバックアップは2台運用とは別に用意することをお薦めします。
- DBダンプ、重要ファイルの定期的な外部媒体へのコピー等
2台運用の仕組み
マスタサーバのDBをスタンバイサーバのDBに同期(レプリケーション)します。DBのレプリケーションはPostgreSQLの機能で行うためマスタサーバとスタンバイサーバのPostgreSQLバージョン(=Ubuntu OSバージョン)が一致していることが動作条件となります。
また日レセパッケージ、プログラム更新、プリンタ設定等のDB以外の部分については別途手動でスタンバイサーバに設定する必要があります。
DBレプリケーションの設定
説明のための前提条件
説明のためマスタサーバ、スタンバイサーバの状態は以下とします。
OSによってPostgreSQLバージョン違いによりファイルパスが異なります。適宜読み替えてください。
IPアドレス | OS | PostgreSQL | |
マスタサーバ | 192.168.56.101 | Ubuntu 20.04 | 12.5 |
スタンバイサーバ | 192.168.56.102 | Ubuntu 20.04 | 12.5 |
マスタサーバの設定
レプリケーションユーザ作成
以下のコマンドでPostgreSQLのレプリケーションユーザを作成します。 WITH PASSWORD ''で囲まれた部分がパスワードとなります。ここではpasswordとしていますが適切なパスワードを設定してください。
$ cd /tmp/
$ sudo -u postgres psql -c "CREATE USER replication WITH PASSWORD 'password' REPLICATION;"
postgresql.confの編集
レプリケーションを動作させるために /etc/postgresql/12/main/postgresql.conf の以下の設定を編集します。コメントアウトされている設定はコメントを解除(先頭#を削除)した上で値を変更してください。
Ubuntu 18.04の場合は /etc/postgresql/10/main/postgresql.conf
Ubuntu 22.04の場合は /etc/postgresql/14/main/postgresql.conf
となります。以降適宜読み替えてください。
listen_addresses = '*' max_wal_senders = 2 wal_keep_segments = 32 (postgresql ver12までの設定) wal_keep_size = 512 (postgresql ver14以降で設定) max_wal_size = 1GB min_wal_size = 80MB wal_level = replica
pg_hba.confの編集
スタンバイサーバからレプリケーションユーザが接続できるよう/etc/postgresql/12/main/pg_hba.confを編集します。最下部に以下の行を追加します。
Ubuntu 18.04の場合は /etc/postgresql/10/main/pg_hba.conf
Ubuntu 22.04の場合は /etc/postgresql/14/main/pg_hba.conf
となります。以降適宜読み替えてください。
host replication all 192.168.56.102/32 md5
4列目にスタンバイサーバのIPアドレスを指定します。
PostgreSQLの再起動
以下のコマンドでPostgreSQLを再起動します。
$ sudo systemctl restart postgresql
スタンバイサーバの設定
postgresql.confの編集
以下の設定項目を編集します。この設定を行うとDBに参照専用としてアクセスが可能となります。(更新はできません。)
max_wal_senders = 2 hot_standby = on
PostgreSQLの停止
以下のコマンドでPostgreSQLを停止します。
$ sudo systemctl stop postgresql
コマンドによる同期
以下のコマンドでマスタサーバと同期を行います。最初のコマンドでPostgreSQLデータディレクトリの削除を行い、2番目のコマンドでDBの同期を行います。-hオプションの後にマスタサーバのIPアドレスを指定します。またコマンド実行時にパスワードの入力を求められるのでマスタサーバで作成したレプリケーションユーザのパスワードを入力します。PostgreSQLデータディレクトリの規模によっては実行に多少時間がかかります。
$ cd /tmp/
$ sudo rm -rf /var/lib/postgresql/12/main $ sudo -u postgres pg_basebackup -R -h 192.168.56.101 -p 5432 -U replication -D /var/lib/postgresql/12/main/ -W Password:
エラーが発生した場合は以下を確認してください。
- コマンドの-hオプションのIPアドレスが正しいか
- マスタサーバのPostgreSQL設定が正しいか
- マスタサーバでPostgreSQLが起動しているか
- スタンバイサーバのPostgreSQLデータディレクトリを正しく削除できているか
- レプリケーションユーザのパスワードが正しいか
各種プロセスの再起動
$ sudo systemctl restart postgresql
WebORCAオンプレの場合:$ sudo systemctl restart jma-receipt-weborca Panda版オンプレの場合:$ sudo systemctl restart jma-receipt
同期の確認
マスタサーバで以下のコマンドを実行します。
$ sudo -u postgres psql -c "SELECT * FROM pg_stat_replication;" pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state | reply_time --------+----------+-------------+------------------+----------------+-----------------+-------------+-------------------------------+--------------+-----------+------------+------------+------------+------------+-----------+-----------+------------+---------------+------------+------------------------------- 346814 | 24565 | replication | 12/main | 192.168.56.102 | | 59350 | 2021-02-02 10:46:08.148397+09 | | streaming | 0/33000148 | 0/33000148 | 0/33000148 | 0/33000148 | | | | 0 | async | 2021-02-02 10:46:48.283679+09 (1 row)
sent_lsnとwrite_lsn、flush_lsn、replay_lsnあたりの値が同一であれば同期されている状態です。
またマスタサーバでDB更新操作(日レセ登録処理など)を行い、スタンバイサーバのDBを参照して更新を確認するといった方法でも同期が確認できます。
スタンバイサーバ側でも以下のコマンドで最終の同期時刻が確認できます。ただし同期直後でマスタサーバの更新がない場合は以下のレコードがない場合もあります。
$ sudo -u postgres psql -c "SELECT pg_last_xact_replay_timestamp();" pg_last_xact_replay_timestamp ------------------------------- 2021-02-02 16:03:27.546964+09 (1 row)
他には以下のコマンドでスタンバイサーバの同期プロセスのプロセスIDが確認できます。
$ sudo -u orca psql -Aqntc "SELECT pid from pg_stat_wal_receiver;" 2046
スタンバイサーバにてlocalhostのデータベースに接続した場合、同期中は下記の動作となります。
WebORCAオンプレ版 :ログインできなくなるため、「ログインに失敗しました」が表示 MONTSUQI版オンプレ:接続をおこなうと「従サーバに接続しています」が表示
障害発生時の切り替え
マスタサーバで障害が発生し、スタンバイサーバに運用を切り替える際は以下の手順で行います。(クライアント接続先変更やプリンタ設定の確認は前後しても構いません。)
- データベースのマスタ昇格
- プリンタ設定などの確認
- 日レセクライアントの接続先変更
- 日レセの起動
- プログラム更新
- プラグイン更新
データベースのマスタ昇格
以下のコマンドを実行してPostgreSQLのマスタ昇格を行います。マスタ昇格後はデータベース更新可能となります。また障害発生前のマスタサーバとの同期設定は自動的に解除されます。
$ cd /tmp/
$ sudo -u postgres /usr/lib/postgresql/12/bin/pg_ctl promote -D /var/lib/postgresql/12/main/ waiting for server to promote.... done server promoted
マスタサーバ復旧後の2台運用の再設定
マスタサーバの障害が解消し、再度2台運用を設定する場合は、マスタ昇格したスタンバイサーバをそのまま新マスタサーバとし、復旧した旧マスタサーバをスタンバイとして設定することを推奨します。(マスタサーバの入れ替えは誤って古いマスタデータを同期してしまう懸念があるためです。)
メンテナンス
マスタサーバは通常の日レセメンテナンス方法となりますが、スタンバイサーバのメンテナンスは一部手順が異なります。
プログラム更新
通常時はマスタサーバのみ行います。スタンバイサーバでは行いません。
スタンバイサーバでは、障害発生時にマスタに昇格した際にプログラム更新を行います。(レプリケーション状態ではDB更新ができずプログラム更新処理がエラーとなるためです。)
プラグイン更新
通常時はマスタサーバのみ行います。スタンバイサーバでは行いません。
スタンバイサーバでは、障害発生時にマスタに昇格した際にプラグイン画面から組み込みをし直します。DB上はプラグインがインストールされていますが、プラグインの実体が存在しないためそのままでは動作しません。プラグイン管理画面で「インストール済み」が「NOT FOUND」となっているプラグインを選択して、一旦削除してから、再度組み込みを行います。
マスタ更新
マスタサーバのみ行います。スタンバイサーバでは行いません。(レプリケーションにより同期されるためマスタ更新は不要です。 )