เผยแพร่ครั้งแรกเมื่อวันที่ 29 พฤษภาคม 2018 ที่ ObjectRocket.com/blog
คำขอรับการสนับสนุนของ Elasticsearch® ที่พบบ่อยๆ ที่ Rackspace Technology จะได้รับคือ “คุณช่วยเรื่องเวลาตอบสนองของฉันได้ไหม” หรือ “คำถามของฉันใช้เวลานาน ฉันควรทำอย่างไร”
สองแนวทาง
เมื่อใดก็ตามที่เราได้รับคำถามประเภทนี้ เราจะเริ่มต้นด้วยการพิจารณาสองประเด็นหลัก:
- ฝ่ายปฏิบัติการ – ดูทรัพยากรระบบปัจจุบันและตัวเลือก Elasticsearch เริ่มต้น
- ด้านการพัฒนา - ดูคำค้นหา โครงสร้าง และการแมปของข้อมูลที่คุณกำลังค้นหา
ในครั้งแรกนี้ในชุดโพสต์บล็อกเกี่ยวกับการเพิ่มประสิทธิภาพ Elasticsearch เราเน้นที่ส่วนหลังของสองส่วนนี้ เราได้รับข้อความค้นหาที่ช้า หารือเกี่ยวกับภาษาการสืบค้น Domain Specific Language (DSL) และพิจารณาตัวเลือกที่สามารถช่วยปรับปรุงการสืบค้น Elasticsearch ของคุณได้
ข้อความค้นหาของคุณช้าแค่ไหน
ขั้นตอนแรกคือการดูว่าต้องใช้เวลานานแค่ไหนในการส่งแบบสอบถามไปยังคลัสเตอร์ เอกสาร Elasticsearch ไม่ชัดเจนเกี่ยวกับวิธีการเปิดบันทึกที่ช้า ดังนั้นฉันจึงแสดงตัวอย่างบางส่วนในโพสต์นี้
อันดับแรก มีบันทึกที่ช้าสองเวอร์ชันใน Elasticsearch:จัดทำดัชนีบันทึกช้าและค้นหาบันทึกช้า เนื่องจากปัญหาที่เรากำลังพยายามแก้ไขเกี่ยวข้องกับการสืบค้นที่ช้า เราจึงเน้นที่การค้นหาบันทึกที่ช้า อย่างไรก็ตาม หากเป็นเรื่องเกี่ยวกับปัญหาด้านประสิทธิภาพขณะจัดทำดัชนีหรือเพิ่มเอกสาร เราจะพิจารณาบันทึกที่ช้าของดัชนี
Elasticsearch ทุกเวอร์ชันจะปิดบันทึกที่ช้าตามค่าเริ่มต้น ดังนั้นคุณต้องอัปเดตทั้งการตั้งค่าคลัสเตอร์และการตั้งค่าดัชนี ตัวอย่างต่อไปนี้จัดการกับ Elasticsearch 6.2 แต่คุณสามารถค้นหาข้อมูลเกี่ยวกับเวอร์ชันก่อนหน้าได้ที่นี่ แทนที่ $ES_version ด้วย เวอร์ชันที่คุณกำลังทำงานอยู่ เช่น เวอร์ชัน 5.5
-
ส่ง วาง ขอไปยัง _cluster API เพื่อกำหนดระดับของบันทึกที่ช้าที่คุณต้องการเปิด:เตือน ข้อมูล ดีบัก และติดตาม (ข้อมูลเพิ่มเติมเกี่ยวกับระดับการบันทึก)
curl -XPUT https://localhost:$ES_PORT/_cluster/settings -H 'Content-Type:application/json' -d'
{
“ชั่วคราว” :{“logger.index.search.slowlog” :“DEBUG”,“logger.index.indexing.slowlog” :“DEBUG”}}'
เนื่องจาก Elasticsearch เปิดใช้งานการบันทึกช้าทั้งหมดในระดับดัชนี คุณจึงสามารถส่งคำขอไปที่ดัชนี _settings API เพื่อเปิดใช้งาน คุณต้องเพิ่มเทมเพลตดัชนีด้วยหากคุณจะหมุนเวียนดัชนีเป็นรายเดือน รายไตรมาส และอื่นๆ
-
ปรับการเรียก API ไปยังการตั้งค่าดัชนีเพื่อให้ตรงกับเกณฑ์เวลาในการบันทึกที่ช้าที่คุณต้องการเข้าถึง คุณสามารถตั้งค่าเป็นศูนย์เพื่อสร้างโปรไฟล์ของอินสแตนซ์และรวบรวมการสืบค้นที่ส่งทั้งหมดหรือ –1 เพื่อปิดการบันทึกที่ช้า
-
ใช้การตั้งค่าระดับบันทึกเดียวกับที่คุณใช้ใน _clustersettings ในตัวอย่างนี้
DEBUG
.ES_PORT
เป็นตัวแปรด้านสิ่งแวดล้อมที่คงอยู่curl -XPUT https://localhost:$ES_PORT/*/_settings?pretty -H 'Content-Type:application/json' -d '{“index.search.slowlog.threshold.query.debug”:“-1” ,“index.search.slowlog. threshold.fetch.debug”:“-1”,}’
ตอนนี้ คุณต้องรวบรวมบันทึก บันทึกที่ช้าจะถูกสร้างขึ้นตามชาร์ดและที่รวบรวมต่อโหนดข้อมูล หากคุณมีโหนดข้อมูลเพียงโหนดเดียวที่เก็บชาร์ดหลักห้ารายการ (ค่าเริ่มต้น) คุณจะเห็นรายการห้ารายการสำหรับหนึ่งการสืบค้นในบันทึกที่ช้า เนื่องจากการค้นหาใน Elasticsearch เกิดขึ้นภายในแต่ละชาร์ด คุณจะเห็นหนึ่งรายการสำหรับแต่ละชาร์ด บันทึกที่ช้าจะถูกจัดเก็บต่อโหนดข้อมูลในตำแหน่งเริ่มต้นต่อไปนี้:/var/log/elasticsearch/$ClusterID_index_slowlog_query and /var/log/elasticsearch/$ClusterID_index_slowlog_fetch อย่างที่คุณเห็น บันทึกการค้นหาที่ช้าจะถูกแบ่งออกเป็นไฟล์บันทึกที่แยกจากกันอีกครั้งตามขั้นตอนของการค้นหา:การดึงข้อมูลและการค้นหา
ตอนนี้เราได้ผลลัพธ์ในบันทึกแล้ว เราสามารถดึงรายการและแยกส่วนได้
[2018-05-21T12:35:53,352][DEBUG ][index.search.slowlog.query] [DwOfjJF] [blogpost-slowlogs][4] took[1s], took_millis[0], types[], stats[], search_type[QUERY_THEN_FETCH], total_shards[5], source[{"query":{"match":{"name": {"query":"hello world", "operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions" :true, "lenient":false,"zero_terms_query": "NONE","boost":1.0}}},"sort":[{"price": {"order":"desc"}}]}],
ที่นี่คุณจะเห็น:
- ประทับวันที่
- ระดับบันทึก
- ประเภทบันทึกช้า
- ชื่อโหนด
- ดัชนี
- หมายเลขชาร์ด
- ใช้เวลา
- เนื้อหาของข้อความค้นหา (_source>)
หลังจากที่เราได้รับข้อความค้นหาที่เราระบุว่าใช้เวลานานเกินไป เราสามารถใช้เครื่องมือต่อไปนี้เพื่อแยกย่อย:
_profile API
_profile API ให้หน้าข้อมูลเกี่ยวกับการค้นหาของคุณและแยกย่อยสิ่งที่เกิดขึ้นในแต่ละชาร์ด ลงไปจนถึงเวลาของแต่ละองค์ประกอบการค้นหา ยิ่งการค้นหามีรายละเอียดมาก ผลลัพธ์ของ _profile ก็ยิ่งละเอียดมากขึ้นเท่านั้น
เครื่องมือสร้างโปรไฟล์ Kibana
เครื่องมือ Kibana® ทำงานร่วมกับ _profile เอพีไอ มันให้ภาพน้ำตกที่สวยงามเป็นตัวแทนขององค์ประกอบการค้นหาแต่ละรายการและเวลาที่พวกมันใช้ในการทำให้เสร็จ อีกครั้ง วิธีนี้ทำให้คุณสามารถเลือกพื้นที่ปัญหาของข้อความค้นหาได้
Elasticsearch สองขั้นตอน:สืบค้นแล้วดึงข้อมูล
ตอนนี้ เราได้ระบุข้อความค้นหาที่ช้าแล้ว และเราได้ดำเนินการผ่านตัวสร้างโปรไฟล์ การดูผลลัพธ์ของเวลาส่วนประกอบแต่ละรายการไม่ได้ทำให้การค้นหาของคุณเร็วขึ้น ตอนนี้อะไร? การทำความเข้าใจว่าการสืบค้นข้อมูลทำงานอย่างไร โดยผ่านสองขั้นตอนต่อไปนี้ ช่วยให้คุณออกแบบการสืบค้นข้อมูลของคุณใหม่ในลักษณะที่ได้รับผลลัพธ์ที่ดีที่สุดจาก Elasticsearch ทั้งในแง่ของความเร็วและความเกี่ยวข้อง
ระยะการสืบค้น
- โหนดผู้ประสานงานยอมรับการสืบค้น
- ผู้ประสานงานระบุดัชนี (หรือดัชนี) ที่กำลังค้นหา
- ผู้ประสานงานสร้างรายการโหนดที่มีชาร์ดสำหรับดัชนี (ทั้งแบบหลักและแบบผสม)
- ผู้ประสานงานส่งแบบสอบถามไปยังโหนด
- ชาร์ดบนโหนดประมวลผลการสืบค้น
- การสืบค้นจะได้รับคะแนน (โดยค่าเริ่มต้น) ถึงเอกสาร 10 อันดับแรก
- รายการจะถูกส่งกลับไปยังโหนดผู้ประสานงาน
เฟสดึงข้อมูล
- ขั้นตอนการดึงข้อมูลเริ่มต้นด้วยโหนดผู้ประสานงาน ซึ่งกำหนดเอกสาร 10 อันดับแรกจากผลลัพธ์ 50 รายการ (5 ส่วนแบ่งข้อมูล x 10) ที่ส่งโดยแต่ละกลุ่มข้อมูล
- ผู้ประสานงานจะส่งคำขอสำหรับเอกสาร 10 อันดับแรกไปยังชาร์ด (ซึ่งอาจเป็นชาร์ดเดียวที่มีเอกสารที่มีคะแนนสูงสุด หรืออาจกระจัดกระจายในหลายชาร์ด)
หลังจากที่รายการถูกส่งกลับ ต้นแบบจะแสดงเอกสารในส่วน _hits ของการตอบกลับแบบสอบถาม
คะแนนผลลัพธ์
คะแนนผลลัพธ์มีความสำคัญใน Elasticsearch โดยปกติ เมื่อคุณใช้เครื่องมือค้นหา คุณต้องการผลลัพธ์ที่แม่นยำที่สุด ตัวอย่างเช่น หากคุณกำลังค้นหากีวี ผลไม้ คุณไม่ต้องการให้ผลลัพธ์รวม Kiwi ขัดรองเท้าด้วย Elasticsearch จะให้คะแนนผลลัพธ์ของการค้นหาตามพารามิเตอร์ที่คุณระบุ ในขณะที่เรากล่าวถึงความเกี่ยวข้องของข้อความค้นหาในโพสต์บล็อกที่ต่างไปจากเดิมอย่างสิ้นเชิง สิ่งสำคัญคือต้องพูดถึงที่นี่ เพราะหากคุณมีการค้นหาที่รวดเร็ว แต่ผลลัพธ์ไม่ใช่สิ่งที่คุณกำลังมองหา การค้นหาทั้งหมดเป็นการเสียเวลา ดังนั้น คุณจะเร่งการค้นหาของคุณให้เร็วขึ้นได้อย่างไร
ตัวกรอง
วิธีหนึ่งในการปรับปรุงประสิทธิภาพการค้นหาของคุณคือการใช้ตัวกรอง ข้อความค้นหาที่กรองแล้วสามารถเป็นเพื่อนที่ดีที่สุดของคุณได้ สิ่งสำคัญคือต้องกรองก่อน เนื่องจากตัวกรองในการค้นหาไม่ส่งผลต่อผลลัพธ์ของคะแนนเอกสาร คุณจึงใช้ทรัพยากรเพียงเล็กน้อยเพื่อลดช่องค้นหา
เมื่อใช้คำค้นหาที่กรองแล้ว การทำงานกับการจับคู่แบบบูลีน คุณจะค้นหาเอกสารทั้งหมดที่มี X ได้ก่อนที่จะให้คะแนนว่ามี Y หรือไม่ นอกจากนี้ คุณยังแคชตัวกรองได้อีกด้วย
ตัวกรองไม่ใช่วิธีเดียวที่จะเร่งความเร็วการสืบค้นของ Elasticsearch เราจะพูดถึงวิธีการอื่นๆ ที่คุณสามารถใช้ปรับปรุงประสิทธิภาพการสืบค้นในบล็อกในอนาคต
สรุป
คุณสามารถเพิ่มประสิทธิภาพการสืบค้นของคุณได้ด้วยขั้นตอนง่ายๆ:
- เปิดใช้งานการบันทึกช้าเพื่อให้คุณสามารถระบุข้อความค้นหาที่ใช้เวลานาน
- เรียกใช้การค้นหาที่ระบุผ่าน _profiling API เพื่อดูเวลาของแต่ละส่วนประกอบ
- กรอง กรอง กรอง
มีคำถามเกี่ยวกับการจัดการ Elasticsearch หรือไม่? เรารวมการเข้าถึงผู้ดูแลฐานข้อมูลของเราด้วยความเชี่ยวชาญด้าน Elasticsearch อย่างลึกซึ้งในทุกอินสแตนซ์ แม้จะไม่มีการทดลองใช้ฟรี เริ่มมุ่งเน้นที่การพัฒนาและให้เราจัดการการจัดการ Elasticsearch
ต้องการทดลองใช้ Elasticsearch 6 กับ Kibana ฟรีหรือไม่ เริ่มต้นและแจ้งให้เราทราบหากคุณมีคำถามใดๆ
ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณยังสามารถคลิกแชทขาย เพื่อแชทตอนนี้และเริ่มการสนทนา