[mongodb client UI]


MongoDB 2.2.x 2.1.2 부터 TTL(Time To Live) 기능이 제공되고 있다. IT에 익숙한 분이라면 icmp, DNS, cache server 등의 프로토콜이나 설정/작동 방법상에서 자주 나타나는 용어라는 것을 알 수 있으리라.


mongodb에서의 이 기능은 단순하게 설명하자면, 지정된 시간 이전의 레코드를 자동으로 지우는(purging, removing) 기능이다. 주로 통계성 데이터나 모니터링 데이터 등 시계열 데이터가 저장되어 있을 경우나 일정 시간 동안만 저장되어야 하는 session 정보 등을 저장하는데 유용하게 사용할 수 있겠다.

중요한 주의사항 몇 가지를 아래에 정리해 두고 테스트를 진행해 본다.
  1. mongodb의 Date 에 해당하는 날짜시간 데이터가 저장되는 필드가 필요하고, 여기에 ensureIndex로 인덱스를 두는 방식이다
  2. 해당 필드는 다른 index 에 복합적으로 참조되지 않아야 한다(단일 필드, 단일 인덱스)
  3. 해당 필드에는 위 1번에서 처럼 Date BSON type의 데이터가 UTC 기준으로 저장되어야 자동으로 지워진다
  4. mongodb의 ttl thread는 1분단위로 동작한다. 즉 10초로 설정한다고 데이터 저장 후 10초만에 지워지는 것이 아니라 1분 가량의 오차가 존재하며, DB 시스템의 부하 정도(mongod의 workload가 얼마나 큰지)에 따라 달라질 수 있다는 즉, 정확히 해당 시간 경과후 지워진다는 보장은 없다는 것.
  5. 모든 컬렉션의 공통 필드인 _id 필드는 ttl 필드로 사용할 수 없다.
  6. capped collection은 ttl index를 적용할 수 없다.

각설하고, 아래와 같이 간단히 테스트 해 본다

> db.tt_col.save( { id: 'id1', name: 'aaa', dt: new Date() } );
> db.tt_col.save( { id: 'id2', name: 'bbb', dt: new Date() } );
> db.tt_col.save( { id: 'id3', name: 'ccc', dt: new Date() } );
> db.tt_col.find();
{ "_id" : ObjectId("509de58b1493b98702441310"), "id" : "id1", "name" : "aaa", "dt" : ISODate("2012-11-10T05:26:35.370Z") }
{ "_id" : ObjectId("509de5ac1493b98702441311"), "id" : "id2", "name" : "bbb", "dt" : ISODate("2012-11-10T05:27:08.218Z") }
{ "_id" : ObjectId("509de5ba1493b98702441312"), "id" : "id3", "name" : "ccc", "dt" : ISODate("2012-11-10T05:27:22.450Z") }
> db.tt_col.ensureIndex( {dt: 1}, {expireAfterSeconds: 10} );
> db.tt_col.find();
{ "_id" : ObjectId("509de58b1493b98702441310"), "id" : "id1", "name" : "aaa", "dt" : ISODate("2012-11-10T05:26:35.370Z") }
{ "_id" : ObjectId("509de5ac1493b98702441311"), "id" : "id2", "name" : "bbb", "dt" : ISODate("2012-11-10T05:27:08.218Z") }
{ "_id" : ObjectId("509de5ba1493b98702441312"), "id" : "id3", "name" : "ccc", "dt" : ISODate("2012-11-10T05:27:22.450Z") }
잘 보면 날짜/시간 부분이 localtime이 아닌 UTC 기준시간으로 저장되어 있음에 유의한다.

약 40초 후에 컬렉션의 데이터를 조회해 보니 3건의 데이터가 삭제되어 있음을 확인할 수 있다. 
> db.tt_col.find().count();
0
> db.tt_col.find();
>


응용할 수 있는 트릭이라면, 지워지게 하고 싶지 않은 데이터가 있을 경우 어떨게 하면 될까?


한 가지 방법은 보관이 필요한 데이터를 찾아서 ttl 설정 필드 값을 Date() 로 update하는 것이다. 만약 계속 보존처리를 해야 한다면 매번 update를 수행해야 할 것이고,

계속 보존해야 한다면, 단순하게도 다음과 같이 ttl 필드를 Date가 아닌 다른 데이터 값으로 설정하면 된다.

> db.tt_col.update( { id: 'id1' }, { dt: null } );


[pymongo 2.3]

사용 방법은 유사하지만 python 내에서 ttl 기능 설정/사용시에 유의할 사항이 있다. 아래 예시의 함정을 찾아 보자.


Python 2.7.2 (default, Aug 19 2011, 20:41:43) [GCC] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import pymongo

>>> from datetime import datetime, date, time, timedelta

>>> datetime.now()

datetime.datetime(2012, 11, 2, 2, 3, 50, 18750)

>>> pyMongoConnStr = 'mongodb://10.10.10.70:28017/myschema'

>>> connMongo = pymongo.Connection( pyMongoConnStr )

>>> connMongo.myschema.tt_col.save( { 'a':1, 'b':2, 'dt': datetime.now() } )
ObjectId('50aa68a94422527639f91a34')
>>> connMongo.monitor.t_col.ensure_index( 'dt', pymongo.ASCENDING, expireAfterSeconds = 15 )
>>> connMongo.myschema.tt_col.find_one()
{u'a': 1, u'dt': datetime.datetime(2012, 11, 2, 2, 13, 13, 517000), u'_id': ObjectId('50aa68a94422527639f91a34'), u'b': 2}


15초 가량 후에 해당 row가 삭제되어야 하는데, 10분이 지나도 멀쩡하게 남아 있다. index 설정을 봐도 잘못 된게 없고, 시스템 시간도 정확하게 현재시간을 가리키고 있는데, ...


결론을 말하자면, 위에서 등록한 row는 한국 시간으로 9시간 가량 후에 지워질 것이다. 왜냐하면 mongodb의 ttl thread 는 UTC 를 기준으로 작동하는데, python에서 mongodb에 등록한 데이터(row)에서 dt 필드의 값인 datetime.now() 는 KST(대한민국표준시; 또는 시스템 시간이 localtime) 기준의 시간 값이기 때문이다. 즉 python에서 ttl index 필드의 시간 값을 설정할 때는 반드시 datetime.utcnow() 를 사용하여야만 한다. 이점 유의하자.



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

Opensuse 12.1 환경에서 PHP5 + lighttpd fastcgi + mongodb + mysql 개발/운영 환경 설정

* howtoforge.com 내용 참조, 테스트 실행 & 보완


1. Lighttpd & php5 환경 설정


# zypper in -y lighttpd

# systemctl enable lighttpd.service

# systemctl start lighttpd.service


* 기존의 php5 fastcgi 가 php5-fpm 패키지로 통합 업그레이드 되었고 별도 daemon으로 동작한다.

# zypper in -y php5-fpm


# mv /etc/php5/fpm/php-fpm.conf.default /etc/php5/fpm/php-fpm.conf

# chmod 1733 /var/lib/php5


* error_log 부분을 un-comment 하고 아래와 같이 수정한다

# vi /etc/php5/fpm/php-fpm.conf

error_log = /var/log/php-fpm.log


* 아래 라인들을 찾아서 확인하고 몇 가지 mandatory 설정을 un-comment 한다(pm=dynamic 일 경우)

* howtoforge.com 에서는 해당 설정 부분이 누락되어 있다

pm = dynamic

pm.max_children = 50

pm.min_spare_servers = 5

pm.max_spare_servers = 35


* fpm용으로 별도의 php.ini 파일이 없으므로 cli용을 복사한다.

# cp /etc/php5/cli/php.ini /etc/php5/fpm/


* 아래 해당 라인을 찾아서 un-comment 한다.

# vi /etc/php5/fpm/php.ini

cgi.fix_pathinfo=1


# systemctl enable php-fpm.service

# systemctl start php-fpm.service


# vi /etc/lighttpd/modules.conf -> 아래 라인을 찾아서 un-comment

include "conf.d/fastcgi.conf"


server.modules = (

...

  "mod_auth",

...

)


* 아래 라인을 추가

# vi /etc/lighttpd/lighttpd.conf

include "conf.d/auth.conf"


* 아래 라인들을 un-comment 하고 내용을 수정

# vi /etc/lighttpd/conf.d/auth.conf

auth.debug = 2

auth.backend = "plain"

auth.backend.plain.userfile  = "/etc/lighttpd/lighttpd.user"


auth.require = ( "/" =>

                      (

                        "method"  => "basic",

                        "realm"   => "Password protected area",

                        "require" => "user=loginid"

                      ),

                    )


* 아래 로그인 정보를 등록하고 저장

# vi /etc/lighttpd/lighttpd.user

loginid:loginpassword


# vi /etc/lighttpd/conf.d/fastcgi.conf -> 아래 라인이 있는지 확인

server.modules += ( "mod_fastcgi" )


* 아래 내용을 추가(기존의 fastcgi.server 부분의 comment 는 그대로 둔다)

fastcgi.server += ( ".php" =>

        ((

                "host" => "127.0.0.1",

                "port" => "9000",

                "broken-scriptfilename" => "enable"

        ))

)


# systemctl restart lighttpd.service


* lighttpd의  default 문서 홈디렉토리는 /srv/www/htdocs 이다


# vi /srv/www/htdocs/info.php

<?php

phpinfo();

?>


* 브라우저로 접속 확인




2. MySQL과 utility 패키지 설치


* Web 을 통하지 않고 직접 DB접속을 위해 접속 클라이언트를 사용할 경우에는 아래와 같이 클라이언트를 설치한다.

# zypper in -y mysql-community-server-client


* MySQL 및 일반적으로 많이 사용하는 드라이버 설치

# zypper in -y php5-mysql php5-bcmath php5-bz2 php5-calendar php5-ctype php5-curl php5-dom php5-ftp php5-gd php5-gettext php5-gmp php5-iconv php5-imap php5-ldap php5-mbstring php5-mcrypt php5-odbc php5-openssl php5-pcntl php5-pgsql php5-posix php5-shmop php5-snmp php5-soap php5-sockets php5-sqlite php5-sysvsem php5-tokenizer php5-wddx php5-xmlrpc php5-xsl php5-zlib php5-exif php5-pear php5-sysvmsg php5-sysvshm


3. mongodb 드라이버 설치


* 11.x 환경과는 다르게 12.1 부터는 pecl 을 통해 php용 mongo 드라이버를 쉽게 설치할 수 있다


# pecl install mongo


# vi /etc/php5/fastcgi/php.ini -> 아래 라인을 추가

extension=mongo.so


# systemctl restart lighttpd.service

# systemctl restart php-fpm.service


* 1의 과정과 같이 브라우저를 통해 php 환경에 맞게 설치된 드라이버들을 최종 확인한다.






저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

Opensuse 11.3, 12.1 각각에 대해 2회에 걸쳐서 정리

* howtoforge.com 내용 참조, 테스트 실행 & 보완


1. Lighttpd & php5 환경 설정


# zypper in -y lighttpd

# chkconfig --add lighttpd

# chkconfig lighttpd on

# service lighttpd start


# zypper in -y php5-fastcgi


* 아래 라인을 찾아서 un-comment

# vi /etc/php5/fastcgi/php.ini 

cgi.fix_pathinfo=1


* 아래 라인을 찾아서 un-comment

# vi /etc/lighttpd/modules.conf

include "conf.d/fastcgi.conf"


server.modules = (

...

  "mod_auth",

...

)


* 아래 라인을 추가

# vi /etc/lighttpd/lighttpd.conf

include "conf.d/auth.conf"


* 아래 라인들을 un-comment 하고 내용을 수정

# vi /etc/lighttpd/conf.d/auth.conf

auth.debug = 2

auth.backend = "plain"

auth.backend.plain.userfile  = "/etc/lighttpd/lighttpd.user"


auth.require = ( "/" =>

                      (

                        "method"  => "basic",

                        "realm"   => "Password protected area",

                        "require" => "user=loginid"

                      ),

                    )


* 아래 로그인 정보를 등록하고 저장

# vi /etc/lighttpd/lighttpd.user

loginid:loginpassword


* 아래 라인이 있는지 확인

# vi /etc/lighttpd/conf.d/fastcgi.conf

server.modules += ( "mod_fastcgi" )


* 아래 부분을 찾아서 un-comment

fastcgi.server = ( ".php" =>

                   ( "php-local" =>

                     (

                       "socket" => socket_dir + "/php-fastcgi-1.socket",

                       "bin-path" => server_root + "/cgi-bin/php5",

                       "max-procs" => 1,

                       "broken-scriptfilename" => "enable",

                     )

                   ),

                   ( "php-tcp" =>

                     (

                       "host" => "127.0.0.1",

                       "port" => 9999,

                       "check-local" => "disable",

                       "broken-scriptfilename" => "enable",

                     )

                   ),


                   ( "php-num-procs" =>

                     (

                       "socket" => socket_dir + "/php-fastcgi-2.socket",

                       "bin-path" => server_root + "/cgi-bin/php5",

                       "bin-environment" => (

                         "PHP_FCGI_CHILDREN" => "8",

                         "PHP_FCGI_MAX_REQUESTS" => "10000",

                       ),

                       "max-procs" => 2,

                       "broken-scriptfilename" => "enable",

                     )

                   ),

                )

* 위의 옵션은 소규모 접속일 경우이고, 일반적인 다중 접속 사이트일 경우 아래와 같이 규모에 맞게 적당히 옵션을 조정한다.

"PHP_FCGI_CHILDREN" => "16"

"max-procs" => 5


# service lighttpd restart


* lighttpd의  default 문서 홈디렉토리는 /srv/www/htdocs 이다


# vi /srv/www/htdocs/info.php

<?php

phpinfo();

?>


* 브라우저로 접속 확인




2. MySQL과 utility 패키지 설치


* Web 을 통하지 않고 직접 DB접속을 위해 접속 클라이언트를 사용할 경우에는 아래와 같이 클라이언트를 설치한다.

# zypper in -y mysql-community-server-client


* MySQL 및 일반적으로 많이 사용하는 드라이버 설치

# yast2 -i php5-mysql php5-bcmath php5-bz2 php5-calendar php5-ctype php5-curl php5-dom php5-ftp php5-gd php5-gettext php5-gmp php5-iconv php5-imap php5-ldap php5-mbstring php5-mcrypt php5-odbc php5-openssl php5-pcntl php5-pgsql php5-posix php5-shmop php5-snmp php5-soap php5-sockets php5-sqlite php5-sysvsem php5-tokenizer php5-wddx php5-xmlrpc php5-xsl php5-zlib php5-exif php5-pear php5-sysvmsg php5-sysvshm


3. mongodb 드라이버 설치


* pecl.php.net 사이트를 이용하여 최신 버전의 php mongo 드라이버를 찾아서 다운로드 한다.


# zypper in -y php5-devel

# wget http://pecl.php.net/get/mongo-1.3.0beta2.tgz

# tar xvzf mongo-1.3.0beta2.tgz; cd mongo-1.3.0beta2

# phpize

# ./configure

# make

# make install

# ldconfig

# vi /etc/php5/fastcgi/php.ini -> 아래 라인을 추가

extension=mongo.so


# service lighttpd restart


* 1의 과정과 같이 브라우저를 통해 php 환경에 맞게 설치된 드라이버들을 최종 확인한다.





저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

 

MongoDB를 백업하는 방법에는 Journaling을 지원하는 Block 장치일 경우 snapshot, lock & fsync, mongodump & mongorestore 등의 여러 가지가 있다. mongo.org 에 의하면 증분 백업(incremental backup)을 지원하지는 않고 있으며, 아직까지 이러한 기능을 수행하는 도구 또한 존재하지 않는 상황이다.


데이터베이스 엔진이 중단되지 않아야 하는 상황의 경우 dump & restore를 통한 방법이 일반적이므로 아래에 그 사용법에 대해 정리해 둔다. 이 방식은 쉽게 표현하자면 단순히 레코드 단위로  백업(dump)을 받고, 복구시에도 레코드 단위로 insert를 반복적으로 수행하게 된다.


[mongodump]

# 전체 데이터베이스 Full backup

/mongo/bin/mongodump --out /mongobackup/20120901 --oplog --host 10.10.0.10 --port 28017 -uuser -ppass


* 특정 데이터베이스 스키마만 백업할 경우에는 --db dbsname 옵션을 사용한다.

* --oplog 옵션은 백업이 진행되고 있는 도중에 발생한 트랜잭션에 대한 데이터를 별도로 처리하여 누락되는 백업데이터가 없도록 해 주는 기능이다.

* 백업이 끝나면 /mongobackup/20120901 디렉토리에 각 데이터베이스 스키마별로 서브디렉토리가 생성되어 컬렉션별로 .bson 파일들이 생성된다.

* 용량과 서버 성능에 따라 수십분 내지 수시간이 걸릴 수 있으며, 백업되는 디스크의 용량도 수백GB 또는 수TB까지도 사용 가능하여야 할 수도 있다.


[mongorestore]

# 전체 데이터베이스 Full restore

/mongo/bin/mongorestore --host 10.10.0.10 --port 28017 -uuser -ppass --oplog --drop  /mongobackup/20120901/


* 특정 데이터베이스 스키마만 복구하려면 아래와 같이 수행한다. 백업디렉토리의 하위 디렉토리 위치에 대상 데이터베이스명을 정확히 기입하여야 한다.

/mongo/bin/mongorestore --host 10.10.0.10 --port 28017 -uuser -ppass --drop --db dbname /mongobackup/20120901/dbname/


* --drop 옵션은 복구시에 해당 컬렉션을 삭제하는 방식이다. 즉 복구시에 동일한 컬렉션이 존재할 경우 컬렉션을 초기화하고 dump된 데이터만을 채워 넣으므로, dump 이후에 저장된 데이터는 소실됨을 의미하므로, 데이터베이스 전체를 dump된 시점으로 되돌릴 때 사용한다.

*  데이터베이스 개별 복구일 경우 --oplog 옵션은 적용되지 않는다.

 


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


Mongo DB를 사용한 Replication은 그 조합과 목적에 따라 여러 가지 구조로 구현된다. Master-Slave 이중화 및 다중화, Master-Master 이중화, Master-Master Circular 구조의 다중화, Cluster 기술이 적용된 Replica Set 등, ... 결국은 데이터베이스의 고가용성을 갖추기 위한 목적은 같지만 말이다.

가장 대표적이고 단순한 것은 Master-Slave이다. 이를 통해서 Data redundancy는 구현되지만, Fail-over 문제, 자원의 비효율적 사용 때문에 Master-Master 구조를 선호하는 것이 일반적이다. 또한 그 구조도 비교적 단순하며 Fail-over 를 통한 Availability 뿐 아니라 Read/Write 부하의 분산의 측면에서 아직까지 중/소규모 데이터 처리시에 효과적으로 활용될 수 있다. 물론 Database의 앞 쪽에 Load Balancer가 있어, 양쪽으로 부하를 분산해 줄 수 있을 경우 또는 드라이버나 Application 에서 Fail-over에 대응하는 접속 설정이 가능할 경우에 해당된다.

이 방식에서의 치명적인 단점은 바로 운영의 부담이 크다는 것이다. 데이터를 양쪽 노드에 모두 쓰기가 가능함으로 해서, Fail-over의 혜택을 누렸지만, 이를 복구한 이후에 재 투입을 할 경우, 짧은 순간이지만, 각 노드가 Master 이면서 Slave 이기 때문에 살아 있던 Master의 replication 옵션을 바꾸어서 장애 복구한 노드를 재 투입하여 Replication을 하고, 정상적으로 Replication될 경우 다시 한번 양 쪽의 raplication 옵션을 Master-Master 바꾸어서 재실행하여야 한다.

10Gen 에서는 MongoDB 초창기(1.4?) 부터 Master/Slave Replication 의 단점을 보완하고자 지금은 없어진 Replica Pair, Replica Set 기능을 개발 해 왔고 1.6.* 이후 부터 본격적으로 안정된 Replica Set 기능을 제공하고 있다. 즉 2대 이상의 서버를 이용해 Master-Slave(1:n) 구조로Data를 복제하여 저장하되, 정상 상황에서 하나의 Primary만 존재하여 작동하되, Primary에 문제가 생길 경우 Slave 중의 하나를 Primary로 선정(vote)하여 Master 기능을 넘겨 받는 구조이다.


[주의] 
모든 경우에 Replica Set이 만능은 될 수 없다. mongos와 Config server를 사용하여 쓰기 부하를 분산하도록 해야 하며, Master-Slave 이중화 구성에서 Replica Set으로 이전하려면, Application 측의 driver 를 변경하여 Primary 노드를 찾아가도록 하는 추가적인 노력이 필요한 점에 유의하여야 하며, 기존의 이중화 구성에서 사용한 Load Balancer의 설정 방식에도 변화를 주어야 한다. 하지만 한 번 적용해 놓으면 트리 구조의 단순성과 추가 노드 투입(확장성)또는 장애 대처의 편리성(운영 편의), 거의 100%에 가까운 가용성 때문에 중 대규모 데이터를 처리하고자 하는 환경인 경우에 지극히 효과적인 장점을 보이는 것은 분명하다.


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


[Getting ready]

* Install spidermonkey(js.lib)
# curl -O ftp://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
# tar zxvf js-1.7.0.tar.gz
# cd js/src
# export CFLAGS="-DJS_C_STRINGS_ARE_UTF8"
# make -f Makefile.ref
# JS_DIST=/usr make -f Makefile.ref export

* install scons, pcre-devel
# zypper in scons
# zypper in pcre-devel

* Packages needed for building  mongo
<Fedora 8, 10, ...Opensuse 11, ...>
git, tcsh, scons, gcc-c++, glibc-devel
boost-devel pcre-devel js-devel readline-devel
boost-devel-static, readline-static ncurses-static
<Ubuntu 9.x>
tcsh git-core scons g++
libpcre++-dev libboost-dev libreadline-dev xulrunner-1.9.1-dev
libboost-program-options-dev libboost-thread-dev libboost-filesystem-dev libboost-date-time-dev

[Building & installing]
* js와 mongodb-src-r1.x.x 가 동일한 directory에 위치하도록(mongo build시 ../js 를 참조함)

# scons all
# scons --prefix=/user/service/mongo install

* Enjoy huMONGOus document database

[Run mongo as an auto-start daemon]

* Make data & log directory for mongo
# mkdir /user/service/mongo/data
# mkdir /user/service/mongo/log

vi mongo
-----------------------------------------------------------------------------
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          mongoDB
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop the mongo database server daemon
# Description:       Controls the main mongo database server daemon "mongod"
### END INIT INFO
#
# Copy this file to /etc/init.d & run commands below
#  1. Make symbolic link to /etc/rc[0-6].d/S??mongo
#  2. ln -s /etc/init.d/mongo /etc/rc[2345].d/S30mongo ==> start on boot(as to run level 2, 3, 4, 5
#  3. ln -s /etc/init.d/mongo /etc/rc[012].d/K30mongo ==> start on boot(as to run level 2, 3, 4, 5
#
export MONGO_HOME=/user/service/mongo
# Test if the file is executable, exits if not
test -x $MONGO_HOME/bin/mongod || exit 0
#
# main()
#
case "${1:-''}" in
  'start')
        # Start daemon
        $MONGO_HOME/bin/mongod --auth --port 28017 --dbpath $MONGO_HOME/data/ --fork --logpath $MONGO_HOME/log/mongodb.log
        ;;

  'stop')
        pid=`ps -o pid,command ax | grep mongod | awk '!/awk/ && !/grep/ {print $1}'`
        if [ "${pid}" != "" ]; then
            echo "About to kill mongod ...";
            echo "Pid: $pid";
            sudo kill -2 ${pid};
        fi
        ;;

  'restart'|'reload'|'force-reload')
        pid=`ps -o pid,command ax | grep mongod | awk '!/awk/ && !/grep/ {print $1}'`
        if [ "${pid}" != "" ]; then
            echo "About to kill '$1'...";
            echo $pid;
            sudo kill -2 ${pid};
        fi
        sleep 5
        $MONGO_HOME/bin/mongod --auth --port 28017 --dbpath $MONGO_HOME/data/ --fork --logpath $MONGO_HOME/log/mongodb.log
        ;;

  'status')
        $MONGO_HOME/bin/mongod --sysinfo
        ;;

  *)
        echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
        exit 1
        ;;
esac
-----------------------------------------------------------------------------

# chmod +x mongo
# cp mongo /etc/init.d
# chkconfig --add mongo
# chkconfig mongo ON

* Start by "/etc/init.d/mongo start" & have fun.


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


mongo db는 몽고 라는 나라와 전혀 상관이 없다. Humongous 하는 단어에서 만들어진 것.

설치후 아무런 제약 없이 ./mongo 만 치면 db에 접속된다. 개발환경이라면 문제 없지만
개념 없이 쓰다가 큰 일 ㅡ_-? 이 날지도...

우선 mongod를 기동시킬 때 --auth 옵션을 추가해 두자.
다음 글에서 mongod 를 시스템 스타트시에 기동되도록 설정하는 방법을 정리할 것이다. ubuntu, centos, suse 등
거의 모든 linux 머신에서 특정 App을 기동시키는 일반적인 방법이 되겠다.

각설하고,
mongo db는 system 영역 내에 admin 이라는 DB 관리를 위한 스키마 영역(database)를 가진다.
* 메서드 Name에 대소문자 구분 주의
# ./mongo
# use admin
# db.addUser( "adminname", "adminpassword" )
이제 관리자로 접근하려면
# db.auth( "adminname", "adminpassword" )
라고 입력해야만 DB를 use 할 수 있다.

* 이제 DB를 관리하기 위해서는 반드시 아래와 같이 해야만 정상적으로 접속되고 user 생성 등을 할 수 있다.
# mongo -uroot -padminpassword --port 12345 admin

# db.system.useres.find() => users 테이블 내용을 select

일반적인 작업 영역을 위해 별도의 DB를 만들고 권한을 설정하려면
# use newdb => mongo는 newdb가 없으면 자동으로 생성한다. table(collection이라고도 한다)이나
                        key(attribute, column)에 대해서도 마찬가지. 즉, DDL이 따로 없다. C/C++의 structure
                        구조와 같은 composite한 다중 컬럼도 생성이 가능하므로 자칫하면 table 구조가 엉망이 될
                        수도 있다.
# db.addUser( "newdbuser", "newpassword" )
이제 newdb 데이터베이스로 접근하려면
# db.auth( "newdbuser", "newpassword" ) 로 접근할 수 있다.

* 데이터베이스마다 owner 개념으로 접근 계정을 각각 할당하는 방식에 유의 !!!

이제 데이터베이스에 접속하려면  아래 방법들 처럼 접속이 가능하다
# mongo -unewdbuser -pnewpassword newdb --port 27017 --host 100.100.100.20
# mongo -uroot -padminpassword --port 29007 newdb
저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


개발도구는 Sun Studio 12.1 로 해 보자(NetBeans 6.8도 가능)
개발을 위한 컴파일러는 gcc 4.1* 이상이어야 한다.

우선 mongoDB 다운로드 & 설치
- www.mongodb.org 에서 mongodb binary 또는 소스를 받아서 설치한다
- 소스 설치시는 의존성에 걸리는 빌드도구들을 여러가지 받아서 설치해야한다. 특히 scons 가 필수인데
   Ubuntu, centOS에서는 숫한 삽질을 통해 scons 소스를 컴파일해서 빌드한 기억이 난다.
   우여곡절 끝에 mongodb를 다음과 같이 빌드할 수 있다
   # scons --prefix /usr/service/mongo install
- mongodb 는 rpm 같은 패키징이 없이 tar.gz binary 압축해제/복사 또는 source 컴파일후 위에서 처럼 빌드, 설치
  2가지중 하나를 선택해야 한다.

mongodb 를 사용하는 프로그램을 컴파일 하기 위해서 필수적인 라이브러리가 바로 c++ boost library이다.
CentOS에서는 yum install boost, yum install boost-devel 로 설치할 수는 있지만
아쉽게도 boost 버전이 1.33이라 mongo 어플리케이션을 컴파일할 수가 없다. 그렇다면? boost 소스를 다운받아서
직접 빌드하고 설치해야 한다(이 때도 숫한 삽질이 수반된다). 결론은 Cent에서 mongodb app 개발은 상당한
인내심을 길러주는 극기 훈련이 될테니 마음 단단히 먹기 바란다.
특히 CentOS는 패키지 다운로드를 통해서 받아오는 MySQL이나 boost 등의 어플리케이션들이 상당히
구닥다리들이 많다는 점에 주의 !!

Ubuntu 에서는 그나마 상대적으로 쉬운 편인데 반드시 boost 1.38.1 이상을 설치해줘야 한다.

OpenSUSE 에서는 상당히 간편하게 mongodb 개발이 가능하다. YaST에서 최신버전의 boost 를
받아서 설치해주면 된다. gcc(g++4.4)와 boost 1.40이 설치될 것이다. 잘 모르겠으면 속편하게 소프트웨어
설치에서 왠만한 개발 도구와라이브러리들을 슥슥 선택해서 좌악 깔아주면 된다.

사이트의 샘플 소스를 Copy&Paste 해서 테스트 프로그램을 편집하였다고 하자.
#include <iostream>
#include "client/dbclient.h"

using namespace mongo;

void run() {
  DBClientConnection c;
  c.connect("localhost");
}

int main() {
  try {
    run();
    cout << "connected ok" << endl;
  } catch( DBException &e ) {
    cout << "caught " << e.what() << endl;
  }
  return 0;
}

커맨드라인에서라면 애래와 같이 컴파일 & 빌드를 수행하면 된다.
# g++ mongotest.cc -lmongoclient -lboost_thread-mt -lboost_filesystem -lboost_system-mt -o mongotest
여기서 libmongoclient.a, libboost_thread-mt.so libboost_filesystem.so libboost_system-mt.so 등이 적절히
설치되고 -L 옵션등으로 지정해주거나 LD_LIBRARY_PATH에 추가 하는 등의 작업이 필요함은 물론이다
(플랫폼에 따라 libboost_filesystem-mt.so로 해야 할 수도 있다).

SunStudio 내에서 컴파일&빌드 하려 한다면
Sunstudio 메뉴에서 Tools>Option>C/C++ 설정으로 가서 GNU를 default 로지정하고 저장한다.
Project Properties 에서 컴파일러 옵션에서 Additional Include 디렉토리를 mongodb include 디렉토리로 지정
링크 옵션에서 Add Library로 libmongoclient.a와 boost shared library 3개를 모두 추가하여 야 한다.


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

Tag boost, C++, mongodb