بلاگ/راه‌اندازی ClickHouse روی سرور مجازی و اختصاصی: دیتابیس تحلیلی متن‌باز برای پردازش سریع داده‌های حجیم
به‌روز شده

راه‌اندازی ClickHouse روی سرور مجازی و اختصاصی: دیتابیس تحلیلی متن‌باز برای پردازش سریع داده‌های حجیم

1405/06/296 بازدید
راه‌اندازی ClickHouse روی سرور مجازی و اختصاصی: دیتابیس تحلیلی متن‌باز برای پردازش سریع داده‌های حجیم

راه‌اندازی ClickHouse روی سرور مجازی و اختصاصی: دیتابیس تحلیلی متن‌باز برای پردازش سریع داده‌های حجیم

وقتی حجم داده‌ها از چند میلیون ردیف عبور می‌کند و کوئری‌های تحلیلی روی دیتابیس‌های ردیفی (مثل MySQL یا PostgreSQL) کند می‌شوند، اغلب تیم‌ها سراغ یک دیتابیس ستونی می‌روند. ClickHouse یکی از شناخته‌شده‌ترین گزینه‌های متن‌باز در این دسته است و برای پردازش تحلیلی داده‌های حجیم (OLAP) ساخته شده، نه برای تراکنش‌های روزمره.

این راهنما نصب و راه‌اندازی ClickHouse روی سرور را از صفر توضیح می‌دهد؛ چه سرور شما یک VPS باشد و چه یک سرور اختصاصی. در ادامه ساخت اولین جدول، اجرای کوئری تحلیلی و امن‌سازی دسترسی از راه دور را هم پوشش می‌دهیم.

نمای کلی راه‌اندازی ClickHouse روی سرور

ClickHouse چیست و چرا برای داده حجیم سریع است؟

ClickHouse یک دیتابیس مدیریت‌شده ستونی (Column-Oriented) است که توسط Yandex توسعه داده شد و اکنون به‌صورت متن‌باز در دسترس همه است. تفاوت اصلی آن با دیتابیس‌های ردیفی این است که داده هر ستون را کنار هم روی دیسک ذخیره می‌کند، نه هر ردیف را.

این طراحی برای کوئری‌هایی که فقط چند ستون از یک جدول با میلیون‌ها ردیف را می‌خوانند (مثلاً SELECT AVG(response_time) روی لاگ‌های یک هفته) تفاوت محسوسی ایجاد می‌کند، چون دیسک فقط ستون‌های مورد نیاز را می‌خواند، نه کل ردیف را. فشرده‌سازی هم روی داده‌های همگن یک ستون بسیار مؤثرتر از فشرده‌سازی یک ردیف ناهمگن است.

کاربردهای رایج ClickHouse شامل تحلیل لاگ، داشبورد real-time، ذخیره متریک‌های مانیتورینگ، و گزارش‌گیری روی داده‌های رویدادمحور (event-based) است. برای تراکنش‌های بانکی یا CRUD معمولی مناسب نیست؛ آن‌جا PostgreSQL یا MySQL انتخاب درست‌تری هستند.

انتخاب سرور مناسب: مجازی یا اختصاصی؟

پیش از نصب، باید تصمیم بگیرید ClickHouse روی چه زیرساختی اجرا شود. برای پروژه‌های کوچک تا متوسط، یک سرور مجازی با دیسک NVMe کافی است؛ برای حجم داده بسیار بالا یا کوئری‌های همزمان زیاد، سرور اختصاصی گزینه بهتری است.

معیارسرور مجازی (VPS)سرور اختصاصی (Dedicated)
هزینه اولیهپایین، پرداخت ماهانهبالاتر، تعهد بیشتر
CPU و RAMمشترک یا تضمین‌شده تا سقف مشخصاختصاصی و کامل
I/O دیسکوابسته به نوع پلن و NVMeحداکثر ظرفیت سخت‌افزار
مقیاس‌پذیریسریع، با ارتقای پلننیازمند جابه‌جایی سخت‌افزار
مناسب برایتست، پروژه‌های تا چند ده گیگابایت دادهحجم بالا، کوئری همزمان زیاد
زمان راه‌اندازیچند دقیقهمعمولاً چند ساعت تا یک روز

مقایسه استقرار ClickHouse روی سرور مجازی و سرور اختصاصی برای پردازش سریع داده

اگر هنوز مطمئن نیستید حجم داده شما به کجا می‌رسد، شروع با یک سرور مجازی و ارتقا در صورت نیاز، منطقی‌تر از خرید سرور اختصاصی از ابتدا است. وقتی حجم داده به صدها گیگابایت یا کوئری‌های همزمان زیاد رسید، سرور اختصاصی کنترل کامل روی سخت‌افزار و I/O را می‌دهد.

پیش‌نیازها پیش از نصب

قبل از شروع نصب، این موارد را آماده کنید:

  • دسترسی root یا کاربری با sudo روی سرور (اوبونتو ۲۲.۰۴ یا دبین ۱۲ در این راهنما استفاده شده)
  • حداقل ۲ هسته CPU و ۴ گیگابایت RAM برای تست؛ برای بار واقعی حداقل ۸ گیگابایت پیشنهاد می‌شود
  • دیسک SSD یا NVMe؛ ClickHouse روی HDD هم کار می‌کند اما سرعت خواندن ستونی را از دست می‌دهید
  • یک IP عمومی و دسترسی به پورت‌های ۸۱۲۳ (HTTP) و ۹۰۰۰ (native TCP)

اگر هنوز مطمئن نیستید دیسک سرورتان چه نوعی است، تفاوت عملکرد SSD و NVMe را از قبل بررسی کنید؛ برای ClickHouse این تفاوت مستقیماً روی سرعت خواندن ستونی اثر می‌گذارد.

نصب ClickHouse روی سرور

ساده‌ترین راه، استفاده از ریپازیتوری رسمی ClickHouse است. دستورات زیر را با دسترسی sudo اجرا کنید:

sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
sudo apt-get install -y clickhouse-server clickhouse-client

در حین نصب، یک رمز عبور برای کاربر default از شما خواسته می‌شود؛ آن را در جایی امن نگه دارید، چون در بخش امن‌سازی دوباره به آن نیاز دارید.

پس از نصب، سرویس را فعال و اجرا کنید:

sudo systemctl enable clickhouse-server
sudo systemctl start clickhouse-server
sudo systemctl status clickhouse-server

اگر status وضعیت active (running) را نشان داد، نصب موفق بوده است. برای تست سریع:

clickhouse-client --query "SELECT version()"

ساخت اولین دیتابیس و جدول

فرض کنید می‌خواهید لاگ درخواست‌های یک وب‌سرویس را ذخیره کنید. وارد کلاینت شوید و دیتابیس بسازید:

CREATE DATABASE analytics;

CREATE TABLE analytics.request_logs
(
    event_time DateTime,
    service    String,
    status_code UInt16,
    response_time_ms UInt32,
    user_id    UInt64
)
ENGINE = MergeTree
ORDER BY (service, event_time)
PARTITION BY toYYYYMM(event_time);

موتور MergeTree و مشتقات آن (ReplacingMergeTree، SummingMergeTree و غیره) اصلی‌ترین انتخاب برای جداول تحلیلی در ClickHouse هستند. کلید ORDER BY مشخص می‌کند داده روی دیسک به چه ترتیبی مرتب و فشرده شود؛ انتخاب درست این کلید، سرعت کوئری‌های فیلترشده روی همان ستون‌ها را چند برابر می‌کند. PARTITION BY هم داده را بر اساس ماه به بخش‌های جداگانه تقسیم می‌کند تا حذف داده قدیمی یا کوئری روی یک بازه زمانی سریع‌تر باشد.

وارد کردن داده و اجرای کوئری نمونه

برای درج داده تستی:

INSERT INTO analytics.request_logs VALUES
    (now(), 'api-gateway', 200, 45, 1001),
    (now(), 'api-gateway', 500, 320, 1002),
    (now(), 'auth-service', 200, 12, 1001);

و یک کوئری تحلیلی رایج، میانگین زمان پاسخ به تفکیک سرویس در ۲۴ ساعت گذشته:

SELECT
    service,
    count() AS total_requests,
    avg(response_time_ms) AS avg_response_ms,
    countIf(status_code >= 500) AS errors
FROM analytics.request_logs
WHERE event_time >= now() - INTERVAL 1 DAY
GROUP BY service
ORDER BY total_requests DESC;

روی جداول واقعی با میلیون‌ها ردیف، همین کوئری معمولاً در کسری از ثانیه برمی‌گردد؛ چون ClickHouse فقط ستون‌های service، response_time_ms و status_code را می‌خواند، نه کل ردیف را.

تنظیمات بهینه برای حجم داده بالا

برای این‌که سرور زیر بار واقعی هم پاسخ‌گو بماند:

  • فشرده‌سازی: به‌طور پیش‌فرض LZ4 فعال است؛ برای داده‌ای که فضای دیسک اهمیت بیشتری از سرعت CPU دارد، می‌توانید در تعریف ستون از CODEC(ZSTD) استفاده کنید.
  • TTL روی داده قدیمی: با TTL event_time + INTERVAL 6 MONTH DELETE می‌توانید داده قدیمی‌تر از یک بازه را خودکار حذف کنید تا دیسک پر نشود. اگر با وجود TTL هم به فضای بیشتری نیاز دارید، مدیریت دیسک با LVM افزایش فضا را بدون توقف سرویس ممکن می‌کند.
  • حافظه کوئری: مقدار max_memory_usage در users.xml سقف حافظه هر کوئری را تعیین می‌کند؛ روی سرورهای کم‌رم پایین نگه‌اش دارید تا یک کوئری سنگین کل سرویس را از کار نیندازد.
  • merge پس‌زمینه: ClickHouse به‌صورت دوره‌ای parts کوچک را ادغام می‌کند؛ روی سرورهای با دیسک کندتر، background_pool_size را کاهش دهید تا با ترافیک نوشتن رقابت نکند.

امن‌سازی دسترسی از راه دور

ClickHouse به‌صورت پیش‌فرض روی پورت‌های ۸۱۲۳ و ۹۰۰۰ گوش می‌دهد و اگر بدون تنظیم درست expose شود، یک ریسک امنیتی جدی است. این موارد را حتماً انجام دهید:

  1. رمز عبور کاربر default را عوض کنید یا این کاربر را غیرفعال کرده و کاربر جدید با دسترسی محدود بسازید:
CREATE USER analyst IDENTIFIED WITH sha256_password BY 'یک-رمز-قوی';
GRANT SELECT ON analytics.* TO analyst;
  1. دسترسی شبکه را محدود کنید. در /etc/clickhouse-server/config.xml، مقدار listen_host را از 0.0.0.0 به IP داخلی یا 127.0.0.1 تغییر دهید و اتصال از بیرون را فقط از طریق SSH tunnel یا VPN انجام دهید (برای تنظیم درست خود SSH هم این راهنمای امن‌سازی SSH را ببینید).

  2. فایروال را تنظیم کنید تا فقط IPهای مورد اعتماد به پورت‌های ClickHouse دسترسی داشته باشند (برای قوانین دقیق‌تر می‌توانید از فایروال nftables هم استفاده کنید):

sudo ufw allow from <trusted-ip> to any port 8123
sudo ufw allow from <trusted-ip> to any port 9000
sudo ufw deny 8123
sudo ufw deny 9000
  1. HTTPS/TLS را فعال کنید اگر کلاینت‌ها از بیرون شبکه داخلی وصل می‌شوند؛ ClickHouse از گواهی TLS در همان config.xml پشتیبانی می‌کند.

بدون این چهار مرحله، یک سرور ClickHouse expose‌شده روی اینترنت باز، هدف ساده‌ای برای اسکن خودکار و حملات brute-force است.

مانیتورینگ و نگهداری

جداول سیستمی ClickHouse (system.query_log، system.parts، system.metrics) اطلاعات لازم برای مانیتورینگ را از داخل خود دیتابیس می‌دهند، بدون نیاز به ابزار جانبی برای شروع:

SELECT query, query_duration_ms, memory_usage
FROM system.query_log
ORDER BY query_duration_ms DESC
LIMIT 10;

برای محیط production، اتصال این متریک‌ها به Grafana از طریق پلاگین ClickHouse یا Prometheus exporter، دید بهتری نسبت به وضعیت سرور در طول زمان می‌دهد؛ روش کامل راه‌اندازی این دو ابزار را در راهنمای مانیتورینگ سرور با Prometheus و Grafana پوشش داده‌ایم.

جمع‌بندی

راه‌اندازی ClickHouse روی سرور شامل چند مرحله مشخص است: انتخاب زیرساخت مناسب (VPS برای شروع، اختصاصی برای مقیاس)، نصب از ریپازیتوری رسمی، طراحی درست جدول با MergeTree و کلید ORDER BY، و امن‌سازی دسترسی شبکه پیش از اتصال به دنیای بیرون. با همین چهار مرحله، یک دیتابیس تحلیلی آماده پردازش داده‌های حجیم خواهید داشت.

اگر می‌خواهید بدون نگرانی درباره تنظیمات پایه شبکه یا محدودیت منابع شروع کنید، یک سرور مجازی آریانت با دیسک NVMe انتخاب مناسبی برای اجرای ClickHouse است.