Memecahkan masalah NoHostAvailableException dan NoNodeAvailableException
NoHostAvailableException adalah pengecualian wrapper tingkat atas dengan banyak kemungkinan penyebab dan pengecualian internal. Banyak di antaranya bisa terkait dengan klien. Pengecualian ini cenderung terjadi jika ada beberapa masalah dengan pengaturan kluster atau koneksi, atau jika satu atau lebih node Cassandra tidak tersedia.
Artikel ini menjelaskan kemungkinan alasan dari pengecualian ini, dan membahas detail tertentu tentang driver klien yang sedang digunakan.
Pengaturan driver
Salah satu penyebab paling umum dari NoHostAvailableException adalah pengaturan driver default. Sebaiknya gunakan pengaturan yang tercantum di akhir artikel ini. Berikut adalah beberapa informasi penjelasan:
- Nilai default koneksi per host adalah 1, yang tidak kami rekomendasikan untuk Azure Cosmos DB. Kami merekomendasikan nilai minimum 10. Meskipun disediakan Unit Permintaan (RU) yang lebih banyak, tambahkan jumlah koneksi. Pedoman umum adalah 10 koneksi per 200.000 RU.
- Gunakan kebijakan percobaan kembali Azure Cosmos DB untuk menangani respons pembatasan yang terputus-terputus. Untuk informasi selengkapnya, lihat pustaka ekstensi Azure Cosmos DB:
- Untuk akun multi-wilayah, gunakan kebijakan penyeimbangan muatan Azure Cosmos DB pada ekstensi.
- Waktu habis permintaan baca harus diatur pada lebih dari 1 menit. Kami menyarankan 90 detik.
Pesan pengecualian
Jika pengecualian tetap ada setelah Anda melakukan perubahan yang direkomendasikan, tinjau pesan pengecualian dalam tiga bagian berikutnya. Jika log galat Anda berisi salah satu pesan pengecualian ini, ikuti rekomendasi untuk pengecualian tersebut.
BusyPoolException
Kesalahan sisi klien ini menandakan bahwa jumlah maksimum koneksi permintaan untuk suatu host telah dicapai. Jika Anda tidak dapat menghapus permintaan dari antrean, Anda mungkin melihat kesalahan ini. Jika koneksi per host telah disetel ke minimal 10, pengecualian bisa disebabkan oleh latensi sisi server yang tinggi.
Java driver v3 exception:
All host(s) tried for query failed (tried: :10350 (com.datastax.driver.core.exceptions.BusyPoolException: [:10350] Pool is busy (no available connection and the queue has reached its max size 256)))
All host(s) tried for query failed (tried: :10350 (com.datastax.driver.core.exceptions.BusyPoolException: [:10350] Pool is busy (no available connection and timed out after 5000 MILLISECONDS)))
C# driver 3:
All hosts tried for query failed (tried :10350: BusyPoolException 'All connections to host :10350 are busy, 2048 requests are in-flight on each 10 connection(s)')
Rekomendasi
Alih-alih menyetel max requests per connection, pastikan bahwa connections per host disetel ke minimal 10. Lihat bagian sampel kode.
TooManyRequest(429)
OverloadException akan muncul ketika tingkat permintaan terlalu banyak, yang mungkin terjadi ketika tidak tersedia cukup throughput untuk tabel dan anggaran RU terlampaui. Untuk informasi selengkapnya, lihat permintaan besar dan percobaan kembali sisi server.
Rekomendasi
Terapkan salah satu opsi berikut ini:
- Jika pembatasan terus terjadi, tambahkan RU yang diprovisikan.
- Jika pembatasan terputus-putus, gunakan kebijakan percobaan kembali Azure Cosmos DB.
- Jika pustaka ekstensi tidak dapat direferensikan, aktifkan percobaan kembali sisi server.
Semua host yang mencoba untuk mengkueri gagal
Saat klien disetel untuk terhubung ke kawasan selain wilayah titik kontak utama, selama beberapa detik pertama saat memulai, Anda akan mendapatkan salah satu pesan pengecualian berikut:
Untuk Java driver 3:
Exception in thread "main" com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)at cassandra.driver.core@3.10.2/com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:83)Untuk Java driver 4:
No node was available to execute the queryUntuk C# driver 3:
System.ArgumentException: Datacenter West US does not match any of the nodes, available datacenters: West US 2
Rekomendasi
Gunakan CosmosLoadBalancingPolicy di Java driver 3 dan Java driver 4. Kebijakan ini kembali ke titik kontak wilayah tulis utama tempat data lokal yang ditentukan tidak tersedia.
Catatan
Jika rekomendasi sebelumnya tidak membantu mengatasi masalah Anda, hubungi dukungan Azure Cosmos DB. Pastikan untuk menyediakan detail berikut ini: pesan pengecualian, stacktrace pengecualian, log driver datastax, waktu universal kegagalan, kegagalan yang konsisten atau terputus-terputus, keyspace dan tabel yang gagal, jenis permintaan yang gagal, dan versi SDK.
Sampel kode
Pengaturan Java driver 3
// socket options with default values
// https://docs.datastax.com/en/developer/java-driver/3.6/manual/socket_options/
SocketOptions socketOptions = new SocketOptions()
.setReadTimeoutMillis(90000); // default 12000
// connection pooling options (default values are 1s)
// https://docs.datastax.com/en/developer/java-driver/3.6/manual/pooling/
PoolingOptions poolingOptions = new PoolingOptions()
.setCoreConnectionsPerHost(HostDistance.LOCAL, 10) // default 1
.setMaxConnectionsPerHost(HostDistance.LOCAL, 10) // default 1
.setCoreConnectionsPerHost(HostDistance.REMOTE, 10) // default 1
.setMaxConnectionsPerHost(HostDistance.REMOTE, 10); //default 1
// cosmos load balancing policy
String Region = "West US";
CosmosLoadBalancingPolicy cosmosLoadBalancingPolicy = CosmosLoadBalancingPolicy.builder()
.withWriteDC(Region)
.withReadDC(Region)
.build();
// cosmos retry policy
CosmosRetryPolicy retryPolicy = CosmosRetryPolicy.builder()
.withFixedBackOffTimeInMillis(5000)
.withGrowingBackOffTimeInMillis(1000)
.withMaxRetryCount(5)
.build();
Cluster cluster = Cluster.builder()
.addContactPoint(EndPoint).withPort(10350)
.withCredentials(UserName, Password)
.withSSL(sslOptions)
.withSocketOptions(socketOptions)
.withPoolingOptions(poolingOptions)
.withLoadBalancingPolicy(cosmosLoadBalancingPolicy)
.withRetryPolicy(retryPolicy)
.build();
Pengaturan Java driver 4
// driver configurations
// https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/configuration/
ProgrammaticDriverConfigLoaderBuilder configBuilder = DriverConfigLoader.programmaticBuilder();
// connection settings
// https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/pooling/
configBuilder
.withInt(DefaultDriverOption.CONNECTION_POOL_LOCAL_SIZE, 10) // default 1
.withInt(DefaultDriverOption.CONNECTION_POOL_REMOTE_SIZE, 10) // default 1
.withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(90)) // default 2
.withClass(DefaultDriverOption.RECONNECTION_POLICY_CLASS, ConstantReconnectionPolicy.class) // default ExponentialReconnectionPolicy
.withBoolean(DefaultDriverOption.METADATA_TOKEN_MAP_ENABLED, false); // default true
// load balancing settings
// https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/load_balancing/
String Region = "West US";
List<String> preferredRegions = new ArrayList<String>();
preferredRegions.add(Region);
configBuilder
.withClass(DefaultDriverOption.LOAD_BALANCING_POLICY_CLASS, CosmosLoadBalancingPolicy.class)
.withBoolean(CosmosLoadBalancingPolicyOption.MULTI_REGION_WRITES, false)
.withStringList(CosmosLoadBalancingPolicyOption.PREFERRED_REGIONS, preferredRegions);
// retry policy
// https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/retries/
configBuilder
.withClass(DefaultDriverOption.RETRY_POLICY_CLASS, CosmosRetryPolicy.class)
.withInt(CosmosRetryPolicyOption.FIXED_BACKOFF_TIME, 5000)
.withInt(CosmosRetryPolicyOption.GROWING_BACKOFF_TIME, 1000)
.withInt(CosmosRetryPolicyOption.MAX_RETRIES, 5);
CqlSession session = CqlSession.builder()
.withSslContext(sc)
.addContactPoint(new InetSocketAddress(EndPoint, Port))
.withAuthCredentials(UserName, Password)
.withLocalDatacenter(Region)
.withConfigLoader(configBuilder.build())
.build();
Pengaturan C# driver v3
PoolingOptions poolingOptions = PoolingOptions.Create()
.SetCoreConnectionsPerHost(HostDistance.Local, 10) // default 2
.SetMaxConnectionsPerHost(HostDistance.Local, 10) // default 8
.SetCoreConnectionsPerHost(HostDistance.Remote, 10) // default 1
.SetMaxConnectionsPerHost(HostDistance.Remote, 10); // default 2
SocketOptions socketOptions = new SocketOptions()
.SetReadTimeoutMillis(90000); // default 12000
buildCluster = Cluster.Builder()
.AddContactPoint(Program.ContactPoint)
.WithPort(Program.CosmosCassandraPort)
.WithCredentials(Program.UserName, Program.Password)
.WithPoolingOptions(poolingOptions)
.WithSocketOptions(socketOptions)
.WithReconnectionPolicy(new ConstantReconnectionPolicy(1000)) // default ExponentialReconnectionPolicy
.WithSSL(sslOptions);
Langkah berikutnya
- Untuk memahami berbagai kode galat beserta pengertiannya, lihat Diagnostik sisi server.
- Lihat Mendiagnosis dan memecahkan masalah dengan Azure Cosmos DB .NET SDK.
- Pelajari tentang pedoman performa untuk .NET v3 dan .NET v2.
- Lihat Memecahkan masalah dengan Azure Cosmos DB Java SDK v4 dengan akun SQL API.
- Lihat Tips performa untuk Azure Cosmos DB Java SDK v4.