Exploring failover handling with PGD

高可用性クラスターでは、フェールオーバー機能はクラスターの全体的な復元力にとって重要です。リードデータノードが何らかの理由で動作を停止した場合、アプリケーションはほとんど、またはまったく中断せずにデータベースの操作を継続できる必要があります。 PGDの場合、これは、アプリケーションを新しいリードデータノードに転送することを意味し、自動的に引き継ぎます。これがPGDプロキシが役立つ場所です。クラスターと連携し、トラフィックをリードデータノードに自動的に転送します。

この演習では、データベースに定期的にデータを送信するアプリケーションを作成します。次に、PGD CLIで変更を要求することにより、最初にリードデータノードをソフトに切り替えます。次に、データベースインスタンスを強制的にシャットダウンし、PGDがそれをどのように処理するかを確認します。

クイックスタート構成

この探索では、 quick start for Docker 、 quick start for AWS 、または quick start for Linux hosts を使用してPGDクラスターを作成したことを前提としています。

各クイックスタートの最後には、4つのノードと次のロールを持つクラスターが作成されます。

Host name

Host role

kaboom

PGD data node and pgd-proxy co-host

kaftan

PGD data node and pgd-proxy co-host

kaolin

PGD data node and pgd-proxy co-host

kapok

Barman backup node

この演習では、これらのホスト名を使用します。

xpanesのインストール

xpanes を使用します。これは、簡単に切り替えることができる複数のターミナルセッションをすばやく作成できるユーティリティです。デフォルトではインストールされないため、インストールする必要があります。この演習では、 tpaexec を実行してクイックスタートクラスターを構成したシステムからxpanesを起動します。

システムでUbuntuを実行している場合は、次を実行します。

sudo apt install software-properties-common
sudo add-apt-repository ppa:greymd/tmux-xpanes
sudo apt update
sudo apt install tmux-xpanes

これらは the xpanes repository からのインストール手順です。 Ubuntuを使用していない場合、リポジトリには他のシステムのインストール手順も含まれています。

4つのサーバーへの接続

xpanesがインストールされたら、次を実行して、4つすべてのサーバーとのSSHセッションを作成できます。

cd democluster
xpanes -d -c "ssh -F ssh_config {}" "kaboom" "kaolin" "kaftan" "kapok"

これらのコマンドを実行すると、4つのペインが表示されます。 4つのペインはkaboom、kaolin、kaftan、およびkapokに接続され、それぞれにrootユーザーとしてログインします。演習の後半でサービスを簡単に停止および開始できるように、この特権が必要です。

Control-b を押してから q を押して、各ペインの数値を簡単に表示します。

4 SSH Sessions showing numbers

4 SSH Sessions showing numbers

ペイン間でフォーカスを切り替えるには、 Control-b とカーソルキーを使用してペイン間を移動できます。または、 Control-b を使用し、その後に q とフォーカスするペインの番号を入力します。両方の方法を示します。

Control-b↓を使用します。Control-b→ または Control-bq3 して、フォーカスをkapokホストである右下のペインに移動します。このサーバーは、バックアップの実行を担当します。これは、デモアプリケーションの操作のベースとして使用します。 Barmanの資格情報を使用して、データベースサーバーとプロキシに接続できます。

sudo -iu barman
psql -h kaboom -p 6432 bdrdb

このコードはkaboomホスト上のプロキシに接続します。ホストはクラスターの一部としてPostgresインスタンスも実行します。

次のステップでは、アプリケーションが書き込むテーブルを作成します。

drop table if exists ping cascade;
CREATE TABLE ping (id SERIAL PRIMARY KEY, node TEXT, timestamp TEXT) ;

このコードは、最初にping テーブルを削除します。次に、 id主キーと、ノードとタイムスタンプ用の2つのテキストフィールドを使用して、 ping テーブルを再作成します。これでテーブルの準備ができました。確認するには、 Control-b←を使用します。Control-b↑ または Control-bq0 して左上のペインに移動し、kaboomサーバーに接続します。このペインで、enterprisedbユーザーになり、データベースに簡単に接続できます。

sudo -iu enterprisedb

次を実行して、ローカルデータベースに接続できます。

psql bdrdb

このコマンドは、kaboom上のローカルデータベースインスタンスに直接接続します。 \dt を使用して、使用可能なテーブルを表示します。

bdrdb=# \dt
       List of relations
 Schema | Name | Type  | Owner
- -------+------+-------+--------
 public | ping | table | barman
(1 row)

\d ping を実行すると、pingを作成するDDLがkaboomサーバー上にあることが示されます。

edb_notranlate_7このテーブルが複製されていることを確認したい場合は、クラスター内の別のノードに接続して見ることができます。 psqlの\c コマンドを使用すると、別のサーバーに接続できます。 Kaftanノードに接続するには、次を実行します。

\c - - kaftan

次のようなログインメッセージが表示されます。

psql.bin (15.2.0 (Debian 15.2.0-2.buster), server 15.2.0 (Debian 15.2.0-2.buster)) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
You are now connected to database "bdrdb" as user "enterprisedb" on host "kaftan" (address "10.33.25.233") at port "5444".
bdrdb=#

\dt および\d ping を実行すると、kaftanノードで同じ結果が表示されます。

kaboomノードに再接続するには、次を実行します。

\c - - kaboom

モニターのセットアップ

次に、pingテーブルのアクティビティを監視します。次のSQLを入力して、最新の10件のエントリを表示します。

select * from ping order by timestamp desc limit 10;

このコマンドを複数回実行するには、シェルで\watch コマンドを使用します。これにより、定期的に最後のクエリが実行されます。毎秒更新するには、次のように入力します。

\watch 1

これまでのところ、見るものは何もありません。すぐにアクティビティを追加します。

pingの作成

Control-b↓を使用して、Barmanホストカポックに戻ります。Control-b→ または Control-bq3 。

このセッションはまだpsqlセッションにログインしています。次にシェルスクリプトを実行するため、 psqlを終了する必要があります。 Control-d を押します。

シェルプロンプトに次のように表示されます。

barman@kapok:~$

admin@kapok またはroot@kapok と書かれている場合は、 sudo -iu barman を実行してBarmanユーザーに戻ります。

作成するアプリケーションはシンプルです。書き込むノードとpingのタイムスタンプを取得します。次に、できるだけ早く、新しいpingをpingテーブルに書き込みます。

シェルで、次のように入力します。

while true; do psql -h kaftan,kaolin,kaboom -p 6432 bdrdb -c "INSERT INTO ping(node, timestamp) select node_name, current_timestamp from bdr.local_node_summary;"; done

より読みやすい形式で、つまり:

while true;
    do psql -h kaftan,kaolin,kaboom -p 6432 bdrdb -c \
        "INSERT INTO ping(node, timestamp) select node_name, current_timestamp from bdr.local_node_summary;"
    done

定数ループでは、 psqlコマンドを呼び出し、ホストとして3つのプロキシのいずれかに接続するように指示し、プロキシポートを提供し、 bdrdbデータベースを選択します。また、2つの値をpingテーブルに挿入するコマンドを渡します。値の1つは、実際に接続しているノードの名前を含むbdr.local_node_summary から取得されます。もう1つの値は現在の時刻です。

ループが実行されると、新しいエントリがテーブルに表示されます。モニターをセットアップする左上のペインにそれらが表示されます。

これで、フェールオーバーのテストを開始できます。

書き込みリーダーの表示

プロセスのこの部分では、左下隅にあるホストkaftanに切り替えます。 Control-b← または Control-bq2 を使用して、フォーカスを切り替えます。

pgd を実行するための適切な特権を取得するには、PGDコマンドラインインターフェイスで次を実行します。

sudo -iu enterprisedb

クラスターの状態を表示するには、次を実行します。

pgd show-groups

次のような出力が表示されます。

Group        Group ID   Type   Parent Group Location Raft Routing Write Leader
- ----        --------   ----   ------------ -------- ---- ------- ------------
democluster  1935823863 global                       true false
dc1_subgroup 1302278103 data   democluster  dc1      true true    kaboom

グローバルグループdemocluster には、すべてのサブグループが含まれます。 dc1_subgroup は、使用しているデータクラスターです。そのグループ名の値は、このクラスターを構成したときにクイックスタートで指定された場所から派生します。各ロケーションは独自のサブグループを取得するため、他のロケーションまたはクラスターとは無関係に管理できます。

表の右側にスキップすると、グループの現在の書き込みリーダー(すべてのプロキシが更新を送信するサーバー)がkaboomであることがわかります。

switchover コマンドをクラスターグループに送信して、リーダーを変更します。次のコマンドを実行します。

edb_notranlate_33 ノード名は、dc1_subgroupグループ内の別のデータノードのホスト名です。

2つの応答のいずれかが表示されます。 show-groups コマンドを実行したとき、書き込みリーダーとしてkaolinが表示された場合、次のように表示されます。

Error: "kaolin" is already a write leader

これは、カオリンがすでに書き込みリーダーに選出されたことを意味するため、切り替えても効果はありません。この演習では、ノード名をkaboomまたはkaftanに置き換えて、別のホストへのスイッチオーバーを再試行します。

現在の書き込みリーダーではないホストを選択すると、他の応答が表示されます。

switchover is complete

左上のペインを見ると、スクリプトからの挿入が切り替えられ、切り替えたばかりのノードに書き込まれていることがわかります。

!!!Info ID番号を観察する 生成されているID番号は、値の完全に異なる範囲からのものであることに注意してください。これは、システムがIDを生成するシーケンスを透過的にグローバルシーケンスにしたためです。グローバルシーケンスとそれらが

bdr.シーケンス でどのように機能するかについてもっと読む。

ノードを失う

リーダーを切り替えることができることは、計画的なメンテナンスに役立ちます。クラスターに構成を変更するように指示します。予期せぬ変化が起こったら?ここで、そのシナリオを作成します。

左下のペインで、リーダーをカオリンに設定します。

pgd switchover --group-name dc1_subgroup --node-name kaolin

次に、 Control-b↑を使用して、フォーカスを右上のペインに変更します。Control-b→ または Control-bq1 、これはカオリンホストでのセッションです。

次を実行して、Postgresサーバーをオフにします。

sudo systemctl stop postgres.service

左上のペインには、クラスターサブグループが新しいリーダーを選択すると、監視対象テーブルがカオリンから別のノードに切り替わるのが表示されます。更新がキャンセルされると、右下ペインのスクリプトにエラーが表示される場合があります。ただし、新しいリーダーが選出されるとすぐに、そのリーダーへのトラフィックのルーティングが開始されます。

ノードの状態を表示する

Control-b↓を使用して左下のペインに切り替えますControl-b← または Control-bq2 、実行:

pgd show-nodes

次のようなものが表示されます。

Node   Node ID    Group        Type Current State Target State Status      Seq ID
- ---   -------    -----        ---- ------------- ------------ ------      ------
kaboom 2710197610 dc1_subgroup data ACTIVE        ACTIVE       Up          3
kaftan 3490219809 dc1_subgroup data ACTIVE        ACTIVE       Up          2
kaolin 2111777360 dc1_subgroup data ACTIVE        ACTIVE       Unreachable 1

カオリンノードがダウンしており、更新は別の書き込みリーダーに送られます。

監視ラグ

カオリンがダウンしている間、PGDの中心にある論理レプリケーションは、カオリンがクラスターとどの程度同期していないかを追跡しています。それを自分で確認するには、次を実行します。

psql bdrdb -c "select * from bdr.node_replication_rates;"

このコマンドは、サーバー間の現在のレプリケーション速度を表示します。

 peer_node_id | target_name | sent_lsn  | replay_lsn |   replay_lag    | replay_lag_bytes | replay_lag_size | apply_rate | catchup_interval
- -------------+-------------+-----------+------------+-----------------+------------------+-----------------+------------+------------------
   2710197610 | kaboom      | 0/769F650 | 0/769F650  | 00:00:00        |                0 | 0 bytes         |       1861 | 00:00:00
              | kaolin      | 0/7656648 | 0/7656648  | 00:03:07.252266 |           299016 | 292 kB          |            |
(2 rows)

この出力を見ると、カオリンには3分のリプレイラグと、今戻ってきた場合に追いつくための約292KBのデータがあることがわかります。カオリンがダウンしている時間が長いほど、リプレイラグが大きくなります。モニタリングコマンドを再実行すると、数値が上昇していることがわかります。

 peer_node_id | target_name | sent_lsn  | replay_lsn |   replay_lag    | replay_lag_bytes | replay_lag_size | apply_rate | catchup_interval
- -------------+-------------+-----------+------------+-----------------+------------------+-----------------+------------+------------------
   2710197610 | kaboom      | 0/76B1D28 | 0/76B1D28  | 00:00:00        |                0 | 0 bytes         |       1743 | 00:00:00
              | kaolin      | 0/7656648 | 0/7656648  | 00:03:53.045704 |           374496 | 366 kB          |            |
(2 rows)

さらに46秒が経過し、ラグは74KB拡大しました。次に、ノードを元に戻し、システムがどのように回復するかを確認します。

ノードの再起動

カオリンでPostgresサービスを戻すことができます。 Control-b↑を使用して、右上のペインに戻ります。Control-b→ または Control-bq1 、実行:

sudo systemctl start postgres.service

変化は見られません。データベースサービスは復旧して実行されていますが、クラスターは選挙を行っていないため、リーダーはそのままです。 Control-b↓を使用して左下のペインに切り替えますControl-b← または Control-bq2 、実行:

pgd show-nodes

次の内容が表示されます。

Node   Node ID    Group        Type Current State Target State Status Seq ID
- ---   -------    -----        ---- ------------- ------------ ------ ------
kaboom 2710197610 dc1_subgroup data ACTIVE        ACTIVE       Up     3
kaftan 3490219809 dc1_subgroup data ACTIVE        ACTIVE       Up     2
kaolin 2111777360 dc1_subgroup data ACTIVE        ACTIVE       Up     1

カオリンがクラスターに戻るとすぐに、クラスターとの同期が開始されます。それは、そのリプレイデータに追いつくことによってそれを行います。実行:

psql bdrdb -c "select * from bdr.node_replication_rates;"

出力は次のようになります。

 peer_node_id | target_name | sent_lsn  | replay_lsn | replay_lag | replay_lag_bytes | replay_lag_size | apply_rate | catchup_interval
- -------------+-------------+-----------+------------+------------+------------------+-----------------+------------+------------------
   2710197610 | kaboom      | 0/8092938 | 0/8092938  | 00:00:00   |                0 | 0 bytes         |       2321 | 00:00:00
   2111777360 | kaolin      | 0/8092938 | 0/8092938  | 00:00:00   |                0 | 0 bytes         |     337426 | 00:00:00
(2 rows)

ご覧のとおり、カオリンは完全に自動的に追いついたので、リプレイラグはなくなりました。

カオリンが完全にサービスを再開すると、すべてをそのままにすることができます。ライトリーダーであるサーバーを変更する必要はありません。フェイルオーバーメカニズムは、必要に応じて別のサーバーを書き込みリーダーに引き上げる準備ができています。

必要に応じて、次を実行してカオリンリーダーを再度作成できます。

pgd switchover --group-name dc1_subgroup --node-name kaolin

このコマンドは、リードを書き込むカオリンを返します。プロキシが書き込みリーダーを追跡するため、アプリケーションの更新が続きます。

プロキシフェイルオーバー

プロキシはフェールオーバーすることもできます。これを体験するには、フォーカスがまだ左下のペインにあることを確認して、次を実行します。

pgd show-proxies

次の内容が表示されます。

Proxy  Group        Listen Addresses Listen Port
- ----  -----        ---------------- -----------
kaboom dc1_subgroup [0.0.0.0]        6432
kaftan dc1_subgroup [0.0.0.0]        6432
kaolin dc1_subgroup [0.0.0.0]        6432

exit と入力してenterprisedbユーザーを終了し、管理/ルートシェルに戻ります。次を実行して、このノードのプロキシサービスを停止できます。

sudo systemctl stop pgd-proxy.service

スクリプトが別のプロキシに切り替えると、右下のウィンドウに簡単なエラーが表示されます。ただし、書き込みリーダーは変更されないため、プロキシのスイッチは、モニタークエリが実行されている左上のペインに表示されません。

次を実行して、Kaftanのプロキシサービスを元に戻します。

sudo systemctl start pgd-proxy.service

!!!Tip Tmuxの終了 Tmuxと関連するすべてのセッションをすばやく終了できます。セッションが強制終了された後も実行を継続するため、最初に実行中のプロセスを終了します。 Control-B を押してから、 :kill-session と入力します。このアプローチは、 Control-D またはexit を使用して各ペインのセッションを1つずつ終了するよりも簡単です。

この例では、3つのデータノードと1つのバックアップノードのクイックスタート構成を使用します。 2つのデータノードと1つの監視ノードを持つようにクラスターを構成できます。これは、ノードの障害に対する回復性が低くなります。または、5つのデータノードを構成できます。これは、ノードの障害に対する回復力がはるかに高くなります。この構成では、アプリケーションでフェールオーバーがどのように機能するかを調べることができます。複数の場所を持つクラスターの場合、同じ基本ルールが適用されます。サーバーをダウンすると、プロキシが指す新しい書き込みリーダーが選択されます。

さらに読む