คำถาม
ถ้าต้องเก็บข้อมูลสำหรับการค้นหาและวิเคราะห์ไว้ใน Elasticsearch
โดยข้อมูลต้นทางจะถูกเก็บไว้ใน RDBMS เช่น MySQL และ PostgreSQL เป็นต้น
ถ้ามีการแก้ไขข้อมูลที่ RDBMS แล้ว
จะทำการ sync หรือ update ข้อมูลใน Elasticsearch อย่างไรได้บ้าง ?
คำตอบ
ทำได้หลายวิธีแล้วแต่ความต้องการและความสามารถ
โดยวิธีการที่ผมใช้บ่อยที่สุดคือ การเขียน code เองนี่แหละ
เนื่องจากควบคุมได้ง่ายสุด ในมุมมองของผม
รวมทั้งมีความยืดหยุ่นอีกด้วย
เนื่องจากต้องทำการแปลงรูปแบบข้อมูลด้วยเสมอ
และจำเป็นต้องทำการตั้ง schedule สำหรับการทำงานอีกด้วย
แต่หลาย ๆ คนอาจะบอกว่า
มีวิธีที่ง่ายกว่านี้ไหม
ผมว่าวิธีการข้างต้นก็ง่ายแล้วนะ
สงสัยที่ง่าย เนื่องจากผมชอบเขียน code ได้มั้ง
หรือไม่อยากใช้เครื่องมืออื่น ๆ ให้วุ่นวาย
ดังนั้นมาลองวิธีอื่น ๆ บ้าง เช่น
- ใช้ Kafka connect + JDBC
- ใช้ Logstash + JDBC input plugin
โดยใน blog นี้จะใช้งาน Logstash + JDBC input plugin
แนวคิดการทำงานของ JDBC input plugin ก็ไม่ได้ยากอะไร คือ
จะทำการ poll ถาม RDBMS ตามช่วงเวลาที่เรากำหนด
เช่น ทุก ๆ นาที เป็นต้น เหมือนกับการกำหนดใน crontab นั่นเอง
จากนั้นจะทำการตรวจสอบว่า มีการเพิ่มหรือเปลี่ยนแปลงข้อมูลใน RDBMS หรือไม่ ?
จะทำการตรวจสอบผ่าน column ชื่อว่า modification_time และ insertion_time
ว่ามีค่ามากกว่า เวลาที่ poll หรือดึงล่าสุดหรือไม่
โดยที่ค่าทั้งสอง column จะถูกเพิ่มเข้ามาในการ update และ insert นั่นเอง
การสร้างก็ง่าย ๆ เริ่มจากสร้าง database และ table ข้อมูลหลักก่อน
ซึ่งต้องเพิ่ม 2 colum ไปด้วยดังนี้
[gist id="c00f4059c58f4f3e67eb5c39c11d1aa2" file="1.sql"]จากนั้นทำการสร้าง config สำหรับ logstash
โดยกำหนด input คือ JDBC จาก database ที่สร้างไว้
ในตัวอย่างผมใช้ MySQL
และ output ให้แสดงออกที่ console และ Elasticsearch server นั่นเอง
เพียงเท่านี้ก็ใช้งานได้แล้วนะ
แต่สิ่งที่ผมไม่ค่อยชอบคือ
ไม่สามารถแก้ไขรูปแบบข้อมูลได้ ตามที่ต้องการมากนัก
ถ้าจะทำต้องมาเขียนในส่วนของ filter ที่ config ใน Logstash
แน่นอนว่า ซับซ้อนไปหน่อย
แต่ถ้าเราไม่คิดอะไรมาก วิธีการนี้ก็ชิว ๆ ครับ
ไว้ blog ต่อ ๆ ไป จะเอาตัวอย่างของ Kafka connect มาให้ดู