Aracılığıyla paylaş


MongoDB için Azure Cosmos DB sanal çekirdeğinde yatay ölçeklenebilirlik için parçalama

MongoDB için Azure Cosmos DB sanal çekirdeği, verileri ve trafiği yatay olarak dağıtmak için parçalanmayı destekler. Koleksiyondaki belgeler mantıksal parçalar olarak adlandırılan öbeklere ayrılır.

Parçalama, koleksiyonun belge yapısından belirlenen bir parça anahtarı kullanılarak her koleksiyon için ayrı ayrı tanımlanır. Ardından veriler, her bir öbek mantıksal bölüme karşılık gelen öbekler halinde demet haline getirilir. Parça anahtarı özelliğinin her benzersiz değerinin belgeleri aynı mantıksal parçada yer alır.

Parçalı koleksiyona eklenen her belge için, belirlenen mantıksal parçanın hesaplanacağı parça anahtarı özelliğinin değeri karma olarak oluşturulur. Mantıksal parçanın yerleştirilmesi ve küme içindeki tüm mantıksal parçaların dağıtılması, kullanıcıdan soyutlanır ve hizmet tarafından tam olarak yönetilir.

Mantıksal parçalar

Parça anahtarı için aynı değeri içeren tüm belgeler aynı mantıksal parçaya aittir.

Örneğin, aşağıdaki belge yapısına sahip Çalışanlar adlı bir koleksiyonu ele alalım.

Bu tabloda, parça anahtarı değerlerinin mantıksal bölümlere eşlemesi gösterilmektedir.

Belge Kimliği Parça Anahtarı Değeri Mantıksal Parça
"12345" "Steve Smith" Parça 1
"23456" "Jane Doe" Parça 2
"34567" "Steve Smith" Parça 1
"45678" "Michael Smith" Parça 3
"56789" "Jane Doe" Parça 2
  • Bir koleksiyon için mantıksal parça sayısının sınırı yoktur. Bir koleksiyon, her belgedeki parça anahtarı özelliği için benzersiz bir değere sahip belgeler kadar çok mantıksal parça içerebilir.

  • Tek bir mantıksal parçanın boyutu için de sınır yoktur.

  • Ayrıca hizmet, işlemleri mantıksal bir parçanın kapsamıyla sınırlamaz. MongoDB için Azure Cosmos DB sanal çekirdek tabanlı hizmet, birden çok mantıksal parçada ve kümedeki birden çok fiziksel parçada geçerli olan okuma ve yazma işlemlerini destekler.

Fiziksel parçalar

Fiziksel parçalar, verilerin kalıcı hale getirilmesinden ve veritabanı işlemlerinin gerçekleştirilmesinden sorumlu olan temel makineler ve disklerdir. Mantıksal parçalardan farklı olarak hizmet, fiziksel parçaları kapakların altında yönetir.

Bir küme oluşturulduğunda fiziksel parça sayısı tanımlanır. Tek parça kümeleri, kümenin depolama ve veritabanı işlemlerinden tamamen sorumlu olan bir fiziksel parçaya sahiptir. Çok parçalı kümeler, verileri ve işlem hacmini kümedeki fiziksel parçalar arasında dağıtır.

Mantıksal parçaları fiziksel parçalara eşleme

Yeni mantıksal parçalar eklendiğinde, küme mantıksal parçaları fiziksel parçalara eşlemeyi sorunsuz bir şekilde güncelleştirir. Benzer şekilde, her fiziksel parçaya adres alanı ataması, kümeye yeni fiziksel parçalar eklendikçe değiştirilir ve ardından mantıksal parçalar küme genelinde yeniden dengelenir.

Mantıksal ve fiziksel parçaları eşlemek için kullanılan karma aralığı, kümedeki fiziksel parçalar arasında eşit olarak dağıtılır. Her fiziksel parça karma aralığının eşit boyutta bir demetine sahiptir. Yazılan her belge için parça anahtarı özelliğinin değeri karmalanır ve karma değeri belgenin temel alınan fiziksel parçayla eşleneceğini belirler. Dahili olarak, birkaç mantıksal parça tek bir fiziksel parçayla eşler. Ayrıca, mantıksal parçalar hiçbir zaman fiziksel parçalar arasında bölünemez ve mantıksal parçanın tüm belgeleri yalnızca bir fiziksel parçayla eşlenir.

İki fiziksel parça içeren bir küme kullanarak önceki örnekten yararlanan bu tabloda belgelerin fiziksel parçalara örnek bir eşlemesi gösterilmektedir.

Belge Kimliği Parça Anahtarı Değeri Mantıksal Parça Fiziksel Parça
"12345" "Steve Smith" Parça 1 Fiziksel Parça 1
"23456" "Jane Doe" Parça 2 Fiziksel Parça 2
"34567" "Steve Smith" Parça 1 Fiziksel Parça 1
"45678" "Michael Smith" Parça 3 Fiziksel Parça 1
"56789" "Jane Doe" Parça 2 Fiziksel Parça 2

Fiziksel parçaların kapasitesi

Küme sağlandığında seçilen küme katmanı, fiziksel bir parçanın CPU ve bellek kapasitesini belirler. Benzer şekilde, depolama SKU'su fiziksel bir parçanın depolama ve IOPS kapasitesini belirler. Daha büyük küme katmanları daha fazla işlem gücü ve daha büyük bellek sağlarken, daha büyük depolama diskleri daha fazla depolama ve IOPS sağlar. Yoğun okuma iş yükleri daha büyük bir küme katmanından yararlanırken, yoğun yazma iş yükleri daha büyük bir depolama SKU'sundan yararlanıyor. Küme katmanının ölçeği, uygulamanın değişen gereksinimlerine göre küme oluşturulduktan sonra artırılabilir ve azaltılabilir.

Çok parçalı bir kümede, her fiziksel parçanın kapasitesi aynıdır. Küme katmanını veya depolama SKU'sunu ölçeklendirmek, fiziksel parçalar üzerindeki mantıksal parçaların yerleşimini değiştirmez. Ölçeği artırma işleminden sonra fiziksel parça sayısı aynı kalır ve bu sayede kümedeki verileri yeniden dengeleme gereksinimi ortadan kalkmış olur.

Fiziksel parçanın işlem, bellek, depolama ve IOPS kapasitesi, mantıksal parçalar için kullanılabilir kaynakları belirler. Depolama ve istek birimlerinin eşit dağıtımına sahip olmayan parça anahtarları, küme içinde eşit olmayan depolama ve aktarım hızı tüketimine neden olabilir. Sık erişimli bölümler, fiziksel parçaların eşit olmayan şekilde kullanılmasına neden olarak öngörülemeyen aktarım hızı ve performansa neden olabilir. Bu nedenle parçalı kümeler, uygulamanın gereksinimleri zaman içinde değiştikçe performansın tutarlı kalmasını sağlamak için dikkatli bir planlama gerektirir.

Çoğaltma kümeleri

Her fiziksel parça, çoğaltma kümesi olarak da adlandırılan bir çoğaltma kümesinden oluşur. Her çoğaltma, veritabanı altyapısının bir örneğini barındırıyor. Çoğaltma kümesi, fiziksel parça içindeki veri depolarını dayanıklı, yüksek oranda kullanılabilir ve tutarlı hale getirir. Fiziksel parça oluşturan her çoğaltma, fiziksel parçanın depolama ve işlem kapasitesini devralır. MongoDB için Azure Cosmos DB sanal çekirdeği çoğaltma kümelerini otomatik olarak yönetir.

Verileri parçalama için en iyi yöntemler

  • MongoDB için Azure Cosmos DB sanal çekirdeğinde parçalama, koleksiyonun depolama ve işlem birimleri tek bir fiziksel parçanın kapasitesini aşmadığı sürece gerekli değildir. Örneğin, hizmet parça başına 32 TB disk sağlar. Bir koleksiyon 32 TB'tan fazla gerektiriyorsa parçalanmalıdır.

  • Bir kümedeki her koleksiyonun birden çok fiziksel parçayla parçalanmasını gerektirmez. Parçalı ve parçalanmamış koleksiyonlar aynı kümede bir arada bulunabilir. Hizmet, küme içindeki koleksiyonları en uygun şekilde dağıtarak kümenin işlem ve depolama kaynaklarını mümkün olduğunca eşit şekilde kullanır.

  • Yoğun okuma uygulamaları için parça anahtarı en sık kullanılan sorgu desenlerine göre seçilmelidir. Bir koleksiyon için en yaygın kullanılan sorgu filtresi, aramayı tek bir fiziksel parçaya yerelleştirerek veritabanı işlemlerinin en yüksek yüzdesini iyileştirmek için parça anahtarı olarak seçilmelidir.

  • Okumalara göre yazma performansını destekleyen yoğun yazma uygulamaları için verileri fiziksel parçalar arasında eşit bir şekilde dağıtmak için bir parça anahtarı seçilmelidir. En yüksek kardinaliteye sahip parça anahtarları, mümkün olduğunca eşit şekilde dağıtmak için en iyi fırsatı sağlar.

  • En iyi performans için mantıksal parçanın depolama boyutu 4 TB'tan az olmalıdır.

  • En iyi performans için mantıksal parçalar depolama alanında eşit olarak dağıtılmalı ve kümenin fiziksel parçaları arasında istek hacmine dağıtılmalıdır.

Koleksiyonu parçala

'cosmicworks' veritabanı ve 'çalışan' koleksiyonu içinde aşağıdaki belgeyi göz önünde bulundurun

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7
}

Aşağıdaki örnek, firstName özelliğindeki cosmicworks veritabanındaki çalışan koleksiyonunu parçalar.

use cosmicworks;
sh.shardCollection("cosmicworks.employee", {"firstName": "hashed"})

Koleksiyon bir yönetici komutu kullanılarak da parçalanabilir:

use cosmicworks;
db.adminCommand({
  "shardCollection": "cosmicworks.employee",
  "key": {"firstName": "hashed"}
})

Koleksiyon depolama biriminde önemli ölçüde büyüdükten sonra parça anahtarını değiştirmek ideal olmasa da, parça anahtarını değiştirmek için reshardCollection komutu kullanılabilir.

use cosmicworks;
sh.reshardCollection("cosmicworks.employee", {"lastName": "hashed"})

Koleksiyon, bir yönetici komutu kullanılarak da yeniden parçalanabilir:

use cosmicworks;
db.adminCommand({
  "reshardCollection": "cosmicworks.employee",
  "key": {"lastName": "hashed"}
})

En iyi yöntem olarak, parça anahtarı özelliğinde bir dizin oluşturulmalıdır.

use cosmicworks;
db.runCommand({
  createIndexes: "employee",
  indexes: [{"key":{"firstName":1}, "name":"firstName_1", "enableLargeIndexKeys": true}],
  blocking: true
})

Sonraki adımlar