'replicaset'에 해당되는 글 3건

  1. 맥미니 몽고디비 분산 시스템 (5) - Aggregate
  2. 맥미니 몽고디비 분산 시스템 (3) - Sharding
  3. 맥미니 몽고디비 분산 시스템 (2) - 클러스터 구축 준비

1. Sharding을 위한 Shard key 생성

Sharding을 위해서는 Shard Key를 생성해야 하며, 생성된 Shard Key에는 반드시 인덱스의 생성이 요구됩니다.

$ mongo 192.168.3.2:27017/admin
mongos>
mongos> db.runCommand( {enablesharding : "test"} )  // test db 의 Shard 기능 활성화 
mongos>
mongos> use test
mongos> db.things.ensureIndex( {empno : 1} )  // empno 항목에 대한 오름차순 색인 생성 
mongos>
mongos> use admin
mongos> db.runCommand( {shardcollection : "test.things", key : {empno : 1}} )


2. 테스트 데이터 입력

mongos의 test db에 접속해서 50,000,000건의 pseudo 데이터를 입력하고, 입력된 데이터로부터 aggregate()을 해보겠습니다. 입력하고자 하는 pseudo 데이터는 회사의 고용자들에 대한 정보로서 사원번호, 소속 부서의 번호(0~100까지), 그리고 데이터가 입력된 시간 정보를 포함하고 있습니다. 소속 부서의 번호는 무작위Random 방법 으로 0부터 100까지의 숫자가 할당되며, 데이터가 입력된 후에는 소속 부서별로 몇 명의 인원 이 할당되어 있는지 Map-Reduce 방법을 통해서 계산하는 예제도 시현해 보려고 합니다. 현재의 시 스템 구성에서 데이터를 입력하는데 약 90분 정도 소요되며, 입력된 데이터의 크기는 약 20GB 물리적 공간을 차지합니다.

$ mongo 192.168.3.2:27017/test ← test db에 접속한다 mongos>
mongos> for (var n=10000000; n<60000000; n++) {
                         var deptno = Math.round(Math.random()*100);
                         var added_at = new Date();
                         db.things.insert( {"empno": n, "deptno": deptno, "added_at": added_at} )
              }


3. aggregate() 메써드를 통한 Map-Reduce

MongoDB 2.1.2 이상 버전에서는 내장되어 있는 mapReduce() 메써드 이외에도 aggregate() 메써드를 통해서도 Map-Reduce를 시행할 수 있습니다. 50,000,000건의 데이터에서 소속 부서별로 인 원수를 집계하는 Map-Reduce 계산은 aggregate() 메써드를 이용하면 수분 이면 충분합니다.

$ mongo 192.168.3.2:27017/test   // test db에 접속한다
mongos>
mongos> db.things.aggregate( {$group : {_id : "$deptno", total : {"$sum":1}}} )


1. 샤딩Sharding 시스템 구축

MongoDB 샤딩 시스템 구축을 위한 개요도는 다음 그림과 같습니다. 3대의 Config 서버와 4대의 Sharding 서버로 구성된 시스템을 만들어 보려 합니다.


위의 그림과 같은 시스템 구성을 위해서는 각각의 node에 접속하여 아래와 같이 설정하면 샤딩 서버와 Config 서버를 구성할 수 있습니다. Config 서버는 각 Shard 서버에 어떤 데이터들이 어떻게 분산 저장되어 있는지에 대한 Meta Data가 저장되어 있으며 MogoS가 데이터를 쓰고/읽기 작업을 수행할 때 Config 서버를 통해서 처리됩니다. 

in node 1

$ mkdir /data/config1 $ mongod --configsvr --dbpath /data/config1 --port 50001 & $ $ mkdir /data/shard4 $ mongod --shardsvr --dbpath /data/shard4 --port 40001 &

in node 2

$ mkdir /data/shard1 $ mongod --shardsvr --dbpath /data/shard1 --port 40001 &

in node 3

$ mkdir /data/config2 $ mongod --configsvr --dbpath /data/config2 --port 50001 & $ $ mkdir /data/shard2 $ mongod --shardsvr --dbpath /data/shard2 --port 40001 &

in node 4

$ mkdir /data/config3 $ mongod --configsvr --dbpath /data/config3 --port 50001 & $ $ mkdir /data/shard3 $ mongod --shardsvr --dbpath /data/shard3 --port 40001 &

Config 서버는 Sharding 시스템의 필수 구조 중에 하나이고 최소 1대가 요구되며 예기치 못한 시스템 장애로 인해 서비스가 수행되지 못하는 경우를 대배해서 추가로 Config 서버의 설정이 필요합니다. 3대 이상의 Config 서버를 운영하다가 하나의 Config 서버에 장애가 발생하면 나머지 Config 서버는 읽기 전용이 되기 때문에 최소한의 Sharding 시스템 운영이 가능해 집니다.


2. MongoS 프로세스

MongoS는 데이터를 샤드 서버로 분배해주는 프로세스입니다. Application Server에서 실행 가능하고, Config 서버로부터  Meta-Data를 캐시하는 기능을 수행합니다. node1 서버에서 다음과 같이 mongos  프로세스를 활성화 할 수 있습니다.

$ mongos --configdb 192.168.3.1:50001,192.168.3.3:50001 --port 50000 --chunkSize 1

이제 mongos 프로세스에 접속해서 각 Shard 서버를 등록하는 일이 남았습니다.

$ mongo 192.168.3.2:50000/admin mongos> mongos> db.runCommand( {addshard:"192.168.3.1:40001"} ) { "shardAdded": "shard0000", "ok": 1 } mongos> db.runCommand( {addshard:"192.168.3.2:40001"} ) { "shardAdded": "shard0001", "ok": 1 } mongos> db.runCommand( {addshard:"192.168.3.3:40001"} ) { "shardAdded": "shard0002", "ok": 1 } mongos> db.runCommand( {addshard:"192.168.3.4:40001"} ) { "shardAdded": "shard0003", "ok": 1 } mongos> db.runCommand( {enablesharding: "test"} ) // test db의 Shard 기능 활성화

mongodb의 Sharding은 Collection 단위로 수행되며 해당 Collection의 특정 필드(Shard-Key)값을 기준으로 분산됩니다. Sharding을 위해 해당 Shard-Key에는 반드시 인덱스의 생성이 요구됩니다.


3. Sharding 환경 설정 확인

Shard 서버, Config 서버, MongoS 프로세스에 대한 환경설정 작업을 완료 했다면, 다음과 같은 방법으로 정상적으로 설정이 되었는지 확인해 볼 수 있습니다.

$ mongo 192.168.3.2:50000/admin mongos> db.runCommand( {listshards: 1} ) // 등록된 Shard 서버의 IP address와 port 번호 확인 mongos> use config mongos> db.locks.find( {_id:"balancer"} ) // mongos 프로세스 상태 확인 mongos> db.settings.find() // 설정된 chunk 크기 확인 mongos> db.shards.find() // shard 서버 목록 확인 mongos> db.mongos.findOne() // mongos 상태 확인 mongos> db.settings.save( {_id: "chunksize", value: <size>} ) // chunk size 변경


4. Sharding 시스템 구축시 고려사항

MongoDB의 샤딩 시스템을 구축할 때 가장 중요한 요소는 Shard Key 입니다. Shard Key를 얼마나 적절하게 선택했느냐에 따라 운영, 관리 및 MongoDB의 성능이 달라질 수 있습니다. Shard key는 분할(Partition)과 균등 분산(Load Balancing)을 위한 기준이기 때문에 적절한 카디널리티Cardinality를 가진 필드가 선택되어야 합니다. 카디널리티는 조건을 만족하는 데이터의 분산 정도를 나타내는 값으로 전체 데이터 중에서 조건을 만족하는 데이터의 분포가 넓으면 낮은 카디널리티라고 표현하고 분포가 좁으면 높은 카디널리티라고 합니다. 하나 이상의 Field로 Shard key를 구성하는 것도 가능합니다.


5. Chunk Size & Migration 임계값값

초당 발생하는 빅데이터를 여러 대의 서버로 구성된 샤딩 시스템에 저장할 때 하나의 서버에만 데이터가 저장된다면 쓰기 지연 현상이 집중적으로 발생하여 성능 저하 현상이 발생할 수도 있습니다. 이런 경우를 위해 하나의 서버에 저장되는 데이터들을 여러 개의 논리적 구조로 분할 저장해 두었다가 일정한 데이터 양에 도달했을 때 두번째, 세번 째 서버로 분할 데이터의 일부를 이동 저장하게 되는데 이 분할 단위를 청크Chunk라고 합니다. Chunk size는 기본적으로 64MB 단위로 분할되지만 어떤 필드를 Shard Key로 설정했느냐에 64MB 이상 되는 Chunk Size로 분할 될 수도 있습니다. 하지만, 이 크기에 따라 Chunk Migration 횟수와 빈도가 결정되기 때문에 샤딩 하려는 컬렉션의 데이터 양과 도큐먼트의 크기에 따라 적절한 Chunk Size를 결정해야 합니다.

1. 맥미니 클러스터의 구성

MongoDB를 설치하기 위한 맥미니 클러스터의 구성은 다음과 같습니다. 원활한 설정을 위해서 hostname과, ip address를 제외한 설정은 동일하게 하는 것이 좋습니다. (각 node의 user name은 모두 skyeong로 동일하게 설정합니다.)

 Hostname

 IP

 용도 

 제품 성능

 node1

 192.168.3.1 

 Config Server
 Slave Server

 Name: Mac Mini

 CPU: 2.6GHz Inte Core i7

 Memory: 16GB

 HDD: 1TB Fusion Drive

 OS X version: 10.8.3 (mountain lion)

 node2

 192.168.3.2

 Shard Server
 Slave Server

 node3

 192.168.3.3

 Config Server
 Shard Server

 node4

 192.168.3.4

 Shard Server
 Slave Server










2. XQurtz 설치

ssh 등 네트워크를 통해서 원격으로 접속하여 프로그램을 background mode에서 실행시키기 위해서는 XQurtz를 설치해야 합니다. Mac OS를 설치한 후에 아무런 설정 변경을 하지 않았다면, 보안의 문제로 XQurtz가 설치되지 않을 것입니다. 이때는 설정Preference 메뉴에서 'Security & Privacy'의 설정을 바꿔야 합니다. <일반General> 탭에서 'Allow applications downloaded from'을 'Anywhere'로 바꾼 후에 설치를 진행하면 됩니다. XQurtz를 설치한 후에는 재부팅을 권장합니다.

3. MongoDB 다운로드 및 설치

MongoDB의 Sharding 및 ReplicaSet을 구성하기 위해서는 MongoDB(http://www.mongodb.org)를 다운로드 한 후에, 압축을 풀고, /usr/local 로 mongodb-osx-x_86_64-xxx 폴더를 이동합니다. 이동한 후에 mongodb 폴더의 권한은 사용자(user name: skyeong)에게 할당합니다 (sudo chown -R skyeong:staff /usr/local/mongodb-osxox_86_64-xxx). 

$ cd ~/Download $ tar -xvzf mongodb-osx-x86_64-2.2.2.5.tgz # 여기에서는 OS X(64bit)용 2.2.5 버전을 설치함 $ sudo mkdir -p /usr/local/ $ sudo mv mongodb-osx-x86_64-2.2.5 /usr/local $ sudo chown -R skyeong:staff /usr/local/mongodb-osx-x86_64-2.2.5 # 소유권 변경 $ sudo ln -s /usr/local/mongodb-osx-x86_64-2.2.5 /usr/local/mongodb

MongoDB 서버 프로그램(/usr/local/mongodb/bin/mongod)을 실행시키기 위해서는 데이터가 저장될 위치를 지정해 주어야 합니다. 폴더를 생성하고, 폴더의 소유권을 다음과 같이 설정해 줍니다. 

$ sudo mkdir -p /data/ $ sudo chown -R skyeong:staff /data

이제 mongodb가 설치되어 있는 경로를 .profile에서 설정해 주어야 터미널 상의 어떤 경로에서도 mongod와 mongo를 실행시킬 수 있습니다. emacs나 vi 등의 편집기를 이용해서 skyeong 계정의 홈 데렉토리에 있는 .profile 파일의 맨 아랫줄에 다음을 추가해 주면 됩니다. (만약 .profile 파일이 없으면 새로 생성하면 됩니다.)

export PATH=/usr/local/mongodb/bin:$PATH

위와 같은 방법으로 node1, node2, node3, node4를 모두 동일하게 설정해 줍니다.