MongoDB 구성하기

단일 MongoDB 인스턴스를 사용할 경우 쉽고 빠르게 구성이 가능합니다.

그러나 만일 해당 호스트 및 MongoDB 인스턴스에 대한 예기치 못한 문제로 인하여 프로세스가 down되는 등 장애 상황이 발생하거나 데이터 유실이 발생할 수 있습니다.

이를 대비하기 위해 여러 다른 종류의 DBMS와 비슷하게 MongoDB 또한 복제 구성을 통한 DB HA(High Availability) 기능을 사용할 수 있습니다. 이렇게 복제 구성된 그룹은 Replica Set이라 하며, 나아가 다수의 Replica Set을 함께 구성하여 쿼리의 분산 처리와 Scale out에 유리하게 구성한 형태를 Sharded Cluster 라고 부릅니다.

이 장에서는 Replica Set과 Sharded Cluster에 대한 구성 방법을 설명합니다.

Replica Set(RS) 구성하기

하나의 Replica Set은 이를 구성하는 3개 이상의 Member로 구성되며, 각각의 Member는 3가지 중 role(Primary, Secondary, Arbiter) 중 하나의 역할을 합니다.

(자세한 내용은 https://docs.mongodb.com/manual/core/replica-set-members/index.html을 참고)

각각의 role에 따라 Replica Set 구성에 차이가 있을 수 있는데 주로 3개의 Member에 대하여 P-S-A(Primary-Secondary-Arbiter) 혹은 P-S-S(Primary-Secondary-Secondary) 구성이 일반적입니다.

여기서는 P-S-A 구성에 대하여 설명하겠습니다

  1. DB 서버로 사용할 서버 2대, 그리고 Arbiter 서버로 사용할 1대를 준비합니다.

    • 설치형 MongoDB가 설치된 상태, DB 프로세스를 shutdown한 상태

      • DB 프로세스 shutdown 하는 방법 :
        • ]$ mongod --shutdown –f /home/mongodb/db/config/mongod.conf
    • Arbiter는 primary 및 secondary의 데이터를 복제 하지 않으며 프로세스로만 존재하고 primary에 문제가 생겨 fali-over가 발생할 시에 투표만 하는 역할이므로 고성능 DB서버를 사용하지 않아도 됩니다.

    • 뒤에서 설명할 Sharding 구성 시 Router, Config Server와 같은 DB서버 내에 구성하는 경우도 많습니다.

  2. MongoDB replica set 3대의 데몬 설정파일(/home/mongodb/db/config/mongod.conf)을 아래와 같이 설정합니다.(YAML 형태)

    • 예: /home/mongodb/db/config/mongod.conf

      systemLog:
         destination: file
         path: "/home/mongodb/db/log/mongod.log"
         logAppend: true
         logRotate: rename
      storage:
         engine: wiredTiger
         directoryPerDB: true
         wiredTiger:
            engineConfig:
               journalCompressor: snappy
            collectionConfig:
               blockCompressor: snappy
            indexConfig:
               prefixCompression: true
         dbPath: "/home/mongodb/db/data"
         journal:
            enabled: true
            commitIntervalMs: 300
      processManagement:
         fork: true
         pidFilePath: "/tmp/mongod.pid"
      net:
         port: 27019
         bindIpAll: true
         maxIncomingConnections: 20000
         unixDomainSocket:
            enabled: false
      replication:
          oplogSizeMB: 10240
          replSetName: "rstest01"
       setParameter:
          failIndexKeyTooLong: false
      
    • 같은 Replica Set의 멤버로 구성하기 위해서는 replication 항목 아래의 replSetName 이 동일해야 합니다.(예시에서는 rstest01 이라는 이름으로 사용)

    • mongodb shard server의 포트는 기본적으로 27019입니다. 기본 포트 외의 다른 포트를 사용할 것을 권장드립니다

  3. 설정이 끝난 후 MongoDB 데몬을 구동합니다.(3대 모두)

    • ]$ numactl --interleave=all mongod -f /home/mongodb/db/config/mongod.conf &
  4. 구동이 끝나면 primary DB로 사용할 서버에서 mongod shell로 접근합니다.(DB명: admin)

    • mongoshell 접속 장법: mongo < IP 혹은 localhost >:< PORT >/DB명
    • ]$ mongo localhost:27019/admin
  5. 해당 mongo shell 내에서 아래 명령을 통하여 Replica Set을 설정합니다.(여기서는 primary와 secondary 총 2대)

    > rs.initiate(
               {
          _id: "ReplicaSet명",
          version: 1,
          members: [
             { _id: 0, host : "<primaryIP>:<PORT>" },
             { _id: 1, host : "<SecondaryIP>:<PORT>" }
          ]
       }
    )
    
    • 이 예제에서 primary / secondary /arbiter로 사용할 장비의 IP 정보가 아래와 같고 27019 Port를 사용한다고 할 때,

      • Primary: 192.10.10.11
      • Secondary: 192.10.10.12
      • Arbiter: 192.10.10.13
    • 쉘에서는 아래와 같이 입력합니다 (_id’ 필드값은 위의 mongod.conf의 replcation.replSetName 값입니다.)

      rs.initiate(
         {
            _id: "rstest01",
            version: 1,
            members: [
               { _id: 0, host : "192.10.10.11:27019" },
               { _id: 1, host : "192.10.10.12:27019" }
            ]
         }
      )
      
      • 수행 결과 메시지 'ok' 확인 및 잠시 후 primary 및 secondary의 MongoDB shell에 접근하여 prompt가 변경되었는지 확인합니다.

        "rstest01:PRIMARY > " 혹은 "rstest02:SECONDARY> "
        
  6. Primary 및 Secondary 상태를 확인 후 아래와 같이 Arbiter를 추가합니다.(2가지 방법 모두 같은 동작이므로 이 중에 하나만 수행하시면 됩니다)

    • Arbiter 추가

      rs.addArb("192.10.10.13:27019")
      혹은
      rs.add( { host: "192.10.10.13:27019", arbiterOnly: true } )
      
  7. 구성이 잘 완료되었는지 아래 명령을 확인합니다.

    • RS 상태 확인

      rstest01:PRIMARY> rs.status()
      
  8. root권한을 가진 관리 계정을 생성합니다.

    • 사용자 생성

      use admin
      db.createUser(
         {
           user: "<계정명>",
           pwd: "<패스워드>",
           roles: ["root" ]
         }
      )
      
    • 계정 및 패스워드를 'user' / '0000'으로 생성할 경우 아래와 같이 입력합니다.(admin DB에서 수행)

      use admin
      db.createUser(
         {
           user: "user",
           pwd: "0000",
           roles: ["root" ]
         }
      )
      
  9. primary에서 임의의 데이터를 insert 해 보고 secondary에서 데이터가 입력되는지 확인합니다.

    • primary 접속 후

      db.testcol.insert("seq" : 1)
      
    • Secondary 접속 후

      use test
      rs.slaveOk()
      db.testcol.find({})
      

Sharded Cluster 구성하기

만일 사용하고자 할 mongodb에서 처리해야 할 데이터량이 많아 분산 처리가 필요할 경우 등 하나의 replica Set만으로는 운영에 어려움이 있을 경우 mongodb에서 제공하는 ‘Sharding’ 기능을 사용할 수 있습니다.

Sharding 기능을 이용하여 다수의 replica set을 분산 구성한 형태를 “Sharded Cluster”라고 부르며 이는 MongoDB의 핵심 기능 중 하나입니다.

Sharded Cluster에서 반드시 필요한 member들은 아래와 같습니다.

Router(= MongoS): 응용 또는 사용자가 접속하는 포인트. 쿼리를 받아 필요 시 Config Server의 분산 정보를 참조하여 적절한 Shard(Replica Set)으로 전달해주고 사용자에게 결과를 리턴해주는 역할

Config Server: Sharded Cluster에서 여러 분산된 Shard 정보를 저장하고 관리합니다. 하나의 sharded cluster에 config server는 하나의 set만 구성하면 됩니다.

1개 그룹 이상의 Shard(=Replica Set): 여러 개의 Replica Set으로 Cluster를 구성합니다. 각각의 Replica Set을 Shard 라고 부릅니다.

여기서는 아래와 같이 구성하는 예를 설명합니다.

  1. Replica Set을 구성합니다.

    "Replica Set(RS) 구성하기"를 참고하여 2개의 Replica Set(총 6대)를 구성합니다. 단, 설정 파일(/home/mongodb/db/config/mongod.conf) 내에 아래 설정을 추가하여 구동합니다.

    sharding:
       clusterRole: shardsvr
    

    예: /home/mongodb/db/config/mongod.conf

    systemLog:
       destination: file
       path: "/home/mongodb/db/log/mongod.log"
       logAppend: true
       logRotate: rename
    storage:
       engine: wiredTiger
       directoryPerDB: true
       wiredTiger:
          engineConfig:
             journalCompressor: snappy
          collectionConfig:
             blockCompressor: snappy
          indexConfig:
             prefixCompression: true
       dbPath: "/home/mongodb/db/data"
       journal:
          enabled: true
          commitIntervalMs: 300
    processManagement:
       fork: true
       pidFilePath: "/tmp/mongod.pid"
    net:
       port: 27019
       bindIpAll: true
       maxIncomingConnections: 20000
       unixDomainSocket:
          enabled: false
    replication:
        oplogSizeMB: 10240
        replSetName: "rstest01"
    setParameter:
    failIndexKeyTooLong: false
    sharding:
       clusterRole: shardsvr
    

    Mongodb 구동 후 각 Replica Set 멤버 모두에 접속하여 PRIMARY, SECONDARY, ARBITER 여부가 모두 확인되면 shard로 사용될 replica set 설치가 완료됩니다.

  2. config server 구성하기

    Config server는 Sharded Cluster 하나 안에 단 하나의 set만 구성합니다. Config server 도 replica set과 마찬가지로 서로 복제되는 구성입니다. 따라서 설치 방법 또한 replica set 구성과 유사하며 위의 "Replica Set(RS) 구성하기"를 참고하여 1개의 config server(총 3대)를 구성합니다. 단, config server 구성 시에는 P-S-A가 아니라 P-S-S 형태로 구성합니다.

여기서는 Router(MongoS)가 설치될 장비 3대에 각각 Config server의 각 멤버를 P-S-S- 형태로 구성하는 예를 설명합니다.

mongodb 데몬 설정 파일(/home/mongodb/db/config/mongod.conf) 과는 별개의 설정 파일을 생성합니다.(/home/mongodb/db/config/configserver.conf)

예: /home/mongodb/db/config/configserver.conf

   storage:
       dbPath: "/home/mongodb/db/configdata"
       journal:
           enabled: true
   systemLog:
       destination: file
       path: "/home/mongodb/db/log/configlog.log"
       logAppend: true
   processManagement:
       fork: true
   net:
       bindIpAll: true
       port: 27018
   replication:
       oplogSizeMB: 40960
       replSetName: "cstest"
   sharding:
       clusterRole: "configsvr"
  • 예제에서는 config server의 포트를 기본 포트인 27018으로 설정하였습니다 기본 포트가 아닌 다른 포트로 설정할 것을 권장드립니다.

  • sharding.clusterRole은 “configsvr”로 설정합니다.(앞서 예시에서 replica set으로 설정했던 DB 서버의 sharding.clusterRole 값(“shardsvr”)과 차이가 있습니다.)

    config server로 사용할 mongodb 데몬이 구동되면 primary로 사용될 mongodb sheel 안에서 아래와 같이 복제 그룹을 설정합니다.

이 예제에서 config server로 사용할 primary / secondary / secondary로 사용할 장비의 IP 정보가 아래와 같고 27017 port를 사용한다고 할 때,

  • config server 구성 정보(예시)

    • Primary: 192.10.10.14
    • Secondary: 192.10.10.15
    • Secondary: 192.10.10.16

    쉘에서는 아래와 같이 입력합니다.(‘_id’ 필드값은 위의 configserver.conf의 replication.replSetName 값)

    rs.initiate(
     {
        _id: "cstest",
        version: 1,
        members: [
           { _id: 0, host : "192.10.10.14:27018" },
           { _id: 1, host : "192.10.10.15:27018" },
           { _id: 2, host : "192.10.10.16:27018" }
        ]
     }
    )
    

    위 명령 수행 후 결과가 ‘ok’인지 확인 후 잠시 후 primary 및 secondary MongoDB shell에 접근하여 prompt가 변경되는지 확인합니다.

  • 예: ]$ mongo localhost:27018/admin

    “cstest:PRIMARY >” 혹은 “cstest:SECONDARY> “
    
  1. Router(=MongoS) 구성하기

    router로 사용될 서버 모두에서(현재 예시에서는 3대) mongod.conf, configserver.conf와 마찬가지로 동일한 디렉토리에 router 설정 파일을 작성합니다.(/home/mongodb/db/config/mongos.conf)

sharding 항목은 이미 설치된 config server 정보를 입력하며 net.port 항목은 router 포트(사용자 및 응용이 접속할 포트)로 사용할 정보를 입력합니다.(예시에서는 27017)

   sharding:
       configDB: "cstest/192.10.10.14:27018,192.10.10.15:27018,192.10.10.16:27018"
   systemLog:
       destination: file
       path: "/home/mongodb/db/log/mongos.log"
       logAppend: true
   processManagement:
       fork: true
   net:
       port: 27017
       bindIpAll: true
       maxIncomingConnections: 30000
   setParameter:
           ShardingTaskExecutorPoolHostTimeoutMS : 3600000
           ShardingTaskExecutorPoolMaxSize : 20
           ShardingTaskExecutorPoolMinSize : 10

설정이 끝난 후 router 데몬을 구동합니다.(3대 모두 구동, mongod가 아닌 mongos 명령에 주의)

  • $] numacl --interleave=all mongos -f /home/mongodb/db/config/mongos.conf &

구동이 끝나면 primary DB로 사용할 서버에서 mongo shell로 접근합니다.(DB명: admin)

  • mongo shell 접속 방법: mongo :/DB명 예시)

    ]$ mongo localhost:27017/admin
    

Router 및 config server에서 관리할 Sharding 정보(Replica Set) 정보를 입력합니다.

(router의 shell(여기서는 port:27017) 접속 후

   sh.addShard("<replica_set>/<hostname><:port>,<hostname><:port>,…")
예:
   // 첫 번째 replica set 입력(Arbiter를 제외한 Primary 및 Secondary 정보만 입력)
   sh.addShard("rstest01/192.10.10.14:27019,192.10.10.15:27019")

   // 두 번째 replica set 입력(Arbiter를 제외한 Primary 및 Secondary 정보만 입력)
   sh.addShard("rstest02/192.10.10.114:27019,192.10.10.115:27019")
  1. root권한을 가진 관리 계정을 생성합니다.

    use admin
    db.createUser(
      {
        user: "<계정명>",
        pwd: "<패스워드>",
        roles: ["root" ]
      }
    )
    

    예: 계정 및 패스워드를 ‘user’ / ‘0000’으로 생성할 시 아래와 같이 입력합니다.(admin DB에서 수행)

    use admin
    db.createUser(
      {
        user: "user",
        pwd: "0000",
        roles: ["root" ]
      }
    )
    

    이후 sharding과 관련한 명령어들은 아래 공식 매뉴얼을 통해 참고하여 주시기 바랍니다

    (https://docs.mongodb.com/manual/reference/method/js-sharding/)

인증 모드 적용하기

위의 구성하기 단계까지는 일종의 ‘비인증 모드’로, 사용자 계정 인증이 없어도 거의 모든 관리자 권한을 사용할 수가 있습니다.

보안 측면에서 이를 방지하고 사용자 인증(계정/패스워드) 모드를 적용하기 위해서는 아래와 같은 설정 단계가 추가적으로 이루어져야 합니다

  1. 임의의 장비에서 key-file을 생성합니다.

    예:

    ]$ openssl rand -base64 755 > /home/mongodb/db/config/mongodb-keyfile
    
  2. 생성된 키파일(/home/mongodb/db/config/mongodb-keyfile)을 모든 mongodb 장비에 복사합니다.

  3. 각 설정파일에 아래 항목을 추가합니다.

    • shard 설정(/home/mongodb/db/config/mongod.conf)

      security:
        keyFile: /home/mongodb/db/config/mongodb-keyfile
        authorization: enabled
      
    • config server 설정(/home/mongodb/db/config/configserver.conf)

      security:
        keyFile: /home/mongodb/db/config/mongodb-keyfile
        authorization: enabled
      
    • router 설정(/home/mongodb/db/config/mongos.conf): authorization: enabled 항목 제외

      security:
        keyFile: /home/mongodb/db/config/mongodb-keyfile
      
  4. 모든 장비에서 프로세스 재시작

    • shard 재시작

      mongod --shutdown -f /home/mongodb/db/config/mongod.conf
      
      numactl --interleave=all mongod \
      -f /home/mongodb/db/config/mongod.conf &
      
    • config server 재시작

      mongod --shutdown -f /home/mongodb/db/config/configserver.conf
      
      numactl --interleave=all mongod \
      -f /home/mongodb/db/config/configserver.conf &
      
    • router 재시작(ps 명령으로 mongos의 PID를 확인 후)

      kill <PID>
      
      numactl --interleave=all mongod \
      -f /home/mongodb/db/config/mongos.conf &
      

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...