티스토리 뷰

웹 프로그래밍

Gearman에 대해 알아보자

소림파워 2015. 11. 11. 14:23

1.Gearman 탄생

Gearman은 memcached, MogileFS로 유명한 Danga Interactive에서 개발했다. 초창기 Gearman은 순수한 펄로 작성되었으나 후에 C, 펄, Python, PHP, Java, Go, Mysql등 언어 중립적이고 포괄적인 분산 프로세스 플랫폼으로 발전했다.


2.Gearman 구성

1)Gearman 서버 : Gearman은 클라이언트에서 작업요청을 받아 Worker 서버에 적절하게(Queuing 방식) 분산시키는 Job Server역할을 한다. 구현체는 C로 작성된 gearmand와 펄로 작성된 Gearman::Server가 있다.

2)Gearman 워커 : 서버로 부터 전달받은 작업을 실제로 수행하는 프로세스. 구현체는 C로 작성된 libgearmand와 펄로 작성된 Gearman::Worker, libgearmand를 사용해 구현된 Gearman::XS::Worker가 있다.

3)Gearman 클라이언트 : 워커에게 작업을 시키는 프로세스. 구현체는 C로 작성된 gearmand와 펄로 작성된 Gearman::Client, libgearmand를 사용해 구현된 Gearman::XS::Client가 있다.


3.Gearman 사용 예(http://advent.perl.kr/2012/2012-12-15.html 참고)

개인적으로 Gearman을 활용해 문제를 해결했던 상황을 간단하게 소개하고 오늘의 기사를 정리하겠습니다.

당시 1만 개 정도의 웹페이지를 긁어온 뒤 필요한 자료를 추출하고 저장하는 작업이 있었습니다. 먼저 그 작업을 평범한 스크립트로 작성해서 실행시켜 본 결과 주로 로컬의 CPU와 메모리를 소모하는 자료의 추출 및 저장 프로세스보다 외부의 네트워크 자원을 소모하고 대역폭의 영향을 받는 웹페이지 추출 작업이 대부분 시간을 소모하는 병목지점임을 알게 되었습니다.

이 프로세스의 속도를 개선하기 위해서 Gearman을 사용하기로 하고 다음과 같이 진행했습니다. 먼저 기존에 작성했던 스크립트에서 혼재되어있는 코드를 각각의 작업영역별로 함수단위로 정리하고 예전과 같게 동작하도록 수정했습니다. 그래서 4개의 함수로 list_fetch(), detail_fetch(), store_page(), parse_page()가 만들어졌습니다.

각각의 함수를 별도의 파일로 분리하고 Gearman::XS::Worker를 사용해 워커로 등록했습니다. 앞서 분석한 결과에 따라 주요 병목지점인 list_fetch() 워커를 2개,detail_fetch() 워커를 6개 실행하고, 나머지 store_page(), parse_page() 워커는 하나씩만 실행했습니다.

작업이 순차적으로 진행될 필요가 있는 경우, 즉 list_fetch()한 페이지를 통해 복수 페이지에 대한 detail_fetch() 요청이 생성되고 그 결과에 대해 parse_page()store_page() 요청이 생기는 경우에는 Gearman 워커 코드 내에 Gearman 클라이언트 코드를 삽입해 작업이 연쇄적으로 일어날 수 있도록 조정했습니다.

C로 구현된 gearmand를 컴파일해 설치하고 작업의 저장은 로컬 SQLite를 사용했으며 Perl 워커와 클라이언트는 각각 Gearman::XS::Client, Gearman::XS::Worker를 사용해 작성했습니다. 결과적으로 병목지점이 되던 네트워크 사용 부분이 해소되면서 전체 실행시간이 70% 정도 개선되었습니다. 당시 사용했던 코드는 github에 올려두었으니 참고하시기 바랍니다.


5.참고

http://advent.perl.kr/2012/2012-12-15.html

http://mobicon.tistory.com/86

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함