2대의 서버로 구성하는 개발용 Shard Cluster
각 장비에 mongodb 2개, config server 1개, mongos 1개가 구성됩니다.
Config, db, pid 경로 및 파일을 추가생성하여 하나의 서버에서 다수개를 구동할 수 있습니다.
다만 ReplicaSet 의 절체가 정상적으로 이루어지지 않는 경우가 발생할 수 있는점과 성능 및 구조상 이슈로 인하여 MongoDB 에서는 해당 구조를 추천해주지 않지만, 기존 IPRON 의 구조가 장비 2대를 통한 Active/Standby 임으로 임의 구성해보았습니다.
커맨드구성으로도 가능하지만, 차후 관리편의성을 생각해서 systemctl 에 등록하는 방향으로 가이드합니다.
두대의 장비에 이중화 설정 및 Shard Cluster 구성은 다음과 같이 생성됩니다.
Shard Cluster 에서 Config Server , Shard , Mongos 는 아래와 같이 통신합니다.
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)
}
}
}