'MongoDB'에 해당되는 글 4건

  1. 2011.07.19 MongoDB javascript engine 교체 및 튜닝
  2. 2011.07.01 MongoDB Sharding
  3. 2011.06.30 Mongodb용 웹기반 GUI 툴 RockMongo, JmongoBrowser 설치
  4. 2011.06.29 mongodb 시작하기

MongoDB javascript engine 교체 및 튜닝

|

메뉴얼 : http://www.mongodb.org/display/DOCS/Building
실행 환경 : ubuntu 11.04

v8 설치하기
만약에 몽고디비 src가 ~/workspace/mongodb-src-r1.8.2 에 있을경우
v8은 ~/workspace/v8 으로 받아놓자

v8 컴파일 
필수 패키지 설치
sudo apt-get install subversion git-core tcsh git-core scons g++ libpcre++-dev
sudo apt-get install libboost-dev libreadline-dev xulrunner-1.9.1-dev
v8 다운로드
svn checkout http://v8.googlecode.com/svn/trunk/ v8
ubuntu 64bit에서 컴파일하기 위해서
scons arch=x64


mongodb 소스파일받기 
  1. http://www.mongodb.org/downloads 에서 가장 오른쪽의 source부분
  2. wget http://downloads.mongodb.org/src/mongodb-src-r1.8.2.tar.gz
mongodb 컴파일하기
필수 패키지 설치 
apt-get -y install tcsh git-core scons g++
apt-get -y install libpcre++-dev libboost-dev libreadline-dev xulrunner-1.9.2-dev
apt-get -y install libboost-program-options-dev libboost-thread-dev libboost-filesystem-dev libboost-date-time-dev

scons all --usev8

v8으로 계속 m/r을 돌리다보면 메모리릭이 있는거 같다..... jira에 해당 버그가 reporting되어 있는거 같은데....나중에 고친다고함 ㅋ 
And

MongoDB Sharding

|
  • 특징
    • 부하와 분산에 따라서 자동의로 균형을 맞춰준다
    • 새머신의 추가히기 쉽다
    • 자동 복구가 가능하다
    • 수천개의 노드도 수평적으로 확장가능
    • config server, mongos, mongod 로 구성됨
  • 한계
    •  sharding내에서의 인증과 보안문제
  • sharding
    키가되는 필드로 각 머신의로 나뉘어서 들어간다
    해당키에 대해서 각 머신은 chunk라는 단위로 데이터를 쌓는다
    user는 mongos 를 통해서 자신의 요청에 적합한 shard로 명령을 내린다
    sharding은 collection단위로 실행된다
  • balancing
    하나의 shard node가 너무 많이 차게 되면 분산된다
  • failover
  • scailing model
    auto sharding model은 구글의 big table, yahoo위 pnuts 와 유사하다
    order-preserving partitioning이 사용되어짐 
  • shard keys
    index처럼 여러개를 key로 갖을수 있고 order-preserving partitioning이 사용되므로 각 shard에는
    어느정도 range의 데이터드이 뭉쳐서 들어가게 된다
    해당 range는 mongo config서버에 저장된다 
  • chunks
    chunk는 collection, maxkey, minkey 이렇게 3개로 나타진다
    보통 64M 까지 증가한다. 해당 용량을 넘어서면 2개의 chunk로 나누어진다
    키를 선택할때는 해당 키가 균등하게 데이터를 분산할수 있게할수 있는 값인지 판단필요
    만약의 single key를 사용할때 해당 key에 대해서 끝도 없이 커질 위험이 있을 경우에는 여러개의 key를 shard key로 사용해야함 
  • config server
    shard server의 정보와 chunk정보를 갖고있다
    chunk데이터가 config server 의 main data이다
    config server끼리는 모든 chunk데이터의 복사본을 갖는다
    chunk데이터는 consistency를 유지하기 위해서 2phase commit 이 발생한다
    config server는 자신만의 replica set 구조를 갖는다 (일반적인 mongodb의 replica set이랑 다름)
    config server가 하나라도 죽으면 다른 config server는 read만할수 있다 (이때 mongo cluster에도 read, write가능하다) 
  • routing process (mongos)
    mongo cluster를 단일 system처럼 생각할 수 있게 routing역할을한다
    user로부터 request가 오면 적합한 server로 request를 보내거나 취합해서 user에게 돌려준다
    mongos는 독자적인 영구적이 저장이 없고 startup될때 config server로부터 데이터를 받고 데이터가 변경되면
    config server로부터 해당 변경 데이터를 받는다 
  • opereation종류
    global : 전체 shard로 부터 연산 필요
    target : single 또는 몇개의 shard로부터 연산

  • sharding 만들기
    물리적 서버 2대를 기준으로 만든다고생각 (server1, server2로 구성)
    shard는 2개로 구성예정 각각의 replication을 server1,2에 분산해서 처리

    1. start mongod
    먼저 필요한 디렉토리 생성
    server1 : mkdir -p /home/yoga/workspace/mall/shard1/log  /home/yoga/workspace/mall/shard1/data  /home/yoga/workspace/mall/shard2/log  /home/yoga/workspace/mall/shard2/data
    server2 : mkdir -p /home/yoga/workspace/mall/shard1/log  /home/yoga/workspace/mall/shard1/data  /home/yoga/workspace/mall/shard2/log  /home/yoga/workspace/mall/shard2/data

    shard1 구성 (replica set 구성)
    server1에서 : mongod --shardsvr --replSet shard1 --fork --logpath /home/yoga/workspace/mall/shard1/log/mongodb.log --logappend --dbpath /home/yoga/workspace/mall/shard1/data --rest --oplogSize 2048 --port 30000 
    server2에서 : mongod --shardsvr --replSet shard1 --fork --logpath /home/yoga/workspace/mall/shard1/log/mongodb.log --logappend --dbpath /home/yoga/workspace/mall/shard1/data --rest --oplogSize 2048 --port 30000
     
    shard2 구성 (replica set 구성) 
    server1에서 : mongod --shardsvr --replSet shard2 --fork --logpath /home/yoga/workspace/mall/shard2/log/mongodb.log --logappend --dbpath /home/yoga/workspace/mall/shard2/data --rest --oplogSize 2048 --port 30001
    server2에서 : mongod --shardsvr --replSet shard2 --fork --logpath /home/yoga/workspace/mall/shard2/log/mongodb.log --logappend --dbpath /home/yoga/workspace/mall/shard2/data --rest --oplogSize  2048 --port 30001



    replica set config 구성 : server1에서는 shard1이 master, server2에서는 shard2가 master
    server1 또는 2 아무곳에서나 
    mongo --port 30000
    config = { _id : "shard1", members : [
           {_id: 0, host: "server1의ip:30000" , priority : 1},
           {_id: 1, host: "server2의ip:30000", priority: 1}]}
    rs.initiate(config);
    exit
    mongo --port 30001
     
    config = { _id : "shard2", members : [
           {_id: 0, host: "server1의ip:30001" , priority : 1},
           {_id: 1, host: "server2의ip:30001", priority: 1}]}
    rs.initiate(config);
    exit

    server1에서는 shard1이 master로 server2에서는 shard2가 master로 될수 있게 셋팅하자
    mongo shell을 통해서 master가 잘못 잡혔으면 해당 서버에서 rs.stepDown()을 해주자
    (처음에 지정할 마스터를 선택하는게 있을듯.....문서좀 뒤져봐야겠다) 



    2. config server
    config server를 위한 디렉토리 설정 (server1, 2에서 실행, 1 or 3개 띄어야해서 2번서버에 42000port로 하나더 띄움)
    mkdir -p /home/yoga/workspace/mall/config/log  /home/yoga/workspace/mall/config/data
    server1,2에서 : mongod --configsvr --fork --port 40000 --logpath /home/yoga/workspace/mall/config/log/mongodb.log --logappend --dbpath /home/yoga/workspace/mall/config/data --rest
    server2에만(디렉토리도 만들어주자 log3, data3으로) : mongod --configsvr --fork --port 42000 --logpath /home/yoga/workspace/mall/config/log3/mongodb.log --logappend --dbpath /home/yoga/workspace/mall/config/data3 --rest


    3. mongos 셋팅
    server1,2에 셋팅
    mkdir -p /home/yoga/workspace/mall/router/log  /home/yoga/workspace/mall/router/data
    server1, 2에서 : mongos --port 50000 --configdb server1:40000,server2:40000,server2:42000 --logpath /home/yoga/workspace/mall/router/log/mongodb.log --logappend  --fork 
    mongos에 shard정보를 입력하기 (하나만하면 다른 모든 mongos에 전파되는듯..)
    mongo server1:50000/admin
    db.runCommand({addshard:"shard1/server1:30000,server2:30000"})
    db.runCommand({addshard:"shard2/server1:30001,server2:30001"})
    db.runCommand({listshards:1})   : 현재 셋팅된 shard 알려줌
    db.runCommand({enablesharding: "mall"})    : shard할 데이터베이스 이름 (요걸안하면 첫번째 shard에 계속 저장된다)
    db.runCommand({ shardcollection: "mall.product", key : {p_id:1, p_name:1}}) : shard할 collection 셋팅 및 shard key지정





     
And

Mongodb용 웹기반 GUI 툴 RockMongo, JmongoBrowser 설치

|
JMongoBrowser 설치
추가로 설치할것이 없고 java만 설치되어있으면된다
http://www.antoinegirbal.com/jmongobrowser/
받아서 그냥 설치하면되고 file->connection->servers에서 ip:port만 넣고 그냥 선택하면된다


RockMongo 설치
oracle client같은 기능을 갖는 GUI 툴을 찾다보니 php기반의 rockmongo를 찾았다
이것 말고도 phpmyadmin이라는 것도 있는듯. 

설치에 필요한것 apache, php, mongodb php driver, rockmongo
apache, php는 ubuntu에 설치되어 있는 것으로 사용

http://code.google.com/p/rock-php/downloads/list 
최신버전을 다운로드 압축을 /var/www/rock_mongo 에 푼다 (/var/www는 자신의 취향에 따라 선택. 후에 apache config에서도
이 디렉토리에 맞게 수정이 필요함)
rock_mongo 디렉토리 바로 하위에 php파일등이 오게 될것임


php용 mongodb driver 설치
http://www.mongodb.org/display/DOCS/PHP+Language+Center  

 
sudo pecl install mongo
vi /etc/php5/apache2/php.ini
//  Dynamic Extensions쪽에 extension=mongo.so 추가후
/etc/init.d/apache2 restart


apache 셋팅 
httpd.conf파일에 alias 걸어주기
 
Alias /rock_mongo /var/www/rock_mongo
/etc/init.d/apache2 restart


RockMongo 동작확인
http://host_ip/rock_mongo/index.php 
처음 동작시 계정은 admin/admin 

메인화면에서 login없애기 위해서
// config.php파일에서  요걸 수정
$MONGO["servers"][$i]["control_auth"] = false;
And

mongodb 시작하기

|
mongodb 설치하기
http://www.mongodb.org/downloads 에서 사용자 platform에 맞는 바이너리 다운로드하기
mongodb 실행하기  
   1. demon으로 실행 : mongod --fork --logpath /var/log/mongodb.log --logappend
   2. 추가 옵션 --dbpath 경로 : 원래는 /data/db 경로로 monggodb의 기본 데이터들이 저장되는데 경로를 변경할수 있다   
   3. 추가 옵션 --port port번호 : 기본포트가 27017포트외에 다른 포트를 사용하기위해서
   mongod --fork --logpath /home/yoga/workspace/mall_mongodb/log/mongodb.log --logappend --dbpath /home/yoga/workspace/mall_mongodb/data --rest
mongodb 종료하기
   mongo 실행후 콘솔창에서 use admin 입력하여 admin 디비에서 db.shutdownServer() 를 이용해서 종료
mongodb 관리창 열기 : --rest 옵션을 준상태에서만 사용가능
   http://실행ip:28017

collection 추가하기
  shell에서 mongo실행후
   use 컬렉션명
   show dbs : 존재하는 컬렉션명이 나온다 (use 컬렉션명한것은 insert하기 전까지는 안나온다)

collection 에 데이터 추가하기
  shell에서 mongo실행후
   item = {aa:2, bb:3}
  db.컬렉션명.save(item)

collection 에 데이터 찾기
  shell에서 mongo 실행후 
  db.컬렉션명.find() : 기본 limit 20으로 잡혀있고 shell명령어에 it를 입력하면 다음 cursor의 데이터를 출력해준다
  db.컬렉션명.find().limit(3) : 3건만 노출  
  var cursor = db.컬렉션명.find()
  while(cursor.hasNext()) printjson(cursor.next()); 
  cursor.forEach(printjson);
  cursor[4] : 5번째 cursor의 데이터를 출력한다 (list처럼 사용가능)
  cursor는 snapshot이 아니라서 여러사용자가 동시에 사용하면 값이 다를 수 있다
  db.컬렉션명.find({x:3}) : x:3인 문서만 찾는다 (sql로 치면 where x = 3 과 동일 find의 input은 document이다)
  db.컬렉션명.find({x:3}, {j:true}) : x:3인 문서만 찾고 return문서의 학목은 _id와 j 만 반환한다 (전체 document가 반환되는게 아니다)
  db.컬렉션명.findOne({x:3}) : x:3인 문서 한개만 반환한다 (cursor를 반환하는게 아니라 document 한개 또는 null을 반환한다)
And
prev | 1 | next