Redis Cluster Hash를 기반으로 Slot 16384로 구분한다. CRC16 해시알고리즘을 사용하여 Slot = crc16(key % 16384 이기 때문에 총 슬롯 갯수는 16384개를 넘어가지 않는다. 특정 Redis 서버는 Slot Range 를 가지고 있고, 데이터 Migration은 이 슬롯단위의 데이터를 Migration Command를 이용하여 다른 서버로 전달하게 된다. 장점 - 자체적인 Primary, Secondary Failover - 슬롯 단위의 데이터 관리 단점 - 메모리 사용량이 더 많다. - Migration 자체는 관리자가 시점을 결정해야한다. - 라이브러리 구현이 필요하다. 예를들면, 아래와같이 Primary #2에 들어가야 할 데이터가 1번으로 잘못 들어간다면 ..
데이터의 특성에 따라서 선택할 수 있는 방법이 달라진다. 데이터 분산 방법 - Application Modular 방식으로 데이터를 분산했을 때, 서버에 데이터가 가득 찼을때 수평적 확장을 위해 Modular를 추가한다면 기존의 데이터들은 Re-balancing되어야 한다. 이때 절반 이상의 데이터들이 이동을 하게 된다. 그래서 하나씩 추가한다면 비효율적이다. 하지만 서버를 두배씩 늘려나가게 된다면 특별한 계산없이 데이터가 이동해야하는 서버가 쉽게 확정된다. 그렇지만 이 방법은 항상 서버를 두배씩 늘려가야하므로 몇 번 반복이 된다면 늘어나야하는 서버때문에 부담이 된다. Consistancy Hashing twemproxy 를 사용하는 방법으로 쉽게 사용 가능 서버의 확장이나 축소로 인해 데이터가 이동을 ..
1. 메모리 관리를 잘하자. - Redis 는 In-Memory Data Structure - Physical Memory 이상을 사용하면 문제가 발생한다. Swap은 Memory Page 를 Disk에 저장해놓고 필요할때마다 로딩시킨다. Swap이 한번이라도 발생한 Memory Page는 계속 Swap이 일어난다. Swap이 있다면 Swap사용으로 해당 메모리 페이지 접근 시 마다 늦어진다. - Max memory를 설정하더라도 이보다 더 사용할 가능성이 크다. jemalloc을 사용함에도 불구하고 jemalloc때문에 Redis는 자기가 사용하는 메모리를 정확하게 알 수가 없다. Memory allocate 에 따라서 성능이 다를 수 있다. 메모리 파편화가 일어날 수 있다. - RSS 값을 모니터링 ..
디아블로 2가 다시 출시되면서 엄청난 인기를 끌고 있다. 나도 그 유저중에 하나이고 취업을 준비하는 와중에 짬짬이 즐기고 있었다. 하지만 출시되고 이제 3주가 지난 시점인데 그동안 거의 매일매일 서버에 문제가 생겨 접속을 하지 못하는 경우가 많이 생겼다. 20년이 더 지난 게임이기때문에 그러려니 하는 것도 지쳐가는 와중에 지난 주말에 서버접속 문제로 진척도가 롤백이 되는 사태도 일어나버렸다. 문제가 어느정도 해결된 후 블리자드에서 올린 공지를 보았다. 프로그래밍을 배우기전에 내가 보던 공지의 느낌에서 서버개발자로 취업을 준비하는 사람이 직접 서버문제를 체험해 본 후 보게되는 공지의 느낌이 사뭇달랐다. 이 글은 사태분석같은 것은 아니고 그냥 공지를 보고 내가 느낀 점들을 주저리 써보는 글이다. 요약된 내용..
백엔드 개발자로 취업을 위해 프로그래머스에서 시행하는 챌린지에 참여하였다. 비전공자로 시작한 프로그래밍공부에서 내게 흥미를 일깨워 주었던 알고리즘을 테스트하는 취업연계 챌린지였다. 나의 테스트는 이전에 어느 한 기업의 코딩테스트를 했을 때와 비슷한 양상으로 흘러갔다. 가장 맨 처음 알고리즘을 접했을 때 단순히 퀴즈를 푸는 느낌으로 접근을 했었다. 그래서 재밌었다. 하지만 실질적인 코딩 실력을 테스트하는 부분까지 도달했을 때 굉장히 어려웠었다. 하지만 문제를 풀었을 때의 쾌감이 좋았고 지금도 알고리즘공부는 스트레스가 아닌 내가 즐길수 있는 공부이다. 부트캠프를 진행하면서 처음으로 CS적인 지식을 알게 되었고 자료구조나 여러 알고리즘유형에 대해 알게 되었다. 그리고 내가 어려워했던 문제들은 이러한 지식들을 ..
Failover와 Fault Tolerant 서비스 중인 프로세스에 문제가 발생하는 원인은 다양하다. 이때 장애에 대응하는 방법으로 Failover와 Fault Tolerant라는 개념이 있다. Failover는 시스템에 문제가 발생했을 때 준비해 둔 예비 시스템으로 자동 전환해서 서비스가 중단되지 않도록 하는 기능이다. Fault Tolerant는 시스템에 문제가 발생하면 전체 시스템을 다운하는 것이 아니라 문제가 발생하지 않은 부분은 정상적으로 수행하는 기능이다. 마이크로서비스 아키텍처는 기본적으로 분산 아키텍처이기 때문에 마이크로서비스를 충분하게 분산 배치했다면 Failover 기능을 수행했다고 할 수 있다. 또한 특정 서비스에 문제가 발생해도 다른 API를 서비스하는 마이크로 서비스는 정상적으로 ..
마이크로서비스 아키텍쳐는 각 기능들을 하나의 작은 서버로 분리하고 각각의 API를 제공하는 형태라고 볼 수 있다. 그리고 작은 서버들은 서로의 API를 참고해 통신한다. 그리고 클라이언트가 모든 API를 호출해야 한다면 모든 API에 대한 코드를 작성해야하기 때문에 통일된 패킷 구조와 인터페이스가 필요하다. 클라이언트가 하나의 인터페이스로 모든 마이크로서비스를 호출하려면 레이어(층)의 개념이 필요하다. 마이크로서비스들과 클라이언트의 사이에 하나의 레이어를 두고 이 레이어에서 통일된 인터페이스를 통해 모든 API를 호출할 수 있다. 레이어를 게이트웨이라고 부르고 게이트웨이는 HTTP, TCP, PROTOBUF 등 다양한 형태의 서버가 될 수 있고, 여러개가 존재 할 수있다. 하지만 게이트웨이간의 통신은 하..
마이크로서비스와 분산아키텍처 마이크로서비스는 기본적으로 분산 아키텍처이다. 분산 아키텍처를 구성하려면 시스템 사이에 네트워크를 어떻게 연결하지 고민해야한다. 여기에서 우선적으로 이해가 필요한 것은 토폴리지이다. 토폴리지는 컴퓨터 네트워크를 구성할 때 링크, 노드 등을 이용해 물리적으로 연결하는 방식을 말한다. 토폴리지는 버스형, 트리형, 링형, 성형, 망형이 있다. 버스형은 전체 노드가 하나의 공통 연결선에 연결된 구조이다. 버스만 안정적이라면 노드 간 간섭이 없어 안정적이고, 노드의 추가, 삭제가 편하다. 하지만 공통 연결선인 버스에 부하가 발생하면 전체 성능이 저하된다는 단점이 있다. 트리형은 여러 버스형 토폴리지가 결합된 구조이다. 링형은 부하가 집중되는 노드가 없어 병목현상이 발생하지 않는다. 하..