[입 개발] 한 서버에 하나의 Redis를 띄우시나요? 아니면 여러 대를 띄우시나요?

해당 블로그는 KT Olleh UCloud Biz의 지원을 받고 있습니다.

여러분은 하나의 서버에 Redis 인스턴스를 하나만 실행하시나요? 아니면 CPU Core 수나 메모리 양에 따라서 여러 개의 Redis 인스턴스를 실행시키시나요?

아마도 일반적으로는 하나의 서버에 하나의 Redis 인스턴스를 실행하는 경우가 많을 것 같지만, 아마도 다 각자의 기준이 있거나 또는, 그냥 실행시키지 않을까 싶기도 합니다.

오늘은 바로 이 이야기에 대해서 해볼려고 합니다.

일단 먼저, 어떤 방식을 선택해야 한다라는 정답은 없습니다. 다 잘쓰면 되지요.(퍽퍽퍽, 이 따위 소릴 할려고 소중한 내 시간을 뺐느냐? 라는 주먹들이 보이시는군요.) 그런데, 일단 끝까지 헛소리를 들으시고 그 뒤에 절(퍽퍽퍽… 들을 가치도 없어보인다는 말씀들이 덜덜덜)

일단 두 가지 경우의 장단점을 간단히 따져보면,

하나의 서버에 Redis 인스턴스를 하나만 실행하는 경우는 관리가 싶습니다. 그리고 행여나 다른 이슈로 인해서 해당 Redis 인스턴스가 영향을 받을 경우도 덜합니다.

하나의 서버에 여러개의 Redis 인스턴스를 실행하는 것은, 일단, Redis가 싱글스레드이기 때문에, 그래도 성능이 더 잘 나올 수 있습니다. 그리고, 여러 대의 서버를 써야 한다면, 하나의 서버 여러개를 관리하나, 여러 대의 서버에서 여러 개의 인스턴스를 사용하나 비슷할 가능성이 높습니다.

그럼, 일단 너는 어떤걸 권장하냐? 라고 물어보신다면, 적절히 잘 관리하면 어떤 방법이든 상관없지만, 개인적으로는 하나의 서버에 여러 대의 Redis 인스턴스를 사용하는 것을 추천합니다.

자 일단 예를 들어보겠습니다. 다음과 같은 서버 사양이 있다고 합니다.(KT UCloud 에서 해당 서버 목록을 가져왔습니다.)

*2vCore, 4G memory
*4vCore, 8G memory
*8vCore, 16G memory

위와 같은 사양에서 만약 한 서버에 하나의 Redis 인스턴스를 실행한다면, 어느정도 메모리를 사용할 경우, 메모리를 많이 사용한다고 할 수 있을가요?

그냥 제 맘대로 생각했을때, 3G, 6G, 13~14G 정도 사용하면 거의 맥시멈으로 사용한다라고 생각하지 않을까요? 이게 그냥 일반적인 생각일 것입니다. 그런데 만약 우리가 마스터/슬레이브 형태로 Redis 를 사용한다면, 여기서 문제가 하나 생길 수 있습니다. 슬레이브 노드가 마스터에 연결될 때, 마스터가 죽을 수도(도를 강조) 있다는 것입니다.

“왜” 라는 질문이 나오는 것이 정상일 것입니다. 그리고 죽을 수 있는 이유는 RDB 때문입니다. 여기서 “아!!!” 하시는 분과 “엥???” 하시는 분이 계실껍니다. 그럼 RDB 꺼두면 되는거 아니예요? 라고 물어보시는 분도 생길껍니다. 그런데… RDB 설정을 켜두든, 꺼두든… 이 문제는 발생할 수 있습니다.

이유를 살펴보면, Redis의 마스터/슬레이브 연결시에는 RDB 설정 여부에 상관없이 무조건 RDB를 생성하게 됩니다. 그리고 이 RDB 파일을 seed로 전송하고 그 뒤의 차이를 버퍼에 저장한 후에 이를 보내서 sync를 맞추게 되는데, 이 때, write가 많은 서버라면 메모리를 많이 사용해서 서버가 죽을 수도 있습니다. 처음 서비스 시작시에 슬레이브를 설정하면, 당연히 메모리 사용량이 얼마 안되니, 큰 문제가 없지만, 서비스로 인해서 메모리가 거의 풀로 찬 상황에서 슬레이브가 붙는다면, 문제의 소지가 있는 것이죠.

이 때문에, Core 수나 메모리에 따라서 적절히 Redis 인스턴스를 여러 개 띄워주는게 유리합니다. 즉, N개의 인스턴스를 실행한다면 (Memory-(운영체제필요메모리))/(N+1) 정도의 규칙으로 적절히 나누면(물론 Core 수도 중요합니다.) 하나의 인스턴스가 순간적으로 메모리를 많이 사용하더라도, 안정적으로 넘어갈 수 있습니다.(물론 이 때도 관리를 잘 해야합니다. 관리를 잘못하면… 한대든 여러대든 똑같은 이슈가…)

즉, 위와 같은 문제를 해결하기 위해서 하나의 서버에서 하나의 인스턴스만 실행하면, 16G 메모리라면, 최악을 대비해서 7G 정도만 사용해야 하지만… 여러 개의 인스턴스를 실행한다면 4G*3 개 정도의 인스턴스를 운영할 수 있습니다. 어차피 여러 대 관리해야 하면, 관리 이슈도 비슷하게 들테니까요.

여담이지만, Redis 나 이런 서버종류를 단순히 8G 서버 4대를 32G 서버 한대로 변경할 수 있는 것은 아닙니다. 컨넥션 수의 관리 때문에, 무조건 일정 대수 이상은 있어야 할 경우도 충분히 있습니다. 즉, 어느 것이 답이라는게 아니라, 어떤 것을 쓰든, 내부 구조를 잘 알아야 한다는게 오늘의 이야기입니다.