PowerFlex:ゲートウェイ高可用性のセットアップでRESTクライアントで401エラーが発生する
Summary: REST APIクライアントは、「401: ゲートウェイとApacheの両方のサービスが実行されている場合は、「Unauthorized」エラーが発生します。
Symptoms
REST APIクライアントは、「401: ゲートウェイとApacheの両方のサービスが実行されている場合は、「Unauthorized」エラーが発生します。
REST APIクライアントの一例として、OpenStack cinderがあります。この問題により、OpenStackの特定のScaleIOボリューム操作(マップ、割り当て解除など)が失敗する可能性があります。
REST APIリクエストが10回成功するごとに、1回失敗します。たとえば、プライマリApacheサービスの mod_jk.logには次のように表示されます。
tail -f /var/log/apache2/mod_jk.log | grep ") status"
[6496:139877463439104] [debug] ajp_unmarshal_response::jk_ajp_common.c (739): (machine2) status = 200
[6497:139877295294208] [debug] ajp_unmarshal_response::jk_ajp_common.c (739): (machine2) status = 200
[6497:139877270116096] [debug] ajp_unmarshal_response::jk_ajp_common.c (739): (machine2) status = 200
[6496:139877429868288] [debug] ajp_unmarshal_response::jk_ajp_common.c (739): (machine1) status = 401 <---
[6497:139877219759872] [debug] ajp_unmarshal_response::jk_ajp_common.c (739): (machine2) status = 200
[6496:139877303686912] [debug] ajp_unmarshal_response::jk_ajp_common.c (739): (machine2) status = 200
[6497:139877228152576] [debug] ajp_unmarshal_response::jk_ajp_common.c (739): (machine2) status = 200
/var/log/nova/nova-compute.log には次のように表示されます。
2017-04-05 11:20:36.090 38186 ERROR nova.compute.manager [instance: 20e1036d-daf0-49b9-a228-07a1c48b882d] File "/usr/lib/python2.7/site-packages/os_brick/initiator/connector.py", line 1980, in connect_volume 2017-04-05 11:20:36.090 38186 ERROR nova.compute.manager [instance: 20e1036d-daf0-49b9-a228-07a1c48b882d] self.volume_id = self._get_volume_id() 2017-04-05 11:20:36.090 38186 ERROR nova.compute.manager [instance: 20e1036d-daf0-49b9-a228-07a1c48b882d] File "/usr/lib/python2.7/site-packages/os_brick/initiator/connector.py", line 1879, in _get_volume_id 2017-04-05 11:20:36.090 38186 ERROR nova.compute.manager [instance: 20e1036d-daf0-49b9-a228-07a1c48b882d] raise exception.BrickException(message=msg) 2017-04-05 11:20:36.090 38186 ERROR nova.compute.manager [instance: 20e1036d-daf0-49b9-a228-07a1c48b882d] BrickException: Error getting volume id from name oGXMByctQWesXL8PPKiyBQ==: Unauthorized 2017-04-05 11:20:36.090 38186 ERROR nova.compute.manager [instance: 20e1036d-daf0-49b9-a228-07a1c48b882d]
Cause
これはドキュメントのエラーです。このドキュメントの workers.properties 設定には、2 つの Gateway (Tomcat) インスタンス間のロード バランシング設定が含まれており、 lbfactor は 10 と 1 に設定されています。つまり、Apacheサービスは、受信リクエストを2つのゲートウェイに10:1の比率で転送します。REST API クライアントは 1 つのゲートウェイを介してトークンを取得し、トークンは Gateway 間で共有されないため、このトークンを使用して 2 番目のゲートウェイに送信された要求は 401.
で失敗します。手記:クライアントが lbfactor 1 を使用してゲートウェイからトークンを取得した場合、失敗率は約 91% です。
Resolution
回避策
ドキュメント内のファイルの代わりに、次の workers.properties ファイルを使用します。これにより、2 つの Gateway がアクティブ/スタンバイ モードに設定されます。
** /etc/apache2/workers.properties ***
worker.list=balance1
worker.machine1.type=ajp13
worker.machine1.host=<ip of GW 1>
worker.machine1.port=8009
worker.machine1.lbfactor=1
worker.machine1.activation=disabled
worker.machine2.type=ajp13
worker.machine2.host=<ip of GW 2>
worker.machine2.port=8009
worker.machine2.lbfactor=1
worker.machine2.redirect=machine1
worker.balance1.type=lb
worker.balance1.balance_workers=machine1,machine2
この構成では、machine2 をプライマリとして、worker1 をスタンバイとして設定します。この構成とドキュメントの主な違いは次のとおりです。
-
worker.machine1.activation=disabled
worker.machine2.redirect=machine1
-
worker.machine#.lbfactor=1
lbfactors 両方のワーカーに不要な場合はセットアップします。
この構成では、次のようになります。
- 両方のゲートウェイが稼働している場合、すべての要求はworker2に送信され、401はありません。
- worker2 がダウンすると、要求は worker1 に送信されます。RESTクライアントは401を受信し、REST APIサービスに再度ログインして続行できます。
- worker2 が戻ってきて mod_jk モジュールがそれを検出すると、要求は再び worker2 に転送され、REST クライアントはさらに 401 を受け取りますが、RESET API サービスに再度ログインして続行できます。
注:両方のApacheサービスは、 workers.properties ファイルで定義)を使用することが重要です。Apacheサービスは、 active-standby クラスター、 keepalived、および mod_jk モジュールは、上記の構成に基づいて、REST API要求をゲートウェイ サービスに送信する役割を担います
これはドキュメント エラーです。このKBは、ドキュメントを修正する前に使用できます。
Additional Information
keepalived構成は、apache / httpdサービスを正しく監視しない可能性があるため、改善することもできます
keepalived.conf は "script" に "killall -0 apache2" を使用します。これは、名前に「apache2」を含むプロセスがある場合に0(成功)を返します。tail -f /var/log/apache2/mod_jk.log."
apache2サービスを正しく監視するには、「systemctl --no-pager status apache2」(Ubuntuの場合)または「systemctl status httpd」(CentOS/RedHatの場合)を使用します
「スクリプト」として使用されるコマンドは、apache2/httpd サービスが実行されている場合は 0 を返し、停止している場合は 0 を返しません。