[발 번역] Memcached를 걷어내자. 그건 너무 느리다.

*해당 블로그는KT ucloud 의 지원을 받고 있습니다.

해당 글은 http://blog.serverdensity.com/2012/05/11/removing-memcached-because-its-too-slow/ 글을 발번역한 것입니다. 오역에 주의하시길 바랍니다. DB에 로그등을 저장할 경우, DB의 저장 속도가 로그 생성 속도를 따라가지 못하는 케이스가 꽤 있고, 그 해결책으로 제시되는 방법 중에 하나가, 로그를 메모리 캐시 솔루션등에 일시적으로 모으고 그걸 배치 등으로 한번에 저장하는 방법을 많이 이용합니다. 그런데, 해당 기사는 속도 때문에 해당 아키텍처를 사용하다가 MongoDB 1.8에서  2.0으로 전환하면서 해당 솔루션을 제거했습니다. 왜 그런지에 대해서 알아두시면 나름 좋은 방법이 될 듯합니다.

개인적으로는 Server Density에서 사용한 이전 방법이 부하가 더 커질 경우에 사용할 수 있는 좋은 방법이라는 생각이 듭니다. 그리고, 필자의 의견에 동의를 못하는 것이, 필자가 말하는 것처럼, Moxi에서 24ms 이 나오는 것도 이상합니다. 보통 moxi를 사용하더라도 1ms 이하로 나오는 것이 정상이기 때문입니다. 댓글을 보면 Moxi나 Client Library 문제가 아닌가라는 의심이 나옵니다. 개인적으로는 Moxi보다는 클라이언트 라이브러리 이슈나 네트워크 위치나 설정에 따른 문제가 아닐까 의심됩니다. 저도 실제로 네트웍 이슈로 해당 속도가 느려지는 것을 경험해본적이 있습니다. 그리고 memcached 메모리가 swapping 되기 시작하면 속도가 꽤 느려질 수 있습니다. 그러나 필자가 말하는 컴포넌트를 하나 제거할 수 있다라는 장점은 상당히 큰 매력이네요. 여러가지 관점에서 고민해보시면 좋을 듯 합니다. @lqez 님도 비슷한 방법으로 재미를 보신걸로 알고 있습니다.

Memcached를 제거하자. 그건 너무 느리다.

Server Density 코드베이스를 변경하면서, Memcached 를 시스템에서 제거한 이야기를 짧게하려고 합니다. 여기에는 두가지 목적이 있습니다.

  1. UI 캐싱: 계정 데이터를 초기 로딩할 경우( server list, alert list, users lists 등 ) MongoDB 에서 바로 읽어서 해당 데이터가 변경될 때 까지 캐시해두고, 변경되면, 캐시를  제거했습니다.
  2. 병목 MongoDB  1.8에서의 글로벌 락의 성능 영향으로 인해서  모니터링 postback 을 MongoDB에 바로 저장할 수 없었습니다.  그래서 Memcached 에 먼저 데이터를 넣고, 수 많은 웹 클라이언트와는 대조적으로 몇 개의 데몬을 통해서 저장해야 했습니다.


Performance map

이 방법은 MongoDB 2.0이 나오기 전까지는 꽤 잘 동작했습니다. 꽤 똑똑한 Lock 양보 정책으로 Global Lock의 영향이 크게 감소되었고, 2.2에서는 database 수준의 락킹으로 더 좋아질 것입니다. 차후에는 동시성 관련 부분도 더 좋아질 것입니다.

이미 코드베이스에서는 Memcached를 이용하는 것에 영향을 받는 부분은 이미 제거해뒀고, 마침내 Memcached를 완전히 제거할 수 있다는 것을 성능 지표에서 보여주고 있습니다. MongoDB로의 직접 접근이 훨씬 빨라졌기 때문입니다. 확실히,  우리의 평균 DB 쿼리 응답 속도는 0.43 ms 이고 Memcached 로 부터는 24.2ms 가 나옵니다.

Database throughput

Response time

모든 종류의 데이터가 중요한 데이터 저장소로써, 다수의 MongoDB 클러스터가 있고( 시간관련 데이터들은 따로 분리되어 있지만 )  2개의 샤드가 있고 각각의 샤드는 4대의 데이터 노드로 구성되었습니다. 각각의 샤드는 미국내의 워싱턴 DC와 San Jose 에 있는 각각의 데이터 센터에 있고, 각 서버는 8GB 메모리에,  Intel Xeon-SandyBridge Quad Core 3.4Ghz CPUs, 100GB SSDs 장비에 Ubuntu 10.04 LTS를 이용해서 MongoDB를 구동중입니다.  각각은 2Gbps 네트웍으로 연결이 되어 있습니다. ( 역자 주:  8GB 메모리였다면, 메모리를 좀 더 올리는 것도 방법이 아니었을 까 합니다. SSD가 속도가 확실히 빠르긴 하지만, 일단 메모리가 많으면, SSD 보다 더 빠릅니다. )

Nodes

Memcached를 제거함으로써, 시스템이 더더욱 간단해지고, 코어 소프트웨어 스택은 단지 Apache, PHP, python, MongoDB, Ubuntu 로만 구성될 수 있을 것입니다.  이로 인해 Memcached를 독립된 클러스터에서 동작시킬 필요가 없어졌습니다.  Moxi proxy의 failover 처리를 위한 모니터링을 추가할 필요도 없어졌습니다., Ubuntu LTS를 통한 공식 버전을 사용하길 원할 경우에, 또 다른 불편인, PHP와 Python 에 memcached library를 추가할 필요도 없어졌습니다. 무엇보다 24ms 의 응답시간을 제거할 수 있었습니다.