본문 바로가기

Mongodb

Mongodb Sharded Cluster

구조

PSS Mongodb sharded cluster

1. PSA vs PSS

  • PSA는 PRIMARY-SECONDARY-ARBITER로 구성된 REPLICASET이며, ARBITER는 투표권을 가지지만 RESOURCE는 가지지 않는 노드이다.  PSS는 PRIMARY-SECONDARY-SECONDARY로 구성된 REPLICASET이다. 위의 그림은 PSS를 따르며, PSA를 사용할 경우 각각 REPLICASET의 SECONDARY 중 1개의 노드는 ARBITER로 바뀌거나, 3개의 ARBITER를 한개의 노드를 이용해 병합할 수 있다.

2. VOTING, PRIORITY

  • VOTING이란 투표를 행사하는 것으로써, 각각의 REPLICASET에 PRIMARY가 죽을 경우 다음 PRIMARY가 선출이 되는데 그때 VOTING을 행사하는 것이다. 아래 그림과 같이 각각 VOTE를 1개씩 가지고 있다.

  • 하지만 SECONDARY 노드가 2개가 남고 각각 VOTE를 한개씩 받았다면 무승부가 되어, PRIMARY 선출을 못하게 된다. 그렇다면 한개의 SECONDARY VOTE를 0으로 만들면 되지 않을까 하는데, PRIMARY가 선출이 되려면 과반수 VOTES가 넘어야하는데 PSS구조에서는 VOTE를 1개만 받았기 때문에 에러가 발생한다. 여기서 짝수개의 노드가 남는다면, 무승부가 발생하기 때문에 PSS가 아니라 PSA구조를 통해 VOTE를 1개 가지는 ARBITER를 통해 남은 SECONDARY에 투표하도록 하는 것이다.
  • 위의 PRIORITY는 여러 SECONDARY가 있을 경우 콕 찝어 특정 SECONDARY가 뽑히도록 하는 변수이다. 하지만 무조건 PRIMARY로 되지 않는다고 한다.

3. CONFIG SERVER

  • 문서상에서 똑같은 mongod 인스턴스를 3개를 사용할 것을 권장하고 있다. 
  • mongod 인스턴스 이므로 데이터를 가지고 있으며 해당 데이터에는 shard에 대한 정보와 replication에 대한 메타 정보를 가지고 있으므로 mongos인스턴스에서는 config server의 정보를 통해 query routing기능을 수행한다.

4. MONGOS

  • mongos 인스턴스 이며 DB데이터는 가지고 있지 않으며 단순 query routing기능을 수행한다.
  • 물리 서버가 여러대 이며 클러스터로 구성 되어져 있다면 각각의 물리 서버에 mongos인스턴스를 띄워서 분산 처리를 하는 것이 성능상의 이점을 가져올수 있다.

5. Fail Over

  • Failover란 시스템 대체 작동이란 의미로, 평소 사용하는 서버와 그 서버의 클론 서버를 가지고 있다가 사용 서버가 장애로 사용이 어렵게 되었을 때 클론 서버로 그 일을 대신하는 것이다.
  • Failover 이후에 replicaset member(secondary)가 rejoin 했을 경우 이전 primary 쓰기로 수정된 데이터가 secondary에 쓰여지지 않았을 경우에 rollback되어 데이터 일관성을 유지한다.
  • rollback data는 bson 형태로 dbpath/rollback 아래에 구성된다.
  • journaling 옵션을 통해 데이터가 무결성을 지키도록 한다.
  • Failover 이후 primary를 선출하는 과정중에는 쓰기는 불가능하고 읽기만 가능하다.

6. 그외

  • Primary 노드는 read/write가 가능하며 Secondary노드는 read만 가능하고 secondary노드가 늘어나면 읽기에 대한 분산 처리가 가능하다.
  • replica set으로 구성된 member는 2초마다 ping을 하는데 10초 동안 hearbeat이 되지 않으면 connection을 잃는다.

 

설정

  • 공식문서에 따르면 다음 포트를 추천한다.
  • 27017 : MongoDB의 기본 포트 번호이자 샤드를 구성할 때 Mongos가 이용하는 포트 번호
  • 27018 : 샤드를 구성할 때 샤드 서버들이 사용하는 포트번호
  • 27019 : Config 서버들이 사용하는 포트 번호

Config_File

 

1. PRIMARY-SECONDARY-SECONDARY

$ vi /etc/mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
    commitIntervalMs: 200
#  engine:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4
      journalCompressor: snappy
      directoryForIndexes: false
    collectionConfig:
      blockCompressor: snappy
    indexConfig:
      prefixCompression: true
# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
  port: 27018
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/caToValidateClientCertificates.pem
setParameter:
  enableLocalhostAuthBypass: false
#security:
#operationProfiling:
replication:
  replSetName: "rs0"
sharding:
  clusterRole: shardsvr
## Enterprise-Only Options
#auditLog:
#snmp:

 

config file 적용

$ mongod -f /etc/mongod_arb01.conf
$ mongod -f /etc/mongod_arb02.conf
$ mongod -f /etc/mongod_arb03.conf

 

REPLICASET 적용

> docker-compose exec PRIMARY-MONGO-CONTAINER-ID mongo -u USERID -p PASSWORD
> rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "HOST:27018" },
      { _id: 1, host: "HOST:27018" },
      { _id: 2, host: "HOST:27018" } # 만약 이 노드가 arbiter 라면  {_id: 2, host: "HOST:27020", arbiterOnly:true} 
   ]
})
{
  "ok" : 1,
  "$clusterTime" : {
    "clusterTime" : Timestamp(1609920364, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1609920364, 1)
}
> conf = rs.config();
> conf.members[0].priority = 3;
> conf.members[1].priority = 2;
> rs.reconfig(conf);

 

2. CONFIG SERVER

$ vi /etc/mongod_cfg.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod_cfg.log
# Where and how to store data.
storage:
  dbPath: /var/lib/mongo/cfg
  journal:
    enabled: true
    commitIntervalMs: 200
#  engine:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      journalCompressor: snappy
      directoryForIndexes: false
    collectionConfig:
      blockCompressor: snappy
    indexConfig:
      prefixCompression: true
# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod_cfg.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
  port: 27019
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/caToValidateClientCertificates.pem
setParameter:
  enableLocalhostAuthBypass: false
#security:
#operationProfiling:
replication:
  replSetName: "cfgrepl"
sharding:
  clusterRole: configsvr
## Enterprise-Only Options
#auditLog:
#snmp:

 

config file 적용

$ mongod -f /etc/mongod_cfg01.conf
$ mongod -f /etc/mongod_cfg02.conf
$ mongod -f /etc/mongod_cfg03.conf

 

3. Mongos

# mongos.conf
    
sharding:
    configDB: "cfgrepl/mongosc01:27019,mongosc02:27019,mongosc03:27019"

systemLog:
    destination: file
    logAppend: true
    path: /var/log/mongodb/mongos.log
processManagement:
    fork: true

net:
    port: 27017
    bindIpAll: true
    tls:
      mode: requireTLS
      certificateKeyFile: /etc/ssl/mongodb.pem
      CAFile: /etc/ssl/caToValidateClientCertificates.pem

 

config file 적용

$ mongos -f /etc/mongos.conf

 

샤드 노드 추가

$ mongo
mongos>
mongos> sh.addShard("rs0/mongodbp01:27018,mongodbs01:27018")
mongos> sh.addShard("rs1/mongodbp02:27018,mongodbs02:27018")
mongos> sh.addShard("rs2/mongodbp03:27018,mongodbs03:27018")

 

 

'Mongodb' 카테고리의 다른 글

SSL/TLS Connection With Mongodb  (0) 2021.11.15
mongodb configuration  (0) 2021.11.12