MongoDB replica set + sharding kurulumu
Belirti
Amaç: MongoDB için otomatik failover'lı replica set kur ve yatay ölçek için sharded cluster'a genişlet.
1. mongod'ları aynı replSet adıyla başlat
Replica set üyelerinin her biri aynı --replSet adıyla ve erişilebilir --bind_ip ile başlatılır. Üretimde anahtar dosyası (keyFile) veya TLS ile iç kimlik doğrulama önerilir. Tek çoğunluk için tek sayıda oy veren üye hedeflenir.
MongoDB
mongod --replSet rs0 --port 27017 --dbpath /data/n1 --bind_ip localhost,10.0.0.11
mongod --replSet rs0 --port 27017 --dbpath /data/n2 --bind_ip localhost,10.0.0.12
mongod --replSet rs0 --port 27017 --dbpath /data/n3 --bind_ip localhost,10.0.0.132. Replica set'i initiate et
Bir üyeye mongosh ile bağlanıp rs.initiate() çağrılır ve tüm üyeler tanımlanır. Bu, ilk seçimi tetikler ve bir primary belirlenir. rs.status() ile PRIMARY/SECONDARY rolleri doğrulanır.
MongoDB
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: '10.0.0.11:27017' },
{ _id: 1, host: '10.0.0.12:27017' },
{ _id: 2, host: '10.0.0.13:27017' }
]
})
rs.status()3. Üye ekle, öncelik ve gerekiyorsa arbiter ayarla
Sonradan rs.add() ile üye eklenir. priority ile hangi üyenin primary olmaya eğilimli olduğu belirlenir (0 = asla primary olmaz). Arbiter yalnızca oy verir, veri tutmaz; çift sayıda veri düğümünde tie-breaker olarak kullanılır ancak veri güvenliği için gerçek üye tercih edilir. Arbiter'lı (özellikle PSA) yapılarda bir veri düğümü düşünce majority write concern sağlanamaz ve yazmalar bekler; 5.0+ sürümlerde arbiter eklemeden önce küme geneli varsayılan write concern'ün setDefaultRWConcern ile açıkça ayarlanması gerekebilir.
MongoDB
rs.add({ host: '10.0.0.14:27017', priority: 0.5 })
// Arbiter yalnızca gerçekten gerekiyorsa (veri taşıyan üye tercih edilir):
rs.addArb('10.0.0.15:27017')
// öncelik değiştirme:
cfg = rs.conf(); cfg.members[0].priority = 2; rs.reconfig(cfg)4. Sharding için config server replica set'i kur
Sharded cluster'ın metadatası bir config server replica set'inde (--configsvr) tutulur. Kendisi de bir replica set olarak initiate edilir; yüksek erişilebilirlik için 3 üye önerilir.
MongoDB
mongod --configsvr --replSet cfgrs --port 27019 --dbpath /data/cfg1 --bind_ip localhost,10.0.0.21
-- mongosh (config sunucusunda):
rs.initiate({ _id: 'cfgrs', configsvr: true, members: [
{ _id: 0, host: '10.0.0.21:27019' },
{ _id: 1, host: '10.0.0.22:27019' },
{ _id: 2, host: '10.0.0.23:27019' } ] })5. Shard replica set'lerini ve mongos router'ı başlat
Her shard, --shardsvr ile başlatılan kendi replica set'idir (veri dayanıklılığı shard içi replikasyondan gelir). mongos yönlendirici config server'lara işaret ederek başlatılır; uygulamalar mongos'a bağlanır.
MongoDB
mongod --shardsvr --replSet shard1rs --port 27018 --dbpath /data/s1 --bind_ip localhost,10.0.0.31
# shard1rs'i rs.initiate ile başlat, sonra mongos:
mongos --configdb cfgrs/10.0.0.21:27019,10.0.0.22:27019,10.0.0.23:27019 --port 27017 --bind_ip localhost,10.0.0.406. Shard'ları ekle ve koleksiyonu shard'la
mongos'a bağlanılıp sh.addShard() ile her shard replica set'i eklenir. Veritabanında sharding etkinleştirilir ve sh.shardCollection() ile bir shard anahtarına göre koleksiyon dağıtılır. Anahtar seçimi kritiktir: kardinalitesi yüksek ve dağılımı düzgün olmalı. sh.status() ile chunk dağılımı izlenir.
MongoDB
sh.addShard('shard1rs/10.0.0.31:27018')
sh.addShard('shard2rs/10.0.0.32:27018')
sh.enableSharding('appdb')
sh.shardCollection('appdb.olaylar', { musteri_id: 'hashed' })
sh.status()