Azure Cosmos DB istek oranı çok yüksek (429) özel durumlarını tanılama ve sorun giderme
UYGULANANLAR: NoSQL
Bu makale, NoSQL API'sine yönelik çeşitli 429 durum kodu hatalarının bilinen nedenlerini ve çözümlerini içerir. MongoDB api'sini kullanıyorsanız, 16500 durum kodunda hata ayıklama için MongoDB IÇIN API'de yaygın sorunları giderme makalesine bakın.
Hata kodu 429 olarak da bilinen "İstek oranı çok büyük" özel durumu, Azure Cosmos DB'ye yönelik isteklerinizin hız sınırlaması olduğunu gösterir.
Sağlanan aktarım hızını kullandığınızda, iş yükünüz için gereken saniye başına istek birimleri (RU/sn) cinsinden ölçülen aktarım hızını ayarlarsınız. Okumalar, yazmalar ve sorgular gibi hizmete karşı veritabanı işlemleri bazı sayıda istek birimi (RU) tüketir. İstek birimleri hakkında daha fazla bilgi edinin.
Belirli bir saniyede, işlemler sağlanan istek birimlerinden daha fazlasını kullanırsa Azure Cosmos DB 429 özel durumu döndürür. Her saniye, kullanılabilecek istek birimi sayısı sıfırlanır.
RU/sn'yi değiştirmek için bir eylem gerçekleştirmeden önce hız sınırlamasının kök nedenini anlamak ve temel sorunu çözmek önemlidir.
İpucu
Bu makaledeki kılavuz, sağlanan aktarım hızını kullanan veritabanları ve kapsayıcılar için geçerlidir ; hem otomatik ölçeklendirme hem de el ile aktarım hızı.
Farklı 429 özel durum türlerine karşılık gelen farklı hata iletileri vardır:
- İstek oranı yüksektir. Daha fazla İstek Birimi gerekebilir, bu nedenle değişiklik yapılmadı.
- Yüksek oranda meta veri isteği nedeniyle istek tamamlanmadı.
- Geçici bir hizmet hatası nedeniyle istek tamamlanmadı.
İstek oranı büyük
Bu en yaygın senaryodur. Veriler üzerindeki işlemler tarafından kullanılan istek birimleri sağlanan RU/sn sayısını aştığında oluşur. El ile aktarım hızı kullanıyorsanız, sağlanan el ile aktarım hızından daha fazla RU/sn kullandığınızda bu durum oluşur. Otomatik ölçeklendirme kullanıyorsanız, sağlanan maksimum RU/sn'den daha fazlasını kullandığınızda bu durum oluşur. Örneğin, el ile 400 RU/sn aktarım hızıyla sağlanan bir kaynağınız varsa, tek bir saniyede 400'den fazla istek birimi kullandığınızda 429 değerini görürsünüz. Otomatik ölçeklendirme maksimum RU/sn değeri 4000 RU/sn (400 RU/sn - 4000 RU/sn arasında ölçeklendirilir) ile sağlanan bir kaynağınız varsa, tek bir saniyede 4000'den fazla istek birimi kullandığınızda 429 yanıt görürsünüz.
İpucu
Tüm işlemler, kullandıkları kaynak sayısına göre ücretlendirilir. Bu ücretler istek birimleriyle ölçülür. Bu ücretler, , 412
, 449
vb. gibi 400
uygulama hatalarından dolayı başarıyla tamamlanmayan istekleri içerir. Azaltmaya veya kullanıma bakarken, kullanımınızda bu işlemlerin artmasına neden olacak bir desenin değişip değişmediğini araştırmak iyi bir fikirdir. Özellikle etiketleri 412
veya 449
(gerçek çakışma) denetleyin.
Sağlanan aktarım hızı hakkında daha fazla bilgi için bkz . Azure Cosmos DB'de sağlanan aktarım hızı.
1. Adım: 429 hatasıyla isteklerin yüzdesini belirlemek için ölçümleri denetleyin
429 hata iletilerini görmek, veritabanınızda veya kapsayıcınızda sorun olduğu anlamına gelmez. El ile veya otomatik ölçeklendirme aktarım hızı kullanmanız fark etmeksizin 429 yanıtın küçük bir yüzdesi normaldir ve sağladığınız RU/sn değerini en üst düzeye çıkardığınızın işaretidir.
Araştırma adımları
Veritabanınıza veya kapsayıcınıza yönelik isteklerinizin yüzde kaçının başarılı isteklerin toplam sayısına kıyasla 429 yanıta neden olduğunu belirleyin. Azure Cosmos DB hesabınızdan, Durum Koduna Göre İçgörü>İstekleri>Toplam İstekler'e gidin. Belirli bir veritabanı ve kapsayıcıya göre filtreleyin.
Varsayılan olarak, Azure Cosmos DB istemci SDK'ları ve Azure Data Factory ve toplu yürütücü kitaplığı gibi veri içeri aktarma araçları istekleri 429'larda otomatik olarak yeniden dener. Genellikle en fazla dokuz kez yeniden dener. Sonuç olarak ölçümlerde 429 yanıt görebilirsiniz ancak bu hatalar uygulamanıza döndürülmemiş bile olabilir.
Önerilen çözüm
Genel olarak, bir üretim iş yükü için, 429 yanıtlı isteklerin %1-5'i arasında bir değer görürseniz ve uçtan uca gecikmeniz kabul edilebilirse, bu RU/sn'lerin tam olarak kullanıldığına ilişkin sağlıklı bir işarettir. Eylem gerekmiyor. Aksi takdirde, sonraki sorun giderme adımlarına geçin.
Önemli
Bu %1-5 aralığı, hesap bölümlerinizin eşit olarak dağıtıldığını varsayar. Bölümleriniz eşit olarak dağıtılmıyorsa, sorun bölümünüz büyük miktarda 429 hatası döndürebilirken genel oran düşük olabilir.
Otomatik ölçeklendirme kullanıyorsanız, RU/sn en yüksek RU/sn'ye ölçeklendirilmemiş olsa bile veritabanınızda veya kapsayıcınızda 429 yanıt görebilirsiniz. Açıklama için otomatik ölçeklendirme ile İstek oranı büyük bölümüne bakın.
Sık sorulan sorulardan biri şudur: "Azure İzleyici ölçümlerinde neden 429 yanıt görüyorum, ancak kendi uygulama izlememde yok?" Azure İzleyici Ölçümleri 429 yanıtınız olduğunu gösteriyorsa ancak kendi uygulamanızda hiç yanıt görmediyseniz, bunun nedeni varsayılan olarak Azure Cosmos DB istemci SDK'larının automatically retried internally on the 429 responses
ve isteğin sonraki yeniden denemelerde başarılı olmasıdır. Sonuç olarak, 429 durum kodu uygulamaya döndürülmüyor. Bu gibi durumlarda, genel oranın %1-5 arasında olduğu ve uçtan uca gecikme süresinin uygulamanız için kabul edilebilir olduğu varsayıldığında 429 yanıtın genel oranı genellikle en düşük düzeydedir ve güvenle yoksayılabilir.
2. Adım: Sık erişimli bölüm olup olmadığını belirleme
Sık erişimli bölüm, bir veya birkaç mantıksal bölüm anahtarı daha yüksek istek hacmi nedeniyle toplam RU/sn'nin orantısız bir miktarını tükettiğinde ortaya çıkar. Bunun nedeni istekleri eşit olarak dağıtmayan bir bölüm anahtarı tasarımı olabilir. Birçok isteğin "sık erişimli" duruma gelen küçük bir mantıksal (fiziksel) bölüm alt kümesine yönlendirilmesiyle sonuçlanır. Mantıksal bölümün tüm verileri bir fiziksel bölümde bulunduğundan ve toplam RU/sn fiziksel bölümler arasında eşit olarak dağıtıldığı için, sık erişimli bölüm 429 yanıta ve verimsiz aktarım hızı kullanımına yol açabilir.
Sık erişimli bölümlere yol açan bölümleme stratejilerine bazı örnekler aşağıda verilmiştir:
- tarafından
date
bölümlenmiş yoğun yazma iş yükü için IoT cihaz verilerini depolayan bir kapsayıcınız var. Tek bir tarihe ilişkin tüm veriler aynı mantıksal ve fiziksel bölümde yer alır. Her gün yazılan tüm veriler aynı tarihe sahip olduğundan, bu durum her gün sık erişimli bölüme neden olur.- Bunun yerine, bu senaryo için gibi bir bölüm anahtarı
id
(GUID veya cihaz kimliği) veya yapay bir bölüm anahtarı bir araya getirerekid
date
değerlerin daha yüksek kardinalitesini ve istek hacminin daha iyi dağıtılmasını sağlar.
- Bunun yerine, bu senaryo için gibi bir bölüm anahtarı
- tarafından bölümlenmiş
tenantId
bir kapsayıcı ile çok kiracılı bir senaryonuz var. Bir kiracı diğerlerinden çok daha etkinse, sık erişimli bölümle sonuçlanır. Örneğin, en büyük kiracının 100.000 kullanıcısı varsa ancak çoğu kiracının 10'dan az kullanıcısı varsa, tarafındantenantID
bölümlendiğinde sık erişimli bölüme sahip olursunuz.- Bu önceki senaryoda, gibi daha ayrıntılı bir özellik
UserId
tarafından bölümlenmiş en büyük kiracı için ayrılmış bir kapsayıcıya sahip olmayı göz önünde bulundurun.
- Bu önceki senaryoda, gibi daha ayrıntılı bir özellik
Sık erişimli bölümü tanımlama
Sık erişimli bölüm olup olmadığını doğrulamak için İçgörü aktarım>hızı>Normalleştirilmiş RU Tüketimi (%) By PartitionKeyRangeID bölümüne gidin. Belirli bir veritabanı ve kapsayıcıya göre filtreleyin.
Her PartitionKeyRangeId, bir fiziksel bölüme eşler. Normalleştirilmiş RU tüketimi diğerlerinden çok daha yüksek olan bir PartitionKeyRangeId varsa (örneğin, biri tutarlı olarak %100'de, diğerleri %30 veya daha azsa), bu sık erişimli bölümün işareti olabilir. Normalleştirilmiş RU Tüketimi ölçümü hakkında daha fazla bilgi edinin.
Hangi mantıksal bölüm anahtarlarının en çok RU/sn kullandığını görmek için Azure Tanılama Günlükleri'ni kullanın. Bu örnek sorgu, her mantıksal bölüm anahtarında saniye başına tüketilen toplam istek birimlerini özetler.
Önemli
Tanılama günlüklerinin etkinleştirilmesi Log Analytics hizmeti için ayrı bir ücretlendirilir ve alınan veri hacmine göre faturalandırılır. Hata ayıklama için tanılama günlüklerini sınırlı bir süre için açmanız ve artık gerekli olmadığında kapatmanız önerilir. Ayrıntılar için fiyatlandırma sayfasına bakın.
CDBPartitionKeyRUConsumption
| where TimeGenerated >= ago(24hour)
| where CollectionName == "CollectionName"
| where isnotempty(PartitionKey)
// Sum total request units consumed by logical partition key for each second
| summarize sum(RequestCharge) by PartitionKey, OperationName, bin(TimeGenerated, 1s)
| order by sum_RequestCharge desc
Bu örnek çıktı, belirli bir dakika içinde "Contoso" değerine sahip mantıksal bölüm anahtarının yaklaşık 12.000 RU/sn, "Fabrikam" değerine sahip mantıksal bölüm anahtarının ise 600 RU/sn'den az tüketildiğini gösterir. Bu desen, hız sınırlamasının gerçekleştiği zaman aralığında tutarlıysa bu, sık erişimli bir bölüm olduğunu gösterir.
İpucu
Herhangi bir iş yükünde, mantıksal bölümler arasında istek hacminde doğal bir değişim olacaktır. Sık erişimli bölümün, bölüm anahtarı seçiminden (anahtarın değiştirilmesini gerektirebilir) veya iş yükü desenlerindeki doğal değişim nedeniyle geçici bir ani artıştan kaynaklanan temel bir dengesizlik olup olmadığını belirlemeniz gerekir.
Önerilen çözüm
İyi bir bölüm anahtarı seçme yönergelerini gözden geçirin.
Hız sınırlı isteklerin yüzdesi yüksekse ve sık erişimli bölüm yoksa:
- İstemci SDK'ları, Azure portalı, PowerShell, CLI veya ARM şablonunu kullanarak veritabanı veya kapsayıcıdaki RU/sn'leri artırabilirsiniz. Ayarlanacağı doğru RU/sn'yi belirlemek için sağlanan aktarım hızını (RU/sn) ölçeklendirmeye yönelik en iyi yöntemleri izleyin.
Hız sınırlı isteklerin yüzdesi yüksekse ve temel alınan bir sık erişimli bölüm varsa:
- En iyi maliyet ve performans için uzun vadeli bölüm anahtarını değiştirmeyi göz önünde bulundurun. Bölüm anahtarı yerinde güncelleştirilemez, bu nedenle verilerin farklı bir bölüm anahtarına sahip yeni bir kapsayıcıya geçirilmesi gerekir. Azure Cosmos DB bu amaçla bir dinamik veri geçiş aracını destekler.
- Kısa vadeli olarak, sık erişimli bölüme daha fazla aktarım hızı sağlamak için kaynağın genel RU/sn değerini geçici olarak artırabilirsiniz. Ru/sn'nin fazla sağlanmasına ve maliyetin daha yüksek olmasına yol açtığı için bu uzun vadeli bir strateji olarak önerilmez.
- Kısa vadeli olarak, sık erişimli fiziksel bölüme daha fazla RU/sn atamak için bölümler arasında aktarım hızı yeniden dağıtım özelliğini (önizleme) kullanabilirsiniz. Bu yalnızca sık erişimli fiziksel bölüm tahmin edilebilir ve tutarlı olduğunda önerilir.
İpucu
Aktarım hızını artırdığınızda, ölçeği artırmak istediğiniz RU/sn sayısına bağlı olarak ölçeği artırma işlemi anında tamamlanır veya tamamlanması 5-6 saate kadar sürebilir. Zaman uyumsuz ölçeklendirme işlemini tetiklemeden ayarlayabileceğiniz en yüksek RU/sn sayısını bilmek istiyorsanız (daha fazla fiziksel bölüm sağlamak için Azure Cosmos DB gerektirir), ayrı PartitionKeyRangeId sayısını 10.0000 RU/sn ile çarpın. Örneğin, sağlanan 30.000 RU/sn ve 5 fiziksel bölümünüz (fiziksel bölüm başına 6000 RU/sn) varsa, anlık ölçeklendirme işleminde 50.000 RU/sn'ye (fiziksel bölüm başına 10.000 RU/sn) artırabilirsiniz. 50.000 RU/sn'ye çıkılması >zaman uyumsuz bir ölçeklendirme işlemi gerektirir. Sağlanan aktarım hızını (RU/sn) ölçeklendirmeye yönelik en iyi yöntemler hakkında daha fazla bilgi edinin.
3. Adım: Hangi isteklerin 429 yanıt döndüreceğini belirleme
429 yanıtla istekleri araştırma
Hangi isteklerin 429 yanıt döndürüp kaç RU kullandığını belirlemek için Azure Tanılama Günlükleri'ni kullanın. Bu örnek sorgu dakika düzeyinde toplanır.
Önemli
Tanılama günlüklerinin etkinleştirilmesi Log Analytics hizmeti için ayrı bir ücretlendirilir ve alınan veri hacmine göre faturalandırılır. Tanılama günlüklerini hata ayıklama için sınırlı bir süre için açmanız ve artık gerekli olmadığında kapatmanız önerilir. Ayrıntılar için fiyatlandırma sayfasına bakın.
CDBDataPlaneRequests
| where TimeGenerated >= ago(24h)
| summarize throttledOperations = dcountif(ActivityId, StatusCode == 429), totalOperations = dcount(ActivityId), totalConsumedRUPerMinute = sum(RequestCharge) by DatabaseName, CollectionName, OperationName, RequestResourceType, bin(TimeGenerated, 1min)
| extend averageRUPerOperation = 1.0 * totalConsumedRUPerMinute / totalOperations
| extend fractionOf429s = 1.0 * throttledOperations / totalOperations
| order by fractionOf429s desc
Örneğin, bu örnek çıktı, belge oluşturma isteklerinin her dakikasının %30'unun hız sınırlı olduğunu ve her isteğin ortalama 17 RU tükettiğini gösterir.
Önerilen çözüm
Azure Cosmos DB kapasite planlayıcısını kullanma
Azure Cosmos DB kapasite planlayıcısını kullanarak iş yükünüz temelinde en iyi sağlanan aktarım hızının ne olduğunu anlayabilirsiniz (işlem hacmi ve türü ve belgelerin boyutu). Daha doğru bir tahmin elde etmek için örnek veriler sağlayarak hesaplamaları daha da özelleştirebilirsiniz.
Belge istekleri oluşturma, değiştirme veya yükseltme işlemleriyle ilgili 429 yanıt
- Varsayılan olarak, NoSQL API'sinde tüm özellikler varsayılan olarak dizine eklenir. Dizin oluşturma ilkesini yalnızca gerekli özellikleri dizine almak için ayarlayın. Bu, belge oluşturma işlemi başına gereken İstek Birimlerini azaltır ve bu da 429 yanıt görme olasılığını azaltır veya sağlanan RU/sn miktarı için saniyede daha yüksek işlemler gerçekleştirmenize olanak tanır.
Sorgu belgesi isteklerinde 429 yanıt
- Yüksek RU ücretine sahip sorgularla ilgili sorunları gidermek için kılavuzu izleyin
Saklı yordamları yürütmede 429 yanıt
- Saklı yordamlar , bir bölüm anahtarı değeri genelinde yazma işlemleri gerektiren işlemlere yöneliktir. Çok sayıda okuma veya sorgu işlemi için saklı yordamların kullanılması önerilmez. En iyi performans için bu okuma veya sorgu işlemleri Azure Cosmos DB SDK'ları kullanılarak istemci tarafında yapılmalıdır.
otomatik ölçeklendirme ile istek oranı büyük
Bu makaledeki tüm yönergeler hem el ile hem de otomatik ölçeklendirme aktarım hızı için geçerlidir.
Otomatik ölçeklendirme kullanılırken sık sorulan bir soru şudur: "Otomatik ölçeklendirme ile 429 yanıtı görmek hala mümkün mü?"
Evet. Bunun gerçekleşebileceği iki ana senaryo vardır.
Senaryo 1: Genel olarak tüketilen RU/sn veritabanı veya kapsayıcının maksimum RU/sn değerini aştığında, hizmet istekleri buna göre kısıtlar. Bu, bir veritabanı veya kapsayıcının genel el ile sağlanan aktarım hızını aşmaya benzer.
Senaryo 2: Sık erişimli bir bölüm varsa, yani diğer bölüm anahtarı değerlerine kıyasla orantısız olarak daha yüksek istek miktarına sahip mantıksal bölüm anahtarı değeri varsa, temel alınan fiziksel bölümün RU/sn bütçesini aşması mümkündür. Sık erişimli bölümlerle karşılaşmamak için kullanabileceğiniz en iyi yöntemlerden biri, depolama ve işlem hızı konusunda eşit dağıtım sağlayan iyi bir bölüm anahtarı seçmektir. Bu, el ile aktarım hızı kullanılırken sık erişimli bölüm olmasına benzer.
Örneğin, 20.000 RU/sn maksimum aktarım hızı seçeneğini belirlerseniz ve dört fiziksel bölüm içeren 200 GB depolama alanınız varsa, her fiziksel bölüm 5000 RU/sn'ye kadar otomatik olarak ölçeklendirilebilir. Belirli bir mantıksal bölüm anahtarında sık erişimli bölüm varsa, içinde bulunduğu temel alınan fiziksel bölüm 5000 RU/sn'yi aştığında,yani %100 normalleştirilmiş kullanımı aştığında 429 yanıt görürsünüz.
Bu senaryolarda hata ayıklamak için 1. Adım, 2. Adım ve 3. Adım'daki yönergeleri izleyin.
Sık sorulan bir diğer soru da neden %100 normalleştirilmiş RU tüketimidir, ancak otomatik ölçeklendirme en yüksek RU/sn'ye ölçeklendirilmemiş olabilir?
Bu genellikle geçici veya aralıklı kullanım artışları olan iş yükleri için oluşur. Otomatik ölçeklendirmeyi kullandığınızda Azure Cosmos DB, 5 saniyelik bir aralıkta sürekli ve sürekli bir süre boyunca normalleştirilmiş RU tüketimi %100 olduğunda RU/sn'yi yalnızca maksimum aktarım hızına ölçeklendirir. Bu, tek ve anlık ani artışların gereksiz ölçeklendirmeye ve daha yüksek maliyete yol açmamasını sağladığından ölçeklendirme mantığının kullanıcıya uygun maliyetli olmasını sağlamak için yapılır. Anlık ani artışlar olduğunda, sistem genellikle daha önce RU/sn olarak ölçeklendirilen değerden daha yüksek ancak en yüksek RU/sn'den daha düşük bir değere ölçeklendirilir. Otomatik ölçeklendirme ile normalleştirilmiş RU tüketim ölçümünü yorumlama hakkında daha fazla bilgi edinin.
Meta veri isteklerinde hız sınırlama
Veritabanlarında ve/veya kapsayıcılarda yüksek hacimli meta veri işlemleri gerçekleştirdiğinizde meta veri hızı sınırlaması oluşabilir. Meta veri işlemleri şunlardır:
- Kapsayıcı veya veritabanı oluşturma, okuma, güncelleştirme veya silme
- Azure Cosmos DB hesabındaki veritabanlarını veya kapsayıcıları listeleme
- Sağlanan geçerli aktarım hızını görmek için teklifleri sorgulama
Bu işlemler için sistem tarafından ayrılmış bir RU sınırı vardır, bu nedenle veritabanı veya kapsayıcının sağlanan RU/sn'lerini artırmanın hiçbir etkisi olmaz ve önerilmez. Bkz. Denetim Düzlemi Hizmet Sınırları.
Araştırma adımları
Durum Koduna Göre İçgörüler>Sistem>Meta Veri İstekleri'ne gidin. İsterseniz belirli bir veritabanı ve kapsayıcıya göre filtreleyin.
Önerilen çözüm
Uygulamanızın meta veri işlemleri gerçekleştirmesi gerekiyorsa, bu istekleri daha düşük bir hızda göndermek için bir geri alma ilkesi uygulamayı göz önünde bulundurun.
Statik Azure Cosmos DB istemci örneklerini kullanın. DocumentClient veya CosmosClient başlatıldığında Azure Cosmos DB SDK'sı tutarlılık düzeyi, veritabanları, kapsayıcılar, bölümler ve teklifler hakkında bilgiler de dahil olmak üzere hesap hakkındaki meta verileri getirir. Bu başlatma işlemi çok sayıda RU kullanabileceğinden seyrek gerçekleştirilmelidir. Tek bir DocumentClient örneğini, uygulamanızın yaşam ömrü boyunca kullanın.
Veritabanlarının ve kapsayıcıların adlarını önbelleğe alın. Veritabanlarınızın ve kapsayıcılarınızın adlarını yapılandırmadan alın veya başlangıçta önbelleğe alın. ReadDatabaseAsync/ReadDocumentCollectionAsync veya CreateDatabaseQuery/CreateDocumentCollectionQuery gibi çağrılar, sisteme ayrılmış RU sınırından kullanan hizmete meta veri çağrılarına neden olur. Bu işlemler seyrek gerçekleştirilmelidir.
Geçici hizmet hatası nedeniyle hız sınırlama
İstek geçici bir hizmet hatasıyla karşılaştığında bu 429 hatası döndürülür. Veritabanı veya kapsayıcıda RU/sn'yi artırmanın hiçbir etkisi olmaz ve önerilmez.
Önerilen çözüm
İsteği yeniden deneyin. Hata birkaç dakika devam ederse Azure portalından bir destek bileti oluşturun.
Sonraki adımlar
- Veritabanınızın veya kapsayıcınızın normalleştirilmiş RU/sn tüketimini izleyin.
- Azure Cosmos DB .NET SDK'sını kullanırken sorunları tanılama ve giderme .
- .NET v3 ve .NET v2 için performans yönergeleri hakkında bilgi edinin.
- Azure Cosmos DB Java v4 SDK'sını kullanırken karşılaşılan sorunları tanılama ve giderme .
- Java v4 SDK'sı için performans yönergeleri hakkında bilgi edinin.