Redis #.9 분산캐시와 사용시 주의사항



 

Redis  분산캐시

 

캐시란? (Cache)

이미 요청됐거나, 나중에 요청될 결과를 미리 저장해 두었다가 이를 빠르게 서비스 해주는 것입니다. 이는 웹서비스에서 이용할 수도 있고, RDBMS에 접근 할 때도 사용할 수 있습니다. CPU에서도 L1, L2, L3 같은 캐시가 있습니다. 물리적인 저장장치인 하드디스크 안에도 캐시가 존재 합니다. 이렇듯 캐시는 일고, 쓰는데 있어 빠른 속도를 보장하기 위한 장치입니다. 일반적으로 캐시는 디스크 접근이 아닌 메모리에 상주된 버퍼에 접근하는 것을 의미합니다. 메모리의 I/O 속도가 Disk I/O 속도보다 빠르기 때문입니다. 속도가 빠른 장점 대신에, 용량에 대한 제한이 있습니다. 서버나 PC에 메모리를 디스크처럼 무한정 늘리는게 어렵기 때문입니다. 비용적인 부분도 있고, 기술적인 부분도 있습니다.  하지만 1대의 서버에서 처리할 수 없는 용량이 필요하다면, 캐시 서버를 클러스터링 하여 부하 분산을 처리할 수 있습니다.

Memcached와 Redis

분산캐시에 사용하는 대표적인 두가지가 Memcached와 Redis 입니다. 현재는 Redis가 5버전까지 버전업을 하면서 많은 업체가 redis를 더 많이 사용하고 있습니다. 둘의 차이점이 명확하고 동작 방식이 다소 차이가 있기 때문에, 어느 제품이 더 좋다라고는 할 수 없지만, 5버전에서 자체적으로 클러스터링과 페일오버를 구현한 Redis가 근래들어 많은 선택을 받고 있는것 같습니다. Memcached는 Danga라는 회사에서 만든 메모리 분산 캐시 솔루션입니다. 오픈스택에도 들어가고, 다양한 방면으로 사용되고 있지만, 제품의 개선 속도가 VMware의 지원 받는 Redis의 발전속도 만큼 빠르지 않고, memcached는 Redis에는 없는 기능들이 많아 점점 선택의 차이가 Redis쪽으로 많아지고 있는게 현실입니다.

 

Redis 분산캐시를 사용할 때 주의사항

비어 있는 마스터 노드와 리플리케이션 되는 것을 주의해야 합니다. Redis는 RDB, AOF를 이용하여 스냅샷을 뜰수 있고, 장애대한 데이터 유실을 대비 할 수 있습니다. 마스터 노드는 속도를 위해 RDB, AOF를 사용하지 않고, 슬레이브 노드에서만 RDB, AOF를 사용할 때, 마스터 노드가 장애로 Shutdown 상태로 빠졌다가 Startup 된다면 해당 마스터 노드는 비어있는 상태로 올라오게 됩니다. 마스터가 비어있게 되면, 마스터를 기준으로 동기화하는 슬레이브도 역시 빈상태로 동기화가 진행됩니다. 이 경우 정말 심각한 장애가 발생할 수 있기 때문에 주의를 해야합니다. 이것을 방지하기 위해 SLAVEOF NO ONE 이라는 명령을 사용하여 슬레이브 노드를 마스터로 승격 시킬수 있습니다. 슬레이브 노드에서 실행하는 명령으로 마스터/슬레이브 관계를 끊어주고, 리플리케이션을 하지 않으며, 마스터가 재연결하더라도 재동기화 하는 과정이 없습니다. CLuster에서 SLAVEOF NO ONE에 해당하는 명령은 cluster reset 명령입니다. 해당 명령을 실행하는 노드가 슬레이브 라면 자신을 클러스터에서 제외하고 독립시키면서 마스터로 승격이 됩니다.

 

5버전의 AutoFailOver에 관하여 

이전 버전의 Redis에서는 FailOver를 진행하고, 장애시 슬레이브를 마스터로 승격 시켰다가, 마스터가 다시 돌아오면 동기화 후에 마스터로 승격된 슬레이브를 다시 슬레이브로 내리고, 기존 마스터를 마스터로 유지하는 것을 Redis-centinel이 해왔습니다. 5버전으로 버전업이 되면서 센티넬의 기능들이 Redis 자체에 포함 되었습니다. Cluster노드 내의 마스터 노드들이 센티넬의 역할을 하기 때문에 이제 더 이상 Centinel를 따로 구축하지 않아도 됩니다. 마스터 노드에 장애가 발생하면 해당 마스터에 종속된 슬레이브를 자동으로 마스터로 승격하고, 마스터가 복귀하면 동기화 후에 다시 슬레이브로 돌려 놓습니다. 장애난 마스터노드는 다시 클러스터에 들어왔을때 슬레이브 모드로 복구를 진행후에 다시 마스터로 돌려 놓습니다.

 

메모리 사용량에 주의

Redis는 메모리 기반이기 때문에 장비에 Redis에 할당 할 수 있는 메모리가 많으면 좋습니다. 하지만 그만큼 메모리 할당에 있어 주의 해야합니다. 서버에 16GB의 메모리가 있다고 해서 Redis가 16GB를 모두 사용할 수가 없습니다. 기본적으로 OS가 사용하는 메모리 양이 있고, 모니터링이나 배치에서 사용하는 메모리가 있을수 있기 때문입니다. 일반적으로 전체 메모리의 60~70% 정도 사용하는 것이 안정적입니다. 갑자기 성능저하가 발생했다면 할당된 메모리를 넘어서 Swap을 사용하고 있는지 체크해봐야 합니다. Redis는 Memcached와 달리 RDB를 이용한 데이터 유실없이 재시작 할 수 있으므로 프로세서를 종료후 재시작하면 문제를 해결할 수 있습니다. 또는 OS상의 메모리 캐시를 전부 삭제하여 스왑을 제거할 수 있습니다. root로 아래와 같은 명령을 실행합니다.

echo 3 > /proc/sys/vm/drop_caches

 

실제로 DB에서 직접 세팅해서 분산 캐시로 사용하는 방법이 아니라, 파이썬이나 node.js 같은 프로그래밍을 이용하여 Redis와 어플리케이션 혹은 Redis와 DB를 연결하는 경우가 많습니다. 어떤 방식으로 어떤 부분을 캐시로 이용할 것인지는 아키텍처를 많이 고민한 다음에 결정 후 구현은 개발자의 몫으로 넘어갑니다. Memcached의 경우는 MariaDB나 MySQL에서는 플러그인 방식으로 존재하기 때문에 직접 DB와 연동을 하여 사용할 수도 있습니다. PHP의 경우에도 PHP-redis 플러그인을 이용하여 redis를 캐시로 이용할 수 있으며, Redis를 캐시로 활용하는 방법은 여러가지가 있으니 유저가 찾아보고 자신이 하고자 하는 서비스에 적합한 기능을 가진 애플리케이션을 선택하면 됩니다.



You may also like...

Leave a Reply

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