TimescaleDB là một extension của PostgreSQL được tối ưu hóa để lưu trữ dữ liệu dạng chuỗi thời gian. Đây là một giải pháp hiệu quả hơn cho việc lưu trữ so với việc sử dụng classic relational databases (cơ sở dữ liệu quan hệ tiêu chuẩn). Để có thể cài đặt và sử dụng TimescaleDB trên CentOS 7, hãy cùng tìm hiểu bài viết dưới đây của Vietnix.
Tổng quan về TimescaleDB
Hiện nay có khá nhiều ứng dụng, chẳng hạn như hệ thống giám sát và hệ thống thu thập dữ liệu sẽ tích lũy dữ liệu để phân tích. Những phân tích này thường xem xét cách một phần dữ liệu hoặc một hệ thống thay đổi theo thời gian. Trong những trường hợp này, dữ liệu được biểu diễn dưới dạng chuỗi thời gian, với mỗi điểm dữ liệu sẽ đi kèm với một mốc thời gian. Hãy cùng xem ví dụ sau đây:
2019-11-01 09:00:00 server.cpu.1 0.9
2019-11-01 09:00:00 server.cpu.15 0.8
2019-11-01 09:01:00 server.cpu.1 0.9
2019-11-01 09:01:00 server.cpu.15 0.8
...
Sự liên quan của time series data (dữ liệu dạng chuỗi thời gian) gần đây đã tăng lên nhờ các triển khai mới của Internet of Things (IoT) và Industrial Internet of Things. Hiện nay, có ngày càng nhiều thiết bị thu thập thông tin chuỗi thời gian khác nhau như: Các thiết bị theo dõi sức khỏe, đồng hồ thông minh, dự báo thời tiết và các cảm biến khác. Chúng thu thập rất nhiều thông tin và tất cả dữ liệu này phải được lưu trữ ở một nơi nào đó.
Classic relational databases thường được sử dụng để lưu trữ dữ liệu, nhưng không phải lúc nào cũng phù hợp khi đối mặt với khối lượng dữ liệu khổng lồ của chuỗi thời gian. Khi bạn cần xử lý một lượng lớn time series data (dữ liệu chuỗi thời gian), hiệu suất của relational databases sẽ rất chậm. Do đó, những databases được tối ưu hóa – NoSQL databases, đã được tạo ra để tránh các vấn đề trên.
TimescaleDB là một database với mã nguồn mở được tối ưu hóa để lưu trữ time series data. TimescaleDB được phát triển như là một extension của PostgreSQL và là sự kết hợp giữa tính dễ sử dụng của relational databases và tốc độ xử lí của NoSQL databases. Chính bởi vậy nó cho phép bạn sử dụng PostgreSQL cho cả việc lưu trữ business data (dữ liệu doanh nghiệp) và time series data ở cùng một nơi.
Trong bài viết này, bạn sẽ được hướng dẫn cách thiết lập TimescaleDB trên CentOS 7, thực hiện việc cấu hình và tìm hiểu cách làm việc với TimescaleDB. Bạn cũng sẽ được hướng dẫn cách tạo time series databases và thực hiện một vài truy vấn đơn giản. Cuối cùng, hãy cùng tìm hiểu cách để loại bỏ các dữ liệu không cần thiết.
Yêu cầu để cài đặt và sử dụng TimescaleDB trên CentOS 7
Để làm theo hướng dẫn này, bạn sẽ cần:
- Một máy chủ CentOS 7 bao gồm người dùng non-root có quyền sudo và tường lửa được thiết lập với
firewalld
. - Cài đặt PostgreSQL trên máy chủ của bạn.
Lưu ý: Để có thể thoải mái thực hiện các thao tác cài đặt cũng như sở hữu không gian lưu trữ rộng lớn, bạn cần một máy chủ linh hoạt với khả năng mở rộng nguồn tài nguyên dễ dàng. Lúc này, VPS sẽ là giải pháp lưu trữ phù hợp nhất dành cho bạn.
Vietnix đang là nhà cung cấp dịch vụ thuê máy ảo (VPS) tốc độ cao, ổn định, uy tín, chuyên nghiệp được nhiều khách hàng tin dùng tại thị trường Việt Nam. Với đa dạng gói cấu hình, mức giá cùng khả năng toàn quyền quản trị hệ thống và năng cấp tài nguyên nhanh chóng, VPS Vietnix là lựa chọn tối ưu nếu bạn đang tìm kiếm máy chủ lưu trữ có tốc độ và hiệu năng xử lý cao. Liên hệ với đội ngũ Vietnix để được tư vấn chi tiết nhất.
Bước 1 – Cài đặt TimescaleDB
TimescaleDB không có sẵn trong kho mặc định của CentOS, vì vậy trong bước này, bạn sẽ cài đặt nó từ một kho của bên thứ 3.
Đầu tiên, tạo repository mới:
sudo vi /etc/yum.repos.d/timescaledb.repo
Nhấn i
để bước vào chế độ chèn và dán đoạn cấu hình sau vào tệp:
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
Khi bạn hoàn tất, nhấn ESC
để thoát khỏi chế độ chèn, sau đó :wq
và ENTER
để lưu và thoát tệp.
Bây giờ bạn đã có thể tiến hành cài đặt. Ở hướng dẫn này sử dụng PostgreSQL phiên bản 11; nếu bạn đang sử dụng phiên bản PostgreSQL khác (ví dụ: 9.6 hoặc 11), hãy thay thế giá trị “11” trong lệnh sau và thực thi:
sudo yum install -y timescaledb-postgresql-11
TimescaleDB hiện đã được cài đặt và sẵn sàng để sử dụng. Tiếp theo, bạn sẽ kích hoạt và điều chỉnh một số cài đặt được liên kết trong tệp cấu hình PostgreSQL để tối ưu hóa database.
Bước 2 – Cấu hình TimescaleDB
TimescaleDB module hoạt động tốt với cài đặt cấu hình PostgreSQL mặc định, nhưng để cải thiện hiệu suất và sử dụng tài nguyên bộ xử lý, bộ nhớ và đĩa tài nguyên một cách tốt hơn, bạn nên tự cấu hình một vài tham số sẽ được giới thiệu trong phần này. Điều này có thể được thực hiện tự động với công cụ timescaledb-tune
hoặc bằng cách chỉnh sửa thủ công tệp postgresql.conf
ở server của bạn .
Trong hướng dẫn này, bạn sẽ sử dụng công cụ timescaledc-tune
. Công cụ này sẽ đọc tệp postgresql.conf
và tương tác với các đề xuất thực hiện việc thay đổi.
Chạy lệnh sau để khởi động trình hướng dẫn cấu hình:
sudo timescaledb-tune --pg-config=/usr/pgsql-11/bin/pg_config
Đầu tiên, bạn sẽ được yêu cầu xác nhận đường dẫn đến tệp cấu hình PostgreSQL:
Output
Using postgresql.conf at this path:
/var/lib/pgsql/11/data/postgresql.conf
Is this correct? [(y)es/(n)o]:
Đường dẫn sẽ được tự động phát hiện, xác nhận nó bằng cách nhập y
:
Output
...
Is this correct? [(y)es/(n)o]: y
Writing backup to:
/tmp/timescaledb_tune.backup201912191633
Tiếp theo, bật TimescaleDB module bằng cách nhập y
vào thông báo tiếp theo và nhấn ENTER
:
Output
shared_preload_libraries needs to be updated
Current:
#shared_preload_libraries = ''
Recommended:
shared_preload_libraries = 'timescaledb'
Is this okay? [(y)es/(n)o]: y
success: shared_preload_libraries will be updated
Dựa trên các đặc điểm server và phiên bản PostgreSQL, bạn sẽ được đề nghị điều chỉnh cài đặt của mình. Nhấn y
để bắt đầu quá trình điều chỉnh:
Output
Tune memory/parallelism/WAL and other settings? [(y)es/(n)o]: y
Recommendations based on 7.64 GB of available memory and 4 CPUs for PostgreSQL 11
Memory settings recommendations
Current:
shared_buffers = 128MB
#effective_cache_size = 4GB
#maintenance_work_mem = 64MB
#work_mem = 4MB
Recommended:
shared_buffers = 1955MB
effective_cache_size = 5865MB
maintenance_work_mem = 1001121kB
work_mem = 5005kB
Is this okay? [(y)es/(s)kip/(q)uit]:
timescaledb-tune
sẽ tự động phát hiện bộ nhớ khả dụng của server và tính toán các giá trị được đề xuất cho cài đặt shared_buffers
, effective_cache_size
, maintenance_work_mem
và work_mem
.
Nếu các cài đặt này đều ổn và không gặp lỗi, hãy nhập y
:
Output
...
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: memory settings will be updated
Tại thời điểm này, nếu server có nhiều hơn một CPU, bạn sẽ tìm thấy các đề xuất cho cài đặt song song. Tuy nhiên, nếu chỉ có một CPU, timescaledb-tune
sẽ hướng dẫn bạn trực tiếp cài đặt WAL.
Trong trường hợp có nhiều CPU sẽ gặp phải đoạn thông tin như thế này:
Output
Parallelism settings recommendations
Current:
missing: timescaledb.max_background_workers
#max_worker_processes = 8
#max_parallel_workers_per_gather = 2
#max_parallel_workers = 8
Recommended:
timescaledb.max_background_workers = 8
max_worker_processes = 15
max_parallel_workers_per_gather = 2
max_parallel_workers = 4
Is this okay? [(y)es/(s)kip/(q)uit]:
Các cài đặt này sẽ điều chỉnh số lượng workers để xử lý yêu cầu và các tác vụ nền.
Nhập y
rồi nhấn ENTER
để hoàn tất cài đặt sau:
Output
...
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: parallelism settings will be updated
Tiếp theo, bạn sẽ tìm thấy các đề xuất cho Write Ahead Log (WAL):
Output
WAL settings recommendations
Current:
#wal_buffers = -1
#min_wal_size = 80MB
#max_wal_size = 1GB
Recommended:
wal_buffers = 16MB
min_wal_size = 4GB
max_wal_size = 8GB
Is this okay? [(y)es/(s)kip/(q)uit]:
WAL duy trì tính toàn vẹn dữ liệu, nhưng cài đặt mặc định có thể gây ra I/O không hiệu quả dẫn đến chậm hiệu suất ghi. Nhập y
để tối ưu hóa các cài đặt này:
Output
...
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: WAL settings will be updated
Bây giờ bạn sẽ tìm thấy một số đề xuất khác:
Output
Miscellaneous settings recommendations
Current:
#default_statistics_target = 100
#random_page_cost = 4.0
#checkpoint_completion_target = 0.5
#max_locks_per_transaction = 64
#autovacuum_max_workers = 3
#autovacuum_naptime = 1min
#effective_io_concurrency = 1
Recommended:
default_statistics_target = 500
random_page_cost = 1.1
checkpoint_completion_target = 0.9
max_locks_per_transaction = 64
autovacuum_max_workers = 10
autovacuum_naptime = 10
effective_io_concurrency = 200
Is this okay? [(y)es/(s)kip/(q)uit]:
Tất cả các thông số trên đều nhằm mục đích tăng hiệu suất. Ví dụ: SSD có thể xử lý nhiều yêu cầu đồng thời, vì vậy giá trị tốt nhất cho effective_io_concurrency
có thể là hàng trăm.
Nhấn y
rồi nhấn ENTER
để tiếp tục:
Output
...
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: miscellaneous settings will be updated
Saving changes to: /var/lib/pgsql/11/data/postgresql.conf
Kết quả là, bạn sẽ nhận được một tệp cấu hình được tạo sẵn tại /var/lib/pgsql/11/data/postgresql.conf
.
Lưu ý: Nếu đây là lần đầu thực hiện việc cài đặt này, bạn cũng có thể chạy lệnh với --quiet
và --yes
. Chúng sẽ tự động áp dụng tất cả các đề xuất và sẽ thay đổi tệp cấu hình postgresql.conf
:
sudo timescaledb-tune --pg-config=/usr/pgsql-11/bin/pg_config --quiet --yes
Để việc thay đổi cấu hình trên có hiệu lực, bạn cần phải khởi động lại PostgreSQL bằng cách:
sudo systemctl restart postgresql-11.service
Bây giờ, database đang chạy với các tham số tối ưu và sẵn sàng làm việc với time series data. Trong các bước tiếp theo, bạn sẽ thử thực hiện các thao tác này: Tạo databases, hypertables và thực hiện một vài lệnh khác.
Bước 3 – Tạo database và hypertable
Với việc thiết lập TimescaleDB được tối ưu hóa, bạn đã sẵn sàng làm việc với time series data. TimescaleDB được triển khai như một extension của PostgreSQL, vì vậy các thao tác với time series data không khác nhiều so với các thao tác trên dữ liệu quan hệ. Đồng thời, database cho phép bạn tự do kết hợp dữ liệu từ chuỗi thời gian và bảng dữ liệu quan hệ trong tương lai.
Đầu tiên, bạn sẽ tạo một database mới và kích hoạt TimescaleDB extension. Đăng nhập vào PostgreSQL database của bạn:
sudo -u postgres psql
Bây giờ tạo và kết nối với database mới. Hướng dẫn này sẽ đặt tên cho database mới này là timeseries
:
CREATE DATABASE timeseries;
\c timeseries
Cuối cùng, bật tiện ích mở rộng TimescaleDB:
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
Bạn sẽ nhận được output như sau:
Output
WARNING:
WELCOME TO
_____ _ _ ____________
|_ _(_) | | | _ \ ___ \
| | _ _ __ ___ ___ ___ ___ __ _| | ___| | | | |_/ /
| | | | _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \
| | | | | | | | | __/\__ \ (_| (_| | | __/ |/ /| |_/ /
|_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/
Running version 1.5.1
For more information on TimescaleDB, please visit the following links:
1. Getting started: https://docs.timescale.com/getting-started
2. API reference documentation: https://docs.timescale.com/api
3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture
Note: TimescaleDB collects anonymous reports to better understand and assist our users.
For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry.
CREATE EXTENSION
Điểm tương tác chính với time series data là các hypertable, một sự trừu tượng hóa của nhiều bảng riêng lẻ chứa dữ liệu (chunks).
Để tạo một hypertable, hãy bắt đầu với một bảng SQL thông thường và sau đó chuyển đổi thành một hypertable thông qua hàm create_hypertable
.
Tiến hành tạo một bảng để lưu trữ dữ liệu về việc theo dõi nhiệt độ và độ ẩm trên thiết bị theo thời gian:
CREATE TABLE conditions (
time TIMESTAMP WITH TIME ZONE NOT NULL,
device_id TEXT,
temperature NUMERIC,
humidity NUMERIC
);
Lệnh này sẽ tạo một bảng gọi là conditions
với bốn cột. Cột đầu tiên sẽ lưu mốc thời gian, múi giờ và không được để trống. Tiếp theo, bạn sẽ sử dụng cột này để chuyển đổi bảng của mình thành một hypertable được phân vùng theo thời gian:
SELECT create_hypertable('conditions', 'time');
Lệnh này gọi hàm create_hypertable()
, tạo ra TimescaleDB hypertable từ PostgreSQL table và thay thế cho bảng gốc.
Output sẽ được hiển thị như sau:
Output
create_hypertable
-------------------------
(1,public,conditions,t)
(1 row)
Trong bước này, bạn đã tạo một hypertable mới để lưu trữ time series data. Bây giờ bạn có thể điền dữ liệu vào bằng cách ghi vào hypertable, sau đó tiến hành quá trình xóa dữ liệu.
Bước 4 – Ghi và xóa dữ liệu
Trong bước này, bạn sẽ chèn dữ liệu bằng lệnh SQL tiêu chuẩn và nhập các bộ dữ liệu lớn từ những nguồn bên ngoài. Điều này sẽ cho bạn thấy các khía cạnh về relational database trên TimescaleDB.
Đầu tiên, hãy thử các lệnh cơ bản. Dữ liệu có thể được chèn vào hypertable bằng lệnh SQL là INSERT
. Chèn một số dữ liệu mẫu về temperature
và humidity
cho thiết bị weather-pro-000000
bằng lệnh sau:
INSERT INTO conditions(time, device_id, temperature, humidity)
VALUES (NOW(), 'weather-pro-000000', 84.1, 84.1);
Output được xuất hiện như sau:
Output
INSERT 0 1
Bạn cũng có thể chèn nhiều hàng dữ liệu cùng một lúc. Hãy thử các cách sau:
INSERT INTO conditions
VALUES
(NOW(), 'weather-pro-000002', 71.0, 51.0),
(NOW(), 'weather-pro-000003', 70.5, 50.5),
(NOW(), 'weather-pro-000004', 70.0, 50.2);
Bạn sẽ nhận được output sau đây:
Output
INSERT 0 3
Bạn cũng có thể chỉ định lệnh INSERT
trả về một vài hoặc tất cả dữ liệu được chèn bằng cách sử dụng câu lệnh RETURN
:
INSERT INTO conditions
VALUES (NOW(), 'weather-pro-000002', 70.1, 50.1) RETURNING *;
Output sẽ được hiển thị như sau:
Output
time | device_id | temperature | humidity
-------------------------------+--------------------+-------------+----------
2019-09-15 14:14:01.576651+00 | weather-pro-000002 | 70.1 | 50.1
(1 row)
Nếu bạn muốn xóa dữ liệu khỏi hypertable, hãy sử dụng lệnh SQL là DELETE
. Thực thi lệnh như sau để xóa bất kỳ dữ liệu nào có temperature
cao hơn 80
hoặc humidity
cao hơn 50
:
DELETE FROM conditions WHERE temperature > 80;
DELETE FROM conditions WHERE humidity > 50;
Sau khi thực hiện xong thao tác xóa, bạn nên sử dụng lệnh VACUUM
. Lệnh này sẽ lấy lại dung lượng vẫn còn được sử dụng từ dữ liệu đã bị xóa.
VACUUM conditions;
Các lệnh này phù hợp để nhập dữ liệu có quy mô nhỏ. Tuy nhiên time series data thường tạo ra các bộ dữ liệu khổng lồ từ nhiều thiết bị cùng một lúc nên bạn sẽ cần biết cách chèn hàng trăm hoặc hàng nghìn hàng dữ liệu cùng một lúc. Nếu bạn đã chuẩn bị sẵn dữ liệu từ nhiều nguồn bên ngoài ở dạng cấu trúc, ví dụ như ở định dạng csv, tác vụ này có thể được thực hiện nhanh chóng.
Để kiểm tra điều này, bạn sẽ sử dụng một tập dữ liệu mẫu đại diện cho dữ liệu nhiệt độ và độ ẩm từ nhiều vùng khác nhau. Tập dữ liệu này được tạo ra bởi các nhà phát triển TimescaleDB, cho phép bạn kiểm tra database của họ.
Hãy cùng xem cách nhập liệu từ tập dữ liệu mẫu weather_small
vào database của mình. Đầu tiên, thoát Postgresql:
\q
Sau đó tải xuống tập dữ liệu và giải nén:
cd /tmp
curl https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz -o weather_small.tar.gz
tar -xvzf weather_small.tar.gz
Tiếp theo, nhập dữ liệu nhiệt độ và độ ẩm vào relational database của bạn:
sudo -u postgres psql -d timeseries -c "\COPY conditions FROM weather_small_conditions.csv CSV"
Lệnh này giúp kết nối với database timeseries
và thực hiện \COPY
để sao chép dữ liệu từ tệp đã chọn vào conditions
hypertable. Quá trình trên sẽ chạy trong vài giây.
Khi dữ liệu đã được nhập vào bảng, output sẽ hiển thị như sau:
Output
COPY 1000000
Trong bước này, bạn đã thêm dữ liệu vào hypertable theo cách thủ công và theo lô. Tiếp theo, hãy cùng thực hiện việc truy vấn dữ liệu.
Bước 5 — Truy vấn dữ liệu
Bây giờ khi bảng đã chứa dữ liệu, bạn có thể thực hiện các truy vấn khác nhau để phân tích chúng.
Để bắt đầu, hãy thực hiện đăng nhập vào database:
sudo -u postgres psql -d timeseries
Như đã đề cập trước đó, để làm việc với các hypertable, bạn có thể sử dụng các lệnh SQL chuẩn. Ví dụ: Để hiển thị 10 mục cuối cùng từ bảng conditions
, hãy chạy lệnh sau:
SELECT * FROM conditions LIMIT 10;
Output sẽ xuất hiện như sau:
Output
time | device_id | temperature | humidity
------------------------+--------------------+--------------------+----------
2016-11-15 12:00:00+00 | weather-pro-000000 | 39.9 | 49.9
2016-11-15 12:00:00+00 | weather-pro-000001 | 32.4 | 49.8
2016-11-15 12:00:00+00 | weather-pro-000002 | 39.800000000000004 | 50.2
2016-11-15 12:00:00+00 | weather-pro-000003 | 36.800000000000004 | 49.8
2016-11-15 12:00:00+00 | weather-pro-000004 | 71.8 | 50.1
2016-11-15 12:00:00+00 | weather-pro-000005 | 71.8 | 49.9
2016-11-15 12:00:00+00 | weather-pro-000006 | 37 | 49.8
2016-11-15 12:00:00+00 | weather-pro-000007 | 72 | 50
2016-11-15 12:00:00+00 | weather-pro-000008 | 31.3 | 50
2016-11-15 12:00:00+00 | weather-pro-000009 | 84.4 | 87.8
(10 rows)
Lệnh này cho phép bạn xem dữ liệu được lưu trữ trong database vì database chứa một triệu bản ghi, bạn đã sử dụng LIMIT 10
để giới hạn kết quả là 10 mục.
Để xem các mục nhập gần đây nhất, hãy sắp xếp dữ liệu theo thời gian với thứ tự giảm dần:
SELECT * FROM conditions ORDER BY time DESC LIMIT 20;
Truy vấn này sẽ cho ra 20 mục gần đây nhất.
Bạn cũng có thể thêm bộ lọc. Ví dụ: Để xem các mục từ thiết bị weather-pro-000000
, hãy chạy lệnh sau:
SELECT * FROM conditions WHERE device_id = 'weather-pro-000000' ORDER BY time DESC LIMIT 10;
Trong trường hợp này, bạn sẽ thấy 10 dữ liệu về nhiệt độ và độ ẩm gần đây nhất được ghi lại bởi thiết bị weather-pro-000000
.
Ngoài các lệnh SQL, TimescaleDB cũng cung cấp một số chức năng đặc biệt hữu ích cho việc phân tích time series data. Ví dụ: Để tính trung bình nhiệt độ, bạn có thể sử dụng truy vấn sau với hàm percentile_cont
:
SELECT percentile_cont(0.5)
WITHIN GROUP (ORDER BY temperature)
FROM conditions
WHERE device_id = 'weather-pro-000000';
Bạn sẽ nhận được output sau:
Output
percentile_cont
-----------------
40.5
(1 row)
Bằng cách này, bạn sẽ nhận được nhiệt độ trung bình trong toàn bộ thời gian ở nơi đặt cảm biến weather-pro-00000
.
Để hiển thị các giá trị mới nhất từ mỗi cảm biến, bạn có thể sử hàm last
:
select device_id, last(temperature, time)
FROM conditions
GROUP BY device_id;
Kết quả sẽ cho thấy danh sách tất cả cảm biến và các giá trị mới nhất có liên quan. Để lấy giá trị đầu tiên, hãy dùng hàm first
.
Ví dụ sau đây sẽ phức tạp hơn khi yêu cầu hiển thị nhiệt độ trung bình, nhiệt độ thấp nhất và nhiệt độ cao nhất mỗi giờ cho cảm biến đã chọn trong vòng 24 giờ qua:
SELECT time_bucket('1 hour', time) "hour",
trunc(avg(temperature), 2) avg_temp,
trunc(min(temperature), 2) min_temp,
trunc(max(temperature), 2) max_temp
FROM conditions
WHERE device_id = 'weather-pro-000000'
GROUP BY "hour" ORDER BY "hour" DESC LIMIT 24;
Ở đây bạn đã sử dụng hàm time_bucket
, hoạt động như một phiên bản mạnh hơn so với hàm date_trunc
của PostgreSQL. Kết quả là, bạn sẽ thấy khoảng thời gian nào trong ngày nhiệt độ tăng hoặc giảm:
Output
hour | avg_temp | min_temp | max_temp
------------------------+----------+----------+----------
2016-11-16 21:00:00+00 | 42.00 | 42.00 | 42.00
2016-11-16 20:00:00+00 | 41.92 | 41.69 | 42.00
2016-11-16 19:00:00+00 | 41.07 | 40.59 | 41.59
2016-11-16 18:00:00+00 | 40.11 | 39.79 | 40.59
2016-11-16 17:00:00+00 | 39.46 | 38.99 | 39.79
2016-11-16 16:00:00+00 | 38.54 | 38.19 | 38.99
2016-11-16 15:00:00+00 | 37.56 | 37.09 | 38.09
2016-11-16 14:00:00+00 | 36.62 | 36.39 | 37.09
2016-11-16 13:00:00+00 | 35.59 | 34.79 | 36.29
2016-11-16 12:00:00+00 | 34.59 | 34.19 | 34.79
2016-11-16 11:00:00+00 | 33.94 | 33.49 | 34.19
2016-11-16 10:00:00+00 | 33.27 | 32.79 | 33.39
2016-11-16 09:00:00+00 | 33.37 | 32.69 | 34.09
2016-11-16 08:00:00+00 | 34.94 | 34.19 | 35.49
2016-11-16 07:00:00+00 | 36.12 | 35.49 | 36.69
2016-11-16 06:00:00+00 | 37.02 | 36.69 | 37.49
2016-11-16 05:00:00+00 | 38.05 | 37.49 | 38.39
2016-11-16 04:00:00+00 | 38.71 | 38.39 | 39.19
2016-11-16 03:00:00+00 | 39.72 | 39.19 | 40.19
2016-11-16 02:00:00+00 | 40.67 | 40.29 | 40.99
2016-11-16 01:00:00+00 | 41.63 | 40.99 | 42.00
2016-11-16 00:00:00+00 | 42.00 | 42.00 | 42.00
2016-11-15 23:00:00+00 | 42.00 | 42.00 | 42.00
2016-11-15 22:00:00+00 | 42.00 | 42.00 | 42.00
(24 rows)
Hiện tại, bạn đã biết cách để xử lý dữ liệu. Tiếp theo, bạn sẽ được hướng dẫn cách xóa dữ liệu không cần thiết và cách nén chúng.
Bước 6 – Cấu hình để nén và xóa dữ liệu
Theo thời gian tích lũy, dữ liệu sẽ ngày càng chiếm nhiều dung lượng trên ổ cứng của bạn. Để khắc phục điều này, phiên bản mới nhất của TimescaleDB cung cấp tính năng nén dữ liệu. Tính năng nén không yêu cầu tinh chỉnh bất kỳ cài đặt tệp hệ thống nào và có thể được sử dụng để tối ưu cho database nhanh chóng.
Trước tiên, hãy bật tính năng nén hypertable:
ALTER TABLE conditions SET (
timescaledb.compress,
timescaledb.compress_segmentby = 'device_id'
);
Output sẽ được xuất hiện như sau:
Output
NOTICE: adding index _compressed_hypertable_2_device_id__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_2 USING BTREE(device_id, _ts_meta_sequence_num)
ALTER TABLE
Lưu ý: Bạn cũng có thể thiết lập TimescaleDB để nén dữ liệu trong khoảng thời gian được chỉ định. Ví dụ, bạn có thể thực thi như sau để nén dữ liệu mỗi tuần:
SELECT add_compress_chunks_policy('conditions', INTERVAL '7 days');
Bạn có thể xem số liệu thống kê về dữ liệu nén bằng lệnh:
SELECT *
FROM timescaledb_information.compressed_chunk_stats;
Sau đó, bạn sẽ thấy một danh sách các chunk kèm theo trạng thái của chúng: Trạng thái nén và kích thước dung lượng của các dữ liệu không nén và đã nén (tính bằng byte).
Nếu không có nhu cầu lưu trữ dữ liệu trong một khoảng thời gian dài, bạn có thể xóa để giải phóng không gian trống bằng tính năng drop_chunks
. Nó cho phép bạn xóa các đoạn có dữ liệu đã được lưu trữ trong thời gian dài hơn thời gian được quy định:
SELECT drop_chunks(interval '24 hours', 'conditions');
Truy vấn này sẽ loại bỏ tất cả các chunk từ hypertable conditions
và chỉ bao gồm dữ liệu được lưu hơn một ngày trước.
Output được hiển thị như sau:
Output
drop_chunks
----------------------------------------
_timescaledb_internal._hyper_1_2_chunk
(1 row)
Để tự động xóa các dữ liệu cũ, bạn có thể cấu hình trên tác vụ cron
.
Thực hiện thoát khỏi database bằng cách:
\q
Tiếp theo, chỉnh sửa crontab của bạn bằng lệnh sau, lệnh này sẽ được chạy từ shell:
crontab -e
Bây giờ hãy thêm dòng sau vào cuối tệp:
...
0 1 * * * /usr/bin/psql -h localhost -p 5432 -U postgres -d postgres -c "SELECT drop_chunks(interval '24 hours', 'conditions');" >/dev/null 2>&1
Việc này sẽ thực hiện xóa dữ liệu được lưu hơn một ngày vào lúc 1:00 sáng mỗi ngày.
Lời kết
Đến đây, bạn đã thiết lập được TimescaleDB trên máy chủ CentOS và thử tạo hypertables, chèn dữ liệu, truy vấn dữ liệu, nén và xóa các bản ghi không cần thiết. Hy vọng bài viết sẽ giúp bạn tận dụng TimescaleDB hỗ trợ lập trình hiệu quả hơn. Cảm ơn các bạn đọc bài hướng dẫn, hãy cùng chia sẻ bài viết đến mọi người để cùng nhau trau dồi thêm kiến thức. Nếu có góp ý hay bất kì thắc mắc nào, bạn hãy để lại bình luận bên dưới nhé.