Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

Elasticsearch :: แนะนำการสร้าง mapping ของข้อมูลที่ดี

$
0
0

elasticsearch-logo

Screen Shot 2558-08-23 at 9.25.09 PM หลังจากที่รู้จักกับ Elasticsearch ตั้งแต่ verison 0.9 มาจนถึง 2.0 นั้น มีความสามารถต่าง ๆ เปลี่ยนแปลงไปมากมาย หนึ่งในนั้นคือ Mapping หรือ การกำหนดโครงสร้างของข้อมูล มาดูว่าควรทำการกำหนด mapping อย่างไร เพื่อให้ทำงานได้ดียิ่งขึ้น สามารถใช้ได้ทั้ง version 1.7 และ 2.0

1. กำหนดชนิดของข้อมูลในแต่ละ field ให้ถูกต้อง และ เหมาะสม

โดยปกติ Elasticsearch นั้น เราไม่จำเป็นต้องกำหนด mapping ของข้อมูล เนื่องจากจะสร้าง mapping ให้อัตโนมัติจากข้อมูลนั่นเอง (Dynamic mapping) แต่ถ้าผลการทำงานอาจจะไม่ถูกต้อง และ เหมาะสมกับความต้องการ ดังนั้นแนะนำให้ทำการสร้าง mapping ขึ้นมาก่อน หรืออาจจะใช้ index template ก็ได้ ตัวอย่างเช่น
  • ข้อมูลชนิด geo_point สำหรับเก็บข้อมูลตำแหน่ง latitude และ longitude
  • ข้อมูลชนิด date สำหรับข้อมูล timestame

2. ในแต่ละ field ควรกำหนดให้ Elasticsearch ทำการ analyse และ จัดเก็บเท่าที่จำเป็น

โดยปกติ Elasticsearch นั้น จะทำการ analyse และ จัดเก็บข้อมูลของทุก ๆ field ซึ่งไม่ค่อยมีผลมากนักสำหรับตอนเริ่มต้นของระบบ
แต่เมื่อข้อมูลเยอะขึ้นเรื่อย ๆ ปัญหาจะตามมาอย่างมาก ทั้งพื้นที่การจัดเก็บ และ ขนาดของ memory ที่ต้องใช้งาน ส่งผลต่อเวลาในการประมวลผล
ดังนั้น เพื่อลดการใช้ resource ต่าง ๆ โดยไม่จำเป็น ต้องทำการพิจารณาว่า field ใดควร analyse และ จัดเก็บบ้าง ? หรือ field ไหนไม่ถูกใช้งานเลย ? ซึ่งสามารถกำหนดได้ใน mapping นั่นเอง ตัวอย่างเช่น ข้อมูลของหน้า web page ซึ่งเป็น HTML ซึ่งใช้งานเพียงแสดงผลอย่างเดียว ไม่เคยทำการค้นหาเลย ดังนั้น ควรกำหนดให้จัดเก็บอย่างเดียว แต่ไม่ทำการ analyze

3. ใช้งาน Multi-fields หรือ Raw field เมื่อต้องการทั้ง Analyse และ Aggregation

ตัวอย่างเช่น ข้อมูลของ Tag ซึ่งสามารถจัดเก็บข้อมูลที่มีพวก white space ได้ เช่น ช่องว่าง และ - เป็นต้น และข้อมูล Tag ต้องนำมาใช้งาน เพื่อนับว่าแต่ละ Tag มีข้อมูลที่เกี่ยวข้องจำนวนเท่าไร ? แน่นอนว่า ต้องทำการนับผ่าน Aggregation นั่นเอง ซึ่งเป็นปัญหา classic ที่ทุก ๆ คนจะต้องเจอ การแก้ไขที่เหมาะสมที่สุด คือ การใช้ multi-field โดย field หลัก กำหนดให้ทำการ analyze และ จัดเก็บ ส่วน raw field จะกำหนดไม่ให้ analyze เพื่อนำมานับจำนวนข้อมูลที่เกี่ยวข้องได้อย่างถูกต้อง

4. ให้ระวังการกำหนดจำนวน Replica และ Shard ของแต่ละ index

เนื่องจากเราไม่สามารถแก้ไขค่าเหล่านี้ได้ หลังจากการ indexed ข้อมูลไปแล้วนะ ดังนั้น ควรทำการประมาณการว่า ข้อมูลมีอัตราการเติบโตเท่าไร เพื่อจะได้เตรียมแผนการรับมือไว้ได้ โดยค่าของ Replica นั้น เราจะเพิ่มก็ต่อเมื่อ
  • ต้องการเครื่องมาช่วยรองรับผู้ใช้งานที่มากขึ้น
  • ต้องการเพิ่มเรื่องของ Availability
  • ต้องการ scale up
แนะนำให้เริ่มค่า replica ที่ 1 ส่วนจำนวนของ Shard ขึ้นอยู่กับขนาดของข้อมูล ซึ่งแต่ละ Shard ไม่ควรเกิน 30 GB

5. ถ้าไม่อยากให้ Elasticsearch cluster ตาย แนะนำให้กำหนดจำนวน field ซะ

จำนวน field มีเท่าที่จำเป็นเท่านั้น อย่าเผื่อ !! อ่านเพิ่มเติมได้ที่ Mapping Explosion

6. สำหรับ Elasticsearch 1.x ให้ทำการกำหนดค่าของ doc_values=true

เพื่อไม่ให้ Elasticsearch ทำการ analyse ข้อมูลชนิด String เป็นวิธีการลดจำนวน memory ที่ใช้งานลงไปอย่างมาก ส่วนใน Elasticsearch 2.0 ไม่ต้องทำอะไร เพราะว่าเป็นค่า default อยู่แล้ว

7. แนะนำให้ทำการ reindex มากกว่าลบและสร้าง mapping ใหม่นะครับ

เนื่องจากการลบและสร้าง mapping ใหม่มันใช้ resource ที่สูงมาก ๆ แต่ง่ายและสะดวก แต่ในการทำงานจริง ๆ จะไม่ทำการลบข้อมูลจริง ๆ นะ เพียงทำการกำหนด delete flag = true ไว้เท่านั้นเอง ดังนั้น คุณจะยังไม่ได้พื้นที่ของ harddisk กลัมบโดยทันทีนะ ซึ่งจะได้กลับมาเมื่อทำการ merge segment เสร็จเรียบร้อย ส่วนใน Elasticsearch 2.0 นั้นไม่สามารถลบ mapping ได้แล้วนะ ต้องลบ และ สร้าง index ใหม่เท่านั้น

ทั้ง 7 ข้อ เป็นคำแนะนำสำหรับการจัดการกับ mapping

เนื่องจากปกติ mapping จะถูกสร้างอย่างอัตโนมัติเมื่อทำการ indexed ข้อมูล แต่เพื่อให้ Elasticsearch ทำงานได้อย่างมีประสิทธิภาพกว่าเดิม ควรที่จะต้องทำการปรับแต่ง mapping กันหน่อยนะครับ น่าจะพอมีประโยชน์บ้าง สำหรับคนที่ศึกษา และ นำ Elasticsearch ไปใช้งาน

Viewing all articles
Browse latest Browse all 1997

Trending Articles