현재 인턴중인 회사에서 mongodb에 접속할때, ip와 port주소가 두개 설정되어 있어서 그 이유를 techlead 에게 물어봤더니, db architecture에 관해서 자세하게 설명해 주셔서 그 내용을 정리해 본다.
Standalone
- 서버가 오직 하나의 db와 연결되어 있는 구조
Replica Set
- 서버가 여러개의 replica db와 연결되어 있는 구조. replica는 복제라는 뜻이므로, primary db의 정보가 복제되어 secondary db에 저장되므로, 이들은 모두 같은 정보를 담고 있다.
- 이 구조를 사용하는 이유는 크게 두가지이다.
1) db 인스턴스의 프로세스가 down되는 상황을 고려하여 Single Point of Failure(SPOF)를 방지하기 위해,
2) 동시접속 유저수가 많아질때 요청을 여러 db로 분산시켜 속도를 향상시키기 위해.
- replica set에서 primary db는 매2초마다 secondary dbs의 상태를 체크하고 동기화하는 Heartbeat 작업을 수행한다
- 오직 primary db에만 read/write 둘 다 가능하며, secondary는 read만 가능하다. 기본적으로 하나의 primary와 두개의 secondary를 가진다.
- primary + secondary db의 합은 항상 홀수 이어야 하며, mongodb에서는 50개까지 최대 가질수 있으나, voting members로써는 7개만 가진다.
- arbiter: primary db가 fail할 경우, 서버는 secondary db중 하나와 연결되어 정보를 가져 오게 되는데, 이 때 arbiter가 참여하여 vote(투표)를 하여 해당 db를 결정한다. secondary db가 오직 하나만 존재하는 경우에는 arbiter 자체가 투표에 참여하게 되는데, arbiter는 항상 자기 자신 이외의 다른 db에 투표하게 되므로, 저절로 유일한 secondary db와 연결된다.
- Replica set과 서버를 직접 연결할 경우에는, 각각의 db의 ip/port주소를 지정해주어야 한다 (위 예제의 경우 3개.)
Sharded Cluster
- 앞서 설명한 replica set이 여러개 있는 구조이다.
- 또 다른 차이점은 서버<->db가 직접 연결되는 대신에 서버<->router<->db의 형태로 router를 거쳐 연결된다는 점이다.
- sharding 의 가장 큰 목적은 1) 데이터의 분산 처리(Partition), 2) 성능 향상을 위한 load balancing 이다.
Load balancing is a technique used to distribute workloads uniformly across servers or other compute resources to optimize network efficiency, reliability and capacity.
- config server: shard시스템 구축과 관련된 메타 데이터를 저장/관리하는 서버로서, 이도 역시 fail할 경우를 대비하여 3대 이상 활성화 하는것이 좋다.
- router/MongoS (Query router): 클라이언트가 직접 shard set에 요청을 보낼 수 없으므로, 중간에 MongoS를 통하게 되는데, 여기서는 빅 데이터를 shard set으로 분배해주는 프로세스를 담당한다. 또한, router는 config server에 저장된 metadata를 cache하므로써, config server의 요청 빈도를 줄인다.
- shard set은 최소 2대, 효율성 향상을 위해서는 3대이상 구축하는게 권장된다. 각각의 서버 또한 샤드 시스템을 구축할 때 활성화되는 MongoS가 사용하게 될 메모리를 고려하여, 싱글 노드일때보다 20~30%의 추가 메모리 영역이 요구된다.
- Shard Key: Partition과 load balancing의 기준이 되는 key로써, 적절한 key를 선택해야 mongodb의 성능을 최대로 활용할 수 있다. cardinality를 고려하여 너무 높거나 낮지 않는 필드를 지정하는데, mongodb의 경우 collection단위로 이루어 진다. 임의의 값을 설정할수도 있다.
- Shard Key Index: 여러 set에 데이터가 chunk단위로 분산 저장되는 경우, 빠른 검색을 위해서 index가 필요하다. 따라서, index의 생성을 고려할 수 있는 필드를 shard key를 지정하는게 좋다.
- Chunk: 하나의 db에 저장되는 데이터 조각들이 일정양에 도달 했을때, 다른 set으로 분산하여 저장하는데, 이 데이터의 조각이 chunk이다.
- ip/port주소는 router의 개수만큼 설정하면 된다.
참고:
고마운 techlead 님
NoSql & mongoDB by 주종면