DBAtlas · Veritabanı operasyon atlası

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.13

2. 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.40

6. 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()
DBAtlas'ta aç →