Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

เหตุใดข้อความค้นหา Elasticsearch ของฉันจึงช้า

เผยแพร่ครั้งแรกเมื่อวันที่ 29 พฤษภาคม 2018 ที่ ObjectRocket.com/blog

คำขอรับการสนับสนุนของ Elasticsearch® ที่พบบ่อยๆ ที่ Rackspace Technology จะได้รับคือ “คุณช่วยเรื่องเวลาตอบสนองของฉันได้ไหม” หรือ “คำถามของฉันใช้เวลานาน ฉันควรทำอย่างไร”

เหตุใดข้อความค้นหา Elasticsearch ของฉันจึงช้า

สองแนวทาง

เมื่อใดก็ตามที่เราได้รับคำถามประเภทนี้ เราจะเริ่มต้นด้วยการพิจารณาสองประเด็นหลัก:

  • ฝ่ายปฏิบัติการ – ดูทรัพยากรระบบปัจจุบันและตัวเลือก 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 ฟรีหรือไม่ เริ่มต้นและแจ้งให้เราทราบหากคุณมีคำถามใดๆ

ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณยังสามารถคลิกแชทขาย เพื่อแชทตอนนี้และเริ่มการสนทนา