İçeriğe geç

.Net Core ve MongoDB Sharding’i kullanarak MongoDB’yi Ölçeklendirme (One billion document)

Sharding Nasıl Çalışır?

Uygulamanız aniden popüler hale geliyor. Trafik ve veri artmaya başlıyor ve veritabanınız her geçen gün daha fazla yükleniyor. İnternasyondaki kişiler size veritabanınızı ölçeklendireceklerini söylüyor, ancak bunun ne anlama geldiğini gerçekten bilmiyorsunuz.

Sharding nedir?

Sharding, tek bir mantıksal veri kümesini birden çok veritabanında bölme ve saklama yöntemidir. Verileri birden çok makine arasında dağıtarak bir veritabanı sistemi kümesi daha büyük veri kümesi depolayabilir ve ek istekleri işleyebilir. Bir veri kümesi tek bir veritabanında depolanamayacak kadar büyükse, sharding gerekir. Dahası, birçok çökeltme stratejisi ek makinaların eklenmesine izin verir. Sharding, bir veritabanı kümesinin veri ve trafik artışı ile birlikte ölçeklenmesini sağlar.Düşüneceğimiz en basit olası kırılma senaryosunu çözmeyi deneyelim: 27017 ve 27018 numaralı bağlantı noktalarında, kalıcı MongoDB örnekleri arasında bir koleksiyon var.

Database -1

mkdir c:\data\db1 mongod --shardsvr --port 27017 --journal --dbpath c:\data\db1

Database -2

mkdir c:\data\db2 mongod --shardsvr --port 27018 --journal --dbpath c:\data\db2

MongoDB sharding, parçaların hangi konfigürasyona sahip olduğunu saklamış özel bir konfigürasyon sunucusu kurmanızı gerektirir – bunu 27019 numaralı bağlantı noktasında döndürelim.

mkdir c:\data\configdb mongod --configsvr --port 27019 --dbpath c:\data\configdb

ve son olarak, mongos 27020 numaralı bağlantı noktasında yapılandırma sunucusuna doğru işaret eden bir örneği yukarı doğru döndürüyoruz.

mongos --configdb localhost:27019 --port 27020

Kurulumu tamamlamak için yapılandırma veritabanına, Mongo kabuğunu kullanarak yönetici veritabanına bağlanarak başlattığımız iki parçayı bildiririz.

C:\mongodb\bin>mongo localhost:27020 MongoDB shell version: 1.8.1 connecting to: 
localhost:27020/test > use admin switched to db admin >  
> db.runCommand(
  {
    addShard:"localhost:27017"
  }) 
> db.runCommand(
  {
    addShard:"localhost:27018"
  })

Şimdi şunu anlamış mıyız görelim.

> db.runCommand({listShards: 1}) 
 {     
    "shards" : [
     {
        "_id" : "shard0000",
        "host" : "localhost:27017"
     },
     {
        "_id" : "shard0001",
        "host" : "localhost:27018"
     }],
    "ok" : 1
 }

Gördüğünüz gibi, yapılandırma veritabanı doğru iki parçamız hakkında bilgi sakladı. bu kolaydı! Sonunda, belirli bir veritabanı için parçalamayı etkinleştirmemiz, koleksiyonumuzun kesildiğinden emin olmamız gerekir.

> db.runCommand(
   {
     enableSharding: "fairytale"
    }) 
   { 
    "ok" : 1 
   }
> db.runCommand(
  { 
    shardCollection: "fairytale.unicorns", 
    key: 
  {
    name: 1
  }}) 
  { 
     "collectionsharded" : "fairytale.unicorns",
     "ok" : 1 
  } 

Şimdi, C#’a gidelim ve her biri 500 milyon rasgele adlandırılmış veri ekleyelim.

class Program
{
  static readonly Random Random = new Random();
  static void Main()
  {
    var server = MongoServer.Create("mongodb://localhost:27020");
    var database = server.GetDatabase("fairytale"); 
    var unicorns = database.GetCollection("unicorns");
    using (database.RequestStart())
    {
      var batch = Enumerable.Range(0, 1000000000).Select(_ => new 
           { 
              name = GenerateRandomUnicornName(),
              horns = 1,
              likes = new[] {"eggs", "beer"},
              fairy_dust = GenerateRandomBytes(Random.Next(8192))
            });
      unicorns.InsertBatch(batch);
      server.GetLastError();
    }

    server.Disconnect();
}
  
static byte[] GenerateRandomBytes(int length)
{
  var bytes = new byte[length];
  Random.NextBytes(bytes);
  return bytes;
}

static string GenerateRandomUnicornName()
{
   Func<char> charFactory = () => (char)('a' + Random.Next(25));
   var funcs = Enumerable.Repeat(charFactory, 10 + Random.Next(30));
   return new string(funcs.Select(f => f()).ToArray());
  }
}

Şimdi, MongoDB’ye gidip orada olduklarını görelim.

> db.unicorns.count() 1000000000

Bu Harika! Orada 1 milyar unicorn var. Bakalım Mongo bize ne anlatabilir.

> db.unicorns.count()
> db.printShardingStatus()
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "localhost:27017" }
{ "_id" : "shard0001", "host" : "localhost:27018" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "fairytale", "partitioned" : true, "primary" : "shard0000" }
fairytale.unicorns chunks:
shard0001 66
shard0000 65

66 parça, 1. parça ve 65 parça 2. parça – aslında oldukça dengeli.

Sonuç

Her zaman MongoDB mükemmel uyumlu olan, parçalanmış verilere başlamak oldukça kolay gibi görünsede. Kesinlikle daha çok şey öğrenmeniz gereken bir konudur.

 2,914 Görüntüleme

Kategori:.Net CoreC#MongoDBNoSql

4 Yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir