Bagikan melalui


Memecahkan masalah umum di Azure Cosmos DB for Apache Cassandra

BERLAKU UNTUK: Cassandra

API untuk Cassandra di Azure Cosmos DB adalah lapisan kompatibilitas yang menyediakan dukungan protokol kawat untuk database Apache Cassandra sumber terbuka.

Artikel ini menjelaskan kesalahan dan solusi umum untuk aplikasi yang menggunakan Azure Cosmos DB untuk Apache Cassandra. Jika kesalahan Anda tidak tercantum dan Anda mengalami kesalahan saat menjalankan operasi yang didukung di Cassandra, tetapi kesalahan tidak ada saat menggunakan Apache Cassandra asli, buatlah permintaan dukungan Azure.

Catatan

Sebagai layanan cloud-native yang dikelola sepenuhnya, Azure Cosmos DB memberikan jaminan pada ketersediaan, throughput, dan konsistensi untuk API untuk Cassandra. API untuk Cassandra juga memfasilitasi operasi platform tanpa pemeliharaan dan patching nol waktu henti.

Jaminan ini tidak dimungkinkan dalam implementasi Apache Cassandra sebelumnya, sehingga banyak API untuk operasi back-end Cassandra berbeda dari Apache Cassandra. Kami merekomendasikan pengaturan dan pendekatan tertentu untuk membantu menghindari kesalahan umum.

NoNodeAvailableException

Kesalahan ini adalah pengecualian wrapper tingkat atas dengan sejumlah besar kemungkinan penyebab dan pengecualian internal, banyak di antaranya dapat terkait dengan klien.

Penyebab umum dan solusi:

  • Batas waktu siaga Azure LoadBalancers: Masalah ini mungkin juga bermanifestasi sebagai ClosedConnectionException. Untuk mengatasi masalah ini, atur pengaturan tetap hidup di driver (lihat Mengaktifkan tetap hidup untuk driver Java) dan meningkatkan pengaturan tetap hidup di sistem operasi Anda, atau menyesuaikan batas waktu siaga di Azure Load Balancer.

  • Kelelahan sumber daya aplikasi klien: Pastikan bahwa komputer klien memiliki sumber daya yang memadai untuk menyelesaikan permintaan.

Tidak dapat menyambungkan ke host

Anda mungkin melihat kesalahan ini: "Tidak dapat terhubung ke host apa pun, menjadwalkan coba lagi dalam 600000 milidetik."

Kesalahan ini mungkin disebabkan oleh kelelahan terjemahan alamat jaringan sumber (SNAT) di pihak klien. Ikuti langkah-langkah di SNAT untuk koneksi keluar untuk mengesampingkan masalah ini.

Kesalahan mungkin juga merupakan masalah batas waktu siaga di mana penyeimbang muatan Azure memiliki batas waktu siaga secara default selama empat menit. Lihat Batas waktu siaga penyeimbang muatan. Aktifkan tetap hidup untuk driver Java dan atur keepAlive interval pada sistem operasi menjadi kurang dari empat menit.

Lihat memecahkan masalah NoHostAvailableException untuk cara lain menangani pengecualian tersebut.

OverloadedException (Java)

Permintaan dibatasi karena jumlah total unit permintaan yang digunakan lebih tinggi dari jumlah unit permintaan yang Anda berikan pada ruang kunci atau tabel.

Pertimbangkan untuk menskalakan throughput yang ditetapkan ke keyspace atau tabel dari portal Azure (lihat Menskalakan akun Azure Cosmos DB for Apache Cassandra secara elastis) atau menerapkan kebijakan coba lagi.

Untuk Java, lihat mencoba sampel lagi untuk driver v3.x dan driver v4.x. Lihat juga Ekstensi Cassandra Azure Cosmos DB untuk Java.

OverloadedException meskipun throughput cukup

Sistem tampaknya akan membatasi permintaan meskipun throughput yang cukup disediakan untuk volume permintaan atau biaya unit permintaan yang dikonsumsi. Ada dua kemungkinan penyebabnya:

  • Operasi tingkat skema: API untuk Cassandra menerapkan anggaran throughput sistem untuk operasi tingkat skema (CREATE TABLE, ALTER TABLE, DROP TABLE). Anggaran ini harus cukup untuk operasi skema dalam sistem produksi. Namun, jika Anda memiliki jumlah operasi tingkat skema yang tinggi, Anda mungkin melebihi batas ini.

    Hal ini karena anggaran tidak dikendalikan pengguna, pertimbangkan untuk menurunkan jumlah operasi skema yang Anda jalankan. Jika tindakan tersebut tidak mengatasi masalah atau tidak layak untuk beban kerja Anda, buatlah permintaan dukungan Azure.

  • Ke condong data: Ketika throughput disediakan dalam API untuk Cassandra, throughput dibagi rata antara partisi fisik, dan setiap partisi fisik memiliki batas atas. Jika Anda memiliki sejumlah besar data yang dimasukkan atau dikueri dari satu partisi tertentu, mungkin terbatas pada tarif bahkan jika Anda menyediakan sejumlah besar throughput keseluruhan (unit permintaan) untuk tabel tersebut.

    Tinjau model data Anda dan pastikan Anda tidak memiliki kecondongan berlebihan yang dapat menyebabkan partisi panas.

Kesalahan konektivitas terputus-terputus (Java)

Koneksi turun atau waktu habis secara tak terduga.

Driver Apache Cassandra untuk Java menyediakan dua kebijakan rekoneksi asli: ExponentialReconnectionPolicy dan ConstantReconnectionPolicy. Default adalah ExponentialReconnectionPolicy. Namun, untuk Azure Cosmos DB untuk Apache Cassandra, kami sarankan ConstantReconnectionPolicy dengan penundaan dua detik.

Lihat dokumentasi untuk driver Java 4.x, dokumentasi untuk driver Java 3.x, atau Mengonfigurasi ReconnectionPolicy untuk contoh driver Java.

Kesalahan dengan kebijakan penyeimbangan beban

Anda mungkin telah menerapkan kebijakan penyeimbangan beban di v3.x driver Java DataStax, dengan kode yang mirip dengan:

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();

Jika nilai untuk withLocalDc() tidak cocok dengan pusat data titik kontak, Anda mungkin mengalami kesalahan terputus-terputus: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried).

Terapkan CosmosLoadBalancingPolicy. Untuk membuatnya berfungsi, Anda mungkin perlu memutakhirkan DataStax dengan menggunakan kode berikut:

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

Hitungan gagal pada tabel besar

Saat Anda menjalankan select count(*) from table atau serupa untuk sejumlah besar baris, server akan kehabisan waktu.

Jika Anda menggunakan klien CQLSH lokal, ubah pengaturan --connect-timeout atau --request-timeout. Lihat cqlsh: shell CQL.

Jika hitungan masih kehabisan waktu, Anda bisa mendapatkan hitungan catatan dari telemetri back-end Azure Cosmos DB dengan masuk ke tab metrik di portal Microsoft Azure, memilih metrik document count, lalu menambahkan filter untuk database atau koleksi (analog tabel di Microsoft Azure Cosmos DB). Anda kemudian dapat mengarahkan kursor ke grafik yang dihasilkan untuk titik waktu di mana Anda menginginkan hitungan jumlah rekaman.

tampilan metrik

Mengonfigurasi ReconnectionPolicy untuk driver Java

Versi 3.x

Untuk driver Java versi 3.x, konfigurasikan kebijakan koneksi ulang saat Anda membuat objek kluster:

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

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

Versi 4.x

Untuk driver Java versi 4.x, konfigurasikan kebijakan koneksi ulang dengan mengganti setelan dalam file reference.conf:

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
    }
}

Aktifkan tetap hidup untuk driver Java

Versi 3.x

Untuk versi driver Java versi 3.x, atur tetap hidup saat Anda membuat objek kluster, dan kemudian pastikan bahwa tetap hidup diaktifkan dalam sistem operasi:

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

Versi 4.x

Untuk driver Java versi 4.x, atur tetap hidup dengan menimpa pengaturan di reference.conf, lalu pastikan bahwa tetap hidup diaktifkan dalam sistem operasi:

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

Langkah berikutnya