ຮູ້ຈັກ ແລະ ໃຊ້ງານ InfluxDB time series database

xangnam phiasakha
VtCamp
Published in
3 min readMar 2, 2020

ສະບາຍດີທຸກຄົນກັບມາພົບກັນອີກຄັ້ງກັບບົດຄວາມໃຫມ່ ທີ່ບໍ່ໄດ້ຂຽນດົນນານຫຼາຍເດືອນ ເກືອບລືມຫຼັງກັນເລີຍ ມືນີ້ຈະພາຜູ້ອ່ານມາຮູ້ຈັກັບ InfluxDB ແລະ time-series database ວ່າມີຮູບແບບ ແລະ ການເກັບຂໍ້ມູນແນວໃດ ຕະຫຼອດຈົນເຖິງການໃຊ້ງານ ວ່າເຮົາຈະນຳເອົາ InfluxDB ໄປໃຊ້ກັບວຽກງານການພັດທະນາແນວໃດ ວ່າແລ້ວກໍ່ໄປເລີ່ມກັນເລີຍ!

Time series data

ສຳລັບ developer ຫຼາຍຄົນກໍ່ເຄີຍຫຼິ້ນກັບຂໍ້ມູນມາຫຼາຍປະເພດ ບໍ່ວ່າຈະເປັນປະເພດ ຂໍ້ຄວາມ, ຕົວເລກ, ຮູບ, ສຽງ ທີ່ເກັບໄວ້ຢູ່ໃນ Database ຫຼື File ທຳມະດາ ແຕ່ມັນຍັງມີຂໍ້ມູນອີກປະເພດທີ່ເກັບໄປຕາມເວລາ ຫຼືກໍ່ຄື ທຸກຂໍ້ມູນທີ່ເກັບລົງໄປຈະມີເວລາກຳກັບໄວ້ວ່າເປັນຂໍ້ມູນທີ່ເກີດຂຶ້ນນະຊ່ວງເວລາໃດ ເຊິງໄລຍະເວລາກໍ່ຈະຢູ່ໃນຫຼັກ second , millisecond , nanosecond ຫຼື ກໍ່ຄືຂໍ້ມູນທີ່ປ່ຽນແປງຕະຫຼອດເວລາ ຫຼື ແບບ real-time data ຕົວຢ່າງເຊັ່ນ: ຂໍ້ມູນຈາກ sensor ວັດສະພາບອາກາດ, Dow Jones Industrial, ລະດັບນໍ້າໃນເຂື່ອນໄຟຟ້າ, cpu, disk … etc ເຊິ່ງເອີ້ນຂໍ້ມູນນີ້ວ່າ Time series data ຂໍ້ມູນທີ່ບໍ່ແມ່ນ Time series ຄື ຂໍ້ມູນປະຊາກອນ, ຂໍ້ມູນລົດໃນ parking ເປັນຕົ້ນ ເຊິ່ງເປັນຂໍ້ມູນທີ່ບໍ່ປ່ຽນແປງຕະຫຼອດເວລາ.

InfluxDB

ໃນການເກັບຂໍ້ມູນທີ່ມີການປ່ຽນແປງຕະຫຼອດເວລານັ້ນ ການທີ່ຈະໃຊ້ database ແບບທົ່ວໄປເຊັ່ນ Mysql, SQL Server ເກັບຂໍ້ມູນທີ່ 1000 record / 1 mn ແລະ ຮູບແບບຂໍ້ມູນກໍ່ອາດແຕກຕ່າງກັນໄປຕາມເວລາ. ໃນທາງປະສິດທິພາບ ແລະ ການຄົ້ນຫາຂໍ້ມູນທີ່ Big Data ຂະໜາດນັ້ນຄົງບໍ່ໄຫວ ເພາະ Database ເຫຼົ່ານັ້ນບໍ່ໄດ້ອອກແບບໃຫ້ຮ້ອງຮັບກັບຂໍ້ມູນແບບ Time series ດັ່ງນັ້ນຈຶ່ງເກີດມີ InfluxDB Database ທີ່ອອກແບບສະເພາະເກັບຂໍ້ມູນທີ່ເປັນ Time series ໂດຍສະເພາະ. ເຊິງເຮັດໃຫ້ເຮົາຄົ້ນຫາຂໍ້ມູນທີ່ມະຫາສານໄດ້ແບບ Real-Time ກັນເລີຍ!.

Install InfluxDB ດ້ວຍ Docker

ການຕິດຕັ້ງ InfluxDB ໂດຍໃຊ້ Docker ກໍ່ແສນງ່າຍດາຍ ໂດຍໄປທ ີ່ InfluxDB Docker Official Images

ເຊິ່ງ Documents ກໍ່ຂຽນວິທີການຕິດຕັ້ງ ແລະ ຕັ້ງຄ່າໃຫ້ຄົບຖວນໃນລະດັບ Development ແລະ Production ແລ້ວ! ແຕ່ສຳລັບບົດຄວາມນີ້ຈະຕິດຕັ້ງໃນສະພາບແວດລ້ອມທົດສອບການໃຊ້ງານເທົ່ານັ້ນ ສຳລັບການຕິດຕັ້ງໃນລະດັບ Production ກໍ່ສາມາດຫາສຶກສາເບິ່ງ Options ຕ່າງໆໄດ້ ບໍ່ໄດ້
ຫຍຸງຍາກຫຍັງເລີຍ.

$ docker run --name influxdb -d --network mynet -p 8086:8086 \
-v influxdb:/var/lib/influxdb \
influxdb

ເທົ່ານີ້ເຮົາກໍ່ສາມາດໃຊ້ງານ InfluxDB ໄດ້ແລ້ວ ຈະງ່າຍໄປໃສ່!!!!

ໃນການເຊື່ອມຕໍ່ຫາ influxdb server ນັ້ນສາມາດໃຊ້ influx cli ຫຼື ຜ່ານ REST Api ທີ່ເຮັດວຽກຢູ່ port 8086 ໂດຍ default ນອກນີ້ client ຍັງ Support ພາສາ program ຫຼາກຫຼາຍພາສາ ສາມາດເລືອກໃຊ້ຕາມຄວາມສະດວກໄດ້ເລີຍ ແຕ່ບົດຄວາມນີ້ຈະໃຊ້ influx cli ເພື່ອຄວາມງ່າຍໃນການທົດສອບການໃຊ້ງານ

$ docker exec -it influxdb influx                                                                                  Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
>

ເທົ່ານີ້ເຮົາກໍ່ສາມາດເຊື່ອຕໍ່ກັບ InfluxDB Server ໄດ້ແລ້ວ

Metrics ຂອງ InfluxDB

ຕົວຢ່າງຂໍ້ມູນ metrics https://docs.influxdata.com/influxdb/v1.7/concepts/key_concepts

InfluxDB ເກັບຂໍ້ມູນເປັນ Collection ຂອງ Metrics. Metrics ເປັນຊຸດຂໍ້ມູນທີ່ເປັນຕົວວັດປະສິດທິພາບ, ຄຸນລັກສະນະ, ຄວາມໜ້າຈະເປັນ ຂອງ System, product ເວົ້າງ່າຍໆ ມັນກໍ່ຄືຂໍ້ມູນທີ່ເປັນ feature ຂອງສິ່ງທີ່ເຮົາກຳລັງສຶກສາ ຫຼື ຈະວັດແທກມັນໃນເຊິງປະລິມານ(ງ່າຍບ່ອນໃດຫວ່ະ!) . ສຳລັບຮູບແບບຂໍ້ມູນ metrics ຂອງ influxdb ນັ້ນຈະປະກອບດ້ວຍ:

Measurement

ເປັນ Container ທີ່ໃຊ້ເກັບບັນດາອົງປະກອບຕ່າງໆຂອງຂໍ້ມູນ ເຊັ່ນ time, filed , value… ເປັນຕົ້ນ ເວົ້າກັນງ່າຍໆ ມັນກໍ່ຄື Table ດີໆນີ້ເອງ

Tag

ເປັນ key-value ທີ່ເປັນໂຄງສ້າງທີ່ໃຊ້ເກັບ metadata ເຊິ່ງເປັນ optional ນັ້ນໝາຍຄວາມວ່າ ບໍ່ກຳນົດ ຫຼື ກຳນົດກໍ່ໄດ້ ແຕ່ແນະນຳໃຫ້ກຳນົດເພາະ Tag ຈະເປັນ indexesຂອງຊຸດຂໍ້ມູນ. Tag ຈະປະກອບດ້ວຍ Tag Key ແລະ Tag Value

Field

ເປັນ key-value ທີ່ໃຊ້ເກັບຂໍ້ມູນຕົວຈິງຂອງ metrics ເຊິ່ງ Field ຄ້າຍຄື Tag ຕ່າງແຕ່ວ່າ Field ບໍ່ແມ່ນ indexes ຂອງຊຸດຂໍ້ມູນ Field ຈະປະກອບດ້ວຍ Field key ແລະ Field value

Timestamp

ເປັນວັນເວລາໃນຮູບແບບ RFC3339 UTC ເຊິ່ງເປັນສິ່ງທີ່ຂາດບໍ່ໄດ້

ອົງປະກອບຫຼັກໆກໍ່ຈະປະມານນີ້ ທີ່ເຮົາຈະໄດ້ໃຊ້ກັນທີ່ເຫຼືອນັ້ນກໍ່ເປັນພຽງການຈັດກຸມຂອງບັນດາອົງປະກອບທີ່ໄດ້ເວົ້າມາເຊົ່ນ: Tag set, Field set, Series …etc.

InfluxDB line protocol

ໃນການເອົາຂໍ້ມູນ metrics ເກັບຢູ່ InfluxDB ນັ້ນ ຈະຕ້ອງແປງເປັນຮູບແບບສະເພາະຂອງ InfluxDB ເຊິ່ງເອີ້ນວ່າ: “InfluxDB line protocol”

Syntax

<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]

ຕົວຢ່າງ

weather,location=us-midwest temperature=82 1465839830100400200
| -------------------- -------------- |
| | | |
| | | |
+-----------+--------+-+---------+-+---------+
|measurement|,tag_set| |field_set| |timestamp|
+-----------+--------+-+---------+-+---------+

ແລະນີ້ຄືວິທີການ Insert ຂໍ້ມູນຂອງ InfluxDB ເບິ່ງກັນງ່າຍໆກໍ່ຄືຂໍ້ພຽງແຕ່ແປງຮູບແບບມາເປັນ line ແບບຂ້າງເທິງແລ້ວຈັບໂຢນເຂົ້າໄປ InfluxDB ໄດ້ເລີຍ ບໍ່ມີຫຍັງງ່າຍໄປກວ່ານີ້ແລ້ວ!

Influx Query Language (InfluxQL)

InfluxQL ຄາຍຄື SQL Language ເລີຍ. ໃຜທີ່ເຄີຍໃຊ້ Mysql, SQL Server ຫຼືບັນດາ Database ທີ່ໃຊ້ SQL Language ກໍ່ສາມາດໃຊ້ງານ InFluxQL ໄດ້ເລີຍ ບໍ່ຈຳເປັນຕ້ອງໄປສຶກສາ Syntax ຫຍັງໃຫມ່ໃຫ້ຫຍຸງຍາກຫຼາຍ. ເຮັດໃຫ້ສະດວກ ແລະ ເລີ່ມຕົ້ນໄດ້ໄວ. ເຊິ່ງນີ້ຄືຂໍ້ດີອີກຢ່າງໜຶ່ງຂອງ InfluxDB.

ຕົວຢ່າງການໃຊ້ງານ InfluxQL

CREATE database

$> CREATE DATABASE mydb /*ສ້າງ database mydb*/
$> SHOW DATABASES /*ສະແດງລາຍການ databases ທັງໝົດໃນ influxDB*/
name: databases
name
----
_internal
mydb
...
$> USE mysb /*ໃຊ້ງານ mydb*/
$> show MEASUREMENTS /* ສະແດງລາຍການ MEASUREMENTS ທັງໝົດທີ່ຢູ່ໃນ database mydb*/
name: measurements
name
----
car

INSERT Metrics

$> INSERT my_account,location=laos nName="xang",lname="phiasakha" /*insert metrics ຂອງ database mydb ດ້ວຍ InfluxDB line protocol*/$> show MEASUREMENTS
name: measurements
name
----
car
my_account

SELECT

$> SELECT * from my_account /*query ຂໍ້ມູນຂອງ my_account*/
name: my_account
time lname location nName
---- ----- -------- -----
1583136608510039600 phiasakha laos xang
1583136623976676000 test china abc
1583136632922471800 test china zang
$> SELECT * from my_account WHERE nName='xang'
name: my_account
time lname location nName
---- ----- -------- -----
1583136608510039600 phiasakha laos xang
$> SELECT * from my_account LIMIT 2
name: my_account
time lname location nName
---- ----- -------- -----
1583136608510039600 phiasakha laos xang
1583136623976676000 test china abc

ສຳລັບຕົວຢ່າງ ແລະ ຮູບແບບການໃຊ້ງານຫຼາຍກວ່ານີ້ສາມາດສຶກສາເພີ່ມຕື່ມໄດ້ທີ່ InfluxQL Documents

ມາຮອດຈຸດນີ້ ຂໍ້ຈົບບົດຄວາມນີ້ໄວ້ເທົ່ານີ້ກ່ອນ ຫວັງວ່ຜູ້ທີ່ເຂົ້າມາອ່ານຈະພໍເຫັນພາບການໃຊ້ງານ InfluxDB ເພື່ອຕໍ່ຍອດສຶກສາໃນຂັ້ນຕໍ່ໄປ. ແລ້ວພົບກັນໃນບົດຄວາມໜ້າ. ຂອບໃຈທຸກຄົນ!

--

--