Apache Cassandra için Azure Cosmos DB ile gelişmiş tanılama sorgularıyla ilgili sorunları giderme

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

Bu makalede, kaynağa özgü tablolara gönderilen tanılama günlüklerini kullanarak Cassandra için Azure Cosmos DB hesabınızla ilgili sorunları gidermeye yardımcı olmak için daha gelişmiş sorgular yazmayı ele alacağız.

Azure Tanılama tablolarda tüm veriler tek bir tabloya yazılır. Kullanıcılar sorgulamak istedikleri kategoriyi belirtir. İsteğinizin tam metin sorgusunu görüntülemek istiyorsanız bu özelliği etkinleştirmeyi öğrenmek için bkz . Azure'da tanılama ayarlarını kullanarak Azure Cosmos DB verilerini izleme.

Kaynağa özgü tablolar için veriler, kaynağın her kategorisi için tek tek tablolara yazılır. Aşağıdakiler nedeniyle bu modu öneririz:

  • Verilerle çalışmayı çok daha kolay hale getirir.
  • Şemaların daha iyi bulunabilirliğini sağlar.
  • Hem alma gecikme süresi hem de sorgu sürelerinde performansı artırır.

Önkoşullar

Uyarı

Cassandra hesabı için API için bir Tanılama Ayarı oluştururken, "DataPlaneRequests" seçeneğinin seçili kalmadığından emin olun. Buna ek olarak, Hedef tablosu için "Azure tanılaması" üzerinden önemli maliyet tasarrufu sağladığından "Kaynağa özgü" öğesinin seçildiğinden emin olun.

Not

Tam metin tanılamasını etkinleştirerek döndürülen sorguların PII verileri içereceğini unutmayın. Bu özellik yalnızca sorgunun iskeletini karartılmış parametrelerle günlüğe kaydetmekle kalmaz, parametrelerin değerlerini de günlüğe kaydeder. Bu, belirli bir Birincil Anahtardaki (veya Birincil Anahtar kümesindeki) sorguların diğer Birincil Anahtarlardaki sorgulardan çok daha fazla RU kullanıp kullanmadığını tanılamaya yardımcı olabilir.

Farklı senaryolara sahip Log Analytics sorguları

Azure Cosmos DB'de Log Analytics'i nasıl kullanabileceğinizle ilgili olası soruları içeren kabarcık sözcük haritasının görüntüsü

RU tüketimi

  • Yüksek RU/sn tüketen Cassandra işlemleri.

    CDBCassandraRequests 
    | where DatabaseName=="azure_comos" and CollectionName=="user" 
    | project TimeGenerated, RequestCharge, OperationName,
    requestType=split(split(PIICommandText,'"')[3], ' ')[0]
    | summarize max(RequestCharge) by bin(TimeGenerated, 10m), tostring(requestType), OperationName;
    
  • Mantıksal bölüm anahtarlarında işlem başına RU tüketimini izleme.

    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_comos" and CollectionName=="user"
    | summarize TotalRequestCharge=sum(todouble(RequestCharge)) by PartitionKey, PartitionKeyRangeId
    | order by TotalRequestCharge;
    
    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_comos" and CollectionName=="user"
    | summarize TotalRequestCharge=sum(todouble(RequestCharge)) by OperationName, PartitionKey
    | order by TotalRequestCharge;
    
    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_comos" and CollectionName=="user"
    | summarize TotalRequestCharge=sum(todouble(RequestCharge)) by bin(TimeGenerated, 1m), PartitionKey
    | render timechart;
    
  • RU tüketimini etkileyen en önemli sorgular nelerdir?

    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where TimeGenerated > ago(24h)
    | project ActivityId, DatabaseName, CollectionName, queryText=split(split(PIICommandText,'"')[3], ' ')[0], RequestCharge, TimeGenerated
    | order by RequestCharge desc;
    
  • Ru tüketimi, okuma ve yazma işlemleri için yük boyutlarındaki varyasyonlara göredir.

    // This query is looking at read operations
    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0]
    | where cassandraOperationName =="SELECT"
    | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName)
    
    // This query is looking at write operations
    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0]
    | where cassandraOperationName in ("CREATE", "UPDATE", "INSERT", "DELETE", "DROP")
    | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName)
    
    // Write operations over a time period.
    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0]
    | where cassandraOperationName in ("CREATE", "UPDATE", "INSERT", "DELETE", "DROP")
    | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName)
    | render timechart;
    
    // Read operations over a time period.
    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | project ResponseLength, TimeGenerated, RequestCharge, cassandraOperationName=split(split(PIICommandText,'"')[3], ' ')[0]
    | where cassandraOperationName =="SELECT"
    | summarize maxResponseLength=max(ResponseLength), maxRU=max(RequestCharge) by bin(TimeGenerated, 10m), tostring(cassandraOperationName)
    | render timechart;
    
  • Mantıksal bölüme göre okuma ve yazma işlemlerini temel alan RU tüketimi.

    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where OperationName in ("Delete", "Read", "Upsert")
    | summarize totalRU=max(RequestCharge) by OperationName, PartitionKeyRangeId
    
  • Fiziksel ve mantıksal bölüme göre RU tüketimi.

    CDBPartitionKeyRUConsumption
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | summarize totalRequestCharge=sum(RequestCharge) by PartitionKey, PartitionKeyRangeId;
    
  • Sık erişimli bölüm yüksek RU tüketimine yol açıyor mu?

    CDBPartitionKeyStatistics
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where  TimeGenerated > now(-8h)
    | summarize StorageUsed = sum(SizeKb) by PartitionKey
    | order by StorageUsed desc
    
  • Bölüm anahtarı RU tüketimini nasıl etkiler?

    let storageUtilizationPerPartitionKey = 
    CDBPartitionKeyStatistics
    | project AccountName=tolower(AccountName), PartitionKey, SizeKb;
    CDBCassandraRequests
    | project AccountName=tolower(AccountName),RequestCharge, ErrorCode, OperationName, ActivityId, DatabaseName, CollectionName, PIICommandText, RegionName
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | join kind=inner storageUtilizationPerPartitionKey  on $left.AccountName==$right.AccountName
    | where ErrorCode != -1 //successful
    | project AccountName, PartitionKey,ErrorCode,RequestCharge,SizeKb, OperationName, ActivityId, DatabaseName, CollectionName, PIICommandText, RegionName;
    

Gecikme süresi

  • Zaman penceresinde görülen sunucu tarafı zaman aşımlarının sayısı (Durum Kodu - 408).

    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where ErrorCode in (4608, 4352) //Corresponding code in Cassandra
    | summarize max(DurationMs) by bin(TimeGenerated, 10m), ErrorCode
    | render timechart;
    
  • Belirtilen zaman penceresinde sunucu tarafı gecikmelerinde ani artışlar gözlemleniyor mu?

    CDBCassandraRequests
    | where TimeGenerated > now(-6h)
    | DatabaseName=="azure_cosmos" and CollectionName=="user"
    | summarize max(DurationMs) by bin(TimeGenerated, 10m)
    | render timechart;
    
  • Azaltılan işlemler.

    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | project RequestLength, ResponseLength,
    RequestCharge, DurationMs, TimeGenerated, OperationName,
    query=split(split(PIICommandText,'"')[3], ' ')[0]
    | summarize max(DurationMs) by bin(TimeGenerated, 10m), RequestCharge, tostring(query),
    RequestLength, OperationName
    | order by RequestLength, RequestCharge;
    

Azaltma

  • Uygulamanız herhangi bir azaltma sorunu mu yaşıyor?

    CDBCassandraRequests
    | where RetriedDueToRateLimiting != false and RateLimitingDelayMs > 0;
    
  • Uygulamanızın belirli bir süreyle kısıtlamasına neden olan sorgular özel olarak 429'a bakar.

    CDBCassandraRequests
    | where DatabaseName=="azure_cosmos" and CollectionName=="user"
    | where ErrorCode==4097 // Corresponding error code in Cassandra
    | project DatabaseName , CollectionName , CassandraCommands=split(split(PIICommandText,'"')[3], ' ')[0] , OperationName, TimeGenerated;
    

Sonraki adımlar