<type>เอกสารนี้อธิบายการใช้งานและการกำหนดค่าของ "ESINDEX" ซึ่งเป็นดัชนีรองจาก Elasticsearch สำหรับคาสซานดรา
ปลั๊กอินนี้ต้องการคลัสเตอร์ Elasticsearch (ES) แล้ว
ปลั๊กอินจะติดตั้งใน Cassandra 4.0.x ทั่วไปดาวน์โหลดจาก http://cassandra.apache.org/ ไม่มีอะไรจะเปลี่ยนแปลงในไฟล์การกำหนดค่า Cassandra เพื่อรองรับดัชนี พฤติกรรมของคาสซานดรายังคงไม่เปลี่ยนแปลงสำหรับแอปพลิเคชันที่ไม่ได้ใช้ดัชนี
เมื่อสร้างขึ้นบนตาราง Cassandra ดัชนีนี้อนุญาตให้ดำเนินการค้นหา "การค้นหาข้อความแบบเต็ม" Elasticsearch บนคาสซานดราโดยใช้ CQL และส่งคืนแถวการจับคู่จากข้อมูล Cassandra การใช้ปลั๊กอินนี้ไม่จำเป็นต้องเปลี่ยนซอร์สโค้ดของคาสซานดราเราได้ใช้ดัชนี 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 Clean
สิ่งนี้จะสร้าง "All in One Jar 'ใน 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)
แถวทั้งหมดจะมีข้อมูลจากคาสซานดราที่โหลดจาก SSTables โดยใช้ CQL Constressency ข้อมูลในคอลัมน์ 'Query' คือข้อมูลเมตาที่ส่งคืนโดย 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 ไม่ได้สังเกตว่า UserID เป็นจำนวนเต็มและเพิ่มฟิลด์ [คำหลัก] สำหรับข้อความทั้งหมด
นี่คือลักษณะของข้อมูลใน 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"
}
}
}
}
'};
สิ่งนี้จะสร้างดัชนีใหม่จะให้การแมปและ Reindex ข้อมูลที่อยู่ในคาสซานดรา
นี่คือการทำแผนที่ 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 Query 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
มันสำคัญมากที่จะได้รับการทำแผนที่ก่อนเริ่มการผลิต การจัดอันดับตารางขนาดใหญ่จะใช้เวลานานมากและจะเพิ่มภาระอย่างมากในคาสซานดราและอีลาสซิสต์ คุณจะต้องตรวจสอบบันทึก Cassandra สำหรับข้อผิดพลาดในการทำแผนที่ ES ของคุณ ตรวจสอบให้แน่ใจว่าได้หลบหนีคำพูดเดี่ยว (') โดยเพิ่มขึ้นเป็นสองเท่าในตัวเลือก JSON ที่มีให้กับคำสั่งสร้างดัชนี
ด้านล่างนี้เป็นตัวเลือกทั้งหมดที่เกี่ยวข้องกับการกำหนดค่าของดัชนี Elasticsearch ชื่อคีย์สามารถใช้ยัติภังค์ '-' ถ่านหรือจุด ตัวอย่างเช่นชื่อทั้งสองจะใช้งานได้:
โปรดทราบว่าตัวเลือกด้านล่างทั้งหมดนั้นเฉพาะเจาะจงกับการใช้งาน Genesys และไม่ใช่ Elasticsearch เอง
หากไม่พบคลาส jest โหมดจำลองจะถูกเปิดใช้งานและไม่มีกรณีอื่นใช้
มีการรองรับมัลติเพซเซ็นเตอร์และข้อมูลจะถูกทำซ้ำผ่านการจำลองแบบคาสซานดราซุบซิบเท่านั้น กลุ่ม ES ใน DC ที่แตกต่างกันนั้นไม่เหมือนกันและไม่ควรเข้าร่วมด้วยกันหรือผลการดำเนินงานจะได้รับผลกระทบ เนื่องจากข้อมูลถูกจำลองแบบที่ระดับตาราง ESINDEX จะได้รับการอัปเดตในแต่ละ DC และคลัสเตอร์ ES ท้องถิ่นจะได้รับการปรับปรุงเช่นกัน

เพื่อรองรับ Multi-DC ตัวเลือกทั้งหมดสามารถนำหน้าโดย DataCenter และ Rack ชื่อเพื่อทำการตั้งค่าตำแหน่งเฉพาะตัวอย่างเช่น:
เพื่อให้ดัชนีคาสซานดราสำหรับ Elasticsearch ด้วยข้อมูลรับรองแต่ละโหนดจะต้องมีตัวแปรสภาพแวดล้อม escredentials อย่างถูกต้องก่อนที่จะเริ่ม สิ่งนี้จะต้องตั้งค่าไว้ในโฮสต์ของคาสซานดราทั้งหมด
ตัวอย่างด้านล่างนี้ให้รหัสผ่านสำหรับผู้ใช้ 'ยืดหยุ่น' และรหัสผ่าน 'ExamplePassword' คั่นด้วยอักขระ: (ลำไส้ใหญ่) สามารถทำได้โดยตรงในระบบเป็นตัวแปรสภาพแวดล้อมหรือในทางลัดที่เปิดตัวคาสซานดรา
Escredentials = Elastic: ExamplePassword เมื่อดัชนีเริ่มต้นได้สำเร็จแล้วมันจะเขียน "ข้อมูลรับรอง ElasticSearch ที่ให้ไว้" ในบันทึกของ Cassandra ในระดับข้อมูล เมื่อข้อความนี้เป็นเอาต์พุตเป็นไปได้ที่จะล้างตัวแปรสภาพแวดล้อม หากคาสซานดรารีสตาร์ทตัวแปรสภาพแวดล้อมจะต้องตั้งค่าอีกครั้งก่อนที่จะเริ่ม ข้อมูลประจำตัวจะถูกเก็บไว้ในหน่วยความจำเท่านั้นและจะไม่ถูกบันทึกไว้ที่อื่น หากผู้ใช้และ/หรือรหัสผ่านมีการเปลี่ยนแปลงโหนดคาสซานดราทั้งหมดจะต้องรีสตาร์ทด้วยค่าตัวแปรสภาพแวดล้อมที่อัปเดต
ในชุดตัวเลือกดัชนี
unicast-hosts = https : //<host name>:9200
ขณะนี้ไม่สามารถโยกย้ายดัชนีที่มีอยู่ได้จาก HTTP ไปยัง HTTPS การใช้งานหนึ่งหรืออย่างอื่นจะต้องตัดสินใจก่อนที่คุณจะสร้างคาสซานดราสคีมา เพื่อลดการปรับใช้ HTTPS ดัชนีจะเชื่อถือใบรับรอง HTTPS ทั้งหมดโดยอัตโนมัติ
เป็นไปได้ที่จะเก็บข้อมูลทางด้านของ Elasticsearch เป็นเวลานานกว่า Cassandra TTL ที่กำหนดไว้ โหมดนี้ถูกเปิดใช้งานโดยใช้ตัวเลือกโหมดการวิเคราะห์ ES เมื่อตัวเลือกถูกเปิดใช้งาน ElasticIndex จะข้ามการดำเนินการลบทั้งหมด
เพื่อป้องกันไม่ให้ข้อมูลเพิ่มขึ้นมากเกินไปในด้าน ES ขอแนะนำให้ใช้การตั้งค่า TTL-shift และ Force-Delete
เมื่อสร้างดัชนีคุณจะให้ตัวเลือกดัชนีรวมถึงตัวเลือกดัชนี 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/" (สามารถเปลี่ยนแปลงได้ด้วย -dgenesys-es-esi-file หรือ -dgenesys.es.esi.file System)
นี่คือตัวอย่างสำหรับเนื้อหาของไฟล์:
insert-only = true discard-nulls = false async-write = false
| ชื่อ | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|
| ผลสูงสุด | 10,000 | จำนวนผลลัพธ์ที่จะอ่านจากการค้นหา ES เพื่อโหลดแถวคาสซานดรา |
| ระดับการอ่านที่สอดคล้องกัน | หนึ่ง | ใช้สำหรับการค้นหาระดับความสอดคล้องนี้ใช้ในการโหลดแถวคาสซานดรา |
| แทรกอย่างเดียว | เท็จ | โดยค่าเริ่มต้น ESINDEX จะใช้การดำเนินการ UPSERT ในการแทรกข้อมูลโหมดเท่านั้นจะถูกเขียนทับเสมอ |
| การเขียนแบบ async | จริง | ส่งการอัปเดตดัชนีแบบอะซิงโครนัสโดยไม่ต้องตรวจสอบการดำเนินการที่ถูกต้อง สิ่งนี้ให้การเขียนที่เร็วขึ้นมาก แต่ข้อมูลอาจไม่สอดคล้องกันหากคลัสเตอร์ ES ไม่พร้อมใช้งานเนื่องจากการเขียนจะไม่ล้มเหลว ค่าเริ่มต้นเป็นจริง |
| ส่วน | ปิด | ปิด, ชั่วโมง, วัน, เดือน, ปี, การแบ่งส่วนดัชนีอัตโนมัติแบบกำหนดเองถูกควบคุมโดยการตั้งค่านี้ หากตั้งค่าเป็นวันทุกวันจะมีการสร้างดัชนีใหม่ภายใต้นามแฝง โปรดทราบว่าดัชนีที่ว่างเปล่าจะถูกลบโดยอัตโนมัติทุกชั่วโมง หมายเหตุ: การตั้งค่าชั่วโมงนั้นหมดกำลังใจเนื่องจากจะสร้างดัชนีจำนวนมากและอาจลดประสิทธิภาพ การตั้งค่านี้แนะนำสำหรับวัตถุประสงค์ในการพัฒนาและการทดสอบ |
| ชื่อเซ็กเมนต์ | หากเซ็กเมนต์ = กำหนดเองค่านี้จะใช้สำหรับการสร้างดัชนีใหม่ | |
| การทำแผนที่-<ply> | - | สำหรับแต่ละดัชนีรองชื่อตารางจะถูกส่งผ่านเป็นประเภทเช่นการแมป-visit = {นิยาม JSON} |
| ยูนิคาสต์โฮสต์ | http: // localhost: 9200 | รายการโฮสต์ที่คั่นด้วยเครื่องหมายจุลภาคสามารถเป็นโฮสต์ 1, host2, host3 หรือ http: // host1, http: // host2, http: // host3 หรือ http: // host1: 9200, http: // host2: 9200, http: // โฮสต์ 3: 9200 หากโปรโตคอลหรือพอร์ตหายไป HTTP และ 9200 สันนิษฐาน เป็นไปได้ที่จะใช้ https |
| ทิ้งร่องรอย | จริง | อย่าส่งค่า null ไปยังดัชนี ES หมายความว่าคุณจะไม่สามารถลบค่าได้ ค่าเริ่มต้นเป็นจริง |
| สินค้าดัชนี | - | คุณสมบัติเป็นสตริง JSON ที่ผ่านไปเพื่อสร้างดัชนีใหม่อาจมีคำจำกัดความของ Tokenizer ตัวอย่างเช่น |
| JSON-serialized-fields | - | COMA คั่นสตริงที่กำหนดว่าคอลัมน์สตริงจะต้องจัดทำดัชนีเป็นสตริง JSON สตริงที่ไม่ใช่ JSON สามารถป้องกันเม็ดมีดในคาสซานดรา |
| Json-Flat-Serialized-Fields | - | โคม่าคั่นสตริงที่กำหนดว่าคอลัมน์สตริงจะต้องจัดทำดัชนีเป็นเอกสารประเภท JSON ที่ปลอดภัย การทำแผนที่ Elasticsearch JSON ไม่อนุญาตให้จัดทำดัชนีค่าที่จะเปลี่ยนประเภทเมื่อเวลาผ่านไป ตัวอย่างเช่น {"key": "value"} ไม่สามารถกลายเป็น {"key": {"subkey": "value"}} ใน Elasticsearch คุณจะได้รับการแมป JSON-FLAT ดังกล่าวจะเป็นตัวแปลงเป็นวัตถุ JSON ที่มีคีย์สตริงและอาร์เรย์ของสตริงเป็นค่า |
| คนโง่ | เท็จ | ปิดใช้งานดัชนีรองอย่างสมบูรณ์ โปรดทราบว่าหากไม่พบคลาส JEST ดัชนีจะถูกใส่เข้าสู่โหมดจำลองโดยอัตโนมัติ |
| ตรวจสอบความถูกต้อง | เท็จ | ส่งคำค้นหาการค้นหาไปยัง ES เพื่อตรวจสอบความถูกต้องเพื่อให้เกิดข้อผิดพลาดทางไวยากรณ์ที่มีความหมายแทนการหมดเวลา Cassandra |
| ล็อคพร้อมกัน | จริง | ล็อคดัชนีการดำเนินการบนรหัสพาร์ติชัน สิ่งนี้จะช่วยป้องกันปัญหาการเกิดขึ้นพร้อมกันเมื่อจัดการกับการอัปเดตหลายครั้งในพาร์ติชันเดียวกันในเวลาเดียวกัน |
| ข้ามล็อก-เล่น | จริง | เมื่อโหนดคาสซานดราเริ่มต้นจะเล่นบันทึกการกระทำซ้ำการอัปเดตเหล่านั้นจะถูกข้ามเพื่อปรับปรุงเวลาเริ่มต้นเนื่องจากพวกเขาได้นำไปใช้กับ ES แล้ว |
| Skip-non-local-updates | จริง | เพื่อปรับปรุงประสิทธิภาพการเปิดใช้งานการตั้งค่านี้จะดำเนินการอัปเดตดัชนีบนแบบจำลองต้นแบบของช่วงโทเค็นเท่านั้น |
| ES-analytic-mode | เท็จ | ปิดใช้งานลบ (TTL หรือลบ) ของเอกสาร ES |
| ประเภทท่อ | ไม่มี | รายการประเภทไปยังท่อ |
| Pipeline- <ply> | ไม่มี | นิยามท่อสำหรับประเภทนี้ |
| index.translog.durability | async | เมื่อสร้างดัชนีเราใช้โหมดการกระทำแบบ async เพื่อให้แน่ใจว่าประสิทธิภาพที่ดีที่สุดมันเป็นการตั้งค่าเริ่มต้นใน ES 1.7 ตั้งแต่ 2.x การซิงค์ทำให้ประสิทธิภาพลดลงอย่างจริงจัง |
| พร้อมใช้งานในขณะที่รีบูท | จริง | เมื่อสร้างดัชนีใหม่เป็นไปได้ (หรือไม่) เพื่อเรียกใช้การค้นหาในดัชนีบางส่วน |
| ตัดทอน | เท็จ | ตัดทอนดัชนี ES ก่อนที่จะสร้างใหม่ |
| การล้างระยะเวลา | 60 | ทุก ๆ 60 นาทีดัชนีที่ว่างเปล่าทั้งหมดจะถูกลบออกจากนามแฝง |
| ต่อดัชนี | จริง | เตรียมชื่อดัชนีด้วยชื่อตาราง ใน ES 5.x เป็นไปไม่ได้อีกต่อไปที่จะมีการแมปที่แตกต่างกันสำหรับชื่อฟิลด์เดียวกันในประเภทต่าง ๆ ของดัชนีเดียวกัน ในประเภท ES 6.x จะถูกลบออก |
| กรวด | เท็จ | ทุกนาทีคำขอ "ลบโดยคิวรี" จะถูกส่งไปยัง ES เพื่อลบเอกสารที่หมดอายุ _cassandrattl นี่คือการเลียนแบบฟังก์ชัน TTL ที่ถูกลบออกใน ES 5.x โปรดทราบว่าในขณะที่ Cassandra Compaction จะลบเอกสารจาก ES จริง ๆ แล้วไม่มีการรับประกันว่าจะเกิดขึ้นเมื่อใด |
| ttl-shift | 0 | เวลาในไม่กี่วินาทีในการเปลี่ยน Cassandra TTL ถ้า TTL เป็น 1h ในคาสซานดราและกะคือ 3600 หมายถึงเอกสารใน ES จะถูกลบ 1H ช้ากว่าคาสซานดรา |
| ผู้จัดการดัชนี | com.genesyslab.webme.commons.index.defaultindexmanager | ชื่อคลาสผู้จัดการดัชนี ใช้ในการแบ่งส่วนและฟังก์ชั่นการหมดอายุของผู้จัดการ |
| ขนาดส่วน | 86400000 | กรอบเวลาส่วนในมิลลิวินาที ทุก ๆ มิลลิวินาที "ขนาด" มิลลิวินาทีจะถูกสร้างขึ้นโดยเทมเพลตต่อไปนี้: <alias_name> _index@<yyyymmdd't'hhmmss'z '> |
| การเชื่อมต่อสูงสุดต่อเส้นทาง | 2 | จำนวนการเชื่อมต่อ HTTP ต่อโหนด ES, ค่าเริ่มต้นคือค่า Apache HTTP Pool สามารถเพิ่มประสิทธิภาพของดัชนี Cassandra แต่เพิ่มโหลดบน 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/mapping.html
รองรับคอลัมน์คาสซานดราทั้งหมดข้อมูลจะถูกส่งเป็นสตริงอาร์เรย์หรือแผนที่ขึ้นอยู่กับประเภทของคาสซานดรา ด้วยการทำแผนที่ที่เหมาะสม Elasticsearch จะแปลงข้อมูลเป็นประเภทที่เกี่ยวข้อง สิ่งนี้จะช่วยให้การค้นหาและการรายงานดีขึ้นมาก
| ประเภทคาสซานดรา | Elasticsearch Mapping แนะนำ | การแสดงความคิดเห็น |
|---|---|---|
| ASCII | ข้อความหรือคำหลัก | ดูส่วนถัดไปเกี่ยวกับประเภท ข้อความ |
| Bigint | ยาว | |
| หยด | พิการ | ไม่สามารถจัดทำดัชนีเนื้อหาไบนารี |
| บูลีน | บูลีน | |
| เคาน์เตอร์ | ยาว | |
| วันที่ | วันที่ | |
| ทศนิยม | สองเท่า | |
| สองเท่า | สองเท่า | |
| ลอย | สองเท่า | |
| ทำให้ไม่ได้ | คำสำคัญ | es IP ไม่ได้ทดสอบ |
| int | int | |
| รายการ <ply> | เช่นเดียวกับ ประเภท | ES คาดว่า ประเภท จะเป็นค่าเดียวหรืออาร์เรย์ |
| แผนที่ < typek , typev > | วัตถุ | หากกุญแจของคุณมีค่าที่แตกต่างกันมากมายระวังการทำแผนที่การระเบิด |
| ตั้งค่า <ply> | เช่นเดียวกับประเภท | ES คาดว่า ประเภท จะเป็นค่าเดียวหรืออาร์เรย์ |
| สิ่งเล็ก ๆ น้อย ๆ | int | |
| ข้อความ | ข้อความหรือคำหลัก | ดูส่วนถัดไปเกี่ยวกับประเภท ข้อความ |
| เวลา | คำสำคัญ | |
| การประทับเวลา | "พิมพ์": "วันที่", "รูปแบบ": "yyyy-mm-dd't'hh: mm: ss.sss'z '" | |
| เวลา | คำสำคัญ | |
| Tinyint | int | |
| tuple <type1 type2, ... > | พิมพ์ | |
| uuid | คำสำคัญ | |
| Varchar | ข้อความหรือคำหลัก | ดูส่วนถัดไปเกี่ยวกับประเภท ข้อความ |
| รูปแบบ | ยาว | |
| ประเภทที่ผู้ใช้กำหนด | วัตถุ | แต่ละฟิลด์ UDT จะถูกแมปโดยใช้ชื่อและค่าของพวกเขา |
การทำแผนที่ประเภทข้อความ
เมื่อคอลัมน์ข้อความ (ASCII หรือ VARCHAR) ถูกส่งไปยัง ES จะถูกส่งเป็นข้อความดิบที่จะจัดทำดัชนี อย่างไรก็ตามหากข้อความนั้นเหมาะสม JSON ก็เป็นไปได้ที่จะส่งเป็นเอกสาร JSON สำหรับ ES ไปยังดัชนี สิ่งนี้อนุญาตให้ดัชนี/ค้นหาเอกสารแทนข้อความดิบ
การใช้การแมป JSON ดังกล่าวช่วยให้สามารถค้นหาข้อมูลโดยใช้ "columnName.key: value"
หากกุญแจของคุณมีค่าที่แตกต่างกันมากมายระวังการทำแผนที่การระเบิด
JSON-serialized-fields (ดูตัวเลือกสำหรับรายละเอียด)
เนื้อหาของข้อความถูกส่งเป็น JSON ในการทำแผนที่ของคุณคุณสามารถกำหนดแต่ละฟิลด์เอกสารแยกกัน โปรดทราบว่าเมื่อฟิลด์ได้รับการแมปเป็นประเภทไม่ว่าจะโดยการทำแผนที่แบบคงที่หรือการทำแผนที่แบบไดนามิกการจัดทำประเภทที่เข้ากันไม่ได้จะส่งผลให้คาสซานดราเขียนล้มเหลว
Json-Flat-Serialized-Fields (ดูตัวเลือกสำหรับรายละเอียดและตัวอย่างการแปลง)
เนื้อหาของข้อความยังถูกส่งเป็น JSON อย่างไรก็ตามค่าทั้งหมดถูกบังคับให้อาร์เรย์ของสตริงแบน สิ่งนี้จะจำกัดความสามารถในการค้นหา JSON ที่ซ้อนกัน แต่ปลอดภัยกว่าถ้าคุณไม่สามารถควบคุมประเภท JSON ของค่าได้
เป็นการดำเนินการตามกำหนดเองของดัชนีคาสซานดรา สิ่งนี้แนะนำข้อ จำกัด บางประการที่เชื่อมโยงกับโมเดลความสอดคล้องของคาสซานดรา ข้อ จำกัด หลักเกิดจากลักษณะของดัชนีทุติยภูมิของคาสซานดราแต่ละโหนดคาสซานดราแต่ละโหนดมีข้อมูลที่รับผิดชอบภายในวงแหวนคาสซานดราเท่านั้นโดยมีดัชนีรองมันเป็นสิ่งเดียวกันแต่ละโหนดจะดัชนีข้อมูลท้องถิ่นเท่านั้น หมายความว่าเมื่อทำการสืบค้นบนดัชนีแบบสอบถามจะถูกส่งไปยังโหนดทั้งหมดแล้วผลลัพธ์จะถูกรวมโดยผู้ประสานงานการสืบค้นและส่งกลับไปยังลูกค้า
ด้วย ESINDEX มันแตกต่างกันเนื่องจากการค้นหาดัชนีขึ้นอยู่กับ Elasticsearch แต่ละโหนดสามารถตอบคำถามได้ หมายความว่าต้องส่งแบบสอบถามไปยังโหนดเดียวเท่านั้นหรือผลลัพธ์จะมีการทำซ้ำ นี่คือความสำเร็จโดยการบังคับให้โทเค็นไปยังแบบสอบถาม CQL ดังด้านล่าง
select * from emails where query='subject:12345' and token(id)=0;
โทเค็นควรเป็นค่าที่ยาวแบบสุ่มเพื่อกระจายการสืบค้นข้ามโหนด จะต้องสร้างขึ้นบนคีย์พาร์ติชันของแถว 'ID' ในตัวอย่างข้างต้น
ในตัวอย่างข้างต้นแบบสอบถาม Elasticsearch คือ 'หัวเรื่อง: 12345' นี่คือการสืบค้น Lucene นอกจากนี้ยังเป็นไปได้ที่จะดำเนินการค้นหา DSL ดูหน้า elasticsearch query-dsl สำหรับรายละเอียดเพิ่มเติม
ดัชนี Elasticsearch เดียวจะมีดัชนีตาราง Cassandra ทั้งหมดสำหรับคีย์สเปซที่กำหนด สำหรับแต่ละดัชนีจะใช้ประเภท Elasticsearch เฉพาะ เพื่อให้อนุญาตให้มีการรวมตัวข้ามตารางประเภทไม่ได้บังคับใช้ในการสืบค้น หมายความว่าหากแบบสอบถามของคุณสามารถจับคู่ประเภทต่าง ๆ มันจะส่งคืน ID มากกว่าที่คาดไว้ เนื่องจากสิ่งเหล่านั้นจะไม่ตรงกับแถวคาสซานดราคุณจะไม่ได้รับผลลัพธ์เพิ่มเติม แต่คุณอาจได้รับน้อยลงหากคุณ จำกัด จำนวนผลลัพธ์ที่ส่งคืน
หากจำนวนแถวที่ตรงกันสูงและแถวมีขนาดใหญ่การค้นหาอาจสิ้นสุดในการหมดเวลาอ่าน คุณสามารถขอ PK ได้เฉพาะกับ ES Metadata จากนั้นโหลดแถวขนานจากรหัสของคุณโดยใช้ CQL Queries
เพื่อที่จะบอกให้ดัชนีส่งคืน PKS เท่านั้นคุณต้องใช้คำแนะนำแบบสอบถามด้านล่าง #Options: load-rows = false #:
select * from emails where query='#options:load-rows=false#id:ab*';
เป็นสิ่งสำคัญที่จะต้องทราบว่าแถวที่ส่งคืนเป็นของปลอมและสร้างจากผลลัพธ์ของการสืบค้น Elasicsearch หมายความว่าอาจไม่มีแถวกลับมาอีกแล้ว:
เมื่อมีการร้องขอการค้นหาส่งคืนผลลัพธ์แถวแรกจะมีข้อมูลเมตา Elasticsearch เป็น ## A JSON String ในคอลัมน์ของดัชนี ดูตัวอย่าง:
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 ไม่ได้รับการสนับสนุนอีกต่อไป อย่างไรก็ตามกระบวนการบดอัดและการซ่อมแซมปกติของคาสซานดราจะลบข้อมูลหลุมฝังศพโดยอัตโนมัติ ElasticIndex จะลบข้อมูลออกจาก 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 ล้มเหลว:
