infolightbulb_outlinenew_releasesreportwarning

MongoDB Servisinin Yönetimi ve Ölçeklenmesi

Doruk Fişek<dfisek@ozguryazilim.com.tr>

MongoDB’nin Özellikleri

  • Doküman temelli

  • Dinamik şemalı

  • Replikasyon ve yüksek bulunurluk

  • Otomatik shardlama ile yatay genişleme

  • Herhangi bir alanı indeksleyebilme

  • Map/Reduce

  • JSON ile sorgulama

  • BSON (Binary JSON) veri saklama

  • Dosya sistemi olarak kullanabilme (GridFS)

  • GNU AGPL lisanslı

Tarihçe

  • Eski startuplarında sürekli ölçekleme sorunu yaşıyorlar.

  • 2007’de 10Gen’i kurup, bir uygulama platformu üzerinde çalışıyorlar.

  • Kimse umursamıyor, kullanıcı yok, ilgilenen yok

  • 2009’da uygulama kısmını çöpe atıp, veritabanını özgürleştiriyorlar.

  • Hızla popülerlik kazanıyor

  • 2013’te 10gen → MongoDB Inc.

  • Mongo, İngilizce "humongous" sözcüğünden geliyor. humongous = çok geniş.

Terminoloji

  • Document: Bir koleksiyonda yer alan bir kayıt. MongoDB’nin en temel birimi. (RDBMS: Satır)

  • Field: Bir belgedeki (document) isim/değer ikilisi (RDBMS : Kolon)

  • Collection: MongoDB dokümanlarının gruplanmış bir hali (RDBMS: Tablo)

  • Database: Koleksiyonlardan oluşan fiziksel bir alan (container).

Mongod Servisi

  • Veri yazma/okuma isteklerini işler

  • Arkaplan operasyonlarını yapar

  • Port: 27017

  • Ayarlar: /etc/mongod.conf

  • Veriler: /var/lib/mongodb

  • Web arayüzü: 28017

MongoShell

  • En temel Mongo istemcisi

  • Konsol uygulaması

  • mongo komutu ile çalışır

  • Geçmiş kaydeden, kısayol kullanılabilen bir kabuk (shell) sunar

  • Mongo servisine istenilen komutu gönderebilir

  • Bir dosyadan bir seri komutu okuyup otomatik çalıştırabilir

Programlama Dilleri - 1

Resmen desteklenen:
  • C

  • C# + .NET

  • Java

  • Node.js

  • Perl

  • PHP

  • Python

  • Ruby

  • Scala

Ve çeşitli topluluk destekli diller (Erlang, Go, …​)

Kullanıcılar ve Yetkilendirme

  • Action: Kullanıcının yapabileceği işlem (okuma, yazma, vs)

  • Resource: Veritabanı, koleksiyon, küme

  • Resource + Action → Privilege

  • n tane Privilege → Role

  • Hazır roller: dbAdmin, restore, userAdmin, Backup, …​

MongoDB Araçları

  • mongo: Konsol istemcisi

  • mongostat: Çalışan sürecin istatistikleri

  • mongotop: Çalışan sürecin kaynak tüketimi

  • mongosniff: Mongo’ya gelip-giden ağ trafiğini izleme

  • mongoimport, mongoexport: JSON, CSV, TSV ithalat-ihracat

  • mongodump, mongorestore: Yedek alma, yedekten geri dönme

Veri Silinmesi

  • Yazılımdan tetikleyerek silmek

  • TTL Collection: x günden daha eskileri otomatik sil

  • Capped Collection: Boyut sabit olsun, doldukça eskileri sil

  • Silinen dokümanlar disk alanı olarak geri gelmiyor

  • Mongo silinen yerlere yeni dokümanları yerleştiriyor

  • Yoğun silme/yazma işlemi → fragmantasyon ve performans düşüşü

  • Çözüm 1: db.repairDatabase() çağrılması (2x disk alanı)

  • Çözüm 2: Replika set ise, replikanın silinip baştan oluşturulması

GridFS ile MongoDB’de Dosya Saklamak - 1

  • MongoDB doküman boyut sınırı: 16 MB

  • GridFS katmanı: 255K’lık dokümanlara parçalıyor

  • İstemci alınan parçaları birleştiriyor

  • GridFS-Fuse → Dosya sistemi

  • GridFS-Nginx → Nginx’ten dosya sunumu

  • mod_gridfs → Apache’den dosya sunumu

GridFS ile MongoDB’de Dosya Saklamak - 2

Artılar-Eksiler:
  • Dosyaların da replikasyonu

  • Dosyalara kısmı erişim daha hızlı

  • Performans biraz daha düşük

  • Sorgulanacak doküman sayısı artıyor

Replika Seti Mimarisi

replica set primary with two secondaries

Replika Seti

  • Veri birden fazla sunucuya sürekli çoğaltılır

  • Tüm yazma işlemleri sadece Primary’e yapılır

  • Primary, oplog’una yazma işlemlerine kaydeder

  • Primary, (öntanımlı olarak) replikaya ulaşıp ulaşmadığını umursamaz

  • Replikalar oplog’daki veriyi alarak kendilerine uygular

  • Primary’de sorun olduğundan, diğerlerinden biri Primary olur

  • Süreksiz bağlantılarda da kullanılabilir

Tekil Servis → Replika Seti

  • İkinci bir (boş) Mongo servisi kurulur

  • Tekil (standalone) servis replika seti üyesi yapılır ve replika başlatılır

  • İkinci sunucu aynı isimli replika setine üye haline getirilir

  • Boş sunucu diğerinden verileri çekerek eş hale gelir

  • Sürecin hızlanması için veri dosyaları birebir diğerine kopyalanabilir

  • İstemci, birden fazla sunucudan sorgulama işlemini gerçekleştirir

Neden Replika Seti?

  • Otomatik failover (bir sorun olduğunda diğerinin devam etmesi)

  • Okuma yükünü dağıtmak (öntanımlı değil)

  • Replikayı gerektiğinde kapatıp, yedek alabilmek ya da kopyalayabilmek

  • Farklı fiziksel yerlere canlı veri kopyası

  • Raporlamalar

Otomatik Failover - 1

  • Primary’de bir sorun olduğunda gerçekleşir

  • Oylama (quorum) yapılır

  • Oylamaya replika setinin çoğunluğunun katılması gerekir

  • Çoğunluk katılmazsa replika seti yazmayı durdurur (splitbrain)

  • Replikalar tek sayıda olduğunda en fazla hata toleransı elde edilir

Otomatik Failover - 2

  • Elinde en ileri tarihli veri olan Primary olur

  • Replikalar için öncelik belirtilerek, primary olma önceliği sağlanabilir

  • Primary’e ulaşılamayan bir failover sırasında, primary’nin oplog’unda secondary’e aktarılmamış veri varsa veri kaybı yaşanır.

  • Replikalardan en az birinin Primary’e eş donanımlı olması önerilir

  • Primary geri devreye girdiğinde, otomatik olarak Primary olmaz

Replika Seti Sunucu Toleransı

  • 1 sunucu, 0 sunucu toleransı

  • 2 sunucu, 0 sunucu toleransı

  • 3 sunucu, 1 sunucu toleransı

  • 4 sunucu, 1 sunucu toleransı

  • 5 sunucu, 2 sunucu toleransı

  • 6 sunucu, 2 sunucu toleransı

  • 7 sunucu, 3 sunucu toleransı

  • …​

Gizli Üye (Hidden Member)

  • Bir Mongod süreci

  • Tüm veriyi replike eder

  • Okuma sorgularına yanıt verir

  • İstemciler için görünmezdir

  • Primary olamaz

  • Oy verebilir

Ne İşe Yarar?
  • Taşınma işlemleri

  • Fiziken daha yakında canlı verisi olan bir test sunucusu

Gecikmeli Üye (Delayed Member)

  • Bir Mongod süreci

  • Tüm veriyi replike eder ama x süre geriden gelir

  • İstemciler için görünmezdir

  • Primary olamaz

  • Oy verebilir

Ne İşe Yarar?
  • Olası hatalı sorgularda daha canlıya yakın bir servis

  • Daha hızlı devreye alınabilir (tamamen yedekten dönmeye göre)

Arbiter

  • Bir Mongod süreci

  • Tek görevi quorum’da oy vermek

  • Hiç veri içermez, almaz ve vermez

  • Çok az kaynak tüketir

Ne işe yarar ?
  • Replika sayısını düşürmek

  • Daha az donanım kaynağı harcamak

Shardlamak ya da Shardlamamak

  • Depolama kapasitesi tek sunucuyu aşmak üzere

  • Tek sunucu yazma işlemlerinin hepsine yetişemiyor

  • Yapılan sorguların boyutu RAM’i aşmak üzere

  • Tek sunucuya donanım eklemek (mümkünse bile), yeni sunucu almaktan daha pahalı

  • Shardlamak kaynak ihtiyacını ve karmaşıklığı arttırıyor

  • Gerek yoksa yapmayın

  • Yapacaksanız son dakikayı beklemeyin (shardlama zaman alır)

Shardlanmış Küme Mimarisi - 1

sharded collection

Shardlanmış Küme (Cluster) Mimarisi - 2

sharded cluster production architecture

MongoS

  • mongos = mongo shard

  • Gelen çağrıları karşılar

  • Shardlanmış kümede verinin nerede olduğunu bulur

  • İlgili kümeye yönlendirir (router)

  • Yanıtları alarak istemciye döndürür

  • İstemci açısından mongos süreci = mongod süreci

  • mongos durursa, tüm kümeye erişim durur

  • İstemci tarafından doğrudan sorgulanır

  • Az donanım kaynağı tüketir

  • Yüksek bulunurluk için en az iki tane

Config Sunucuları

  • Özel Mongod süreci

  • Shardlanmış kümenin metadata’sını saklar

  • Metadata = Hangi chunk nerede, ne boyutta

  • Az donanım kaynağı tüketir

  • Yüksek bulunurluk için üç tane

Shard Anahtarı

  • Mongo, shard anahtarına (key) göre shard’lara verileri dağıtır

  • Anahtar birden fazla alanı içerebilir

  • Anahtarın olabildiğince farklı değerde veri içermesi gerekir

  • Mongo’nun kendi otomatik ürettiği bir ID’yi anahtar olarak kullanmak mümkün

  • Amaç 1: Verileri olabildiğince shard’lara dengeli dağıtmak

  • Amaç 2: Yapılan sorguların olabildiğince tek bir shard’dan karşılanması

Replika Set → Shardlanmış Küme

  • MongoS ve Config Sunucular kurulur

  • Eldeki replika set, bir shard olarak MongoS’a eklenir

  • İkinci bir replika seti oluşturulur, ikinci shard olarak MongoS’a eklenir

  • İstenen koleksiyonlar shardlanacak biçimde ayarlanır

  • İlk shard’daki veri dağıtılmaya başlanır

Shardlanmış Kümenin Dengelenmesi - 1

  • Veri dağılımı shard’lar içinde dengesizleşebilir

  • Balancer süreci "chunk"ları tekrar dağıtır

  • Sadece göç eşiği (migration threshold) geçildiği balancer çalışır

  • Bir MongoS tarafından dengeleme işlemi başlatılabilir

  • En çok chunk’ı olan shard’dan en az chunk’ı olana doğru yapılır

Shardlanmış Kümenin Dengelenmesi - 2

  • Sistemde yük oluşmaması için aynı anda tek bir chunk taşınır

  • Balancer geçici olarak kapatılabilir (çalışıyorsa önce yarım işlemi tamamlar)

  • Balancer’ın çalışma saatleri ayarlanabilir

  • Bir shard’a belirli bir boyut sınırı getirmek mümkün

  • Elle chunk taşıyarak, daha da ince ayar yapmak mümkün

Shard Çıkarılması

  • O shard’da shardlanmamış veritabanı varsa, onun başka bir shard’a taşınması

  • Shardlanmış verinin boşaltılması (drain) ve diğerlerine aktarılması gerekir

  • Mongo’ya "shard’ı çıkar" dendiğinde shardlanmış veri taşınmaya başlanır

  • Verinin boşaltılması işlemi veri miktarına ve sisteme göre uzun sürebilir

  • Veri boşaltıldıktan sonra, tekrar "shard’ı çıkar" komutu gönderilir

Shard Anahtarının Değiştirilmesi

  • Otomatik bir yöntemi yok

  • Yeni koleksiyon oluşturulur

  • Yeni bir shard anahtarı oluşturulur

  • Birindeki veri alınarak diğerine basılır

  • Veri girişi durdurulup, fark alınıp, tekrar aktarım yapılır

  • Veri girişleri yeni koleksiyona yapılmaya başlanır

  • Eski koleksiyon çöpe atılır

  • Alternatif 1: Tüm shard’ları teker teker çıkarıp, tekrar shard’lamak

  • Alternatif 2: Tüm verinin dump’ını alıp, key’i değiştirip veriyi geri basmak

Yedekleme

  • Replika ile birebir canlı sistem oluşturma

  • Delayed Member ile x zaman geriden gelen canlı sistem

  • Oplog ile yapılan tüm işlemlerin tek tek kaydı

  • Doğrudan veritabanı dosyalarının kopyalanması

  • mongodump ile dokümanların yedeğini alma

Belirli Bir Zamana Dönme

  • Point-in-Time Recovery

  • Tutulan binary log kayıtları sayesinde veritabanının istenilen bir ana döndürmek mümkündür.

  • Oplog miktarı kadar geriye gidilebilir

  • Bir Delayed Member süreci hızlandırır (yoksa yedekten oluşturulur)

  • Delayed member’ın üzerinde oplog uygulanarak istenilen noktaya gelinir

  • mongooplog, mongorestore ile yapılır

MongoDB’nin Gözetlenmesi - 1

  • MongoDB’nin kendi araçları canlı bilgi veriyor (mongostat, mongotop, vs)

  • MongoDB servisinden istatistiki bilgiler alınabiliyor (dbStats, serverStatus, vs)

  • MongoDB’nin Profiler özelliği (performans düşürür)

  • İç ağa kurulan bir gözetleme yazılımı kullanımı (Nagios, Zabbix, Ganglia, vs)

  • SaaS olarak (ücretli?) bir servis, dışarıdan erişim verilmesi gerekir (ör: MMS)

  • Ne kullanırsanız kullanın, hatalı uyarı vermemesi için, yazılımınıza göre ayarlamalısınız

MongoDB’nin Gözetlenmesi - 2

  • MongoDB ayakta mı? :)

  • Boştaki bağlantı sayısı

  • Lock miktarı

  • Bellek kullanımı

  • Page faultlar

  • Eklenen veri miktarı

  • Silinen veri miktarı

  • Primary değişimleri

  • Replikasyon gecikmesi

  • Index ıskalama oranı

  • …​

Performans Önerileri

  • RAID 10

  • SSD

  • RAM arttırımı

  • ulimit değerlerinin düzenlenmesi

  • Indeksler okumaya yararlı, yazmaya zararlı

  • vm.swappiness değerini düzenleme

  • Okuma için daha çok replika, yazma için daha çok shard

  • Sunucu zamanlarının NTP ile senkronize olması önemlidir

Güvenlik Önerileri

  • Kümeyi kapalı bir ağda çalıştırmak

  • İsim/parola doğrulaması kullanmak

  • Rol bazlı erişim kontrolü

  • --noscripting: mapReduce, group, eval ve $where

  • Web sunucu arayüzünü açmamak

  • Input validation kullanmak

  • Açık ağda Mongo’lar arası SSL kullanmak

MongoDB 3.0’ın Yenilikleri

  • Mongo araçları (mongodump, mongooplog, vb) multi-threaded

  • Farklı depolama motorları: MMAPv1, WiredTiger, TokuMX

  • Depolama alanının sıkıştırılması

  • Daha detaylı audit ve loglama

  • Daha fazla sorgunun explain() ile detaylı incelenebilmesi

  • Ayrı bir enterprise sürüm

MongoDB Enterprise Sürümü

  • Ops Manager ile grafik arayüz ile küme yönetimi

  • LDAP ya da Kerberos ile doğrulama

  • Destek hizmeti

Sorular

  • ?