1. Tổng quan.
InfluxDB là một công cụ lưu trữ dữ liệu theo time series mã nguồn mở, được sử dụng rộng rãi để lưu trữ và phân tích dữ liệu theo thời gian. Bài hướng dẫn này sẽ giúp bạn cài đặt InfluxDB trên hệ điều hành Debian và Ubuntu.
2. Thêm kho lưu trữ InfluxData
Trước tiên, bạn cần thêm kho lưu trữ InfluxData để hệ thống có thể tìm thấy gói cài đặt InfluxDB. Sử dụng các lệnh sau:
# Tải khoá công khai InfluxData
curl -s https://repos.influxdata.com/influxdata-archive_compat.key | gpg --import
# Thêm kho lưu trữ vào danh sách
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
# Cập nhật danh sách gói
sudo apt-get update
2. Cài đặt và khởi động InfluxDB
a. Đối với hệ thống không dùng systemd (Ubuntu 14.04 trở về trước, Debian 7 trở về trước)
sudo apt-get install influxd
sudo service influxdb start
b. Đối với hệ thống dùng systemd (Ubuntu 15.04 trở lên, Debian 8 trở lên)
sudo apt-get install influxd
sudo systemctl unmask influxdb.service
sudo systemctl start influxdb
3. Verify phiên bản sau khi cài đặt xong.
shell> influx -version
InfluxDB shell version: 1.8.10
4. Cấu hình của InfluxDB
InfluxDB có các thiết lập mặc định cho mọi lựa chọn trong file cấu hình. Bạn có thể xem các thiết lập này bằng lệnh:
shell> influxd config
Merging with configuration at: /etc/influxdb/influxdb.conf
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
strict-error-handling = 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
series-file-max-concurrent-snapshot-compactions = 0
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 = false
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
prom-read-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 = ""
5. Tạo cơ sở dữ liệu trong InfluxDB.
Bước 1: Kiểm tra cài đặt và kết nối InfluxDB
- Kiểm tra cài đặt: Đảm bảo bạn đã cài đặt InfluxDB trên máy tính của mình.
- Kết nối: Mở cửa sổ terminal và chạy lệnh
influx
. Nếu kết nối thành công, bạn sẽ thấy thông báo tương tự như sau:
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
>
Bước 2: Tạo cơ sở dữ liệu mới
Sử dụng lệnh CREATE DATABASE: Nhập lệnh CREATE DATABASE <db-name>
trong cửa sổ terminal, thay thế <db-name>
bằng tên cơ sở dữ liệu mong muốn. Ví dụ: CREATE DATABASE mydb
.
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> CREATE DATABASE mydb
>
Kiểm tra thành công: Nếu không có lỗi xuất hiện, cơ sở dữ liệu đã được tạo thành công.
Bước 3: Hiển thị danh sách cơ sở dữ liệu
Sử dụng lệnh SHOW DATABASES: Nhập lệnh SHOW DATABASES
để xem danh sách tất cả các cơ sở dữ liệu hiện có.
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> CREATE DATABASE mydb
> SHOW DATABASES
name: databases
name
----
_internal
mydb
>
Bước 4: Chuyển sang sử dụng cơ sở dữ liệu mới
Sử dụng lệnh USE: Nhập lệnh USE <db-name>
để chuyển sang sử dụng cơ sở dữ liệu vừa tạo. Ví dụ: USE mydb
.
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> CREATE DATABASE mydb
> SHOW DATABASES
name: databases
name
----
_internal
mydb
> USE mydb
Using database mydb
6. Viết và truy vấn dữ liệu.
Hiểu về cấu trúc dữ liệu.
- Time series: Dữ liệu trong InfluxDB được tổ chức theo dạng chuỗi thời gian (time series), bao gồm giá trị đo, thời gian, thẻ (tags) và trường (fields).
- Point: Mỗi điểm dữ liệu (point) đại diện cho một mẫu cụ thể của value Nó bao gồm thời gian, name, value và các tags.
Ví dụ 1.
- Sử dụng định dạng InfluxDB line protocol: Định dạng này bao gồm name, tag, field và thời gian. Ví dụ:
cpu,host=serverA,region=us_west value=0.64
. - Sử dụng lệnh INSERT: Nhập lệnh
INSERT <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
để chèn dữ liệu.
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> CREATE DATABASE mydb
> SHOW DATABASES
name: databases
name
----
_internal
mydb
> USE mydb
Using database mydb
> INSERT cpu,host=serverA,region=us_west value=0.64
Truy vấn dữ liệu
- Sử dụng lệnh SELECT: Nhập lệnh
SELECT <field-key> FROM <measurement>
để truy vấn dữ liệu. Ví dụ:SELECT "value" FROM "cpu"
. - *Sử dụng toán tử : Sử dụng
*
để truy vấn tất cả các trường và thẻ. Ví dụ:SELECT * FROM "temperature"
.
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> CREATE DATABASE mydb
> SHOW DATABASES
name: databases
name
----
_internal
mydb
> USE mydb
Using database mydb
> INSERT cpu,host=serverA,region=us_west value=0.64
> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time host region value
---- ---- ------ -----
2024-09-11T04:13:15.541245507Z serverA us_west 0.64
Lưu ý:
- Nếu không cung cấp thời gian cho một điểm dữ liệu, InfluxDB sẽ tự động gán thời gian hiện tại.
- Sử dụng toán tử
*
một cách cẩn thận trên các cơ sở dữ liệu lớn, vì nó có thể gây ra vấn đề về hiệu suất.
Ví dụ 2.
Tạo dữ liệu
- Định nghĩa đo:
temperature
- Thẻ:
machine=unit42, type=assembly
- Trường:
external=25, internal=37
Viết dữ liệu:
- Sử dụng lệnh
INSERT
để chèn dữ liệu vào cơ sở dữ liệu. - Đặt tên đo là
temperature
và chỉ định các thẻ và trường tương ứng.
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> CREATE DATABASE mydb
> SHOW DATABASES
name: databases
name
----
_internal
mydb
> USE mydb
Using database mydb
> INSERT cpu,host=serverA,region=us_west value=0.64
> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time host region value
---- ---- ------ -----
2024-09-11T04:13:15.541245507Z serverA us_west 0.64
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
Truy vấn dữ liệu
- Sử dụng lệnh
SELECT * FROM "temperature"
để lấy tất cả các trường và thẻ từ đotemperature
. - Toán tử
*
được sử dụng để chỉ định rằng bạn muốn lấy tất cả các cột.
shell> influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> CREATE DATABASE mydb
> SHOW DATABASES
name: databases
name
----
_internal
mydb
> USE mydb
Using database mydb
> INSERT cpu,host=serverA,region=us_west value=0.64
> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time host region value
---- ---- ------ -----
2024-09-11T04:13:15.541245507Z serverA us_west 0.64
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> SELECT * FROM "temperature"
name: temperature
time external internal machine type
---- -------- -------- ------- ----
2024-09-11T04:17:23.02671042Z 25 37 unit42 assembly
Kết quả
- Màn hình sẽ hiển thị kết quả của truy vấn, bao gồm thời gian, giá trị của các trường
external
vàinternal
, và giá trị của các thẻmachine
vàtype
.
Lưu ý:
Sử dụng *
mà không có giới hạn (LIMIT clause) trên một cơ sở dữ liệu lớn có thể gây ra vấn đề về hiệu suất. Nếu truy vấn chạy quá lâu, bạn có thể nhấn Ctrl+C
để hủy bỏ.
InfluxQL hỗ trợ nhiều tính năng và từ khóa khác, bao gồm biểu thức chính quy kiểu Go. Ví dụ, bạn có thể sử dụng SELECT * FROM /.*/ LIMIT 1
để lấy một dòng dữ liệu ngẫu nhiên.
> SELECT * FROM /.*/ LIMIT 1
name: cpu
time external host internal machine region type value
---- -------- ---- -------- ------- ------ ---- -----
2024-09-11T04:13:15.541245507Z serverA us_west 0.64
name: temperature
time external host internal machine region type value
---- -------- ---- -------- ------- ------ ---- -----
2024-09-11T04:17:23.02671042Z 25 37 unit42 assembly
Hoặc.
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9