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

ทำการ update ข้อมูลระหว่าง Elasticsearch กับ Database อย่างไรดี ?

$
0
0

Screen Shot 2559-03-27 at 3.04.46 PM

Screen Shot 2559-03-27 at 3.04.46 PM คำถามหนึ่งที่ได้ยินบ่อยมาก ๆ สำหรับการนำ Elasticsearch มาใช้งานนั่นก็คือ
จะทำการ migrate และ update ข้อมูลระหว่าง  Elasticseach กับ Database อย่างไรดี ?
โดย Database นั้นหมายถึง ที่จัดเก็บข้อมูลของระบบในปัจจุบัน ตัวอย่างเช่น RDBMS, File system และ Memory เป็นต้น มาดูกันว่ามีวิธีการใดบ้าง ?

ถ้าเป็น Elasticsearch ก่อนเวอร์ชั่น 2.0

จะมีสิ่งที่เรียกว่า River API ให้ใช้งาน ซึ่งจะมี JDBC River ไว้สำหรับการดึงข้อมูลจาก Database มาจัดเก็บที่ Elasticsearch อย่างอัตโนมัติ แต่ว่าตั้งแต่เวอร์ชั่น 2.0 ได้นำเอาความสามารถนี้ออกไป ดังนั้นวิธีการนี้จึงไม่ขอแนะนำอีกต่อไป

ส่วนวิธีการที่ขอแนะนำคือ เขียนโปรแกรมเอาเองเลยดีกว่า !!

เนื่องจากการเขียนโปรแกรมเอง มันจะยืดหยุ่นกว่า ตอบรับกับความต้องการที่เปลี่ยนแปลงอยู่ตลอดเวลามากกว่า แต่ข้อเสียคือ ต้องเสียเวลามาเรียนรู้วิธีการเขียนโปรแกรมอีก ซึ่งมันเป็นเรื่องปกติที่มีข้อดีก็ต้องมีข้อเสีย รูปแบบการ update หรือ sync ข้อมูล แสดงดังรูป db-es

ก่อนที่จะลงมือเขียนโปรแกรมหรือเลือกเครื่องมือ มาดูรูปแบบของข้อมูลที่จะจัดเก็บก่อนไหม ?

เพื่อทำให้เข้าใจก่อนว่า ข้อมูลที่จะจัดเก็บเป็นอย่างไร ซึ่งนำข้อมูลมาจากบทความ Four ways to index relational data in Elasticsearch รูปแบบที่ 1 ข้อมูล 1 row จาก Database คือ 1 Document ใน Elasticsearch เป็นวิธีที่ง่าย และ ตรงไปตรงมาสุด ๆ แสดงดังรูป product-01 รูปแบบที่ 2 ข้อมูลจำนวนมากกว่า 1 row จาก Database คือ 1 Document ใน Elasticsearch แสดงดังรูป product-02 ดังนั้นสิ่งที่ต้องทำก่อนนำข้อมูลเข้า Elasticsearch คือ ต้องทำการ join ข้อมูลจาก 2 Table ก่อนเสมอ แสดงดังรูป product-03 จากนั้นในการจัดเก็บที่ Elasticsearch ก็ให้เก็บลง field/property ในรูปแบบของ Array ได้เลย เป็นรูปแบบหนึ่งของการ Denomalization นั่นเอง รูปแบบที่ 3 ทำการจัดเก็บข้อมูลใน Elasticsearch แบบ Nested object มาดูตัวอย่างเพื่อความเข้าใจมากขึ้น เป็นข้อมูลจาก 2 table คือ products และ sizes แสดงดังรูป product-04 ก่อนที่จะจัดเก็บข้อมูลลงไปยัง Elasticsearch ต้องทำการ join ข้อมูลกันก่อน และเลือกเฉพาะ column ที่จำเป็นต่อการใช้งานเท่านั้น ไม่ควรเก็บข้อมูลที่ไม่จำเป็นหรือไม่ได้ใช้งาน ส่วนข้อมูลจาก sizes มีโครงสร้างแบบ Nested object หรือข้อมูล 1 product จะอยู่ใน 1 document เท่านั้น แสดงดังรูป product-05

ข้อควรจำ

ก่อนจะเก็บข้อมูลลงใน Elasticsearch ต้องคิดก่อนเสมอว่า ปัญหาคืออะไร และ จะแก้ไขอย่างไร ไม่ใช่ตั้งหน้าตั้งตาเก็บกันอย่างเดียว !! นั่นคือ เก็บเท่าที่จำเป็น เก็บเท่าที่ใช้ เรานำ Elasticsearch มาใช้เพื่อช่วย ทำให้ระบบการค้นหามันสะดวกขึ้น ทำให้ระบบการค้นหามันง่ายขึ้น ทำให้ระบบการค้นหามันเร็วขึ้น มิใช่นำมาแทนที่ Database หลักนะครับ คำแนะนำจาก Elasticsearch บอกว่าในการ update/sync นั้นให้ใช้ Bulk API และเขียนเองเถอะ ไม่จำเป็นต้องไปเครื่องมือใด ๆ เลย ซึ่งอ้างอิงมาจากบทความเรื่อง Keeping elasticsearch in sync  

Viewing all articles
Browse latest Browse all 1997

Trending Articles