[Linux][DHCP] ISC Kea DHCPをhot-standby HA構成で設定してみる。

2020-02-05 11:08:00AIX、UNIX、Linux, Networkconfig, DHCP, HA, isc, Kea, linux, 冗長構成, 設定

High Availability in Kea 1.4.0 - Design
Hot standby
High Availability in Kea 1.4.0 – Design より
https://gitlab.isc.org/isc-projects/kea/-/wikis/designs/High-Availability-Design

過去に以下のような記事を書きましたが、現在はISC Kea DHCP serverを使用しているのでこちらでのHA(Hot Standby)構成の設定方法について記事を書いておくことにしました。

確認環境

  • Ubuntu 18.04.2 AArch64
  • ISC Kea 1.7.4
  • kea_1(primary): (dns03) / 192.168.1.4
  • kea_2(secondary): (dns02) / 192.168.1.3
CAUTION

IPアドレスのナンバリングとprimary, secondaryの関連性が逆になっており、気持ち悪さを感じる人も多そうですが申し訳ない。

設定方法

以下公式ドキュメントの"15.15. ha: High Availability"のサンプルコードが答えそのものです。

以下のような設定ファイルをactivestandbyのサーバ両方に設定します。this-server-nameだけは固有の設定値になるので、それぞれのサーバを識別できる値を設定しましょう。

"Dhcp4": {
    "hooks-libraries": [{
        "library": "/usr/local/lib/kea/hooks/libdhcp_lease_cmds.so",
        "parameters": { }
    }, {
        "library": "/usr/local/lib/kea/hooks/libdhcp_ha.so",
        "parameters": {
            "high-availability": [{
                "this-server-name": "kea_1",
                "mode": "hot-standby",
                "heartbeat-delay": 10000,
                "max-response-delay": 10000,
                "max-ack-delay": 5000,
                "max-unacked-clients": 5,
                "peers": [{
                    "name": "kea_1",
                    "url": "http://192.168.1.4:8080/",
                    "role": "primary",
                    "auto-failover": true
                }, {
                    "name": "kea_2",
                    "url": "http://192.168.1.3:8080/",
                    "role": "standby",
                    "auto-failover": true
                }]
            }]
        }
    }],

    "subnet4": [{
        "subnet": "192.168.1.0/24",
        "pools": [{
            "pool": "192.168.1.100 - 192.168.1.129",
            "client-class": "HA_kea_1"
        }],

        "option-data": [{
            "name": "routers",
            "data": "192.168.1.1"
        }],
    }]
}

パラメータについて

POINT

  • this-server-name
    HA構成におけるのサーバの一意の識別子です。ピアリスト内で指定されたサーバーの1つと一致する必要がある。
  • mode 
    load-balancinghot-standby のどちらかを選択する。
  • heartbeat-delay
    最後のハートビート(またはパートナーに送信された他のコマンド)を送信してから次のハートビートを送信するまでの期間をミリ秒単位で指定する。ハートビートは定期的に送信され、パートナーのステータスを収集し、パートナーがまだ動作しているかどうかを確認する。
    デフォルトは10,000ミリ秒
  • max-response-delay
    パートナーとの最後の正常な通信からのミリ秒単位の期間を指定する。指定秒数経過後サーバーはパートナーとの通信が中断されたと見なします。この期間は、heartbeat-delayよりも長くする必要がある。サーバーは、通信の中断を検出すると、 partner-down 状態に移行するか( max-unacked-clients が0の場合)、以下の2つのパラメーターの値を使用して障害検出手順をトリガーする。このパラメーターのデフォルト値は60,000ミリ秒です。
  • max-ack-delay
    パートナーの障害検出を制御するパラメーターの1つ。パートナーとの通信が中断されると、サーバーは、secsフィールド(DHCPv4)またはElapsed Timeオプション(DHCPv6)の値を調べる。このパラメーターは、クライアントがDHCPサーバーとの通信を試みる最大時間をミリ秒単位で指定します。その後、このサーバーは、クライアントがDHCPサーバーとの通信に失敗したと見なします(「unacked」)。このパラメーターのデフォルト値は10,000ミリ秒です。
  • max-unacked-clients
    このサーバーがパートナーがオフラインであると見なして partner-down 状態に移行するまでに許可される「unacked」クライアントの数(max-ack-delayを参照)を指定する。このパラメーターには特別な値0を使用できます。これにより、障害検出メカニズムが無効になる。この場合、制御チャネルを介してパートナーと通信できないサーバーは、パートナーサーバーがダウンしていると見なし、すぐに partner-down 状態に移行する。このパラメーターのデフォルト値は10です。
  • name 
    サーバーの一意の名前を指定
  • url
    制御チャネルを介してこのサーバーに接続するために使用されるURLを指定。他のサーバーはこのURLを使用して、そのサーバーに制御コマンドを送信する。
  • role 
    HA構成でのサーバーの役割を設定する。ホットスタンバイ構成では、 primarysecondary 、および backup のロールがサポートされています。ロードバランス構成では、primaryサーバーとsecondaryサーバーがそれぞれ1つだけ存在する必要があります。
  • auto-failover 
    パートナーの障害を検出したサーバーがパートナーのクライアントへのサービスを自動的に開始するかどうかを示す真偽値。このパラメーターのデフォルト値はtrueです。

動作確認

まずActiveサーバを起動します。すると以下のようなlogが出力されると思います。HA構成で起動され、こちらのサーバがprimaryとして認識されています。

2020-02-02 10:57:05.663 INFO  [kea-dhcp4.ha-hooks/30] HA_LOCAL_DHCP_DISABLE local DHCP service is disabled while the kea_1 is in the WAITING state
2020-02-02 10:57:05.663 INFO  [kea-dhcp4.ha-hooks/30] HA_SERVICE_STARTED started high availability service in hot-standby mode as primary server
2020-02-02 10:57:05.664 INFO  [kea-dhcp4.dhcp4/30] DHCP4_STARTED Kea DHCPv4 server version 1.7.4 started

standbyであるkea_2と通信が出来ないため、相手側はUNDEFINEDとなり、ステータスとしてはPARTNER-DOWNという扱いになります。

2020-02-02 10:57:16.676 WARN  [kea-dhcp4.ha-hooks/30] HA_HEARTBEAT_COMMUNICATIONS_FAILED failed to send heartbeat to kea_2 (http://192.168.1.3:8080/): Connection refused
2020-02-02 10:57:16.676 INFO  [kea-dhcp4.ha-hooks/30] HA_STATE_TRANSITION server transitions from WAITING to PARTNER-DOWN state, partner state is UNDEFINED
2020-02-02 10:57:16.677 INFO  [kea-dhcp4.ha-hooks/30] HA_LEASE_UPDATES_DISABLED lease updates will not be sent to the partner while in PARTNER-DOWN state
2020-02-02 10:57:16.677 INFO  [kea-dhcp4.ha-hooks/30] HA_LOCAL_DHCP_ENABLE local DHCP service is enabled while the kea_1 is in the PARTNER-DOWN state
2020-02-02 10:57:27.692 WARN  [kea-dhcp4.ha-hooks/30] HA_HEARTBEAT_COMMUNICATIONS_FAILED failed to send heartbeat to kea_2 (http://192.168.1.3:8080/): Connection refused

standby側のkea_2を起動します。kea_2側のlogは以下の通りです。

ACtive川からリース情報を取得し、ローカルのリース情報データベースを更新します。ここでは15個のリース情報を68.271ミリ秒で取得し同期が取られました。その後は相手側がダウンしない限り準備完了状態(READY)に状態移行します。

2020-02-02 10:58:05.755 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from WAITING to SYNCING state, partner state is PARTNER-DOWN
2020-02-02 10:58:05.756 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_DISABLED lease updates will not be sent to the partner while in SYNCING state
2020-02-02 10:58:05.758 INFO  [kea-dhcp4.ha-hooks/28] HA_SYNC_START starting lease database synchronization with kea_1
2020-02-02 10:58:05.807 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASES_SYNC_LEASE_PAGE_RECEIVED received 15 leases from kea_1
2020-02-02 10:58:05.827 INFO  [kea-dhcp4.ha-hooks/28] HA_SYNC_SUCCESSFUL lease database synchronization with kea_1 completed successfully in 68.271 ms
2020-02-02 10:58:05.828 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from SYNCING to READY state, partner state is PARTNER-DOWN
2020-02-02 10:58:05.829 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_DISABLED lease updates will not be sent to the partner while in READY state

そしてActive側から"ha-heartbeat“コマンドを受信したことで状態をREADYからHOT-STANDBY状態に移行します。パートナーの状態はHOT-STANDBYです

2020-02-02 10:58:10.834 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'ha-heartbeat'
2020-02-02 10:58:15.851 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from READY to HOT-STANDBY state, partner state is HOT-STANDBY
2020-02-02 10:58:15.852 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_ENABLED lease updates will be sent to the partner while in HOT-STANDBY state
2020-02-02 10:58:15.852 INFO  [kea-dhcp4.ha-hooks/28] HA_LOCAL_DHCP_ENABLE local DHCP service is enabled while the kea_2 is in the HOT-STANDBY state
2020-02-02 10:58:20.856 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'ha-heartbeat'

Active側はstandby側からの"ha-heartbeat"コマンドを受信することで同期状態に移行しリース情報の同期がstandby側と行われます。これでHA構成が動作しDHCPからのIPアドレス配布がPrimary側から行われます。

2020-02-02 10:58:00.737 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'ha-heartbeat'                     
2020-02-02 10:58:05.755 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from WAITING to SYNCING state, partner state is PARTNER-DOWN
2020-02-02 10:58:05.756 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_DISABLED lease updates will not be sent to the partner while in SYNCING state2020-02-02 10:58:05.758 INFO  [kea-dhcp4.ha-hooks/28] HA_SYNC_START starting lease database synchronization with kea_1     
2020-02-02 10:58:05.807 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASES_SYNC_LEASE_PAGE_RECEIVED received 15 leases from kea_1     
2020-02-02 10:58:05.827 INFO  [kea-dhcp4.ha-hooks/28] HA_SYNC_SUCCESSFUL lease database synchronization with kea_1 completed successfully in 68.271 ms
2020-02-02 10:58:05.828 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from SYNCING to READY state, partner state is PARTNER-DOWN
2020-02-02 10:58:05.829 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_DISABLED lease updates will not be sent to the partner while in READY state
2020-02-02 10:58:10.834 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'ha-heartbeat'                     
2020-02-02 10:58:15.851 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from READY to HOT-STANDBY state, partner state is HOT-STANDBY
2020-02-02 10:58:15.852 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_ENABLED lease updates will be sent to the partner while in HOT-STANDBY state
2020-02-02 10:58:15.852 INFO  [kea-dhcp4.ha-hooks/28] HA_LOCAL_DHCP_ENABLE local DHCP service is enabled while the kea_2 is in the HOT-STANDBY state

そして、Primary側がDOWNすると、HA状態はPARTNER-DOWNへ移行し、相手側のステータスがUNDEFINED(未定義)に切り替わります。そして以下のメッセージが出力されている通り、 [highlight_bash]HA_LEASE_UPDATES_DISABLED lease updates will not be sent to the partner while in PARTNER-DOWN state[/highlight_bash] リースの更新は、PARTNER-DOWN状態の間はパートナーに送信されず、secondary側だけで行われることが宣言されます。

2020-02-04 18:54:34.399 WARN  [kea-dhcp4.ha-hooks/28] HA_HEARTBEAT_COMMUNICATIONS_FAILED failed to send heartbeat to kea_1 (http://192.168.1.4:8080/): Connection refused
2020-02-04 18:54:34.400 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from HOT-STANDBY to PARTNER-DOWN state, partner state is UNDEFINED
2020-02-04 18:54:34.400 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_DISABLED lease updates will not be sent to the partner while in PARTNER-DOWN state
2020-02-04 18:54:34.912 INFO  [kea-dhcp4.leases/28] DHCP4_LEASE_ADVERT [hwtype=1 04:0c:ce:da:10:1a], cid=[01:04:0c:ce:da:10:1a], tid=0xc8cfbe11: lease 192.168.1.102 will be advertised2020-02-04 18:54:35.927 INFO  [kea-dhcp4.leases/28] DHCP4_LEASE_ALLOC [hwtype=1 04:0c:ce:da:10:1a], cid=[01:04:0c:ce:da:10:1a], tid=0xc8cfbe11: lease 192.168.1.102 has been allocated for 86400 seconds

切り戻しについても、Primary側が復帰するとsecondary側ではPrimary側からのコマンドを受信し、それによってPrimary側が復帰したと判断し、相手側の状態をREADY、そしてHA状態をHOT-STANDBYへ切り替えます。

これでHA構成が通常状態に切り戻されます。

2020-02-04 18:59:57.717 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'ha-heartbeat'
2020-02-04 18:59:57.733 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'dhcp-disable'
2020-02-04 18:59:57.744 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'lease4-get-page'
2020-02-04 18:59:57.780 INFO  [kea-dhcp4.commands/28] COMMAND_RECEIVED Received command 'dhcp-enable'
2020-02-04 19:00:03.796 INFO  [kea-dhcp4.ha-hooks/28] HA_STATE_TRANSITION server transitions from PARTNER-DOWN to HOT-STANDBY state, partner state is READY
2020-02-04 19:00:03.797 INFO  [kea-dhcp4.ha-hooks/28] HA_LEASE_UPDATES_ENABLED lease updates will be sent to the partner while in HOT-STANDBY state

構成の状態については公式ドキュメントの以下に詳細があります。

CAUTION

間違えがあったらお知らせください。

参考

この記事を書いた人
kometchtech

kometchtech
うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。
Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

2020-02-05 11:08:00AIX、UNIX、Linux, Networkconfig, DHCP, HA, isc, Kea, linux, 冗長構成, 設定