네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
By Aria on October 11, 2018
네이버에서의 Data Platform
- 초창기에는 거의 모든 서비스가 2-tier 구조(Web server-RDBMS server)
- 서비스가 점점 커지면서, 빠른 응답을 보장하기 위해 cache 추가(Redis, ARCUS)
- 지표를 저장하기에는 RDBMS는 sharding이 되지 않아 공간과 비용적 문제가 발생. 원활한 데이터 처리를 위해 HBase(Hadoop) 사용 중.
MongoDB가 네이버에서 어떤 경우 대안이 되고 있는가?
- 2.0 지원 Coverage 확대
- Sharding, Transaction 처리, secondary index처리가 가능하고, schema-less한 DB가 필요했다.
Schema-less
- 사전에 데이터에 대한 구조나 정의를 하지 않아도 됨.
- RDBMS라면 각 서비스 별 별도의 table로 관리해야 하거나, column 추가/삭제 등의 서비스 중 overhead가 발생하게 된다.
table A{
userNumber int
,userCellPhoneNumber char(13)
}
-> RDBMS: 1 row 당 17-byte
-> MongoDB: 1 document 당 46-byte. 컬럼 key-value가 같이 저장되기 때문에 저장 공간이 많이 필요하다.
공통플랫폼: 서비스 별 비슷한 기능을 공통 플랫폼에서 제공하는데, 이 때 schema-less 하면 좋다.
Sharding
- scale up의 한계가 대두됨. RDBMS는 응용에서 샤딩으로 scale out 구현 할 수 있지만 확장성이 떨어지며 개발 및 관리의 overhead가 발생한다. Auto sharding이 가능한 데이터 플랫폼이 필요하다.
Secondary Index
- 단순 bigdata성 데이터는 HBase를 사용하고 있음.(인프라 운영비용 절감)
- HBase는 제품 자체에서 secondary index를 제공해주지 않는데, 조회 조건이 다양해짐에 따라 secondary index에 대한 기능이 필요해짐.
- HBase는 HFile이 물리적으로 분리됨. MongoDB Chunk는 논리적 분리
Transaction
- NoSQL을 사용하면서 Transaction 기능을 원하는 경우가 있음.
- MongoDB는 WiredTiger storage 엔진을 사용할 경우 높은 수준의 ACID 지원
s.start_transaction() order.blahblah payment.blahblah s.commit_transaction()
JSON 지원
- REST API 사용이 확대되면서, 메세지 포맷을 JSON으로 사용할 경우
- Web server와 DB server 간 데이터를 주고 받는 과정에서 JSON이 선호되면서 JSON 지원이 필요해짐.
IDC DR(Disaster Recovery: 이중화)
- MongoDB는 IDC간 Auto failover가 가능한 Data Platform
- MongoDB는 IDC를 꼭 3대로 유지해야 함.
네이버에서 MongoDB를 사용하면서 겪은 에피소드들
Mongos 관리
- 웹 서버는 Mongos(router)와 통신을 하게 되고, mongos가 각 shard server에 질의를 한다.
L4와 getmore
- Sharding 에서의 L4 사용을 초기에는 권장했으나(Web server -> L4 -> mongos -> sharding server) getmore 이슈로 제거. (getmore: 20건 단위로 데이터를 전달하는 과정. 100개를 질의한다면 처음 20개 질의, 그 다음 20개 질의 …)
mongos <-> shard 커넥션
- mongos와 shard server 사이에 커넥션 관리에 문제가 있음.
default connection 갯수: Max-> Unlimited, Min-> 1개(per core)
- 요청이 갑자기 늘어나면 해당 DB 서버는 장애로 빠질 영향이 크다. 고로 튜닝이 필요하다.
tuning: Max -> 20개(per core), Min -> 10개(per core)로 네이버에서 사용중.
- Mongos와 shard 사이에 커넥션이 급증하는 경우는 아직까지 많지 않았음. 몇 초 이내에 해결.
Node.js driver
- Node.js 모듈인 mongoose는 성능 이슈로 인해 권장하지 않음.
- Node.js 드라이버 2.X 사용 권장
Storage Engine
- WiredTiger 스토리지 엔진만 사용.
- checkpoint: memory buffer와 disk 사이의 데이터 불일치를 해소하기 위해 data sync하는 작업(memory -> disk)
- checkpoint가 실행되는 시점에 한번에 디스크 쓰기 발행. Write heavy한 환경에서 checkpoint시 성능 하락. 주기적으로 Disk IO가 높아진다면 checkpoint 이슈일 수도 있음.
Background Index
- MongoDB는 인덱스 생성시 collection 뿐만 아니라 database 자체에 lock이 걸린다. 쿼리 지연 발생.
- background index 생성 가능.(=RDBMS의 online index creation)
- background index 생성은 주로 새벽에 진행
Compact
- compact는 maintenance 기간에만 사용할 것.
Balancer
- MongoDB의 Chunk Migration은 high cost. 여러 이유로 balancing 작업이 실패할 수 있음.
Clustered Index
- clustered index: 해당 key 값 기준으로 실제 데이터가 정렬되어 있음.
- clustered index 방식을 활용한 범위 검색 등에는 MongoDB 사용을 권장하지 않는다.
Unique index
- sharding 환경에서 unique index는 local index라 shard 내에서만 unique 함. 전체 shard 내에서는 유니크 하지 않다.
- 전체 shard에서 유니크함을 보장하기 위해서는 sharding key에 포함 필요.
개인정보
- DB영역의 법적 요건(IP 기반 access-control)을 지키기 위해서 MongoDB 3.6 버전의 authenticationRestrictions 기능 사용 중. bind_ip는 DB ACL을 제한하는 기능이 아님. whitelist임.
개인적으로 바라보는 MongoDB의 장단점 그리고 전망(vs RDBMS)
과연 NoSQL 인가?
- MongoDB는 NoSQL의 특징과 RDBMS의 특징을 고루 가지고 있는 DBMS.
성능과 안정성
- checkpoint 등 일부 성능 문제 해결이 시급
- Mongos <-> shard사이의 커넥션 안정화
전망
- 우리나라에서 Main stream으로 도입될 가능성은 높지 않다고 보여지나, 사용처는 점점 확대될 것으로 보인다.