[Openstack Swift] Proxy-Server 파헤치기 1편

안녕하세요! 이번 시간에는 swift를 깊게 이해하는 첫 번째 시간으로, 최전방을 담당하는 proxy-server에 대해 알아보도록 하겠습니다.

Overview of Openstack Swift에서도 설명했듯이 proxy-server는 client와 직접적으로 통신하는 서버입니다. devstack를 이용하여, swift 사용해보기에서 curl을 이용해서 swift를 사용했던 것 기억하시나요? curl을 통해 요청을 한 주소, ‘http://127.0.0.1:8080’ 이 바로 proxy-server의 주소입니다. 그리고 그 뒤에 붙는 ‘/v1/AUTH_…./container/object’ 가 바로 swift에서 제공하는 REST API입니다.

proxy-server의 역할에 대해 정리하면 다음과 같습니다.

  • REST API 제공
  • A/C/O 서버로 사용자 요청 중계
  • 인증시스템과 연동하여 인증 처리
  • 다양한 middleware를 통해 multipart upload, staticweb 등의 기능 제공

역할을 보면 알 수 있듯이 사용자(client)는 A/C/O 서버에 바로 접근하는 것이 아니라 proxy-server를 통해 간접적으로 접근하게 됩니다. 그럼 proxy-server에 부하가 많이 걸리겠죠? 그래서 proxy-server는 한대로 구성하기 보다는 앞단에 Load Balancer를 두어서 HA구성을 하게 됩니다.

기본적으로 proxy-server는 wsgi에서 기본적으로 제공해주는 웹서버를 이용하여 실행하게 됩니다. 하지만 기본 웹서버는 성능이 매우매우 안좋기 때문에 production level에서는 사용하지 말라고 권고하고 있습니다. 따라서 apache 혹은 nginx와 같이 성능이 빠방하고 안정적인 웹서버를 통해서 서버를 실행시키게 됩니다. ( 이는 proxy-server 뿐만 아닌 A/C/O 서버도 동일합니다.) 해당 설정에 대해 궁금하시다면 여기를 참조하시면 됩니다.


Proxy-Server Middleware

proxy 서버는 그 자체로 동작하지 않고, wsgi pipeline 이라는 것을 통해 다양한 middleware와 함께 동작합니다.
다음은 proxy-server 설정파일에 정의된 middleware pipeline 입니다.

client에게서 요청이 들어오면 pipeline의 처음부분인 catch_errors 부터 차례대로 middleware 가 실행되면서 마지막 proxy-server 까지 도달하게 됩니다. 모든 middleware 의 코드가 실행되지만, 실제로는 middleware 에서 자신이 처리해야할 내용이 아니면 바로 다음 middleware 로 넘기기 때문에 성능상의 이슈는 크게 신경쓰지 않아도 됩니다. (만약, middleware 가 자신이 처리해야하는 요청이라 처리를 한다면 그 과정에서 proxy-server 까지 가는데 까지 지연시간이 발생할 수 있습니다)

그림으로 표현하면 다음과 같습니다.

Untitled Diagram

주요 middleware 에 대해 간단히 설명만 해드리겠습니다. 그리고 알아두면 좋다고 생각되면 middleware 는 다른 글을 통해 설명하도록 하겠습니다.

  • gatekeeper
    • swift 의 object 는 user/sys metadata를 가질 수 있습니다.  sysmetata 는 외부로 노출이 되면 안되기 때문에 이를 걸러주는 역할을 합니다.
  • proxy-logging
    • swift 내부 로그를 syslog 로 남겨주는 역할을 합니다.
  • auth 관련 middleware
    • keystone, swauth or tempauth 등 인증과 관련된 내용을 처리합니다.
  • formpost : http form upload 를 지원하는 middleware
  • slo, dlo : multipart upload 를 지원하는 middleware 입니다. (tip! multipart : 커다란 파일을 쪼개는 것)

 Proxy-Server 코드 구조

다음으로는, Proxy-Server의 코드 구조에 대해 알아보도록 하겠습니다. 소스코드는 “swift/proxy”에 있으며, devstack 내부에서는 “/opt/stack/swift/swift/proxy” 에 소스코드가 존재합니다.

  • server.py
    • proxy-server 의 메인이 되는 코드입니다. 설정의 middleware pipeline 을 통해 proxy-server 코드가 호출되면 이 코드의 __call__ 함수가 호출됩니다.
  • controllers
    • server.py 에서 요청을 분석하여 적절한 controller에게 처리를 넘깁니다. Account/Container/Object 별 controller 코드가 들어있는 폴더입니다.
  • controllers/base.py
    • 각 controller에서 공통적으로 사용되는 코드들을 모아놓은 파일입니다.
  • controllers/account.py
    • /v1/AUTH_aaa  와 같이 REST API 가 account 에 해당할 경우 처리할 controller 입니다.
  • controllers/container.py
    • /v1/AUTH_aaa/container  와 같이 REST API 가 container 에 해당할 경우 처리할 controller 입니다.
  • controllers/obj.py
    • /v1/AUTH_aaa/container/obj  와 같이 REST API 가 object 에 해당할 경우 처리할 controller 입니다.
  • controllers/info.py
    • /info 로 오는 swift cluster information 조회 요청을 처리하는 controller 입니다.

지금까지는 proxy-server 의 역할과 어떻게 동작하는지에 대해 살펴보았습니다. 다음에는 코드레벨에서 proxy-server 의 동작을 세세히 알아보도록 하겠습니다.

그럼 2만!

 


Leave a Reply

Your email address will not be published. Required fields are marked *