<type>تشرح هذه الوثائق استخدام وتكوين "Esindex" وهو فهرس ثانوي يعتمد على Elasticsearch لكاساندرا.
يتطلب هذا البرنامج المساعد مجموعة Elasticsearch (ES) التي تم تكوينها بالفعل.
سيتم تثبيت البرنامج المساعد في إصدار Cassandra 4.0.x منتظم تم تنزيله من http://cassandra.apache.org/. لا يوجد شيء يجب تغييره في ملفات تكوين كاساندرا لدعم الفهرس. لا يزال سلوك كاساندرا دون تغيير للتطبيقات التي لا تستخدم الفهرس.
بمجرد إنشائها على جدول كاساندرا ، يسمح هذا الفهرس بإجراء استعلامات "البحث الكامل" على استفسارات Elasticsearch على Cassandra باستخدام CQL و Retring Matching Rows من Cassandra Data. لا يتطلب استخدام هذا البرنامج المساعد تغيير رمز مصدر كاساندرا ، فقد قمنا بتنفيذ فهرس Elasticsearch لكاساندرا باستخدام:

الإصدارات المختبرة هي Elasticsearch 5.x و 6.x و 7.x و Cassandra 4.0.x. ومع ذلك ، قد يعمل المكون الإضافي أيضًا مع إصدارات مختلفة من Elasticsearch (1.7 ، 2.x 5.x ، 6.x ، 7.x) إذا كان التطبيق يوفر التعيينات والخيارات المقابلة. لا يتم دعم الإصدارات الأخرى من Apache Cassandra مثل 1.x 2.x أو 3.x أو 4.1 لأن واجهة الفهرس الثانوية المستخدمة بواسطة المكون الإضافي مختلف. لم يتم اختبار بائعي كاساندرا الآخرين ، لا يتم دعم Scylladb.
| الإصدارات | Elasticsearch 1.x | Elasticsearch 2.x | Elasticsearch 5.x | Elasticsearch 6.x | Elasticsearch 7.x |
|---|---|---|---|---|---|
| كاساندرا 1.x | لا | لا | لا | لا | لا |
| كاساندرا 2.x | لا | لا | لا | لا | لا |
| كاساندرا 3.x | لا | لا | لا | لا | لا |
| كاساندرا 4.x | محدود | محدود | محدود | نعم | نعم |
يتطلب هذا المشروع maven وتجميعها مع Java 8. لبناء المكون الإضافي ، بجذر تنفيذ المشروع:
حزمة نظيفة MVN
سيؤدي هذا إلى بناء "الكل في جرة واحدة" في target/distribution/lib4cassandra
<dependency>
<groupId>com.genesyslab</groupId>
<artifactId>es-index</artifactId>
<version>9.2.000.00</version>
</dependency>
انظر حزمة github
انظر مستودع Maven
ضع es-index-9.2.000.xx-jar-with-dependencies.jar في مجلد lib في كاساندرا إلى جانب الجرار الكاساندرا الأخرى ، على سبيل المثال/usr/share/cassandra/lib 'على جميع عقد كاساندرا. ابدأ أو أعد تشغيل عقدة Cassandra الخاصة بك.
بسبب نقص الاختبار ، لا يتم دعم الجداول ذات المفاتيح التجميعية. يتم دعم مفتاح التقسيم فقط ، يجب أن تعمل مفاتيح التقسيم المركبة ولكن لم يتم اختبارها على نطاق واسع.
يدعم Esindex فقط مستوى الصف TTL حيث ستنتهي صلاحية جميع الخلايا في نفس الوقت ويمكن حذف مستند ES المقابل في نفس الوقت. إذا كان للصف خلايا تنتهي في أوقات مختلفة ، فسيتم حذف المستند المقابل عندما تنتهي صلاحية الخلية الأخيرة. إذا كنت تستخدم TTL خلايا مختلفة ، فستظل البيانات التي يتم إرجاعها من البحث متسقة حيث تتم قراءة البيانات من SSTables ، ولكن سيظل من الممكن العثور على الصف باستخدام بيانات منتهية الصلاحية باستخدام استعلام ES.
من الممكن إنشاء عدة فهارس على نفس الجدول ، لن يمنع Esindex ذلك. ومع ذلك ، إذا كان هناك أكثر من esindex واحد ، فقد يكون السلوك غير متسق ، فإن هذا التكوين غير مدعوم. يمكن استخدام أمر CQLSH "وصف الجدول <Ks.Tablename>" لإظهار الفهارس التي تم إنشاؤها على الجدول وإسقاطها إذا لزم الأمر.
من أجل البساطة ، قم بإنشاء هذه الفضاء أولاً:
CREATE KEYSPACE genesys WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}
دعنا نستخدم الجدول أدناه كمثال:
CREATE TABLE genesys.emails (
id UUID PRIMARY KEY,
subject text,
body text,
userid int,
query text
);
تحتاج إلى تكريس عمود نص وهمية لاستخدام الفهرس. يجب ألا يتلقى هذا العمود البيانات أبدًا. في هذا المثال ، عمود query هو العمود الوهمي.
فيما يلي كيفية إنشاء الفهرس لجدول المثال واستخدم ESHOST لـ Elasticsearch:
CREATE CUSTOM INDEX ON genesys.emails(query)
USING 'com.genesyslab.webme.commons.index.EsSecondaryIndex'
WITH OPTIONS = {'unicast-hosts': 'eshost:9200'};
على سبيل المثال ، إذا كان خادم Elasticsearch يستمع إلى localhost ، استبدل Eshost بـ LocalHost .
الأخطاء التي يتم إرجاعها بواسطة CQL محدودة للغاية ، إذا حدث خطأ ما ، مثل مضيف Elasticsearch الخاص بك غير متاح ، ستحصل على مهلة أو نوع آخر من الاستثناءات. سيكون عليك التحقق من سجلات كاساندرا لفهم الخطأ الذي حدث.
لم نقدم أي تعيين ، لذلك نحن نعتمد على رسم الخرائط الديناميكية Elasticsearch ، دعنا ندخل بعض البيانات:
INSERT INTO genesys.emails (id, subject, body, userid)
VALUES (904b88b2-9c61-4539-952e-c179a3805b22, 'Hello world', 'Cassandra is great, but it''s even better with EsIndex and Elasticsearch', 42);
يمكنك أن ترى أن الفهرس يتم إنشاؤه في Elasticsearch إذا كان لديك الوصول إلى السجلات:
[o.e.c.m.MetaDataCreateIndexService] [node-1] [genesys_emails_index@] creating index, cause [api], templates [], shards [5]/[1], mappings []
[INFO ][o.e.c.m.MetaDataMappingService] [node-1] [genesys_emails_index@/waSGrPvkQvyQoUEiwqKN3w] create_mapping [emails]
الآن يمكننا البحث عن كاساندرا باستخدام Elasticsearch عبر الفهرس ، إليك بحث بناء جملة Lucene:
select id, subject, body, userid, query from emails where query='body:cassan*';
id | subject | body | userid | query
--------------------------------------+-------------+-------------------------------------------------------------------------+--------+-------
904b88b2-9c61-4539-952e-c179a3805b22 | Hello world | Cassandra is great, but it's even better with EsIndex and Elasticsearch | 42 |
{
"_index": "genesys_emails_index@",
"_type": "emails",
"_id": "904b88b2-9c61-4539-952e-c179a3805b22",
"_score": 0.24257512,
"_source": {
"id": "904b88b2-9c61-4539-952e-c179a3805b22"
},
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.24257512
}
}
(1 rows)
(تم تنسيق JSON)
ستحتوي جميع الصفوف على بيانات من Cassandra محملة من SSTables باستخدام اتساق CQL. البيانات في عمود "الاستعلام" هي البيانات الوصفية التي تم إرجاعها بواسطة Elasticsearch.
فيما يلي كيفية الاستعلام عن Elasticsearch للتحقق من التعيين الذي تم إنشاؤه: GET http://eshost:9200/genesys_emails_index@/emails/_mapping?pretty
{
"genesys_emails_index@" : {
"mappings" : {
"emails" : {
"properties" : {
"IndexationDate" : {
"type" : " date "
},
"_cassandraTtl" : {
"type" : " long "
},
"body" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"id" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"subject" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"userid" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
}
}
}
}
}
}أضاف البرنامج المساعد Esindex حقلين:
يمكننا أن نرى أن التعيين يبدو جيدًا ، لكن Elasticsearch لم يلاحظ أن معرف المستخدم هو عدد صحيح ومضاف [الكلمة الرئيسية] لجميع النصوص.
إليكم كيف تبدو البيانات في Elasticsearch:
GET http://localhost:9200/genesys_emails_index@/emails/_search?pretty&q=body:cassandra
{
"took" : 2 ,
"timed_out" : false ,
"_shards" : {
"total" : 5 ,
"successful" : 5 ,
"skipped" : 0 ,
"failed" : 0
},
"hits" : {
"total" : 1 ,
"max_score" : 0.2876821 ,
"hits" : [
{
"_index" : " genesys_emails_index@ " ,
"_type" : " emails " ,
"_id" : " 904b88b2-9c61-4539-952e-c179a3805b22 " ,
"_score" : 0.2876821 ,
"_source" : {
"id" : " 904b88b2-9c61-4539-952e-c179a3805b22 " ,
"body" : " Cassandra is great, but it's even better with EsIndex and Elasticsearch " ,
"subject" : " Hello world " ,
"userid" : " 42 " ,
"IndexationDate" : " 2019-01-15T16:53:00.107Z " ,
"_cassandraTtl" : 2147483647
}
}
]
}
} دعنا نصلح التعيين عن طريق إسقاط الفهرس: drop index genesys.emails_query_idx; سيؤدي ذلك أيضًا إلى إسقاط فهرس Elasticsearch والبيانات!
وإعادة إنشائها برسم خرائط مناسب:
CREATE CUSTOM INDEX ON genesys.emails(query)
USING 'com.genesyslab.webme.commons.index.EsSecondaryIndex'
WITH OPTIONS = {
'unicast-hosts': 'localhost:9200',
'mapping-emails': '
{
"emails":{
"date_detection":false,
"numeric_detection":false,
"properties":{
"id":{
"type":"keyword"
},
"userid":{
"type":"long"
},
"subject":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"body":{
"type":"text"
},
"IndexationDate":{
"type":"date",
"format":"yyyy-MM-dd''T''HH:mm:ss.SSS''Z''"
},
"_cassandraTtl":{
"type":"long"
}
}
}
}
'};
سيؤدي ذلك إلى إنشاء فهرس جديد سيوفر تعيين البيانات الموجودة في كاساندرا.
هنا هو تعيين ES الناتج:
{
"genesys_emails_index@" : {
"mappings" : {
"emails" : {
"date_detection" : false ,
"numeric_detection" : false ,
"properties" : {
"IndexationDate" : {
"type" : " date " ,
"format" : " yyyy-MM-dd'T'HH:mm:ss.SSS'Z' "
},
"_cassandraTtl" : {
"type" : " long "
},
"body" : {
"type" : " text "
},
"id" : {
"type" : " keyword "
},
"subject" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"userid" : {
"type" : " long "
}
}
}
}
}
}الآن بعد أن تم تعريف التعيين بشكل صحيح ، يمكننا البحث عن معرف المستخدم كرقم. في هذا المثال ، نستخدم elasticsearch استعلام DSL:
select id, subject, body, userid from genesys.emails
where query='{"query":{"range":{"userid":{"gte":10,"lte":50}}}}';
@ Row 1
---------+-------------------------------------------------------------------------
id | 904b88b2-9c61-4539-952e-c179a3805b22
subject | Hello world
body | Cassandra is great, but it's even better with EsIndex and Elasticsearch
userid | 42
من المهم جدًا الحصول على الخرائط مباشرة قبل بدء الإنتاج. سيستغرق إدراك طاولة كبيرة الكثير من الوقت وسيضع حمولة كبيرة على كاساندرا و Elasticsearch. ستحتاج إلى التحقق من سجلات كاساندرا للأخطاء في تعيين ES. تأكد من الهروب من عروض الأسعار المفردة (') عن طريق مضاعفة خيارات JSON المقدمة إلى أمر إنشاء الفهرس.
فيما يلي جميع الخيارات المتعلقة بتكوين فهرس Elasticsearch. يمكن أن تستخدم الأسماء الرئيسية الواصلة "-" char أو النقاط. على سبيل المثال سيعمل كلا الاسمين:
لاحظ أن جميع الخيارات أدناه خاصة بتنفيذ Genesys وليس Elasticsearch نفسه.
إذا لم يتم العثور على فئات Jest ، يتم تمكين الوضع الوهمي ولا ينطبق أي حالات أخرى.
يتم دعم مقرات متعددة المدارس ويتم تكرار البيانات عبر تكرار Gossip Cassandra فقط. مجموعات ES على DCs المختلفة ليست هي نفسها ويجب ألا يتم ربطها معًا أو سيتم تأثر الأداء. نظرًا لأن البيانات يتم نسخها على مستوى الجدول ، ستحصل ESINDEX على تحديث في كل مجموعة DC وسيتم تحديث مجموعة ES المحلية أيضًا.

لدعم Multi-DC ، يمكن أن تربى جميع الخيارات عن طريق مركز البيانات واسم الرف لجعل الإعدادات محددة الموقع ، على سبيل المثال:
لتوفير مؤشر Cassandra لـ Elasticsearch مع بيانات الاعتماد ، يجب أن يكون لكل عقدة متغير البيئة المتغير بشكل صحيح قبل البدء. يجب تعيين هذا على جميع مضيفي كاساندرا.
يوفر المثال أدناه كلمة مرور المستخدم "مرن" وكلمة مرور "مثال" WASSORDWORD "مفصولة بواسطة: (القولون). يمكن القيام به إما مباشرة في النظام كمتغير بيئة أو في الاختصار الذي يطلق كاساندرا.
escredentials = مرنة: مثال على ذلك بمجرد تهيئة الفهرس بنجاح ، سيكتب "بيانات اعتماد Elasticsearch المقدمة" في سجلات كاساندرا على مستوى المعلومات. بمجرد إخراج هذه الرسالة ، من الممكن مسح متغير البيئة. إذا تم إعادة تشغيل Cassandra ، فيجب تعيين متغير البيئة مرة أخرى قبل البدء. يتم الحفاظ على بيانات الاعتماد في الذاكرة فقط ولا يتم حفظها في أي مكان آخر. إذا تم تغيير المستخدم و/أو كلمة المرور ، فيجب إعادة تشغيل جميع عقد Cassandra بقيمة متغير البيئة المحدثة.
في مجموعة خيارات الفهرس
Unicasts-Hosts = https : //<host name>:9200
من غير الممكن حاليًا ترحيل فهرس موجود من HTTP إلى HTTPS ، يجب تحديد استخدام واحد أو آخر قبل إنشاء مخطط كاساندرا. من أجل تخفيف نشر HTTPS ، سوف يثق الفهرس تلقائيًا بجميع شهادات HTTPS.
من الممكن الاحتفاظ بالبيانات على جانب Elasticsearch لفترة أطول من Cassandra TTL المحددة. يتم تشغيل هذا الوضع باستخدام خيار وضع التحليل ES-. عندما يتم تمكين الخيار ، سيتخطى المرونة في جميع عمليات الحذف.
للحفاظ على البيانات من النمو على جانب ES ، يُنصح باستخدام إعدادات TTL-Shift و Torp-Selete.
عند إنشاء الفهرس ، ستقوم بتوفير خيارات الفهرس ، بالإضافة إلى خيارات فهرس Elasticsearch باستخدام أمر CQL "باستخدام الخيار".
يجب تحديد خيارات الفهرس في إنشاء الفهرس ، إليك مثال
CREATE CUSTOM INDEX on genesys.email(query) using 'com.genesyslab.webme.commons.index.EsSecondaryIndex' WITH options =
{
'read-consistency-level':'QUORUM',
'insert-only':'false',
'index-properties': '{
"index.analysis.analyzer.dashless.tokenizer":"dash-ex",
"index.analysis.tokenizer.dash-ex.pattern":"[^\\w\\-]",
"index.analysis.tokenizer.dash-ex.type":"pattern"
}',
'mapping-email': '{
"email": {
"dynamic": "false",
"properties": {
"subject" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}',
'discard-nulls':'false',
'async-search':'true',
'async-write':'false'
};
يمكنك أيضًا تعيين أو تجاوز الخيارات باستخدام متغيرات البيئة أو خصائص نظام Java عن طريق خيارات البادئة مع "Genesys-ES-".
يتم استخدام الخيارات المقدمة في الأمر "إنشاء فهرس مخصص" أولاً. يمكن تجاوزها محليًا باستخدام ملف يسمى es-index.properties الموجودة في "." ، "./conf/" ، "../conf/" أو "./bin/". (يمكن تغييرها باستخدام -fenesys-es-esi-file أو -dgenesys.es.esi.file system الخاصية)
فيما يلي مثال لمحتوى الملف:
إدراج فقط = صدق تجاهل-خطايا زائفة غير متزامنة = خطأ
| اسم | تقصير | وصف |
|---|---|---|
| أقصى نتائج | 10000 | عدد النتائج التي يجب قراءتها من عمليات البحث عن ES لتحميل صفوف Cassandra. |
| قراءة مستوى التوافق | واحد | يستخدم لعمليات البحث ، ويستخدم هذا المستوى من الاتساق لتحميل صفوف كاساندرا. |
| أدخل فقط | خطأ شنيع | بشكل افتراضي ، ستستخدم Esindex عمليات التراجع. في إدراج ، سيتم دائمًا كتابة بيانات الوضع فقط. |
| غير متزامن | حقيقي | يرسل تحديثات الفهرس بشكل غير متزامن دون التحقق من التنفيذ الصحيح. يوفر هذا كتابة أسرع بكثير ولكن قد تصبح البيانات غير متسقة إذا لم تكن مجموعة ES متوفرة ، لأن الكتابة لن تفشل. الافتراضي صحيح. |
| شريحة | عن | خارج ، ساعة ، اليوم ، الشهر ، السنة ، يتم التحكم في تجزئة الفهرس التلقائي المخصص بواسطة هذا الإعداد. إذا تم ضبطه على اليوم ، فسيتم إنشاء فهرس جديد كل يوم تحت الاسم المستعار. لاحظ أنه يتم حذف الفهارس الفارغة تلقائيًا كل ساعة. ملاحظة: يتم تثبيط إعداد الساعة لأنه سيخلق العديد من الفهارس وقد يقلل من الأداء. ينصح هذا الإعداد لأغراض التطوير والاختبار. |
| اسم الجزء | إذا كان الجزء = مخصص ، فسيتم استخدام هذه القيمة لإنشاء الفهرس الجديد. | |
| رسم الخرائط- <type> | {} | لكل فهرس ثانوي ، يتم تمرير اسم الجدول كنوع ، على سبيل المثال رسم الخرائط = {JSON Definition}. |
| أحادي المضيق | http: // localhost: 9200 | يمكن أن تكون قائمة مضيف مفصولة بفاصلة ، Host1 أو Host2 أو Host3 أو http: // host1 ، http: // host2 ، http: // host3 أو http: // host1: 9200 ، http: // host2: 9200 ، http: // host3: 9200. إذا كان البروتوكول أو المنفذ مفقود HTTP و 9200 مفترض. من الممكن استخدام HTTPS. |
| تجاهل الفطريات | حقيقي | لا تقم بتمرير القيم الخالية إلى فهرس ES ، فهذا يعني أنك لن تتمكن من حذف قيمة. الافتراضي صحيح . |
| الفهرس | {} | قد تحتوي الخصائص كسلسلة JSON ، التي تم تمريرها لإنشاء فهرس جديد ، على تعريفات رمزية على سبيل المثال. |
| حقول json-serialized | {} | سلسلة مفصولة بالغيبوبة تحدد أن عمود السلسلة يجب فهرسته كسلسلة JSON. ستمنع السلاسل غير القابلة للاستبدال غير المقبولة الإدراج في كاساندرا. |
| حقول json-flat-serialized | {} | سلسلة مفصولة بالغيبوبة تحدد أن عمود السلسلة يجب أن يتم فهرسته كمستند JSON الآمن. لا يسمح Mapping JSON Elasticsearch بفهرسة قيمة ستغير النوع مع مرور الوقت. على سبيل المثال {"مفتاح": "value"} لا يمكن أن تصبح {"مفتاح": {"subkey": "value"}} في Elasticsearch ستحصل على استثناء رسم الخرائط. سيتم تحويل JSON-FLAT إلى كائن JSON يحتوي على مفاتيح سلسلة ومصفوفات من السلسلة كقيم. |
| دمية | خطأ شنيع | يعطل الفهرس الثانوي تمامًا. لاحظ أنه إذا لم يتم العثور على فئات Jest ، فسيتم وضع الفهرس في الوضع الدموي تلقائيًا. |
| التحقق من صحة | خطأ شنيع | يرسل استعلامات البحث إلى ES للتحقق من صحة من أجل توفير أخطاء بناء الجملة ذات معنى بدلاً من مهلة كاساندرا. |
| قفل متزامن | حقيقي | أقفال عمليات الإعدام على معرف القسم. هذا يمنع مشاكل التزامن عند التعامل مع تحديثات متعددة على نفس القسم في نفس الوقت. |
| تخطي عملية تبريد | حقيقي | عندما تبدأ عقد Cassandra ، ستعيد تشغيل سجل الالتزام ، يتم تخطي هذه التحديثات لتحسين وقت بدء التشغيل حيث يتم تطبيقها بالفعل على ES. |
| تخطي المناعة غير المحمولة | حقيقي | لتحسين الأداء ، لن يؤدي هذا الإعداد إلى تنفيذ تحديثات الفهرس إلا على النسخة المتماثلة الرئيسية لنطاق الرمز المميز. |
| ES-Analytic-mode | خطأ شنيع | تعطل الحذف (TTL أو حذف من) من وثائق ES. |
| نوع المكتب | لا أحد | قائمة النوع لإعداد خطوط الأنابيب. |
| خط أنابيب <type> | لا أحد | تعريف خط الأنابيب لهذا النوع. |
| index.translog.dability | غير متزامن | عند إنشاء فهرس ، نستخدم وضع الالتزام ASYNC لضمان أفضل أداء ، كان الإعداد الافتراضي في ES 1.7. منذ 2.x ، يؤدي المزامنة إلى تدهور خطير في الأداء. |
| متاح-في البيع | حقيقي | عند إنشاء فهرس جديد ، من الممكن (أو لا) تشغيل عمليات البحث على الفهرس الجزئي. |
| Truncate-Rebuild | خطأ شنيع | اقتطاع مؤشر ES قبل إعادة البناء. |
| تطهير الفترات | 60 | كل 60 دقيقة سيتم حذف جميع الفهارس الفارغة من الاسم المستعار. |
| لكل مؤشر نوع | حقيقي | قم بتعبئة اسم الفهرس باسم الجدول. في ES 5.x ، لم يعد من الممكن أن يكون لديك رسم خرائط مختلف لنفس اسم الحقل في أنواع مختلفة من نفس الفهرس. في ES 6.x ستتم إزالة أنواع. |
| القوة الحذف | خطأ شنيع | كل دقيقة يتم إرسال طلب "حذف عن طريق الاستعلام" إلى ES لحذف المستندات التي انتهت صلاحية _cassandrattl. هذا هو محاكاة وظيفة TTL التي تمت إزالتها في ES 5.x. لاحظ أنه على الرغم من أن ضغط كاساندرا سيحذف في الواقع المستند من ES ، فلا يوجد ضمان بشأن متى سيحدث. |
| TTL شيفت | 0 | الوقت في ثوان لتغيير كاساندرا TTL. إذا كان TTL 1 ساعة في كاساندرا والتحول هو 3600 ، فهذا يعني أن الوثيقة في ES سيتم حذفها بعد ساعة واحدة من كاساندرا. |
| ماناجر الفهرس | com.genesyslab.webme.commons.index.defaultIndexManager | فهرس اسم فئة المدير. يستخدم في تجزئة المدير ووظيفة انتهاء الصلاحية. |
| حجم القطاع | 86400000 | الإطار الزمني للقطاع بالمللي ثانية. سيتم إنشاء كل فهرس جديد "حجم القطاع" عن طريق القالب التالي: <alias_name> _index@<Yyyymmdn't'hhmmss'z '> |
| Max-Connections-Per-Route | 2 | عدد اتصال HTTP لكل عقدة ES ، الافتراضي هو قيمة تجمع Apache HTTP ، يمكن أن يزيد من أداء مؤشر كاساندرا ولكن زيادة الحمل على ES. (جديد في WCC 9.0.000.15) |
يجب عليك إيقاف الكشف عن التاريخ في تعريف التعيين الخاص بك.
JSON التالي:
{
"maps" : {
"key1" : " value " ,
"key2" : 42 ,
"keymap" : {
"sss1" : null ,
"sss2" : 42 ,
"sss0" : " ffff "
},
"plap" : " plop "
},
"string" : " string " ,
"int" : 42 ,
"plplpl" : [ 1 , 2 , 3 , 4 ]
}سيتم تحويله إلى:
{
"maps" : [ " key1=value " , " key2=42 " , " keymap={sss1=null, sss2=42, sss0=ffff} " , " plap=plop " ],
"string" : [ " string " ],
"int" : [ " 42 " ],
"plplpl" : [ " 1 " , " 2 " , " 3 " , " 4 " ]
}القيم الممكنة:
<type>راجع توثيق Elasticsearch للحصول على تفاصيل حول تعيين النوع: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current
يتم دعم جميع أنواع أعمدة Cassandra ، وسيتم إرسال البيانات كسلسلة أو صفيف أو خريطة اعتمادًا على نوع Cassandra. باستخدام التعيين المناسب ، سيقوم Elasticsearch بعد ذلك بتحويل البيانات إلى النوع ذي الصلة. هذا سيسمح لعمليات البحث والإبلاغ بشكل أفضل بكثير.
| أنواع كاساندرا | أوصى Elasticsearch رسم الخرائط | تعليق |
|---|---|---|
| ASCII | النص أو الكلمة الرئيسية | انظر القسم التالي عن نوع النص |
| Bigint | طويل | |
| النقطة | عاجز | لا يمكن فهرسة المحتوى الثنائي |
| منطقية | منطقية | |
| عداد | طويل | |
| تاريخ | تاريخ | |
| عشري | مزدوج | |
| مزدوج | مزدوج | |
| يطفو | مزدوج | |
| inet | الكلمة الرئيسية | لم يتم اختبار IP |
| int | int | |
| قائمة <Type> | نفس النوع | يتوقع ES أن يكون النوع إما قيمة واحدة أو صفيف |
| الخريطة < typek ، typev > | هدف | إذا كان بإمكان مفاتيحك أن تحتوي على الكثير من القيم المختلفة ، فاحذر من تعيين الانفجار |
| ضبط <type> | نفس النوع | يتوقع ES أن يكون النوع إما قيمة واحدة أو صفيف |
| صغير | int | |
| نص | النص أو الكلمة الرئيسية | انظر القسم التالي عن نوع النص |
| وقت | الكلمة الرئيسية | |
| الطابع الزمني | "النوع": "التاريخ" ، "التنسيق": | |
| الوقت | الكلمة الرئيسية | |
| Tinyint | int | |
| tuple <type1 type2 ، ...> | يكتب | |
| uuid | الكلمة الرئيسية | |
| varchar | النص أو الكلمة الرئيسية | انظر القسم التالي عن نوع النص |
| varint | طويل | |
| نوع محدد من قبل المستخدم | هدف | سيتم تعيين كل حقل UDT باستخدام أسمائهم وقيمهم |
تعيين نوع النص
عند إرسال عمود نص (ASCII أو VARCHAR) إلى ES ، يتم إرساله كنص خام ليتم فهرسته. ومع ذلك ، إذا كان النص مناسبًا لـ JSON ، فمن الممكن إرساله كمستند JSON لفهرس ES. يسمح ذلك بفهرسة/البحث في المستند بدلاً من النص الخام.
يتيح استخدام هذا تعيين JSON البحث عن البيانات باستخدام "columnname.key: value".
إذا كان بإمكان مفاتيحك أن تحتوي على الكثير من القيم المختلفة ، فاحذر من تعيين الانفجار
حقول json-serialized (انظر الخيارات للحصول على التفاصيل)
يتم إرسال محتوى النص كـ JSON. في تعيينك ، يمكنك تحديد كل حقل مستند بشكل منفصل. لاحظ أنه بمجرد تعيين حقل كنوع ، إما عن طريق رسم الخرائط الثابت أو رسم الخرائط الديناميكية ، فإن توفير نوع غير متوافق سيؤدي إلى فشل في كتابة كاساندرا.
حقول JSON-Flat-Serialized (انظر الخيارات للحصول على التفاصيل ومثال التحويل)
يتم إرسال محتوى النص أيضًا على أنه JSON ، ولكن يتم إجبار جميع القيم على صفائف الأوتار المسطحة. سيؤدي ذلك إلى الحد من القدرة على البحث في JSON المتداخلة ولكنه أكثر أمانًا إذا لم تتمكن من التحكم في نوع JSON من القيم.
إنه تطبيق مخصص لمؤشر كاساندرا. هذا يقدم بعض القيود المرتبطة بنموذج الاتساق كاساندرا. يرجع القيد الرئيسي إلى طبيعة فهارس كاساندرا الثانوية ، حيث تحتوي كل عقدة كاساندرا فقط على بياناتها مسؤولة داخل حلقة كاساندرا ، مع فهارس ثانوية ، إنها نفس الشيء ، كل عقدة تفهز فقط بياناتها المحلية. وهذا يعني أنه عند إجراء استعلام على الفهرس ، يتم إرسال الاستعلام إلى جميع العقد ، ثم يتم تجميع النتائج بواسطة منسق الاستعلام وإعادته إلى العملاء.
مع Esindex ، يختلف الأمر ، نظرًا لأن بحث الفهرس يعتمد على Elasticsearch ، فإن كل عقدة قادرة على الاستجابة للاستعلام. وهذا يعني أنه يجب إرسال الاستعلام فقط إلى عقدة واحدة أو أن النتيجة سوف تحتوي على تكرارات. يتم تحقيق ذلك عن طريق فرض رمز على استعلام CQL كما هو موضح أدناه.
select * from emails where query='subject:12345' and token(id)=0;
يجب أن يكون الرمز أي قيمة طويلة عشوائية لنشر الاستعلامات عبر العقد. يجب أن يتم بناؤه على مفتاح التقسيم للصف ، "معرف" في المثال أعلاه.
في المثال أعلاه ، يكون استعلام Elasticsearch "الموضوع: 12345". هذا هو لوكين مثل الاستعلام. من الممكن أيضًا تنفيذ استعلامات DSL ، انظر صفحة Elasticsearch Query-DSL لمزيد من التفاصيل.
سيحتوي فهرس Elasticsearch على جميع فهارس جدول كاساندرا لمساحة مفاتيح معينة. لكل فهرس ، يتم استخدام نوع Elasticsearch المخصص. من أجل السماح للتجمعات عبر الطاولة ، لا يتم تطبيق النوع في الاستعلامات. هذا يعني أنه إذا كان استفسارك يمكن أن يتطابق مع أنواع مختلفة ، فسيعود المزيد من المعرفات مما كان متوقعًا. نظرًا لأن هؤلاء لن يتطابق مع صفوف كاساندرا ، فلن تحصل على المزيد من النتائج ، ولكن يمكنك أيضًا الحصول على أقل إذا قمت بحد عدد النتائج التي تم إرجاعها.
إذا كان عدد الصفوف المتطابقة مرتفعًا والصفوف كبيرة ، فقد تنتهي عمليات البحث في مهلة القراءة. يمكنك طلب إرجاع PK فقط مع بيانات التعريف ES ثم تحميل الصفوف بالتوازي من الكود الخاص بك باستخدام استعلامات CQL.
من أجل إخبار الفهرس بإرجاع PKs فقط ، تحتاج إلى استخدام تلميح الاستعلام أدناه: ROAD-ROWS = FALSE #:
select * from emails where query='#options:load-rows=false#id:ab*';
من المهم أن نلاحظ أن الصفوف التي يتم إرجاعها مزيفة وبناء من نتائج استعلام Elasicsearch. وهذا يعني أن الصفوف التي تم إرجاعها قد لا تكون موجودة بعد الآن:
عند إرجاع طلب البحث عن نتيجة ، سيحتوي الصف الأول على بيانات تعريف Elasticsearch كسلسلة JSON في عمود الفهرس. انظر على سبيل المثال:
cqlsh:ucs> select id,query from emails where query='id:00008RD9PrJMMmpr';
id | query
------------------+---------------------------------------------------------------------------------------------------------------------
00008RD9PrJMMmpr | {"took":5,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":7.89821}}
تقسيم آلية تجزئة Esindex فهرس Elasticsearch المترابط إلى تسلسل الفهارس القائمة على الوقت. أغراض ذلك هي التالية:
نظرًا لأن Elasticsearch 5.x TTL لم يعد مدعومًا بعد الآن. ومع ذلك ، فإن عمليات الإصلاح والإصلاح العادية من كاساندرا تزيل تلقائيًا بيانات شاهد القبر ، ستقوم "مرونة" بالبيانات من Elasticsearch.
يدعم Esindex تتبع CQL ، يمكن تمكينه على عقدة أو باستخدام CQLSH مع الأمر أدناه:
تتبع
يختار التتبع ، ثم ستحصل على آثار من الاستعلام بأكمله مقابل جميع العقد المشاركة:
cqlsh:ucs> select * from "Contact" where "ESQuery"='AttributeValues.LastName:ab*' and token("Id")=0 limit 1;
Id | AttributeValues | AttributeValuesDate | Attributes| CreatedDate | ESQuery | ExpirationDate | MergeIds | ModifiedDate| PrimaryAttributes| Segment| TenantId
1001uiP2niJPJGBa | {"LastName":["IdentifyTest-aBEcKPnckHVP"],"EmailAddress":["IdentifyTest-HHzmNornOr"]} |{} | {'EmailAddress_IdentifyTest-HHzmNornOr': {Id: 'EmailAddress_IdentifyTest-HHzmNornOr', Name: 'EmailAddress', StrValue: 'IentifyTest-HHzmNornOr', Description: null, MimeType: null, IsPrimary: False}, 'LastName_IdentifyTest-aBEcKPnckHVP': {Id: 'LastName_IdentifyTest-aBEcKPnckHVP', Name: 'LastName', StrValue: 'IdentifyTest-aBEcKPnckHVP', Description: null, MimeType: null IsPrimary: False}} | 2018-10-30 02:05:06.960000+0000 | {"_index":"ucsperf2_contact_index@","_type":"Contact","_id":"1001uiP2niJPJGBa","_score":1.0,"_source":{"Id":"1001uiP2niJPJGBa"},"took":485,"timed_out":false,"_shards":{"total":5,"successful":5,failed":0},"hits":{"total":18188,"max_score":1.0}} | null | null | 2018-10-30 02:05:06.960000+0000 | {'EmailAddress': 'IdentifyTest-HHzmNornOr', 'LastName': 'IdentifyTest-aBEcKPnckHVP'} | not-applicable |1
(1 rows)
ثم ستحصل على معلومات تتبع من جلستك:
جلسة التتبع: 8ED07B60-180D-11E9-B832-33A777983333
activity | timestamp | source | source_elapsed | client
-----------------------------------------------------------------------------------------------------------------------------------------+----------------------------+---------------+----------------+--------------
Execute CQL3 query | 2019-01-14 16:03:32.118000 | xxx.xx.47.82 | 0 | xxx.xx.40.11
RANGE_SLICE message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:02:30.200000 | xxx.xx.47.49 | 34 | xxx.xx.40.11
Executing read on ucsperf2.Contact using index Contact_ESQuery_idx [ReadStage-1] | 2019-01-14 16:02:30.201000 | xxx.xx.47.49 | 411 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 Searching 'AttributeValues.LastName:ab*' [ReadStage-1] | 2019-01-14 16:02:30.201000 | xxx.xx.47.49 | 693 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 Found 10000 matching ES docs in 514ms [ReadStage-1] | 2019-01-14 16:02:30.716000 | xxx.xx.47.49 | 515336 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 StreamingPartitionIterator initialized [ReadStage-1] | 2019-01-14 16:02:30.717000 | xxx.xx.47.49 | 516911 | xxx.xx.40.11
reading data from /xxx.xx.47.100 [ReadStage-1] | 2019-01-14 16:02:30.717000 | xxx.xx.47.49 | 517121 | xxx.xx.40.11
speculating read retry on /xxx.xx.47.82 [ReadStage-1] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517435 | xxx.xx.40.11
Executing single-partition query on Contact [ReadStage-2] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517436 | xxx.xx.40.11
Sending READ message to /xxx.xx.47.100 [MessagingService-Outgoing-/xxx.xx.47.100-Small] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517445 | xxx.xx.40.11
Sending READ message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517558 | xxx.xx.40.11
Acquiring sstable references [ReadStage-2] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517866 | xxx.xx.40.11
Bloom filter allows skipping sstable 83 [ReadStage-2] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517965 | xxx.xx.40.11
Partition index with 0 entries found for sstable 400 [ReadStage-2] | 2019-01-14 16:02:30.719000 | xxx.xx.47.49 | 518300 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:02:30.720000 | xxx.xx.47.49 | 519720 | xxx.xx.40.11
Processing response from /xxx.xx.47.82 [RequestResponseStage-4] | 2019-01-14 16:02:30.720000 | xxx.xx.47.49 | 519865 | xxx.xx.40.11
Bloom filter allows skipping sstable 765 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522352 | xxx.xx.40.11
Bloom filter allows skipping sstable 790 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522451 | xxx.xx.40.11
Bloom filter allows skipping sstable 819 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522516 | xxx.xx.40.11
Bloom filter allows skipping sstable 848 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522662 | xxx.xx.40.11
Bloom filter allows skipping sstable 861 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522741 | xxx.xx.40.11
Skipped 0/7 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522855 | xxx.xx.40.11
Merged data from memtables and 1 sstables [ReadStage-2] | 2019-01-14 16:02:30.723001 | xxx.xx.47.49 | 523075 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-2] | 2019-01-14 16:02:30.723001 | xxx.xx.47.49 | 523164 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-1] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524717 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 StreamingPartitionIterator closed [ReadStage-1] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524805 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.82 [ReadStage-1] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524872 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524971 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.100 [MessagingService-Incoming-/xxx.xx.47.100] | 2019-01-14 16:02:30.729000 | xxx.xx.47.49 | 528222 | xxx.xx.40.11
Processing response from /xxx.xx.47.100 [RequestResponseStage-1] | 2019-01-14 16:02:30.729000 | xxx.xx.47.49 | 528364 | xxx.xx.40.11
Initiating read-repair [RequestResponseStage-1] | 2019-01-14 16:02:30.729000 | xxx.xx.47.49 | 528481 | xxx.xx.40.11
Parsing select * from "Contact" where "ESQuery"='AttributeValues.LastName:ab*' and token("Id")=0 limit 1; [Native-Transport-Requests-1] | 2019-01-14 16:03:32.119000 | xxx.xx.47.82 | 174 | xxx.xx.40.11
Preparing statement [Native-Transport-Requests-1] | 2019-01-14 16:03:32.119000 | xxx.xx.47.82 | 254 | xxx.xx.40.11
Index mean cardinalities are Contact_ESQuery_idx:-2109988917941223823. Scanning with Contact_ESQuery_idx. [Native-Transport-Requests-1] | 2019-01-14 16:03:32.119000 | xxx.xx.47.82 | 418 | xxx.xx.40.11
Computing ranges to query [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2480 | xxx.xx.40.11
Submitting range requests on 1 ranges with a concurrency of 1 (-4.6099044E15 rows per range expected) [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2568 | xxx.xx.40.11
Enqueuing request to /xxx.xx.47.49 [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2652 | xxx.xx.40.11
Submitted 1 concurrent range requests [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2708 | xxx.xx.40.11
Sending RANGE_SLICE message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2874 | xxx.xx.40.11
READ message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:03:32.640000 | xxx.xx.47.100 | 29 | xxx.xx.40.11
READ message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521263 | xxx.xx.40.11
Executing single-partition query on Contact [ReadStage-2] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521468 | xxx.xx.40.11
Acquiring sstable references [ReadStage-2] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521566 | xxx.xx.40.11
Partition index with 0 entries found for sstable 1187 [ReadStage-2] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521775 | xxx.xx.40.11
Executing single-partition query on Contact [ReadStage-1] | 2019-01-14 16:03:32.641000 | xxx.xx.47.100 | 266 | xxx.xx.40.11
Bloom filter allows skipping sstable 1188 [ReadStage-2] | 2019-01-14 16:03:32.641000 | xxx.xx.47.82 | 522130 | xxx.xx.40.11
Acquiring sstable references [ReadStage-1] | 2019-01-14 16:03:32.641000 | xxx.xx.47.100 | 361 | xxx.xx.40.11
Bloom filter allows skipping sstable 1189 [ReadStage-2] | 2019-01-14 16:03:32.641000 | xxx.xx.47.82 | 522205 | xxx.xx.40.11
Bloom filter allows skipping sstable 1190 [ReadStage-2] | 2019-01-14 16:03:32.641000 | xxx.xx.47.82 | 522259 | xxx.xx.40.11
Skipped 0/5 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522303 | xxx.xx.40.11
Bloom filter allows skipping sstable 1186 [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522415 | xxx.xx.40.11
Merged data from memtables and 1 sstables [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522540 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522679 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.49 [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522734 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522863 | xxx.xx.40.11
Partition index with 0 entries found for sstable 1208 [ReadStage-1] | 2019-01-14 16:03:32.644000 | xxx.xx.47.100 | 3756 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:03:32.647000 | xxx.xx.47.82 | 528443 | xxx.xx.40.11
Processing response from /xxx.xx.47.49 [RequestResponseStage-2] | 2019-01-14 16:03:32.647000 | xxx.xx.47.82 | 528516 | xxx.xx.40.11
Bloom filter allows skipping sstable 1209 [ReadStage-1] | 2019-01-14 16:03:32.649000 | xxx.xx.47.100 | 9090 | xxx.xx.40.11
Bloom filter allows skipping sstable 1210 [ReadStage-1] | 2019-01-14 16:03:32.649000 | xxx.xx.47.100 | 9162 | xxx.xx.40.11
Bloom filter allows skipping sstable 1211 [ReadStage-1] | 2019-01-14 16:03:32.649000 | xxx.xx.47.100 | 9187 | xxx.xx.40.11
Skipped 0/5 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9237 | xxx.xx.40.11
Bloom filter allows skipping sstable 1207 [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9335 | xxx.xx.40.11
Merged data from memtables and 1 sstables [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9571 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9734 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.49 [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9842 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 10116 | xxx.xx.40.11
Request complete | 2019-01-14 16:03:32.646708 | xxx.xx.47.82 | 528708 | xxx.xx.40.11
جميع الأنشطة التي تبدأ من قبل ESI هي أنشطة من Esindex:
* ESI <id> Searching 'AttributeValues.LastName:ab*': The query have been received and decoded by the ESIndex, it is now sent to ElasticSearch
* ESI <id> Found 10000 matching ES docs in 514ms: The query to ElasticSearch has found 10000 results
* ESI <id> StreamingPartitionIterator initialized: Streaming partition iterator have been provided with all Ids found, and starts reading rows
* ESI <id> StreamingPartitionIterator closed: Client is done reading rows (limit was 1)
تتبع التحديثات/إدراج/حذف
cqlsh:ucs> update "Contact" set "CreatedDate"='2017-04-01T11:21:59.001+0000' where "Id"='1001uiP2niJPJGBa';
جلسة التتبع: F76E4AC0-180E-11E9-B832-33A777983333
activity | timestamp | source | source_elapsed | client
----------------------------------------------------------------------------------------------------------------------------------------+----------------------------+---------------+----------------+--------------
Execute CQL3 query | 2019-01-14 16:13:37.132000 | xxx.xx.47.82 | 0 | xxx.xx.40.11
MUTATION message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:12:35.210000 | xxx.xx.47.49 | 22 | xxx.xx.40.11
Appending to commitlog [MutationStage-1] | 2019-01-14 16:12:35.210000 | xxx.xx.47.49 | 354 | xxx.xx.40.11
Adding to Contact memtable [MutationStage-1] | 2019-01-14 16:12:35.210000 | xxx.xx.47.49 | 465 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.82 [MutationStage-1] | 2019-01-14 16:12:35.212000 | xxx.xx.47.49 | 2356 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:12:35.212000 | xxx.xx.47.49 | 2548 | xxx.xx.40.11
Parsing update "Contact" set "CreatedDate"='2017-04-01T11:21:59.001+0000' where "Id"='1001uiP2niJPJGBa'; [Native-Transport-Requests-1] | 2019-01-14 16:13:37.132000 | xxx.xx.47.82 | 146 | xxx.xx.40.11
Preparing statement [Native-Transport-Requests-1] | 2019-01-14 16:13:37.132000 | xxx.xx.47.82 | 213 | xxx.xx.40.11
Determining replicas for mutation [Native-Transport-Requests-1] | 2019-01-14 16:13:37.133000 | xxx.xx.47.82 | 1895 | xxx.xx.40.11
Appending to commitlog [MutationStage-2] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2042 | xxx.xx.40.11
Adding to Contact memtable [MutationStage-2] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2149 | xxx.xx.40.11
Sending MUTATION message to /xxx.xx.47.100 [MessagingService-Outgoing-/xxx.xx.47.100-Small] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2186 | xxx.xx.40.11
Sending MUTATION message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2232 | xxx.xx.40.11
MUTATION message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:13:37.136000 | xxx.xx.47.100 | 28 | xxx.xx.40.11
Appending to commitlog [MutationStage-1] | 2019-01-14 16:13:37.136000 | xxx.xx.47.100 | 390 | xxx.xx.40.11
Adding to Contact memtable [MutationStage-1] | 2019-01-14 16:13:37.136000 | xxx.xx.47.100 | 471 | xxx.xx.40.11
ESI decoding row 31303031756950326e694a504a474261 [MutationStage-1] | 2019-01-14 16:13:37.137000 | xxx.xx.47.100 | 579 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:13:37.137000 | xxx.xx.47.82 | 5160 | xxx.xx.40.11
ESI writing 31303031756950326e694a504a474261 to ES index [MutationStage-1] | 2019-01-14 16:13:37.137000 | xxx.xx.47.100 | 664 | xxx.xx.40.11
Processing response from /xxx.xx.47.49 [RequestResponseStage-4] | 2019-01-14 16:13:37.137000 | xxx.xx.47.82 | 5280 | xxx.xx.40.11
ESI index 31303031756950326e694a504a474261 done [MutationStage-1] | 2019-01-14 16:13:37.160000 | xxx.xx.47.100 | 23878 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.100 [MessagingService-Incoming-/xxx.xx.47.100] | 2019-01-14 16:13:37.160000 | xxx.xx.47.82 | 28445 | xxx.xx.40.11
Processing response from /xxx.xx.47.100 [RequestResponseStage-2] | 2019-01-14 16:13:37.160000 | xxx.xx.47.82 | 28549 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.82 [MutationStage-1] | 2019-01-14 16:13:37.162000 | xxx.xx.47.100 | 25614 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:13:37.162000 | xxx.xx.47.100 | 25793 | xxx.xx.40.11
Request complete | 2019-01-14 16:13:37.814048 | xxx.xx.47.82 | 682048 | xxx.xx.40.11
جميع الأنشطة التي تبدأ من قبل ESI هي أنشطة من Esindex:
* ESI decoding row <rowId>: update request have been received by the ESIndex, row is being converted to JSON
* ESI writing <rowId> to ES index: update is being sent to ElasticSearch
* ESI index <rowId> done: ElasticSearch acknowledged the update
هذا مثال على ما يحدث عند البحث:

هذا مثال على الكتابة المتزامنة ، (ستفشل عملية كاساندرا إذا فشلت ES):

هذا مثال على الكتابة غير المتزامنة:

هذا مثال على الكتابة غير المتزامنة ، لن تفشل عملية كاساندرا إذا فشلت ES:
