เหตุผลที่เลือกใช้ InfluxDB เก็บราคาและ time series data

เราใช้ InfluxDB (https://www.influxdata.com/products/influxdb-overview/) ในระบบเรา (รันอยู่ใน docker) ในการเก็บข้อมูลประเภท time series data เช่น ราคา, trade action, trade statistics, trade position ฯ

เหตุผล (design rationale) ที่ผมเลือกใช้ InfluxDB:

  1. เป็น time series database อันดับต้นๆ เลย
  2. doc ดีมาก มีตัวอย่างเยอะ มี REST API
  3. คนใช้เยอะ benchmark ดี
  4. ผมถามเพื่อนๆ น้องๆ ที่รู้จัก ที่เค้าใช้ในสเกลใหญ่ๆ เค้าแนะนำ InfluxDB
  5. มันขึ้นชื่อเรื่องเร็วมาก
  6. คำสั่งเป็น SQL คล้าย SQL ใน RDBMS ทำให้เรียนรู้ไม่ยาก
  7. รองรับฟังก์ชั่น, การคำนวณ และการทำงานแบบ time series เช่น การ aggregate ตามเวลา, upsert (insert or update) โดยเช็กจาก time ซึ่งอันนี้สะดวกมาก เหมาะกับงานเราสุดๆ เวลามีราคาใหม่ฟีดเข้ามา แต่แท่งยังไม่จบก็ update ทับ แต่ถ้าขึ้นแท่งราคาใหม่ก็ insert
  8. รูปแบบการตั้ง index (tag) ก็เหมาะกับงานเราดี
  9. มี official python library และอัพเดตบ่อยใช้ได้

ข้อเสียมี 2 เรื่อง:

  1. ถ้าจะใช้แบบ cluster จะไม่ฟรี แพงด้วย แต่ระบบเราไม่ได้รันแบบ cluster อยู่แล้ว หรือถ้าใครจะทำระบบในสเกลใหญ่ เช่น quant fund หนักๆ ก็รันแบบ cluster ได้
  2. schema มัน strict ไม่ยืดหยุ่นแบบ document databaseระบบเวอร์ชั่นก่อนใช้ MongoDB มีดีตรง schema ยืดหยุ่น แต่ความเร็วสู้ influxdb ไม่ได้

จริงๆ จะใช้ Graphite หรือ RDBMS อย่าง Postgresql แทนก็ได้ครับแต่

  1. RDBMS มันเก่ง ACID (atomicity, consistency, isolation, durability) ซึ่งระบบเราไม่ได้มี concurrent update เลย จึงไม่มีการทำ ACID
  2. RDBMS ไม่เก่ง query มีโอเวอร์เฮดเยอะ
  3. RDBMS ไม่เหมาะกับระบบที่มี architectural style แบบนี้เท่าไหร่ เช่น เรื่อง index, scale out, data modeling และอีกเยอะแยะมากมายสาธยายไม่หมด 555
  4. ผมเบื่อ RDBMS กับ ER data model มาก เพราะใช้มันมายี่สิบกว่าปีแล้ว แต่ก่อนเคยเป็น Oracle instructor ด้วยครับ เลยยิ่งเบื่อ 555

====================

เสริมอีกนิด อย่างที่ AVA advisory กับ Finnomena ใช้ Cassandra เป็น database สำหรับเก็บข้อมูลราคา, อินดิเคเตอร์เพราะเขาเก็บข้อมูลหุ้นทุกตัวในตลาดและหลายตลาด และหลายสินค้า ข้อมูลจึงเยอะและใหญ่ และเขาทำในสเกลใหญ่ ข้อมูลหาย/พัง/เสียหาย ก็จะเสี่ยงมาก ดังนั้นหากใช้ Cassandra ข้อมูลจะหาย/พัง/เสียหาย ยากมาก ชัวร์สุดๆ

Cassandra เป็น NoSQL database ประเภท wide-column store ใช้การจัดคอลัมน์เป็นกลุ่มๆ แล้วก๊อปปี้ข้อมูลกระจายไปเก็บในหลายเครื่อง Cassandra ใช้เครื่องเยอะมาก จึงเป็นสาเหตุหลักที่ผมไม่เลือกใช้ในระบบเรา

wide-column store database เป็น database ที่มี high availability สูงที่สุด (แต่ใช้หลายเครื่องมาก)

architecture ในระบบเรา ผมออกแบบในแนว microservices architecture โดยแต่ละชุด trading robot มี database (InfluxDB) กับ cache (Redis) เป็นของมันเอง ซึ่งทั้งหมดรันใน container (docker) บน 1 เครื่อง (VM) แต่ละชุด trading robot จะไม่แชร์อะไรระหว่างกันเลยจึง lightweight & resilient กว่า ไอเดียนี้มาจากแนวคิด embedded resources & decentralization หากเกิดข้อผิดพลาดกระทบกับการรันบอทจะเป็นข้อผิดพลาดในรูปแบบ partial failure ซึ่งจะส่งผลกระทบต่อภาพรวม (บอทในเครื่องต่างๆ ) น้อยมาก หรือแทบไม่เกิดผลกระทบเลย

ในโปรเจ็คต์ Deep Ocean กำลังพิจารณาเลือกใช้ Google BigTable สำหรับเก็บราคาอยู่ครับ ยังไม่ได้ข้อสรุป กำลังทำ feasibility study เทียบระหว่าง BigTable กับ InfluxDB เพราะนอกจากพิจารณาด้านความสามารถ ยังต้องคำนึงด้านใช้จ่ายด้วย ไว้ได้ข้อสรุปจะมาอัพเดตนะครับ

ดูอีกตัวอย่างในเว็บนี้ได้ครับ ที่เอา InfluxDB มาเก็บราคาหุ้น แล้ว visualize ด้วย Grafana https://medium.com/analytics-vidhya/watch-your-stock-shares-with-grafana-and-influxdb-4df7a99c6d64

Leave a Reply

Discover more from

Subscribe now to keep reading and get access to the full archive.

Continue reading