ติดตั้ง InfluxDB และ Grafana และ Telegraf ด้วย Docker

สวัสดีครับ ผู้อ่านทุกท่าน วันนี้เรามาทำในฝั่ง 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 กันต่อไปครับ!

1 thought on “ติดตั้ง InfluxDB และ Grafana และ Telegraf ด้วย Docker”

Leave a Comment