Database/MongoDB

2대의 서버로 구성하는 개발용 Shard Cluster

셀코 2023. 2. 2. 22:46

각 장비에 mongodb 2개, config server 1개, mongos 1개가 구성됩니다.

Config, db, pid 경로 및 파일을 추가생성하여 하나의 서버에서 다수개를 구동할 수 있습니다.

다만 ReplicaSet 의 절체가 정상적으로 이루어지지 않는 경우가 발생할 수 있는점과 성능 및 구조상 이슈로 인하여 MongoDB 에서는 해당 구조를 추천해주지 않지만, 기존 IPRON 의 구조가 장비 2대를 통한 Active/Standby 임으로 임의 구성해보았습니다.

커맨드구성으로도 가능하지만, 차후 관리편의성을 생각해서 systemctl 에 등록하는 방향으로 가이드합니다.

 

두대의 장비에 이중화 설정 및 Shard Cluster 구성은 다음과 같이 생성됩니다.

2대의 장비간 연동

 

Shard Cluster 에서 Config Server , Shard , Mongos 는 아래와 같이 통신합니다.

shard cluster 구성

 

ReplicaSet 구성

최초 설치되는 mongod 데몬의 설정을 생략하고 가이드 합니다.

# Server 1
# /etc/mongod.conf
# 기본 정보에서 아래내용만 추가, 변경
# Server 2 에는 replSetName: "rs1" 으로 설정
net:
  port: 27017
  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.

# 해당 DB는 rs0 라는 ReplicaSet 임을 명시
replication:
  replSetName: "rs0"

# Shard 구성시 Config Server가 아닌 Shard 로 동작할 것을 설정
sharding:
  clusterRole: shardsvr
# Server 1
# /etc/mongod2.conf
# mongod.conf 에서 복사하여 아래 내용을 적용
# Server 2 에는 replSetName: "rs0" 으로 설정
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb2/mongod.log

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb2/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo2

storage:
  dbPath: /var/lib/mongo2

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.

# 해당 DB는 rs1 라는 ReplicaSet 임을 명시
replication:
  replSetName: "rs1"

# Shard 구성시 Config Server가 아닌 Shard 로 동작할 것을 설정
sharding:
  clusterRole: shardsvr
# systemctl 을 이용한 구동을 하려면 service 구성을 추가
# 기반은 기본설치시 추가되는 mongod.service 를 복사하여 변경
# mongod2 및 mongodb2 로 바뀐 부분만 확인하여 변경
#
# cd /etc/systemd/system/multi-user.target.wants
# cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongod2.service
# ln -s /usr/lib/systemd/system/mongod2.service mongod2.service
# vi mongod2.service

[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod2.conf"
EnvironmentFile=-/etc/sysconfig/mongod
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb2
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb2
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb2
PermissionsStartOnly=true
PIDFile=/var/run/mongodb2/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings

[Install]
WantedBy=multi-user.target
호스트명을 등록해줍니다.
vi /etc/hosts
<serverip1> db1
<serverip2> db2
위의 설정을 완료했다면 연관 폴더 생성 및 권한변경 후 실행 
mkdir /var/log/mongod2
mkdir /var/lib/mongod2
mkdir /var/run/mongod2
chown mongod:mongod /var/log/mongod2
chown mongod:mongod /var/lib/mongod2
chown mongod:mongod /var/run/mongod2

systemctl restart mongod
systemctl restart mongod2
ReplicaSet 에 대한 Server 설정을 진행합니다.
아래 명령들은 한쪽 장비에서만 진행합니다.

$ mongo --port 27017

> db.runCommand( {"replSetInitiate" :   {"_id" : "rs0", "members" :   [ { "_id" :1, "host": "db1:27017"},      { "_id" :2, "host" : "db2:27018"} ] }} )

> exit

$ mongo --port 27018

> db.runCommand( {"replSetInitiate" :   {"_id" : "rs1", "members" :   [ { "_id" :1, "host": "db2:27017"},      { "_id" :2, "host" : "db1:27018"} ] }} )

> exit

위 구성까지 완료시 mongo Shell 로 접속시 PRIMARY/SECONDARY 중 하나가 Console Name으로 확인됩니다.

 

Config Server 설치

Config Server 는 같은 ReplicaSet으로 구성하면 됩니다. ReplicaSet Name 은 Shard를 구성할때 사용한 ReplicaSet Name 과는 별도입니다.

양쪽 서버에 동일하게 설정하여 구성합니다.

# /etc/mongocfg.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongocfg/mongod.log

storage:
  dbPath: /var/lib/mongocfg
  journal:
    enabled: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongocfg/mongod.pid  # location of pidfile

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.

# config server 간 replicaSet
replication:
  replSetName: "rscfg"

# config server 명시
sharding:
  clusterRole: configsvr
# systemctl 을 이용한 구동을 하려면 service 구성을 추가
# 기반은 기본설치시 추가되는 mongod.service 를 복사하여 변경
#
# cd /etc/systemd/system/multi-user.target.wants
# cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongocfg.service
# ln -s /usr/lib/systemd/system/mongocfg.service mongocfg.service
# vi mongocfg.service
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongocfg.conf"
EnvironmentFile=-/etc/sysconfig/mongod
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongocfg
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongocfg
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongocfg
PermissionsStartOnly=true
PIDFile=/var/run/mongocfg/mongod.pid
위의 설정을 완료했다면 연관 폴더 생성 및 권한변경 후 실행 
mkdir /var/log/mongocfg
mkdir /var/lib/mongocfg
mkdir /var/run/mongocfg
chown mongod:mongod /var/log/mongocfg
chown mongod:mongod /var/lib/mongocfg
chown mongod:mongod /var/run/mongocfg

systemctl restart mongocfg
해당 명령은 한쪽 장비에서만 진행합니다.

$mongo --port 27019

> rs.initiate({_id:"rscfg",members:[{_id:1, host: "db1:27019"}, {_id:2, host : "db2:27019"}]})

> rs.status()

> exit

 

Mongos 구성

config File 에서는 Config Server 에 대한 Access 정보를 기입합니다.

shard 나 config server 와 달리 해당 서버는 mongos 프로세스를 이용하여 구동합니다.

# /etc/mongos.conf
# 다른 conf 와 달리 아래 내용만 추가하여 새로 생성
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongos/mongos.log

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongos/mongod.pid  # location of pidfile

# network interfaces
net:
  port: 27020
  bindIp: 0.0.0.0 

sharding:
  configDB: rscfg/db1:27019,db2:27019
# systemctl 을 이용한 구동을 하려면 service 구성을 추가
# 기반은 기본설치시 추가되는 mongod.service 를 복사하여 변경
#
# cd /etc/systemd/system/multi-user.target.wants
# cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongos.service
# ln -s /usr/lib/systemd/system/mongos.service mongos.service
# vi mongos.service
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=--config /etc/mongos.conf"
EnvironmentFile=-/etc/sysconfig/mongod
ExecStart=/usr/bin/mongos $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongos
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongos
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongos
PermissionsStartOnly=true
PIDFile=/var/run/mongos/mongod.pid
mkdir /var/log/mongos
chown mongod:mongod /var/log/mongos

systemctl restart mongos
아래 명령은 한쪽장비에서만 진행합니다.

$ mongo --port 27020

> sh.status()

> sh.addShard("rs0/db1:27017,db2:27018")

> sh.addShard("rs1/db2:27017,db1:27018")

> sh.status()

 

Shard 설정

$ mongo --port 27020

> sh.enableSharding("<database>") // 데이터베이스가 샤딩되도록 설정

> sh.shardCollection("<namespace>", {shardkey}) // Collection을 샤딩되도록 설정

> use <database>

> db.stats()

//mydb 의 TEST라는 Collection을 샤딩 설정하였을때 rs0과 rs1에 청크가 분산되어 생성됩니다.
{
        "raw" : {
                "rs0/db1:27017,db2:27018" : {
                        "db" : "mydb",
                        "collections" : 1,
                        "views" : 0,
                        "objects" : 35359,
                        "avgObjSize" : 52,
                        "dataSize" : 1838668,
                        "storageSize" : 507904,
                        "indexes" : 1,
                        "indexSize" : 450560,
                        "totalSize" : 958464,
                        "scaleFactor" : 1,
                        "fsUsedSize" : 7318519808,
                        "fsTotalSize" : 47220527104,
                        "ok" : 1
                },
                "rs1/db1:27018,db2:27017" : {
                        "db" : "mydb",
                        "collections" : 1,
                        "views" : 0,
                        "objects" : 18742,
                        "avgObjSize" : 52,
                        "dataSize" : 974584,
                        "storageSize" : 270336,
                        "indexes" : 1,
                        "indexSize" : 258048,
                        "totalSize" : 528384,
                        "scaleFactor" : 1,
                        "fsUsedSize" : 2925694976,
                        "fsTotalSize" : 47220527104,
                        "ok" : 1
                }
        },
        "objects" : 54101,
        "avgObjSize" : 52,
        "dataSize" : 2813252,
        "storageSize" : 778240,
        "totalSize" : 1486848,
        "indexes" : 2,
        "indexSize" : 708608,
        "scaleFactor" : 1,
        "fileSize" : 0,
        "ok" : 1,
        "operationTime" : Timestamp(1618552944, 236),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1618552944, 236),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}