-
2대의 서버로 구성하는 개발용 Shard ClusterDatabase/MongoDB 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) } } }
'Database > MongoDB' 카테고리의 다른 글
Transaction (0) 2023.02.02 ReplicaSet (0) 2023.02.02 Sharding & Cluster (1) 2023.02.02 View (0) 2023.02.02 Index (1) 2023.02.02