MongoDB 최신 버전 빌드하기 – 2.1.0 pre 기준

MongoDB 를 git에 있는 최신버전으로 빌드해서 scons로 빌드를 하려고 하면 제대로 빌드가 되지 않습니다.

가장 큰 이유는 MongoDB가 2.x 버전으로 가면서 기존의 SpiderMonkey 버전 대신에 v8을 기본 JavaScript 엔진으로 바꾸려고 하기 때문입니다.

git clone git://github.com/mongodb/mongo.git 으로 소스를 받고 (임의상 repo/charsyam/mongo/ 라고 지정합니다. )

이때 boost 라이브러리는 기본 위치(/usr/local) 에 설치 되어있어야 합니다. boost 설치는 워낙 잘 나와있어서 생략합니다.

그리고 scons 도 설치가 되어 있어야 합니다.(이것도 생략)

 

그리고 또 v8도 설치되어야 합니다.

svn checkout http://v8.googlecode.com/svn/trunk/ v8

이 때 v8의 경로가 mongodb 소스 기준으로 (../v8) 이어야 합니다.

그런다음 mongodb 소스에서 scons all –usev8 이런식으로 하시면 잘 빌드가 됩니다.

(참고 사이트: http://www.howsthe.com/blog/2010/feb/22/mongodb-and-v8/)

자세한 내용은 다음 스레드를 참조하시면 합니다. http://groups.google.com/group/mongodb-dev/browse_thread/thread/faf14db204ea7e5d

다음 jira를 보시면 v8로의 변환이 현재 어떻게 진행되고 있는지 알 수 있습니다. 지금 2.0.2 인데 2.1.1 에서나 끝날꺼 같네요.  https://jira.mongodb.org/browse/SERVER-2407

PyMongo에서의 MongoDB Replica Set에서의 FailOver 과정

지난 온라인 서버 제작자 모임에서 누군가가 질문을 하셔서 간단하게 정리합니다. MongoDB에서는 Master-Slave 와 Replica-Set 이라는 두 가지 방법을 제공하고 대부분 Replica-Set을 사용합니다. 그리고 이 경우 Primary가 죽을 경우, 자동적으로 새로운 Primary 가 선출되게 됩니다. 예를 들어 현재 저의 머신에는 다음과 같이 세 개의 mongodb instance를 실행시켜두었습니다.

 

charsyam 5657 1 0 Dec07 ? 00:03:23 /home/charsyam/mongo/mongod –dbpath /home/charsyam/data/mongodb/db1 –port 10001 –replSet charsyammongo/localhost:10002
charsyam 7016 6583 3 01:23 pts/11 00:00:46 /home/charsyam/mongo/mongod –dbpath /home/charsyam/data/mongodb/db2 –port 10002 –replSet charsyammongo/localhost:10001
charsyam 7399 6583 0 01:29 pts/11 00:00:03 /home/charsyam/mongo/mongod –dbpath /home/charsyam/data/mongodb/db3 –port 10003 –replSet charsyammongo/localhost:10001,localhost:10002

 

pymongo를 이용해서 connection을 만듭니다.

 

>>> from pymongo import Connection
>>> db = Connection(“localhost:10001″, replicaset=”charsyammongo”).test
>>> db.test.insert( {‘x’:1} )

ObjectId(‘4edf948ce50cd21aea000000′)
>>> db.test.find_one()

{u’x’: 1, u’_id’: ObjectId(‘4edcf0e4e50cd2389f000001’)}

>>> db.connection.host
localhost

>>> db.connection.port

10001

 

db.connection.host 와 db.connection.port를 이용해서 지금 어디에 연결되어 있는지를 확인할 수 있습니다.

localhost:10001 에 연결되어 있다고 가정하고 해당 instance를 한번 종료시켜 보겠습니다.

 

kill -9 5657

 

그리고 다시 db.test.find_one()를 하게 되면 다음과 같은 에러가 발생합니다.

 

Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “pymongo/collection.py”, line 518, in find_one
for result in self.find(spec_or_id, *args, **kwargs).limit(-1):
File “pymongo/cursor.py”, line 699, in next
if len(self.__data) or self._refresh():
File “pymongo/cursor.py”, line 662, in _refresh
self.__uuid_subtype))
File “pymongo/cursor.py”, line 612, in __send_message
**kwargs)
File “pymongo/connection.py”, line 868, in _send_message_with_response
sock = self.__socket()
File “pymongo/connection.py”, line 680, in __socket
sock, from_pool = self.__pool.get_socket(host, port)
File “pymongo/connection.py”, line 165, in get_socket
self.sock = (pid, self.connect(host, port))
File “pymongo/connection.py”, line 127, in connect
s.connect((host, port))
File “<string>”, line 1, in connect

 

상황에 따라서 다음과 같은 오류가 나기도 합니다.

>>> db.test.find_one()

Trackback (most recent call last):

pymongo.errors.AutoReconnect: …

 

그리고 다시 시도하면 오퍼레이션 도중에 자동으로 접속을 하게 됩니다. Connect 부분에서 call stack을 찍어보면 다음과 같습니다. 참고문서를 보면 AutoReconnect는 이전 primary에 접속할 수 없을 경우에 발생한다고 합니다.

 

(Pdb) w

<stdin>(1)<module>()

/home/charsyam/repo/charsyam/pymongo/pymongo/collection.py(518)find_one()

-> for result in self.find(spec_or_id, *args, **kwargs).limit(-1):

/home/charsyam/repo/charsyam/pymongo/pymongo/cursor.py(699)next()

-> if len(self.__data) or self._refresh():

/home/charsyam/repo/charsyam/pymongo/pymongo/cursor.py(662)_refresh()

-> self.__uuid_subtype))

/home/charsyam/repo/charsyam/pymongo/pymongo/cursor.py(612)__send_message()

-> **kwargs)

/home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(871)_send_message_with_response()

-> sock = self.__socket()

/home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(671)__socket()

-> host, port = self.__find_node()

/home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(641)__find_node()

-> node = self.__try_node(candidate)

/home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(580)__try_node()

-> response = self.admin.command(“ismaster”)

/home/charsyam/repo/charsyam/pymongo/pymongo/database.py(344)command()

-> _uuid_subtype = uuid_subtype)

/home/charsyam/repo/charsyam/pymongo/pymongo/collection.py(518)find_one()

-> for result in self.find(spec_or_id, *args, **kwargs).limit(-1):

/home/charsyam/repo/charsyam/pymongo/pymongo/cursor.py(699)next()

-> if len(self.__data) or self._refresh():

/home/charsyam/repo/charsyam/pymongo/pymongo/cursor.py(662)_refresh()

-> self.__uuid_subtype))

/home/charsyam/repo/charsyam/pymongo/pymongo/cursor.py(612)__send_message()

-> **kwargs)

/home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(871)_send_message_with_response()

-> sock = self.__socket()

/home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(674)__socket()

-> sock, from_pool = self.__pool.get_socket(host, port)

/home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(168)get_socket()

-> self.sock = (pid, self.connect(host, port))

> /home/charsyam/repo/charsyam/pymongo/pymongo/connection.py(138)connect()

-> if self.use_ssl:

 

참고문헌: http://api.mongodb.org/python/current/examples/replica_set.html

 

 

간단한 mongodb 2.0.1 replSet 설정 방법(localhost 일때)

start.sh 보통 3대의 구성으로 많이 이용하는 듯 합니다.

#!/bin/sh

/home/charsyam/mongo/mongod –dbpath /home/charsyam/data/mongodb/db1 –port 10001 –replSet charsyammongo/localhost:10002 &
/home/charsyam/mongo/mongod –dbpath /home/charsyam/data/mongodb/db2 –port 10002 –replSet charsyammongo/localhost:10001 &
/home/charsyam/mongo/mongod –dbpath /home/charsyam/data/mongodb/db3 –port 10003 –replSet charsyammongo/localhost:10001,localhost:
10002 &

 

이렇게 실행만 시키면 다음과 같은 오류가 나기 시작합니다.

Sat Nov 19 00:41:48 [rsStart] trying to contact localhost:10002
Sat Nov 19 00:41:48 [rsStart] replSet can’t get local.system.replset config from self or any seed (EMPTYCONFIG)
Sat Nov 19 00:41:49 [rsStart] trying to contact localhost:10001
Sat Nov 19 00:41:49 [rsStart] replSet can’t get local.system.replset config from self or any seed (EMPTYCONFIG)
Sat Nov 19 00:41:49 [rsStart] trying to contact localhost:10001

 

이제 mongo localhost:10001 로 접속을 하고 다음과 같이 입력합니다.

config = {_id: ‘charsyammongo’, members: [
{_id: 0, host: ‘localhost:10001’},
{_id: 1, host: ‘localhost:10002’},
{_id: 2, host: ‘localhost:10003’}]}

rs.initiate(config)

 

그러면 자기들 끼리 마스터를 선출하기 시작합니다.

이제 에러로그가 다음과 같이 바뀝니다.

 

Sat Nov 19 00:42:27 [rsHealthPoll] replSet member localhost:10001 is now in state PRIMARY
Sat Nov 19 00:42:27 [rsHealthPoll] replSet member localhost:10003 is now in state RECOVERING
Sat Nov 19 00:42:27 [rsHealthPoll] replSet member localhost:10001 is now in state PRIMARY

 

설정 끝!!!