استكشاف المشكلات الشائعة في Azure Cosmos DB ل Apache Cassandra وإصلاحها

ينطبق على: كاساندرا

واجهة برمجة التطبيقات ل Cassandra في Azure Cosmos DB هي طبقة توافق توفر دعم بروتوكول سلكي لقاعدة بيانات Apache Cassandra مفتوحة المصدر.

توضح هذه المقالة الأخطاء والحلول الشائعة للتطبيقات التي تستخدم Azure Cosmos DB ل Apache Cassandra. إذا لم يتم سرد خطأك وكنت تواجه خطأ عند تنفيذ عملية معتمدة في Cassandra، ولكن الخطأ غير موجود عند استخدامApache Cassandra الأصلي، أنشئ طلب دعم من Azure.

إشعار

كخدمة سحابية أصلية مدارة بالكامل، يوفر Azure Cosmos DB ضمانات حول التوفر ومعدل النقل والاتساق لواجهة برمجة التطبيقات ل Cassandra. تسهل واجهة برمجة التطبيقات ل Cassandra أيضا عمليات النظام الأساسي للصيانة الصفرية وتصحيح وقت التعطل الصفري.

هذه الضمانات غير ممكنة في التطبيقات السابقة ل Apache Cassandra، لذلك يختلف العديد من واجهة برمجة التطبيقات لعمليات Cassandra الخلفية عن Apache Cassandra. نوصي بإعدادات ونهج معينة للمساعدة في تجنب الأخطاء الشائعة.

NoNodeAvailableException

هذا الخطأ استثناء برنامج تضمين المستوى الأعلى مع عدد كبير من الأسباب المحتملة والاستثناءات الداخلية، يمكن أن يكون العديد منها ذات صلة بالعميل.

المشاكل والحلول الشائعة

يتعذَّر الاتصال بالخادم

قد ترى هذا الخطأ: "لا يمكن الاتصال بأي مضيف، جدولة إعادة المحاولة في 600000 مللي ثانية."

قد يكون سبب هذا الخطأ استنفاد ترجمة عنوان الشبكة المصدر (SNAT) على جانب العميل. اتبع الخطوات في ترجمة عنوان الشبكة المصدر للاتصالات الصادرة لاستبعاد هذه المشكلة.

قد يكون الخطأ أيضا مشكلة مهلة خاملة حيث كان لدى موازن تحميل Azure أربع دقائق من مهلة الخمول بشكل افتراضي. راجع مهلة الخمول لموازن التحميل. تمكين الاحتفاظ بحيوية لبرنامج تشغيل Java وتعيين keepAlive الفاصل الزمني على نظام التشغيل إلى أقل من أربع دقائق.

راجع استكشاف أخطاء NoHostAvailableException وإصلاحها لمعرفة مزيد من الطرق لمعالجة الاستثناء.

OverloadedException (Java)

يتم خنق الطلبات لأن إجمالي عدد وحدات الطلب المستهلكة أعلى من عدد وحدات الطلب التي قمت بتوفيرها على مساحة المفتاح أو الجدول.

ضع في اعتبارك تحجيم معدل النقل المعين لمساحة مفتاح أو جدول من مدخل Microsoft Azure (راجع تغيير حجم Azure Cosmos DB لحساب Apache Cassandra بشكل مرن) أو تنفيذ نهج إعادة المحاولة.

بالنسبة لـJava، راجع عينات إعادة المحاولة لبرنامج تشغيل v3.xوبرنامج تشغيل v4.x. راجع أيضا Azure Cosmos DB Cassandra Extensions ل Java.

OverloadedException على الرغم من معدل النقل الكافي

يبدو أن النظام يخنق الطلبات على الرغم من توفير معدل نقل كافي لحجم الطلب أو تكلفة وحدة الطلب المستهلكة. هناك سببان محتملان:

  • عمليات مستوى المخطط: تنفذ واجهة برمجة التطبيقات ل Cassandra موازنة معدل نقل النظام للعمليات على مستوى المخطط (CREATE TABLE، ALTER TABLE، DROP TABLE). ينبغي أن تكون هذه الميزانية كافية لعمليات المخطط في نظام إنتاج. ومع ذلك، إذا كان لديك عدد كبير من العمليات على مستوى المخطط، قد تتجاوز هذا الحد.

    نظرا لعدم تحكم المستخدم في الميزانية، خذ بعين الاعتبار خفض عدد عمليات المخطط التي تشغلها. إذا لم يحل هذا الإجراء المشكلة أو لم يكن ممكنا لحمل عملك، أنشئ طلب دعم Azure.

  • انحراف البيانات: عند توفير معدل النقل في واجهة برمجة التطبيقات ل Cassandra، يتم تقسيمها بالتساوي بين الأقسام المادية، ولكل قسم مادي حد أعلى. إذا كان لديك كمية عالية من البيانات التي يتم إدراجها أو الاستعلام عنها من قسم معين واحد، قد يكون محدودة المعدل حتى إذا وفرت كمية كبيرة من معدل النقل الإجمالي (وحدات الطلب) لهذا الجدول.

    راجع نموذج بياناتك وتأكد من عدم وجود انحراف مفرط قد يسبب أقساما ساخنة.

أخطاء الاتصال المتقطع (Java)

ينخفض الاتصال أو ينتهي بشكل غير متوقع.

يوفر برنامج تشغيل Apache Cassandra لـJava اثنين من سياسات إعادة الاتصال الأصلي: ExponentialReconnectionPolicy وConstantReconnectionPolicy. الافتراضي هو ExponentialReconnectionPolicy. ومع ذلك، بالنسبة إلى Azure Cosmos DB ل Apache Cassandra، نوصي ConstantReconnectionPolicy بتأخير لمدة ثانيتين.

راجع وثائق برنامج تشغيل Java 4.x، أو وثائق برنامج تشغيل Java 3.xأو تكوين ReconnectionPolicy للحصول على أمثلة برنامج تشغيل Java.

خطأ في سياسة موازنة التحميل

قد تكون قد طبقت سياسة موازنة التحميل في v3.x لبرنامج تشغيل Java DataStax، مع رمز مشابه لما يلي:

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

إذا كانت القيمة withLocalDc() لا تتطابق مع مركز البيانات لنقطة الاتصال، قد تواجه خطأ متقطع: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried).

نفذ CosmosLoadBalancingPolicy. لجعلها تعمل، قد تحتاج إلى ترقية DataStax باستخدام الرمز التالي:

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

فشل العد على جدول كبير

عند تشغيلك select count(*) from table أو مشابه لعدد كبير من الصفوف، ينقطع الخادم.

إذا كنت تستخدم عميل CQLSH محلي، غيّر إعدادات --connect-timeout أو --request-timeout. راجع cqlsh: CQL shell.

إذا كان العد لا يزال ينقطع، يمكنك الحصول على عدد من السجلات من القياس عن بعد لقاعدة بيانات Azure Cosmos الخلفية عن طريق الانتقال إلى علامة التبويب المقاييس في مدخل Azure، وتحديد document count المقياس، ثم إضافة عامل تصفية لقاعدة البيانات أو المجموعة (التناظرية للجدول في قاعدة بيانات Azure Cosmos). يمكنك بعد ذلك تمرير الماوس فوق الرسم البياني الناتج للنقطة الزمنية التي تريد فيها حساب عدد السجلات.

طريقة عرض المقاييس

تكوين ReconnectionPolicy لبرنامج تشغيل Java

الإصدار 3.x

للحصول على الإصدار 3.x لبرنامج تشغيل Java، كون سياسة إعادة الاتصال عند إنشاءك كائن مجموعة:

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

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

الإصدار 4.x

للحصول على الإصدار 4.x لبرنامج تشغيل Java، كون سياسة إعادة الاتصال عن طريق تجاوز الإعدادات في 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
    }
}

تمكين الاحتفاظ بحيوية لبرنامج تشغيل Java

الإصدار 3.x

للحصول على الإصدار 3.x لبرنامج تشغيل Java، عين الاحتفاظ بالحيوية عند إنشاء كائن مجموعة، ثم تأكد من تمكين الاحتفاظ بالحيوية في نظام التشغيل:

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

الإصدار 4.x

للحصول على الإصدار 4.x لبرنامج تشغيل Java، عين الاحتفاظ بالحيوية من خلال تجاوز الإعدادات فيreference.conf، ثم تأكد من تمكين الاحتفاظ بحيوية في نظام التشغيل:

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

الخطوات التالية