Share via


Apache Cassandra için Azure Cosmos DB'de sık karşılaşılan sorunları giderme

ŞUNLAR IÇIN GEÇERLIDIR: Cassandra

Azure Cosmos DB'deki Cassandra API'si, açık kaynak Apache Cassandra veritabanı için kablo protokolü desteği sağlayan bir uyumluluk katmanıdır.

Bu makalede Apache Cassandra için Azure Cosmos DB kullanan uygulamalara yönelik yaygın hatalar ve çözümler açıklanmaktadır. Hatanız listelenmiyorsa ve Cassandra'da desteklenen bir işlemi yürüttüğünüzde bir hatayla karşılaşıyorsanız ancak yerel Apache Cassandra kullanırken hata yoksa Azure desteği isteği oluşturun.

Not

Tam olarak yönetilen buluta özel bir hizmet olan Azure Cosmos DB, Cassandra API'si için kullanılabilirlik, aktarım hızı ve tutarlılık garantileri sağlar. Cassandra IÇIN API ayrıca sıfır bakım platformu işlemlerini ve sıfır kapalı kalma süresi düzeltme eki uygulama işlemlerini kolaylaştırır.

Bu garantiler Apache Cassandra'nın önceki uygulamalarında mümkün değildir, bu nedenle Cassandra arka uç işlemleri için API'nin çoğu Apache Cassandra'dan farklıdır. Yaygın hataları önlemeye yardımcı olmak için belirli ayarları ve yaklaşımları öneririz.

NoNodeAvailableException

Bu hata, çoğu istemciyle ilgili olabilecek çok sayıda olası nedeni ve iç özel durumu olan en üst düzey sarmalayıcı özel durumudur.

Yaygın nedenler ve çözümler:

Konağa bağlanılamıyor

Şu hatayı görebilirsiniz: "Herhangi bir konağa bağlanılamıyor, 600000 milisaniye içinde yeniden deneme zamanlanıyor."

Bu hatanın nedeni istemci tarafında kaynak ağ adresi çevirisi (SNAT) tükenmesi olabilir. Bu sorunu göz ardı etmek için giden bağlantılar için SNAT'deki adımları izleyin.

Hata, Azure yük dengeleyicinin varsayılan olarak dört dakikalık boşta kalma zaman aşımına sahip olduğu boşta kalma zaman aşımı sorunu da olabilir. Bkz . Yük dengeleyici boşta kalma zaman aşımı. Java sürücüsü için etkin tutma özelliğini etkinleştirin ve işletim sistemindeki aralığı dört dakikadan kısa olacak şekilde ayarlayın keepAlive .

Özel durumu işlemenin diğer yolları için bkz. NoHostAvailableException sorunlarını giderme .

OverloadedException (Java)

Tüketilen toplam istek birimi sayısı anahtar alanı veya tabloda sağladığınız istek birimi sayısından yüksek olduğundan istekler kısıtlanır.

Azure portal bir anahtar alanına veya tabloya atanan aktarım hızını ölçeklendirmeyi (bkz. Apache Cassandra hesabı için Azure Cosmos DB'yi esnek bir şekilde ölçeklendirme) veya yeniden deneme ilkesi uygulamayı göz önünde bulundurun.

Java için bkz. v3.x sürücüsü ve v4.x sürücüsü için yeniden deneme örnekleri. Ayrıca bkz. Java için Azure Cosmos DB Cassandra Uzantıları.

Yeterli aktarım hızına rağmen OverloadedException

İstek hacmi veya tüketilen istek birimi maliyeti için yeterli aktarım hızı sağlansa bile sistem istekleri azaltıyor gibi görünüyor. İki olası neden vardır:

  • Şema düzeyi işlemleri: Cassandra API'si şema düzeyinde işlemler (CREATE TABLE, ALTER TABLE, DROP TABLE) için bir sistem aktarım hızı bütçesi uygular. Bu bütçe bir üretim sistemindeki şema işlemleri için yeterli olmalıdır. Ancak, çok sayıda şema düzeyi işleminiz varsa bu sınırı aşabilirsiniz.

    Bütçe kullanıcı denetiminde olmadığından çalıştırdığınız şema işlemlerinin sayısını azaltmayı göz önünde bulundurun. Bu eylem sorunu çözmezse veya iş yükünüz için uygun değilse bir Azure desteği isteği oluşturun.

  • Veri dengesizliği: Cassandra için API'de aktarım hızı sağlandığında, fiziksel bölümler arasında eşit olarak bölünür ve her fiziksel bölümün üst sınırı vardır. Belirli bir bölümden eklenen veya sorgulanan yüksek miktarda veriniz varsa, bu tablo için büyük miktarda genel aktarım hızı (istek birimi) sağlasanız bile hız sınırlı olabilir.

    Veri modelinizi gözden geçirin ve sık erişimli bölümlere neden olabilecek aşırı dengesizlik olmadığından emin olun.

Aralıklı bağlantı hataları (Java)

Bağlantı beklenmedik bir şekilde düşüyor veya zaman aşımına uğradı.

Java için Apache Cassandra sürücüleri iki yerel yeniden bağlantı ilkesi sağlar: ExponentialReconnectionPolicy ve ConstantReconnectionPolicy. Varsayılan değer: ExponentialReconnectionPolicy. Ancak Apache Cassandra için Azure Cosmos DB için iki saniyelik bir gecikme yapmanızı öneririz ConstantReconnectionPolicy .

Java 4.x sürücüsünün belgelerine, Java 3.x sürücüsü belgelerine veya Java sürücüsü örnekleri için ReconnectionPolicy'yi Yapılandırma'ya bakın.

Yük dengeleme ilkesiyle ilgili hata

Java DataStax sürücüsünün v3.x dosyasında aşağıdakine benzer koda sahip bir yük dengeleme ilkesi uygulamış olabilirsiniz:

cluster = Cluster.builder()
        .addContactPoint(cassandraHost)
        .withPort(cassandraPort)
        .withCredentials(cassandraUsername, cassandraPassword)
        .withPoolingOptions(new PoolingOptions() .setConnectionsPerHost(HostDistance.LOCAL, 1, 2)
                .setMaxRequestsPerConnection(HostDistance.LOCAL, 32000).setMaxQueueSize(Integer.MAX_VALUE))
        .withSSL(sslOptions)
        .withLoadBalancingPolicy(DCAwareRoundRobinPolicy.builder().withLocalDc("West US").build())
        .withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM))
        .withSocketOptions(getSocketOptions())
        .build();

için withLocalDc() değeri kişi noktası veri merkeziyle eşleşmiyorsa, aralıklı bir hatayla karşılaşabilirsiniz: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried).

CosmosLoadBalancingPolicy'yi uygulayın. Çalışmasını sağlamak için aşağıdaki kodu kullanarak DataStax'ı yükseltmeniz gerekebilir:

LoadBalancingPolicy loadBalancingPolicy = new CosmosLoadBalancingPolicy.Builder().withWriteDC("West US").withReadDC("West US").build();

Büyük bir tabloda sayı başarısız oluyor

Çok sayıda satır için veya benzerini çalıştırdığınızda select count(*) from table , sunucu zaman aşımına uysa.

Yerel bir CQLSH istemcisi kullanıyorsanız veya --request-timeout ayarlarını değiştirin--connect-timeout. Bkz. cqlsh: CQL kabuğu.

Sayı hala zaman aşımına uysa, Azure portal ölçüm sekmesine gidip ölçümü seçip document countveritabanı veya koleksiyon için bir filtre ekleyerek (Azure Cosmos DB'deki tablonun analogu) Azure Cosmos DB arka uç telemetrisinden kayıt sayısını alabilirsiniz. Ardından, kayıt sayısını istediğiniz noktaya ait sonuçta elde edilen grafiğin üzerine gelebilirsiniz.

ölçümler görünümü

Java sürücüsü için ReconnectionPolicy'yi yapılandırma

Sürüm 3.x

Java sürücüsünün 3.x sürümü için, bir küme nesnesi oluştururken yeniden bağlanma ilkesini yapılandırın:

import com.datastax.driver.core.policies.ConstantReconnectionPolicy;

Cluster.builder()
  .withReconnectionPolicy(new ConstantReconnectionPolicy(2000))
  .build();

Sürüm 4.x

Java sürücüsünün 4.x sürümü için dosyadaki reference.conf ayarları geçersiz kılarak yeniden bağlanma ilkesini yapılandırın:

datastax-java-driver {
  advanced {
    reconnection-policy{
      # The driver provides two implementations out of the box: ExponentialReconnectionPolicy and
      # ConstantReconnectionPolicy. We recommend ConstantReconnectionPolicy for API for Cassandra, with 
      # base-delay of 2 seconds.
      class = ConstantReconnectionPolicy
      base-delay = 2 second
    }
}

Java sürücüsü için etkin tutma özelliğini etkinleştirme

Sürüm 3.x

Java sürücüsünün 3.x sürümü için, küme nesnesi oluştururken etkin tutma'yı ayarlayın ve ardından işletim sisteminde etkin tutma özelliğinin etkinleştirildiğinden emin olun:

import java.net.SocketOptions;
    
SocketOptions options = new SocketOptions();
options.setKeepAlive(true);
cluster = Cluster.builder().addContactPoints(contactPoints).withPort(port)
  .withCredentials(cassandraUsername, cassandraPassword)
  .withSocketOptions(options)
  .build();

Sürüm 4.x

Java sürücüsünün 4.x sürümü için, içindeki reference.confayarları geçersiz kılarak etkin tutma'yı ayarlayın ve ardından işletim sisteminde etkin tutma özelliğinin etkinleştirildiğinden emin olun:

datastax-java-driver {
  advanced {
    socket{
      keep-alive = true
    }
}

Sonraki adımlar