PowerFlex:閘道高可用性設定會導致 REST 用戶端發生 401 錯誤
Summary: REST API 用戶端收到「401:Unauthorized」錯誤,此時兩個閘道/Apache 服務都在執行中。
Symptoms
REST API 用戶端收到「401:Unauthorized」錯誤,此時兩個閘道/Apache 服務都在執行中。
REST API 用戶端的一個例子是 OpenStack cinder。此問題可能會導致 OpenStack 中的某些 ScaleIO 磁碟區作業失敗 (對應、取消對應等)。
每 10 個成功的 REST API 要求,就有 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 配置包含兩個閘道 (Tomcat) 實例之間的負載均衡設置,並且它們的 lbfactor 設置為 10 和 1。這意味著 Apache 服務以 10:1 的比例將傳入請求定向到兩個閘道。由於 REST API 用戶端通過一個閘道獲取令牌,並且令牌未在閘道之間共用,因此使用此令牌發送到第二個閘道的請求失敗,並顯示 401。
便條:如果用戶端以 lbfactor 1 從閘道獲取令牌,則失敗率約為 91%。
Resolution
因應措施
使用以下 workers.properties 檔而不是文件中的檔。這會將兩個閘道設定為使用中-備用模式:
** /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。
- 當工作線程 2 關閉時,請求將定向到工作線程 1。REST 用戶端收到 401,可以再次登錄到 REST API 服務並繼續。
- 當 worker2 返回並 mod_jk 模組檢測到它時,它會再次將請求定向到 worker2,REST 用戶端收到另一個 401,但可以再次登錄到 RESET API 服務並繼續。
注意:兩種 Apache 服務在其 workers.properties 檔案中所定義。Apache 服務也設定為 active-standby 叢集, 由 keepalived,以及 mod_jk Apache 服務中的模組負責將 REST API 請求定向到基於上述配置的閘道服務。
這是文件錯誤。您可以在修正文件之前使用此 KB。
Additional Information
keepalive配置也可以改進,因為它可能無法正確監視apache/httpd服務。
keepalived.conf 使用“killall -0 apache2”作為“script”。如果名稱中有任何包含「apache2」的進程,則會返回 0(成功),例如”tail -f /var/log/apache2/mod_jk.log."
若要正確監控 apache2 服務,請使用「systemctl --no-pager status apache2」(Ubuntu) 或「systemctl status httpd」(CentOS/RedHat)。
如果 apache2/httpd 服務正在執行中,作為「script」的命令必須傳回 0;如果已停止,則作為「script」的命令必須傳回 none-zero。