Azure Cosmos DB'de bölümleme ve yatay ölçeklendirme

ŞUNLAR IÇIN GEÇERLIDIR: NoSQL MongoDB Cassandra Gremlin Masa

Azure Cosmos DB, uygulamanızın performans gereksinimlerini karşılamak üzere bir veritabanındaki kapsayıcıları tek tek ölçeklendirmek için bölümleme kullanır. Kapsayıcıdaki öğeler mantıksal bölümler olarak adlandırılan ayrı alt kümelere ayrılır. Mantıksal bölümler, bir kapsayıcıdaki her öğeyle ilişkili bölüm anahtarının değerine göre oluşturulur. Mantıksal bölümdeki tüm öğeler aynı bölüm anahtarı değerine sahiptir.

Örneğin, kapsayıcı öğeleri barındırır. Her öğenin özelliği için UserID benzersiz bir değeri vardır. UserID Kapsayıcıdaki öğeler için bölüm anahtarı olarak hizmet verirse ve 1.000 benzersiz UserID değer varsa, kapsayıcı için 1.000 mantıksal bölüm oluşturulur.

Öğenin mantıksal bölümünü belirleyen bölüm anahtarına ek olarak, kapsayıcıdaki her öğenin bir öğe kimliği (mantıksal bölüm içinde benzersizdir) vardır. Bölüm anahtarı ve öğe kimliği birleştirilerek öğenin dizini oluşturulur ve bu dizin öğeyi benzersiz olarak tanımlar. Bölüm anahtarı seçmek, uygulamanızın performansını etkileyen önemli bir karardır.

Bu makalede, mantıksal ve fiziksel bölümler arasındaki ilişki açıklanmaktadır. Ayrıca bölümleme için en iyi yöntemleri ele alır ve Azure Cosmos DB'de yatay ölçeklendirmenin nasıl çalıştığına ilişkin ayrıntılı bir görünüm sağlar. Bölüm anahtarınızı seçmek için bu iç ayrıntıları anlamanız gerekmez, ancak Azure Cosmos DB'nin nasıl çalıştığı konusunda netlik elde edebilmeniz için bunları kapsıyoruz.

Mantıksal bölümler

Mantıksal bölüm, aynı bölüm anahtarına sahip bir dizi öğeden oluşur. Örneğin, gıda beslenmesi hakkındaki verileri içeren bir kapsayıcıda, tüm öğeler bir foodGroup özellik içerir. Kapsayıcı için bölüm anahtarı olarak kullanabilirsiniz foodGroup . , ve Sausages and Luncheon Meatsgibi Beef ProductsBaked Productsiçin foodGroupbelirli değerleri olan öğe grupları ayrı mantıksal bölümler oluşturur.

Mantıksal bölüm, veritabanı işlemlerinin kapsamını da tanımlar. Anlık görüntü yalıtımına sahip bir işlem kullanarak mantıksal bölüm içindeki öğeleri güncelleştirebilirsiniz. Kapsayıcıya yeni öğeler eklendiğinde, sistem saydam bir şekilde yeni mantıksal bölümler oluşturur. Temel alınan veriler silindiğinde mantıksal bölümü silme konusunda endişelenmeniz gerekmez.

Kapsayıcınızdaki mantıksal bölüm sayısıyla ilgili bir sınır yoktur. Her mantıksal bölüm en fazla 20 GB veri depolayabilir. İyi bölüm anahtarı seçeneklerinin çok çeşitli olası değerleri vardır. Örneğin, tüm öğelerin bir foodGroup özellik içerdiği bir kapsayıcıda, mantıksal bölüm içindeki Beef Products veriler 20 GB'a kadar büyüyebilir. Çok çeşitli olası değerlere sahip bir bölüm anahtarı seçmek, kapsayıcının ölçeklenebilmesini sağlar.

Mantıksal bölümün boyutunun 20 GB'a yaklaştığını izlemek için Azure İzleyici Uyarıları'nı kullanabilirsiniz.

Fiziksel bölümler

Kapsayıcı, verileri ve aktarım hızını fiziksel bölümler arasında dağıtarak ölçeklendirilir. Dahili olarak, bir veya daha fazla mantıksal bölüm tek bir fiziksel bölüme eşlenir. Genellikle daha küçük kapsayıcılar birçok mantıksal bölüme sahiptir, ancak yalnızca tek bir fiziksel bölüm gerektirir. Mantıksal bölümlerden farklı olarak, fiziksel bölümler sistemin bir iç uygulamasıdır ve Azure Cosmos DB fiziksel bölümleri tamamen yönetir.

Kapsayıcınızdaki fiziksel bölümlerin sayısı aşağıdaki özelliklere bağlıdır:

  • Sağlanan aktarım hızı miktarı (her fiziksel bölüm saniyede 10.000 istek birimine kadar aktarım hızı sağlayabilir). Fiziksel bölümler için 10.000 RU/sn sınırı, mantıksal bölümlerin de 10.000 RU/sn sınırına sahip olduğunu gösterir çünkü her mantıksal bölüm yalnızca bir fiziksel bölüme eşlenir.

  • Toplam veri depolama alanı (her fiziksel bölüm en fazla 50 GB veri depolayabilir).

Not

Fiziksel bölümler sistemin bir iç uygulamasıdır ve tamamen Azure Cosmos DB tarafından yönetilir. Çözümlerinizi geliştirirken fiziksel bölümlere odaklanmayın çünkü bunları denetleyemezsiniz. Bunun yerine bölüm anahtarlarınıza odaklanın. Aktarım hızı tüketimini mantıksal bölümler arasında eşit olarak dağıtan bir bölüm anahtarı seçerseniz, fiziksel bölümler arasında aktarım hızı tüketiminin dengelendiğinden emin olursunuz.

Kapsayıcınızdaki toplam fiziksel bölüm sayısıyla ilgili bir sınır yoktur. Sağlanan aktarım hızınız veya veri boyutunuz arttıkça Azure Cosmos DB, mevcut bölümleri bölerek otomatik olarak yeni fiziksel bölümler oluşturur. Fiziksel bölüm bölmeleri uygulamanızın kullanılabilirliğini etkilemez. Fiziksel bölüm bölündükten sonra, tek bir mantıksal bölüm içindeki tüm veriler aynı fiziksel bölümde depolanmaya devam eder. Fiziksel bölüm bölme, mantıksal bölümlerin fiziksel bölümlere yeni bir eşlemesini oluşturur.

Kapsayıcı için sağlanan aktarım hızı, fiziksel bölümler arasında eşit olarak bölünür. İstekleri eşit olarak dağıtmayan bir bölüm anahtarı tasarımı, "sık erişimli" olan bölümlerin küçük bir alt kümesine çok fazla istek yönlendirilmesine neden olabilir. Sık erişimli bölümler sağlanan aktarım hızının verimsiz kullanımına neden olur ve bu da hız sınırlamasına ve daha yüksek maliyetlere neden olabilir.

Örneğin, bölüm anahtarı olarak belirtilen yola /foodGroup sahip bir kapsayıcı düşünün. Kapsayıcıda herhangi bir sayıda fiziksel bölüm olabilir, ancak bu örnekte üç tane olduğunu varsayarız. Tek bir fiziksel bölüm birden çok bölüm anahtarı içerebilir. Örneğin, en büyük fiziksel bölüm en önemli en büyük üç boyut mantıksal bölümünü içerebilir: Beef Products, Vegetable and Vegetable Productsve Soups, Sauces, and Gravies.

Saniyede 18.000 istek birimi (RU/sn) aktarım hızı atarsanız, üç fiziksel bölümden her biri sağlanan toplam aktarım hızının 1/3'lük kısmını kullanabilir. Seçili fiziksel bölüm içinde mantıksal bölüm anahtarları Beef Products, Vegetable and Vegetable Productsve Soups, Sauces, and Gravies toplu olarak fiziksel bölümün sağlanan 6.000 RU/sn değerini kullanabilir. Sağlanan aktarım hızı kapsayıcınızın fiziksel bölümleri arasında eşit olarak bölündüğü için, aktarım hızı tüketimini eşit olarak dağıtan bir bölüm anahtarı seçmek önemlidir. Daha fazla bilgi için bkz . Doğru mantıksal bölüm anahtarını seçme.

Mantıksal bölümleri yönetme

Azure Cosmos DB, kapsayıcının ölçeklenebilirlik ve performans gereksinimlerini verimli bir şekilde karşılamak için mantıksal bölümlerin fiziksel bölümlere yerleştirilmesini saydam ve otomatik olarak yönetir. Bir uygulamanın aktarım hızı ve depolama gereksinimleri arttıkça Azure Cosmos DB, yükü daha fazla sayıda fiziksel bölüme otomatik olarak yaymak için mantıksal bölümleri taşır. Fiziksel bölümler hakkında daha fazla bilgi edinebilirsiniz.

Azure Cosmos DB, mantıksal bölümleri fiziksel bölümlere yaymak için karma tabanlı bölümleme kullanır. Azure Cosmos DB, bir öğenin bölüm anahtarı değerini karma olarak kullanır. Karma sonuç mantıksal bölümü belirler. Ardından Azure Cosmos DB, bölüm anahtarı karmalarının anahtar alanını fiziksel bölümler arasında eşit olarak ayırır.

İşlemlere (saklı yordamlarda veya tetikleyicilerde) yalnızca tek bir mantıksal bölümdeki öğelere izin verilir.

Çoğaltma kümeleri

Her fiziksel bölüm, ç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 bölümdeki veri depolarını dayanıklı, yüksek oranda kullanılabilir ve tutarlı hale getirir. Fiziksel bölümü oluşturan her çoğaltma, bölümün depolama kotasını devralır. Fiziksel bölümün tüm çoğaltmaları, fiziksel bölüme ayrılan aktarım hızını toplu olarak destekler. Azure Cosmos DB, çoğaltma kümelerini otomatik olarak yönetir.

Genellikle, daha küçük kapsayıcılar yalnızca tek bir fiziksel bölüm gerektirir, ancak yine de en az dört çoğaltmaları vardır.

Aşağıdaki görüntüde mantıksal bölümlerin genel olarak dağıtılan fiziksel bölümlere nasıl eşlendiği gösterilmektedir. Görüntüdeki bölüm kümesi , birden çok bölgede aynı mantıksal bölüm anahtarlarını yöneten bir grup fiziksel bölüme başvurur:

Azure Cosmos DB bölümlediğini gösteren görüntü

Bölüm anahtarını seçme

Bölüm anahtarının iki bileşeni vardır: bölüm anahtarı yolu ve bölüm anahtarı değeri. Örneğin, { "userId" : "Andrew", "worksFor": "Microsoft" } bölüm anahtarı olarak "userId" öğesini seçerseniz, iki bölüm anahtarı bileşeni aşağıda verilmiştir:

  • Bölüm anahtarı yolu (örneğin: "/userId"). Bölüm anahtarı yolu alfasayısal ve alt çizgi (_) karakterleri kabul eder. Standart yol gösterimini(/) kullanarak iç içe nesneler de kullanabilirsiniz.

  • Bölüm anahtarı değeri (örneğin: "Andrew"). Bölüm anahtarı değeri dize veya sayısal türlerde olabilir.

Bölüm anahtarının aktarım hızı, depolama alanı ve uzunluğuyla ilgili sınırlar hakkında bilgi edinmek için Azure Cosmos DB hizmet kotaları makalesine bakın.

Bölüm anahtarınızı seçmek, Azure Cosmos DB'de basit ama önemli bir tasarım seçimidir. Bölüm anahtarınızı seçtikten sonra yerinde değiştirmek mümkün değildir. Bölüm anahtarınızı değiştirmeniz gerekiyorsa, verilerinizi istediğiniz yeni bölüm anahtarıyla yeni bir kapsayıcıya taşımanız gerekir. (Kapsayıcı kopyalama işleri bu işlemle ilgili yardım alır.)

Tüm kapsayıcılar için bölüm anahtarınız şunları yapmalıdır:

  • Değişmeyen bir değere sahip bir özellik olun. Bölüm anahtarınız bir özellikse, bu özelliğin değerini güncelleştiremezsiniz.

  • Yalnızca değerler içermeli String veya sayılar, IEEE 754 binary64'e göre çift duyarlıklı sayıların sınırlarının dışında kalma olasılığı varsa ideal olarak içine Stringdönüştürülmelidir. Json belirtimi, genel olarak bu sınırın dışındaki sayıları kullanmanın olası birlikte çalışabilirlik sorunları nedeniyle kötü bir uygulama olmasının nedenlerini belirtir. Bu sorunlar özellikle bölüm anahtarı sütunu için geçerlidir, çünkü sabittir ve daha sonra değiştirmek için veri geçişi gerektirir.

  • Yüksek bir kardinaliteye sahip olma. Başka bir deyişle, özelliği çok çeşitli olası değerlere sahip olmalıdır.

  • İstek birimi (RU) tüketimini ve veri depolamayı tüm mantıksal bölümlere eşit olarak yayma. Bu yayma, fiziksel bölümlerinizde RU tüketimi ve depolama dağıtımının bile olmasını sağlar.

  • Genellikle 2048 bayttan büyük olmayan değerlere veya büyük bölüm anahtarları etkinleştirilmediyse 101 bayt'a sahip olun. Daha fazla bilgi için bkz. büyük bölüm anahtarları

Azure Cosmos DB'de çok öğeli ACID işlemlerine ihtiyacınız varsa saklı yordamları veya tetikleyicileri kullanmanız gerekir. Tüm JavaScript tabanlı saklı yordamların ve tetikleyicilerin kapsamı tek bir mantıksal bölüme göre belirlenir.

Not

Yalnızca bir fiziksel bölümünüz varsa, tüm sorgular aynı fiziksel bölümü hedeflediğinden bölüm anahtarının değeri ilgili olmayabilir.

Yoğun okuma özellikli kapsayıcılar için bölüm anahtarları

Kapsayıcıların çoğu için, bölüm anahtarı seçerken dikkate almanız gereken tüm ölçütler yukarıdaki ölçütlerdir. Ancak büyük okuma ağırlıklı kapsayıcılar için, sorgularınızda sık sık filtre olarak görünen bir bölüm anahtarı seçmek isteyebilirsiniz. Sorgular, filtre koşuluna bölüm anahtarı dahil edilerek yalnızca ilgili fiziksel bölümlere verimli bir şekilde yönlendirilebilir.

İş yükünüzün isteklerinin çoğu sorguysa ve sorgularınızın çoğu aynı özellik üzerinde eşitlik filtresine sahipse, bu özellik iyi bir bölüm anahtarı seçimi olabilir. Örneğin, üzerinde UserIDfiltreleyen bir sorguyu sık sık çalıştırıyorsanız bölüm anahtarı olarak seçmek UserID bölümler arası sorgu sayısını azaltır.

Ancak kapsayıcınız küçükse, bölümler arası sorguların performansı konusunda endişelenmeniz için büyük olasılıkla yeterli fiziksel bölüme sahip değilsinizdir. Azure Cosmos DB'deki küçük kapsayıcıların çoğu yalnızca bir veya iki fiziksel bölüm gerektirir.

Kapsayıcınız birkaç fiziksel bölüme kadar büyüyebilirse, bölümler arası sorguları en aza indiren bir bölüm anahtarı seçtiğinizden emin olmanız gerekir. Aşağıdakilerden biri doğru olduğunda kapsayıcınız birkaçtan fazla fiziksel bölüm gerektirir:

  • Kapsayıcınızda 30.000'den fazla RU sağlandı

  • Kapsayıcınız 100 GB'ın üzerinde veri depolar

Bölüm anahtarı olarak öğe kimliğini kullanma

Not

Bu bölüm öncelikli olarak NoSQL IÇIN API için geçerlidir. Gremlin API'si gibi diğer API'ler, bölüm anahtarı olarak benzersiz tanımlayıcıyı desteklemez.

Kapsayıcınızın çok çeşitli olası değerlere sahip bir özelliği varsa, büyük olasılıkla harika bir bölüm anahtarı seçimidir. Böyle bir özelliğin olası örneklerinden biri öğe kimliğidir. Herhangi bir boyuttaki küçük okuma ağırlıklı kapsayıcılar veya yoğun yazma içeren kapsayıcılar için öğe kimliği (/id) doğal olarak bölüm anahtarı için harika bir seçimdir.

Sistem özellik öğesi kimliği kapsayıcınızdaki her öğede bulunur. Öğenizin mantıksal kimliğini temsil eden başka özellikleriniz de olabilir. Çoğu durumda bu kimlikler, öğe kimliğiyle aynı nedenlerle mükemmel bölüm anahtarı seçenekleridir.

Öğe kimliği, aşağıdaki nedenlerle harika bir bölüm anahtarı seçimidir:

  • Çok çeşitli olası değerler vardır (öğe başına bir benzersiz öğe kimliği ).
  • Öğe başına benzersiz bir öğe kimliği olduğundan, öğe kimliği RU tüketimini ve veri depolama alanını eşit şekilde dengeleme konusunda harika bir iş yapar.
  • Öğe kimliğini biliyorsanız bir öğenin bölüm anahtarını her zaman bildiğinizden, verimli nokta okumalarını kolayca yapabilirsiniz.

Bölüm anahtarı olarak öğe kimliğini seçerken dikkate alınması gereken bazı şeyler şunlardır:

  • Öğe kimliği bölüm anahtarıysa, kapsayıcınızın tamamında benzersiz bir tanımlayıcıya dönüşür. Yinelenen öğe kimliklerine sahip öğeler oluşturamazsınız.
  • Birçok fiziksel bölüme sahip yoğun okuma içeren bir kapsayıcınız varsa, öğe kimliğine sahip bir eşitlik filtresine sahip olan sorgular daha verimlidir.
  • Birden çok mantıksal bölümü hedefleyen saklı yordamları veya tetikleyicileri çalıştıramazsınız.