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 구성에는 두 게이트웨이(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이 없어야 합니다.
- 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
apache/httpd 서비스를 올바르게 모니터링하지 못할 수 있으므로 keepalived 구성을 개선할 수도 있습니다.
keepalived.conf는 "스크립트"에 "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)를 사용합니다.
"script"로 사용되는 명령은 apache2/httpd 서비스가 실행 중이면 0을 반환해야 하고, 중지되면 0이 아닌 값을 반환해야 한다.