اوبنتودیتابیسسرورلینوکس

آموزش نصب و استفاده از TimescaleDB روی اوبونتو 24.04

مقدمه بسیاری از اپلیکیشن‌ها، مانند سیستم‌های مانیتورینگ و جمع‌آوری داده‌ها، اطلاعات را برای تحلیل‌های بعدی ذخیره می‌کنند. این تحلیل‌ها اغلب نحوه تغییر یک داده یا سیستم را در طول زمان بررسی می‌کنند. در این موارد، داده‌ها به صورت سری‌های زمانی (Time Series) نمایش داده می‌شوند؛ به این معنا که هر نقطه داده با یک تایم‌استمپ (Timestamp) همراه است. یک نمونه از این داده‌ها به شکل زیر است:

text
2020-06-01 09:00:00 server.cpu.1 0.9
2020-06-01 09:00:00 server.cpu.15 0.8
2020-06-01 09:01:00 server.cpu.1 0.9
2020-06-01 09:01:00 server.cpu.15 0.8

اهمیت داده‌های سری زمانی اخیراً به لطف استقرار جدید اینترنت اشیا (IoT) و اینترنت صنعتی اشیا (IIoT) افزایش یافته است. دستگاه‌های بیشتری وجود دارند که اطلاعات سری زمانی مختلفی را جمع‌آوری می‌کنند: ردیاب‌های تناسب اندام، ساعت‌های هوشمند، ایستگاه‌های هواشناسی خانگی و سنسورهای مختلف. این دستگاه‌ها اطلاعات زیادی را جمع‌آوری می‌کنند و تمام این داده‌ها باید در جایی ذخیره شوند.

معمولاً از پایگاه‌های داده رابطه‌ای (Relational) کلاسیک برای ذخیره داده‌ها استفاده می‌شود، اما این پایگاه‌های داده همیشه برای حجم عظیم داده‌های سری زمانی مناسب نیستند. هنگامی که نیاز به پردازش مقدار زیادی داده سری زمانی دارید، پایگاه‌های داده رابطه‌ای ممکن است بسیار کُند باشند. به همین دلیل، پایگاه‌های داده‌ای که به‌طور ویژه بهینه‌سازی شده‌اند (که اغلب NoSQL نامیده می‌شوند) برای جلوگیری از مشکلات دیتابیس‌های رابطه‌ای ایجاد شده‌اند.

TimescaleDB یک پایگاه داده متن‌باز است که برای ذخیره داده‌های سری زمانی بهینه‌سازی شده است. این دیتابیس به صورت یک افزونه (Extension) برای PostgreSQL پیاده‌سازی شده و سهولت استفاده از پایگاه‌های داده رابطه‌ای را با سرعت پایگاه‌های داده NoSQL ترکیب می‌کند. در نتیجه، به شما اجازه می‌دهد از PostgreSQL هم برای ذخیره داده‌های تجاری و هم برای ذخیره داده‌های سری زمانی در یک مکان استفاده کنید.

با دنبال کردن این آموزش، شما TimescaleDB را روی اوبونتو 24.04 نصب و پیکربندی کرده و یاد می‌گیرید چگونه با آن کار کنید. شما با ایجاد دیتابیس‌های سری زمانی و اجرای کوئری‌های ساده آشنا می‌شوید. در نهایت، نحوه حذف داده‌های غیرضروری را خواهید دید.

پیش‌نیازها برای دنبال کردن این آموزش به موارد زیر نیاز دارید:

  • یک سرور اوبونتو 24.04 که طبق راهنمای راه‌اندازی اولیه سرور اوبونتو در پارمین کلود پیکربندی شده باشد (شامل یک کاربر غیر روت با دسترسی sudo و فایروال).
  • دیتابیس PostgreSQL روی سرور شما نصب باشد. (در اوبونتو 24.04، نسخه پیش‌فرض PostgreSQL نسخه 16 است).

مرحله ۱ — نصب TimescaleDB

TimescaleDB در مخازن پیش‌فرض اوبونتو موجود نیست، بنابراین در این مرحله آن را از مخزن PPA (Personal Package Archive) اختصاصی Timescale نصب خواهید کرد.

ابتدا مخزن APT تایم‌اسکیل را اضافه کنید:

bash
sudo add-apt-repository ppa:timescale/timescaledb-ppa

با فشردن کلید ENTER این اقدام را تایید کنید.

سپس، کش APT خود را برای به‌روزرسانی لیست پکیج‌ها بازخوانی کنید:

bash
sudo apt update

اکنون می‌توانید نصب را ادامه دهید. از آنجایی که در اوبونتو 24.04 از PostgreSQL 16 استفاده می‌کنیم، دستور زیر را برای نصب TimescaleDB سازگار با این نسخه اجرا کنید:

bash
sudo apt install timescaledb-postgresql-16

نکته: پشتیبانی از نسخه‌های قدیمی‌تر PostgreSQL (مانند 9.6.3+ یا 10.9+) منسوخ شده و در نسخه‌های آینده حذف خواهد شد.

TimescaleDB اکنون نصب شده و آماده استفاده است. در مرحله بعد، آن را فعال کرده و برخی تنظیمات مربوط به آن را در فایل پیکربندی PostgreSQL تغییر می‌دهید تا دیتابیس بهینه شود.


مرحله ۲ — پیکربندی TimescaleDB

ماژول TimescaleDB با تنظیمات پیش‌فرض PostgreSQL به‌خوبی کار می‌کند، اما برای بهبود عملکرد و استفاده بهتر از منابع پردازنده، حافظه و دیسک، توسعه‌دهندگان TimescaleDB پیشنهاد می‌کنند برخی پارامترها را به‌صورت اختصاصی تنظیم کنید. این کار را می‌توان به‌طور خودکار با ابزار timescaledb-tune یا با ویرایش دستی فایل postgresql.conf انجام داد.

در این آموزش از ابزار timescaledb-tune استفاده می‌کنید. این ابزار فایل postgresql.conf را می‌خواند و به‌صورت تعاملی پیشنهاد اعمال تغییرات را می‌دهد.

برای شروع جادوگر پیکربندی، دستور زیر را اجرا کنید:

bash
sudo timescaledb-tune

ابتدا از شما خواسته می‌شود مسیر فایل پیکربندی PostgreSQL را تایید کنید:

text
Output
Using postgresql.conf at this path:
/etc/postgresql/16/main/postgresql.conf
Is this correct? [(y)es/(n)o]:

ابزار به‌طور خودکار مسیر فایل پیکربندی (مربوط به نسخه 16) را تشخیص می‌دهد، بنابراین با وارد کردن y آن را تایید کنید:

text
Is this correct? [(y)es/(n)o]: y
Writing backup to:
/tmp/timescaledb_tune.backup202005300523

سپس، از شما خواسته می‌شود متغیر shared_preload_libraries را برای پیش‌بارگذاری ماژول TimescaleDB هنگام старт سرور PostgreSQL تغییر دهید:

text
Output
shared_preload_libraries needs to be updated
Current:
#shared_preload_libraries = ”
Recommended:
shared_preload_libraries = ‘timescaledb’
Is this okay? [(y)es/(n)o]:

این متغیر لیستی از ماژول‌ها را می‌پذیرد که PostgreSQL باید قبل از راه‌اندازی سرور دیتابیس آن‌ها را بارگذاری کند. با تایید این بخش، timescaledb به این لیست اضافه می‌شود. با تایپ y و فشردن ENTER این ماژول را فعال کنید:

text
Is this okay? [(y)es/(n)o]: y
success: shared_preload_libraries will be updated

بر اساس مشخصات سرور شما، پیشنهادهایی برای بهینه‌سازی تنظیمات ارائه می‌شود. برای شروع فرآیند تنظیم (Tuning)، y را بزنید:

text
Output
Tune memory/parallelism/WAL and other settings? [(y)es/(n)o]: y
Recommendations based on 7.79 GB of available memory and 4 CPUs for PostgreSQL 16

ابزار timescaledb-tune به‌طور خودکار حافظه در دسترس سرور شما را تشخیص داده و مقادیر پیشنهادی برای تنظیماتی مانند shared_buffers و work_mem را محاسبه می‌کند. به عنوان مثال، shared_buffers حافظه اختصاص یافته برای کش کردن داده‌ها را تعیین می‌کند که به‌طور پیش‌فرض پایین است و ابزار آن را برای استفاده بهتر از منابع سرور شما افزایش می‌دهد.

برای تایید مقادیر پیشنهادی، y را وارد کنید:

text
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: memory settings will be updated

در مراحل بعدی، پیشنهادهایی برای تنظیمات موازی‌سازی (Parallelism)، لاگ پیش‌نویس (WAL) و تنظیمات متفرقه ارائه می‌شود. در هر مرحله کافیست y و سپس ENTER را بزنید تا تنظیمات بهینه روی سرور شما اعمال شود:

text
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: parallelism settings will be updated
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: WAL settings will be updated
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: miscellaneous settings will be updated
Saving changes to: /etc/postgresql/16/main/postgresql.conf

در نتیجه، شما یک فایل پیکربندی آماده و بهینه‌شده در مسیر /etc/postgresql/16/main/postgresql.conf خواهید داشت.

برای اعمال تغییرات پیکربندی، باید سرویس PostgreSQL را ری‌استارت کنید:

bash
sudo systemctl restart postgresql.service

اکنون دیتابیس با پارامترهای بهینه اجرا می‌شود و آماده کار با داده‌های سری زمانی است.


مرحله ۳ — ایجاد یک دیتابیس جدید و Hypertable

با بهینه‌سازی TimescaleDB، شما آماده کار با داده‌های سری زمانی هستید. TimescaleDB به‌عنوان افزونه‌ای برای PostgreSQL پیاده‌سازی شده است، بنابراین عملیات با داده‌های سری زمانی تفاوت زیادی با عملیات داده‌های رابطه‌ای ندارد.

ابتدا وارد حساب کاربری PostgreSQL شوید:

bash
sudo -u postgres psql

یک دیتابیس جدید به نام timeseries ایجاد کرده و به آن متصل شوید:

sql
CREATE DATABASE timeseries;
\c timeseries

سپس، افزونه TimescaleDB را برای این دیتابیس فعال کنید:

sql
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

نقطه اصلی تعامل با داده‌های سری زمانی در TimescaleDB، Hypertable ها هستند. یک Hypertable یک انتزاع از چندین جدول مجزاست که داده‌ها را در قالب قطعات (Chunks) نگه می‌دارند.

برای ایجاد یک Hypertable، ابتدا یک جدول معمولی SQL می‌سازید و سپس آن را از طریق تابع create_hypertable به Hypertable تبدیل می‌کنید. در این آموزش، جدولی می‌سازیم که دما و رطوبت دستگاه‌های مختلف را در طول زمان ثبت می‌کند:

sql
CREATE TABLE conditions (
time TIMESTAMP WITH TIME ZONE NOT NULL,
device_id TEXT,
temperature NUMERIC,
humidity NUMERIC
);

این دستور جدولی با نام conditions و چهار ستون ایجاد می‌کند. ستون اول زمان را با منطقه زمانی ذخیره می‌کند و نمی‌تواند خالی باشد. اکنون از ستون time برای تبدیل جدول به یک Hypertable که بر اساس زمان پارتیشن‌بندی شده استفاده می‌کنیم:

sql
SELECT create_hypertable(‘conditions’, ‘time’);

خروجی زیر را دریافت خواهید کرد:

text
Output
create_hypertable
————————-
(1,public,conditions,t)
(1 row)

مرحله ۴ — درج (Write) و حذف (Delete) داده‌ها

در این مرحله، داده‌هایی را با استفاده از دستورات استاندارد SQL درج می‌کنید. داده‌ها را می‌توان با دستور استاندارد INSERT در Hypertable قرار داد. داده‌های نمونه زیر را برای دستگاه فرضی weather-pro-000000 درج کنید:

sql
INSERT INTO conditions(time, device_id, temperature, humidity)
VALUES (NOW(), ‘weather-pro-000000’, 84.1, 84.1);

همچنین می‌توانید چندین ردیف داده را به‌طور همزمان وارد کنید:

sql
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);

اگر می‌خواهید داده‌ای را حذف کنید، از دستور استاندارد DELETE استفاده کنید. دستور زیر داده‌هایی با دمای بالاتر از ۸۰ یا رطوبت بالاتر از ۵۰ را حذف می‌کند:

sql
DELETE FROM conditions WHERE temperature > 80;
DELETE FROM conditions WHERE humidity > 50;

پس از عملیات حذف، توصیه می‌شود از دستور VACUUM استفاده کنید تا فضای اشغال‌شده توسط داده‌های حذف شده بازگردانده شود:

sql
VACUUM conditions;

برای درج حجم عظیمی از داده‌ها (مثلاً از یک فایل CSV)، از پایگاه داده خارج شوید (\q) و سپس دیتاست نمونه را دانلود و استخراج کنید:

bash
wget https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz
tar -xvzf weather_small.tar.gz

سپس داده‌ها را به دیتابیس خود وارد (Import) کنید:

bash
sudo -u postgres psql -d timeseries -c “\COPY conditions FROM weather_small_conditions.csv CSV”

پس از تکمیل ورود اطلاعات، خروجی زیر را مشاهده خواهید کرد:

text
Output
COPY 1000000

مرحله ۵ — کوئری گرفتن (Querying) از داده‌ها

اکنون که جدول شما حاوی داده است، می‌توانید کوئری‌های مختلفی برای تحلیل آن اجرا کنید. مجدداً وارد دیتابیس شوید:

bash
sudo -u postgres psql -d timeseries

برای نمایش ۱۰ رکورد آخر از Hypertable، دستور زیر را اجرا کنید:

sql
SELECT * FROM conditions LIMIT 10;

برای مشاهده جدیدترین رکوردها، داده‌ها را به‌صورت نزولی بر اساس زمان مرتب کنید:

sql
SELECT * FROM conditions ORDER BY time DESC LIMIT 20;

علاوه بر دستورات استاندارد SQL، TimescaleDB توابع خاصی برای تحلیل داده‌های سری زمانی ارائه می‌دهد. به عنوان مثال، برای یافتن میانه (Median) مقادیر دما از تابع percentile_cont استفاده کنید:

sql
SELECT percentile_cont(0.5)
WITHIN GROUP (ORDER BY temperature)
FROM conditions
WHERE device_id = ‘weather-pro-000000’;

برای نمایش آخرین مقادیر ثبت شده هر سنسور، از تابع last استفاده کنید:

sql
SELECT device_id, last(temperature, time)
FROM conditions
GROUP BY device_id;

مثال زیر پیچیده‌تر است. این کوئری میانگین، حداقل و حداکثر دمای ساعتی را برای یک سنسور خاص در ۲۴ ساعت گذشته نشان می‌دهد:

sql
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;

در اینجا از تابع قدرتمند time_bucket استفاده شده است که نسخه پیشرفته‌تر تابع date_trunc در PostgreSQL محسوب می‌شود.


مرحله ۶ — پیکربندی فشرده‌سازی و حذف داده‌ها

با انباشت داده‌ها، فضای بیشتری روی هارد دیسک شما اشغال می‌شود. برای ذخیره فضا، TimescaleDB قابلیت فشرده‌سازی داده‌ها را ارائه می‌دهد.

ابتدا فشرده‌سازی را برای Hypertable خود فعال کنید:

sql
ALTER TABLE conditions SET (
timescaledb.compress,
timescaledb.compress_segmentby = ‘device_id’
);

همچنین می‌توانید TimescaleDB را تنظیم کنید تا داده‌ها را پس از یک دوره زمانی مشخص به‌طور خودکار فشرده کند:

sql
SELECT add_compress_chunks_policy(‘conditions’, INTERVAL ‘7 days’);

اگر نیازی به نگهداری طولانی‌مدت داده‌ها ندارید، می‌توانید داده‌های قدیمی را حذف کنید. برای این کار تابع خاصی به نام drop_chunks وجود دارد:

sql
SELECT drop_chunks(interval ’24 hours’, ‘conditions’);

این کوئری تمام قطعات (Chunks) دارای داده‌هایolder از ۲۴ ساعت گذشته را از جدول conditions حذف می‌کند.

برای خودکارسازی حذف داده‌های قدیمی، می‌توانید یک وظیفه Cron ایجاد کنید. از دیتابیس خارج شوید (\q) و سپس crontab را ویرایش کنید:

bash
sudo crontab -e

خط زیر را به انتهای فایل اضافه کنید:

text
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

این وظیفه هر روز ساعت ۱:۰۰ بامداد، داده‌های قدیمی‌تر از یک روز را به‌طور خودکار حذف می‌کند.


نتیجه‌گیری شما اکنون موفق به نصب و راه‌اندازی TimescaleDB روی سرور اوبونتو 24.04 خود در پارمین کلود شده‌اید. شما یاد گرفتید چگونه یک Hypertable ایجاد کنید، داده درج کنید، کوئری بگیرید، داده‌ها را فشرده کرده و رکوردهای غیرضروری را حذف کنید. با استفاده از این مثال‌ها، می‌توانید از مزایای کلیدی TimescaleDB نسبت به سیستم‌های مدیریت دیتابیس رابطه‌ای سنتی برای ذخیره داده‌های سری زمانی بهره‌مند شوید.

اکنون می‌توانید از این داده‌ها برای ایجاد نمودار استفاده کنید. TimescaleDB با ابزارهای مصورسازی (Visualization) که از PostgreSQL پشتیبانی می‌کنند، مانند Grafana، سازگار است.

از همراهی شما با پارمین کلود سپاسگزاریم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا