2016년 9월 30일 금요일

Mongo Rocks DB 설치 방법

  1. MongoRocks 를 쓰는 이유 
    1. MongoRocks 는 MongoDB 에 스토리지 엔진을 Rocksdb로 사용하는 것을 말한다. Rocks 스토리지 엔진은 페이스북에서 개발되어 OpenSource 화 된것으로
      일반적인 BMT 성능에서, mmap 과 wiredTiger 보다 월등한 성능을 보인다.
    2. average results (throughput, operations per second) during 2nd hour:

      8/16265881
      16/32316791
      32/483572104
      size
      mmap
      wiredTiger
      RocksDB
    3. 어떤 게임에서 Mongorocks 엔진을 제안하였고,  Centos 에서는 rpm 이나 yum 으로 아직 제공되지 않아   소스파일을 컴파일 하여야 한다. 
      조금은 복잡하여, 해당 엔진을 컴파일 하는 방법을 공유 하고자 한다. 

  2. Rocks 엔진 관련 선택이유 및  선택 버전
    1. DB

    2. MongoDB 용 스토리지 엔진 RocksDB
    1) 설치
     스토리지 엔진 MongoRocks 선택 이유
    일전에 자체테스트한 결과와 웹에서 벤치마킹에 대한 결과로부터 문제점을 확인하였는데,
    WiredTiger 의 경우 레코드가 많이 쌓여있는 경우 체크포인팅시 수 초 동안 오퍼레이션을 처리하지 못하는 이슈가 있었습니다.
    이 이슈가 MongoDB 차기 버전에서는 해결된 것으로 보이나 언제 릴리즈 될지 알 수 없는 상황이다보니 좀 더 안정적인 RocksDB 로 테스트를 진행합니다. 

    WiredTiger 벤치 마킹 결과입니다. Stall 현상에 대한 내용이 있습니다.
    https://www.percona.com/blog/2015/12/15/mongodb-3-2-wiredtiger-in-iibench/
  3.  사전 준비 사항 
    1. Centos 7.2 이상
    2. GCC-5.3.0 이상
  4. 패키지 준비
    1. MongoRocks( 아래에서 관련내용을 보고 관련파일 다운로드 ) 
      https://github.com/mongodb-partners/mongo-rocks
  5. gcc 설치
    #사전 라이브러리 설치
    yum install libmpc-devel mpfr-devel gmp-devel zlib-devel*
    #Gcc 컴파일
     ./configure --with-system-zlib --disable-multilib --enable-languages=c,c++
        make -j 4
        make install
  6. 각종 필요 라이브러리 설치 
    #GLAGS 설치
     wget https://gflags.googlecode.com/files/gflags-2.0-no-svn-files.tar.gz
     tar -xzvf gflags-2.0-no-svn-files.tar.gz
     cd gflags-2.0
     ./configure && make && sudo make install#zlib 설치
     sudo yum install zlib
     sudo yum install zlib-devel# bzip2 설치
     sudo yum install bzip2
     sudo yum install bzip2-devel#snappy 설치snappy 패키지 폴더에서 ./configure && make && make install# scons 설치rpm -ivh scons-2.3.0-1.el7.1.noarch.rpm
  7. LD_LIBRARY_PATH 추가 
    LD_LIBRARY_PATH=/usr/local/lib:/lib64:.:$LD_LIBRARY_PATH 추가
  8. mongo-master, mongo-rocs.master, rocksdb-master  이 3개의 패키지는 구글을 검색하여 다운로드 하도록 한다
    1. MongoRocks
      https://github.com/mongodb-partners/mongo-rocks
  9. Rockdb 컴파일 
    cd rocksdb;
    # Make file 임의로 생성
    [root@kqabalamgmdb04 rocksdb]# cat > make_config.mk
    CC=cc
    CXX=g++
    PLATFORM=OS_LINUX
    PLATFORM_LDFLAGS= -lpthread -lrt -lz
    JAVA_LDFLAGS= -lpthread -lrt -lz
    JAVA_STATIC_LDFLAGS= -lpthread -lrt
    VALGRIND_VER=
    PLATFORM_CCFLAGS= -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX  -DOS_LINUX -fno-builtin-memcmp -DROCKSDB_FALLOCATE_PRESENT -DZLIB -DROCKSDB_MALLOC_USABLE_SIZE -DROCKSDB_PTHREAD_ADAPTIVE_MUTEX -DROCKSDB_BACKTRACE -march=native
    PLATFORM_CXXFLAGS=-std=c++11  -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX  -DOS_LINUX -fno-builtin-memcmp -DROCKSDB_FALLOCATE_PRESENT -DZLIB -DROCKSDB_MALLOC_USABLE_SIZE -DROCKSDB_PTHREAD_ADAPTIVE_MUTEX -DROCKSDB_BACKTRACE -march=native
    PLATFORM_SHARED_CFLAGS=-fPIC
    PLATFORM_SHARED_EXT=so
    PLATFORM_SHARED_LDFLAGS=-Wl,--no-as-needed -shared -Wl,-soname -Wl,
    PLATFORM_SHARED_VERSIONED=true
    EXEC_LDFLAGS=
    JEMALLOC_INCLUDE=
    JEMALLOC_LIB=
    ROCKSDB_MAJOR=4
    ROCKSDB_MINOR=12
    ROCKSDB_PATCH=0
    CLANG_SCAN_BUILD=scan-build
    CLANG_ANALYZER=
    PROFILING_FLAGS=-pg
    # 컴파일
    make static_lib;
    ==> 혹시 , mongodb scons 컴파일 하고 나서 링크 오류 떨어지면서,  librocksdb 연결할 수 없다는 에러가 게속 발생한다면  위 rocksdb 컴파일 옵션을 static_lib 로 하지말고 make shared_lib으로 변경하자
    # 링크
    export INSTALL_PATH=/usr
    make installcd ..
    mkdir -p mongo/src/mongo/db/modules/
    ln -sf /설치경로/mongo-rocks mongo/src/mongo/db/modules/rocks
  10. Mongodb 컴파일 에러 회피( centos 에서만 ) 
    mongo 컴파일전에 Bug 를 회피하는 아래 내용 추가
    컴파일전에 추가내용
    cd mongo;
    vi  version.json
    {
        "version""0.0.1-fake-"
    }
    $> vi site_scons/mongo_custom_variables.py
    MONGO_VERSION="0.0.1-fake-"
  11. Mongodb 컴파일 
    cd mongo
    $> scons
    위 컴파일 후에 나오는 mongod 바이너리를 사용하면됩니다.
  12. systemctl 에 등록 
    systemctl 변경
    $ >cd /lib/systemd/system
    $> vi  mongodb.service
    [Unit]
    Description=An object/document-oriented database
    Documentation=man:mongod(1)
    After=network.target
    [Service]
    User=mongodb
    Group=mongodb
    ExecStart=/usr/local/bin/mongod --storageEngine=rocksdb -f /etc/mongod.conf
    # (file size)
    LimitFSIZE=infinity
    # (cpu time)
    LimitCPU=infinity
    # (virtual memory size)
    LimitAS=infinity
    # (open files)
    LimitNOFILE=64000
    # (processes/threads)
    LimitNPROC=64000
    [Install]
    WantedBy=multi-user.target
    $> systemctl list-unit-files --type=service | grep mongo
    $> systemctl enable mongodb.service
    $>systemctl list-unit-files --type=service | grep mongo
    $> systemctl start mongodb