MongoDB Sharded Cluster Kurulumu

Caner AYSAN
3 min readNov 10, 2022

--

Sharded Cluster (Parçalanmış Küme) Bileşenleri
Bir MongoDB parçalı kümesi temel olarak aşağıdaki bileşenlerden oluşur:

Shard(parça): Her parça, parçalanmış verilerin bir alt kümesini içerir. MongoDB 3.6'dan itibaren, parçalar bir çoğaltma kümesi olarak dağıtılmaktadır.

Mongos: Mongos, istemci uygulamaları ve parçalanmış küme arasında bir arabirim sağlayan bir sorgu yönlendiricisi görevi görür. MongoDB 4.4'ten başlayarak, mongolar gecikmeleri en aza indirmek için korumalı okumaları destekleyebilir.

Config servers(yapılandırma sunucuları): Yapılandırma sunucuları, küme için meta verileri ve yapılandırma ayarlarını depolar. MongoDB 3.4'ten itibaren, yapılandırma sunucuları bir çoğaltma kümesi (CSRS) olarak dağıtılmalıdır.

MongoDB sharded-cluster yapısı

3 config server cfg1 cfg2 cfg3
3 shard server shrd1 shrd2 shrd3 # shardlar tek cluster de cluster ismi: rs0
1 mongos server qrt1

Yapının çalışma mantığı mongos ile configsrv üzerinden bağlantı sağlayıp load balacing yapıyoruz verileri de shard servler larına kaydetmiş oluyoruz
biz bu yapıda shard sunucuları için tek cluster göstermiş olduk tek cluster 3 shard node u burada 2 tane cluster içerisine yapmak istenilse,
4 shard server yapsak 2 sini rs0 a diğer 2 sini rs1 cluster ına eklemiş oluyoruz.

======= vim /etc/hosts ===== #TÜM MAKİNELERDE

# Config Server Replica Set
192.168.56.116 cfg1.ornek.tr
192.168.56.117 cfg2.ornek.tr
192.168.56.118 cfg3.ornek.tr

# Shard Server Replica Set (rs0)
192.168.56.119 shrd1.ornek.tr
192.168.56.120 shrd2.ornek.tr
192.168.56.121 shrd3.ornek.tr

# Mongos (Query Router)
192.168.56.122 qrt1.ornek.tr

==== makineler arası ssh-passwordless === #1 MAKİNEDEN TÜMÜNE

ssh-keygen
ssh-copy-id -i .ssh/id_rsa.pub localhost
scp -r /root/.ssh/ cfg2.ornek.tr:~/
scp -r /root/.ssh/ cfg3.ornek.tr:~/
scp -r /root/.ssh/ shrd1.ornek.tr:~/
scp -r /root/.ssh/ shrd2.ornek.tr:~/
scp -r /root/.ssh/ shrd3.ornek.tr:~/
scp -r /root/.ssh/ qrt1.ornek.tr:~/

== vim /etc/yum.repos.d/mongodb.repo == #TÜM MAKİNELERDE

yum update
yum -y install mongodb-org
systemctl start mongod
systemctl enable mongod
systemctl status mongod
#Bu aşamadan sonra qrt1 sunucusuna dokunmuyoruz
mongo
use admin
db.createUser({user: "administrator", pwd: "mongo123", roles:[{role: "root", db: "admin"}]})
quit()

== MongoDB Authentication == #TÜM MAKİNELERDE (isteğe bağlı güvenlik)

openssl rand -base64 756 > ~/mongodb_key.pem
sudo cp ~/mongodb_key.pem /var/lib/mongo/
sudo chown -R mongod:mongod /var/lib/mongo/mongodb_key.pem
sudo chmod -R 400 /var/lib/mongo/mongodb_key.pem

== vim /etc/mongod.conf #Config sunucularında mongo ayarları == # (cfg1, cfg2, cfg3)

port: 27019
bindIp: cfg1.ornek.tr # cfg2 cfg3 içinde ayarlanacak

#security:
# keyFile: /var/lib/mongo/mongodb_key.pem #isteğe bağlı kısım

replication:
replSetName: configReplSet

sharding:
clusterRole: configsvr

systemctl restart mongod
systemctl status mongod
mongo --host cfg1.example.pk --port 27019 -u administrator --authenticationDatabase admin
rs.initiate({ _id: "configReplSet", configsvr: true, members: [{ _id : 0, host : "cfg1.ornek.tr:27019"},{ _id : 1, host : "cfg2.ornek.tr:27019"},{ _id : 2, host : "cfg3.ornek.tr:27019"}]})
rs.config()
rs.status()
quit()

== vim /etc/mongod.conf #Shard sunucularında mongo ayarları == # (shrd1, shrd2, shrd3)

net:
port: 27018
bindIp: shrd1.ornek.tr shrd2.ornek.tr shrd3.ornek.tr #shrd2 shrd3 için ayarlanacak

#security:
# keyFile: /var/lib/mongo/mongodb_key.pem

replication:
replSetName: rs0

sharding:
clusterRole: shardsvr

systemctl restart mongod
systemctl status mongod
mongo --host shrd1.example.pk --port 27018 -u administrator --authenticationDatabase admin
rs.initiate({ _id : "rs0", members:[{ _id : 0, host : "shrd1.ornek.tr:27018" },{ _id : 1, host : "shrd2.ornek.tr:27018" },{ _id : 2, host : "shrd3.ornek.tr:27018" }]})
quit()

== vim /etc/mongod.conf #Mongos sunucusunda mongo ayarı == # (qrt1)

systemctl stop mongod
systemctl disable mongod
systemctl status mongod

== vim /etc/mongos.conf ==

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

net:
port: 27017
bindIp: qrt1.example.pk

security:
keyFile: /var/lib/mongo/mongodb_key.pem

sharding:
configDB: configReplSet/cfg1.ornek.tr:27019,cfg2.ornek.tr:27019,cfg3.ornek.tr:27019

== vi /usr/lib/systemd/system/mongos.service ==

[Unit]
Description=Mongo Cluster Router
After=network.target

[Service]
User=mongod
Group=mongod

ExecStart=/usr/bin/mongos — config /etc/mongos.conf

LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity

LimitNOFILE=64000
LimitNPROC=64000

TasksMax=infinity
TasksAccounting=false

[Install]
WantedBy=multi-user.target

systemctl start mongos
systemctl enable mongos
systemctl status mongos

== Shard ekleme ==

mongo --host qrt1.ornek.tr --port 27017 -u administrator --authenticationDatabase admin
sh.addShard( "rs0/shrd1.ornek.tr:27018,shrd2.ornek.tr:27018,shrd2.ornek.tr:27018")
mongo --host qrt1.ornek.tr --port 27017 -u administrator --authenticationDatabase admin
use testDB
db.testCollection.ensureIndex( { _id : "hashed" } )
sh.enableSharding("testDB")
sh.shardCollection( "testDB.testCollection", { "_id" : "hashed" } )
use config
db.databases.find()
mongo --host qrt1.ornek.tr --port 27017 -u administrator -p --authenticationDatabase admin
use testDB
for (var i = 1; i <= 1000; i++) db.testCollection.insert( { x : i } )
db.testCollection.getShardDistribution()
use testDB
db.dropDatabase()

--

--