PowerFlex: Gateway met hoge beschikbaarheid instellen veroorzaakt 401-fouten op REST-clients
Summary: REST API-client ontvangt "401: Niet geautoriseerd" wanneer beide Gateway-/Apache-services worden uitgevoerd.
Symptoms
REST API-client ontvangt "401: Niet geautoriseerd" wanneer beide Gateway-/Apache-services worden uitgevoerd.
Een voorbeeld van een REST API-client is OpenStack cinder. Dit probleem kan ertoe leiden dat bepaalde ScaleIO-volumebewerkingen (mappen, unmappen, enzovoort) in OpenStack mislukken.
Voor elke 10 succesvolle REST API-aanvragen mislukt er 1. In de mod_jk.log van de primaire Apache-service wordt bijvoorbeeld het volgende weergegeven:
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 toont:
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
Dit is een fout in het document. De configuratie workers.properties in dit document bevat een load-balancing-instelling tussen twee Gateway (Tomcat)-instanties en de lbfactor is voor deze instanties ingesteld op 10 en 1. Dit betekent dat de Apache-service inkomende aanvragen naar de twee gateways stuurt in een verhouding van 10:1. Aangezien de REST API-client een token verkrijgt via één gateway en tokens niet worden gedeeld tussen gateways, mislukt een aanvraag die met dit token naar de tweede gateway wordt verzonden met 401.
Notitie: Als een client een token van de Gateway verkrijgt met lbfactor 1, is het uitvalpercentage ongeveer 91%.
Resolution
Tijdelijke oplossing
Gebruik het volgende bestand workers.properties in plaats van het bestand in het document. Hiermee worden de twee gateways in de actieve stand-bymodus geplaatst:
** /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
Deze configuratie stelt machine2 in als de primaire en worker1 als stand-by. De belangrijkste verschillen tussen deze configuratie en het document zijn:
-
worker.machine1.activation=disabled
worker.machine2.redirect=machine1
-
worker.machine#.lbfactor=1
lbfactors Installatie indien niet vereist voor beide werknemers.
Met deze configuratie:
- Wanneer beide gateways actief zijn, worden alle aanvragen doorgestuurd naar worker2 en zou er geen 401 moeten zijn.
- Wanneer werker 2 uitvalt, worden de aanvragen doorgestuurd naar werker1. De REST-client ontvangt een 401 en kan zich opnieuw aanmelden bij de REST API-service en doorgaan.
- Wanneer werker2 terugkomt en mod_jk module het detecteert, stuurt het opnieuw aanvragen naar werker2 en ontvangt de REST-client nog een 401, maar kan zich opnieuw aanmelden bij de RESET API-service en doorgaan.
Opmerking: Beide Apache-services moeten dezelfde configuraties hebben in hun workers.properties bestand. De Apache-diensten zijn ook ingesteld als een active-standby cluster, door keepalived, en de mod_jk module in de Apache-service is verantwoordelijk voor het doorsturen van REST API-aanvragen naar Gateway-services, die zijn gebaseerd op de bovenstaande configuratie.
Dit is een documentatiefout. Deze KB kan worden gebruikt voordat het document wordt gecorrigeerd.
Additional Information
De keepalive-configuratie kan ook worden verbeterd omdat deze apache/httpd-services mogelijk niet correct controleert.
De keepalived.conf gebruikt "killall -0 apache2" voor het "script". Dit retourneert 0 (succes) als er een proces is met "apache2" in de naam, zoals "tail -f /var/log/apache2/mod_jk.log."
Om de apache2-service correct te controleren, gebruikt u "systemctl --no-pager status apache2" (Ubuntu) of "systemctl status httpd" (CentOS/RedHat).
De opdracht die als "script" wordt gebruikt, moet 0 retourneren als de apache2/httpd-service wordt uitgevoerd, en none-zero als deze is gestopt.