สวัสดีครับ ผู้อ่านทุกท่าน วันนี้เรามาทำในฝั่ง Server เพื่อเตรียมตัวทำ Database เพื่อเก็บข้อมูลในอุปกรณ์ IoT ในรูปแบบของ Time Series กันครับ ซึ่งเหมาะมากๆ การเก็บข้อมูลเซ็นเซอร์ต่างๆครับ
ในบทความนี้ผมจะพูดถึงการติดตั้งด้วย Docker นะครับ นั่นแปลว่า ท่านสามารถติดตั้งในระบบปฏิบัติการอื่นได้ในรูปแบบเดียวกัน ซึ่งบทความนี้เราจะไปลุยกันที่วิธีการติดตั้ง InfluxDB และ Grafana บน Cloud (ผมเลือกใช้ Digital Ocean ไปก่อน)
InfluxDB
เป็น TimeSeries Database ครับซึ่งเป็น Open-source อยู่บน TICK Stack (Telegraf, InfluxDB, Chronograf, Kapacitor) ซึ่งออกแบบมาให้จัดการกับการอ่าน/เขียนข้อมูลที่หนักหน่วง และมี InfluxQL ที่ใช้ในการดึงข้อมูลที่คล้ายกับ SQL ภาษาอื่นๆครับ
Grafana
เป็น TimeSeries Database ครับซึ่งเป็น Opensource อยู่บน TICK Stack (Telegraf, InfluxDB, Chronograf, Kapacitor) ซึ่งออกแบบมาให้จัดการกับการอ่าน/เขียนข้อมูลที่หนักหน่วง และมี InfluxQL ที่ใช้ในการดึงข้อมูลที่คล้ายกับ SQL ภาษาอื่นๆครับ
เริ่มต้นติดตั้ง
สร้างพื้นที่เก็บไฟล์โดยใช้ Docker Volume ส่วน Container ของ Grafana และ InfluxDB เราจะออกแบบให้ใช้ interface ของ network อันเดียวกับเครื่องเลยนะครับ นั่นหมายถึงว่า จะใช้ port 3000 และ 8086 หรือ port ใดๆที่เปิดด้วยไฟล์ config
$ docker volume create grafana-storage $ docker volume create influxdb-storage
สร้างไฟล์ config
docker run --rm influxdb influxd config
เราจะได้หน้าตา Config ออกมาแบบนี้ครับ เราเซฟเป็นไฟล์ influxdb.conf
ได้เลย
ถ้าต้องการให้ Database เรามีการใช้ Authenthication ร่วมด้วย ให้เราแก้ตรงที่ผมทำตัวหนาไว้ข้างล่างนะครับ ตรง auth-enabled = true
ครับ
reporting-disabled = false bind-address = "127.0.0.1:8088" [meta] dir = "/var/lib/influxdb/meta" retention-autocreate = true logging-enabled = true [data] dir = "/var/lib/influxdb/data" index-version = "inmem" wal-dir = "/var/lib/influxdb/wal" wal-fsync-delay = "0s" validate-keys = false query-log-enabled = true cache-max-memory-size = 1073741824 cache-snapshot-memory-size = 26214400 cache-snapshot-write-cold-duration = "10m0s" compact-full-write-cold-duration = "4h0m0s" compact-throughput = 50331648 compact-throughput-burst = 50331648 max-series-per-database = 1000000 max-values-per-tag = 100000 max-concurrent-compactions = 0 max-index-log-file-size = 1048576 series-id-set-cache-size = 100 trace-logging-enabled = false tsm-use-madv-willneed = false [coordinator] write-timeout = "10s" max-concurrent-queries = 0 query-timeout = "0s" log-queries-after = "0s" max-select-point = 0 max-select-series = 0 max-select-buckets = 0 [retention] enabled = true check-interval = "30m0s" [shard-precreation] enabled = true check-interval = "10m0s" advance-period = "30m0s" [monitor] store-enabled = true store-database = "_internal" store-interval = "10s" [subscriber] enabled = true http-timeout = "30s" insecure-skip-verify = false ca-certs = "" write-concurrency = 40 write-buffer-size = 1000 [http] enabled = true bind-address = ":8086" auth-enabled = true log-enabled = true suppress-write-log = false write-tracing = false flux-enabled = false flux-log-enabled = false pprof-enabled = true pprof-auth-enabled = false debug-pprof-enabled = false ping-auth-enabled = false https-enabled = false https-certificate = "/etc/ssl/influxdb.pem" https-private-key = "" max-row-limit = 0 max-connection-limit = 0 shared-secret = "" realm = "InfluxDB" unix-socket-enabled = false unix-socket-permissions = "0777" bind-socket = "/var/run/influxdb.sock" max-body-size = 25000000 access-log-path = "" max-concurrent-write-limit = 0 max-enqueued-write-limit = 0 enqueued-write-timeout = 30000000000 [logging] format = "auto" level = "info" suppress-logo = false [[graphite]] enabled = false bind-address = ":2003" database = "graphite" retention-policy = "" protocol = "tcp" batch-size = 5000 batch-pending = 10 batch-timeout = "1s" consistency-level = "one" separator = "." udp-read-buffer = 0 [[collectd]] enabled = false bind-address = ":25826" database = "collectd" retention-policy = "" batch-size = 5000 batch-pending = 10 batch-timeout = "10s" read-buffer = 0 typesdb = "/usr/share/collectd/types.db" security-level = "none" auth-file = "/etc/collectd/auth_file" parse-multivalue-plugin = "split" [[opentsdb]] enabled = false bind-address = ":4242" database = "opentsdb" retention-policy = "" consistency-level = "one" tls-enabled = false certificate = "/etc/ssl/influxdb.pem" batch-size = 1000 batch-pending = 5 batch-timeout = "1s" log-point-errors = true [[udp]] enabled = false bind-address = ":8089" database = "udp" retention-policy = "" batch-size = 5000 batch-pending = 10 read-buffer = 0 batch-timeout = "1s" precision = "" [continuous_queries] log-enabled = true enabled = true query-stats-enabled = false run-interval = "1s" [tls] min-version = "" max-version = ""
สั่งรัน Docker Container
InfluxDB
เราจะสั่งรัน Docker Container ของ InfluxDB ขึ้นมาในชื่อ influxdb
นะครับ
$ docker run -d --name=influxdb \ --restart=unless-stopped \ --net=host \ -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf:ro \ -v influxdb-storage:/var/lib/influxdb \ influxdb -config /etc/influxdb/influxdb.conf
Grafana
กราฟฟาน่า ขั้นตอนจะน้อยกว่าครับ มี Database และ Config ในตัวเลย
docker run --net=host -d \ --restart=unless-stopped \ --name=grafana \ -v grafana-storage:/var/lib/grafana \ grafana/grafana
Telegraf
Telegraf เป็นผู้เชื่อมข้อมูลเข้า InfluxDB ของเราครับ ซึ่งดึงข้อมูลได้จากหลาย Service เลย แต่วันนี้เราจะสอนดูดข้อมูลจาก MQTT ในรูปแบบของ JSON เพื่อส่งเข้า Databse ของเรานะครับ ซึ่งจะมี Config หน้าตาแบบนี้เลย
[agent] interval = "10s" debug = true quiet = false [[outputs.influxdb]] urls = [ "http://localhost:8086", ] database = "sensordb" # required #retention_policy = "one_hour_only" write_consistency = "any" timeout = "5s" username = "admin" password = "admin" [[inputs.mqtt_consumer]] name_override = "sensor_data" servers = [ "tcp://10.130.42.218:1883"] topics = [ "#"] qos = 0 username = "" password = "" client_id = "" data_format = "json"
สามารถรันด้วย Docker ได้เช่นเดียวกันครับ
docker run -e TZ=Asia/Bangkok -d -it --name=telegraf1 --net=host --restart always -v $PWD/telegraf1.conf:/etc/telegraf/telegraf.conf:ro telegraf
หลังจากนั้น เรามาเปิด Grafana กัน ที่ port 3000
เลือก Add Datasource ในรูปแบบของ InfluxDB
หลังจากนั้นเข้าหน้า Dashboard เลือก Database ให้เรียบร้อย เลือก Field ที่ต้องการ ก็จะได้กราฟของข้อมูล มาแล้วครับ
ไม่ยากใช่มั้ยครับ คราวหน้าเดี๋ยวเราจะมาประยุกต์ หรือฝึกใช้ Telegraf, Grafana, และ InfluxDB กันต่อไปครับ!
มีแบบละเอียดใหม่ครับ พอดีเป็นมือใหม่ linux แล้วก็กระโดดมาใช้ docker เลย