برنامه نویسی

ClickHouse: کلید بینش سریعتر

Summarize this content to 400 words in Persian Lang
ClickHouse به دلیل سرعت و کارایی بی نظیر خود در پردازش کلان داده ها به سرعت در حال جلب توجه است. به عنوان مثال، Cloudflare از ClickHouse برای پردازش میلیون‌ها ردیف در ثانیه استفاده می‌کند و مصرف حافظه را تا چهار برابر کاهش می‌دهد و آن را به یک بازیکن کلیدی در تجزیه و تحلیل‌های مقیاس بزرگ تبدیل می‌کند. ClickHouse با ویژگی‌های پیشرفته و عملکرد پرس و جو در زمان واقعی خود به یک انتخاب برای شرکت‌هایی تبدیل می‌شود که مجموعه‌های داده عظیم را مدیریت می‌کنند.در این مقاله، دلیل محبوبیت فزاینده ClickHouse برای تجزیه و تحلیل، ویژگی‌های کلیدی آن و نحوه استقرار آن در Kubernetes را بررسی خواهیم کرد. ما همچنین برخی از بهترین روش‌ها را برای مقیاس‌پذیری ClickHouse برای مدیریت بارهای کاری رو به رشد و به حداکثر رساندن عملکرد پوشش خواهیم داد.

مقدمه

ClickHouse یک سیستم مدیریت پایگاه داده SQL ستون محور (DBMS) با کارایی بالا است که برای پردازش تحلیلی آنلاین (OLAP) طراحی شده است و در مدیریت مجموعه داده های بزرگ با سرعت قابل توجهی، به ویژه برای فیلتر کردن و جمع آوری داده ها عالی است. با استفاده از ذخیره‌سازی ستونی، دسترسی سریع به داده‌ها و فشرده‌سازی کارآمد را ممکن می‌سازد، و برای صنایعی که نیاز به بازیابی و تجزیه و تحلیل سریع داده‌ها دارند، ایده‌آل است. موارد استفاده متداول آن عبارتند از تجزیه و تحلیل وب، که در آن حجم وسیعی از داده های ردیابی را پردازش می کند، هوش تجاری برای تقویت تصمیم گیری با سرعت بالا، و تجزیه و تحلیل گزارش برای نظارت و عیب یابی در مقیاس بزرگ.

ویژگی های کلیدی Clickhouse:

ذخیره سازی ستونی: دسترسی سریع به داده ها و فشرده سازی کارآمد را فعال می کند و سرعت جستجوهای تحلیلی و فشرده سازی کارآمد را افزایش می دهد.

کارایی و مقیاس پذیری بالا: بهینه شده برای مدیریت مجموعه داده های عظیم و پرس و جوهای پیچیده با موتورهای جدول منحصر به فرد که نحوه ذخیره داده ها را تعیین می کند.

تجزیه و تحلیل زمان واقعی: از پردازش و تجزیه و تحلیل داده ها در زمان واقعی پشتیبانی می کند.

به حداکثر رساندن استفاده از سخت افزار: ClickHouse برای استفاده مؤثر از تمام منابع موجود سیستم طراحی شده است.

عملکرد غنی: طیف گسترده ای از توابع داخلی را ارائه می دهد که دستکاری و تجزیه و تحلیل داده ها را افزایش می دهد. ### چگونه کلیک هاوس کار می کند؟

ClickHouse برای سرعت و مقیاس‌پذیری طراحی شده است و آن را برای مدیریت حجم وسیعی از داده‌ها ایده‌آل می‌سازد. ماهیت توزیع شده آن امکان تکثیر داده ها را در چندین گره فراهم می کند و هم تحمل خطا و هم در دسترس بودن بالا را تضمین می کند.

معماری

ClickHouse بر روی یک معماری توزیع شده عمل می کند که در آن داده ها در سراسر گره ها تقسیم و تکثیر می شوند. الف را به کار می گیرد معماری هیچ چیز مشترک، حرکت به سمت یک مدل محاسباتی و ذخیره سازی جدا شده، تسهیل اجرای موازی و برداری.

نمونه ای از Shared Nothing ClickHouse Cluster با 3 سرور مشابه

مکانیسم ذخیره سازی

ClickHouse از فضای ذخیره‌سازی ستونی استفاده می‌كند كه به آن اجازه می‌دهد تا حجم زیادی از داده‌ها را به سرعت بخواند و فشرده كند. سازمان‌هایی که از سیستم‌های مبتنی بر ردیف مانند Postgres مهاجرت می‌کنند، می‌توانند از نظر عملکرد سود قابل توجهی داشته باشند.جداول از منحصر به فرد استفاده می کنند موتورهای رومیزی- به ویژه خانواده موتور MergeTree – برای ذخیره داده ها به طور موثر، با استفاده از نقاط قوت ClickHouse در پردازش تحلیلی.

اجرای پرس و جو

ClickHouse از یک موتور جستجوی منحصربه‌فرد بهینه‌سازی شده برای بازیابی داده‌ها با سرعت بالا استفاده می‌کند و از دستورالعمل‌های Single Instruction، Multiple Data (SIMD) برای پردازش چندین نقطه داده به طور همزمان استفاده می‌کند. این پردازش موازی به طور قابل توجهی عملکرد را به خصوص برای پرس و جوهای پیچیده افزایش می دهد. همانطور که در فیلم A Day in the Life of a Query نشان داده شده است، ClickHouse به طور موثر پرس و جوها را تجزیه و اجرا می کند و به جای بازیابی صرفاً داده های خام، بر پاسخ به سؤالات خاص تمرکز می کند.برای درک بیشتر اجرای پرس و جو، می توانیم از EXPLAIN بند این EXPLAIN بند در SQL برای نمایش طرح اجرای یک پرس و جو استفاده می شود. هنگامی که یک پرس و جو را با EXPLAIN، پایگاه داده در واقع پرس و جو را اجرا نمی کند. در عوض، تفکیک دقیقی از نحوه اجرای پرس و جو، از جمله مراحلی که بهینه ساز پرس و جو انجام خواهد داد را نشان می دهد.

برای ClickHouse مراحل اجرای پرس و جو به صورت زیر است:

منبع: درون نگری عملکرد بند توضیح

توضیح طرح: طرح پرس و جو مراحلی را که باید برای پرس و جو اجرا شود به صورت کلی نشان می دهد، اما طرح پرس و جو نشان نمی دهد که چگونه ClickHouse با استفاده از منابع موجود در دستگاه، پرس و جو را اجرا می کند، برای بررسی اینکه به چه ترتیبی عبارت ها را بررسی می کند مفید است. در حال اجرا هستند، طرح را از پایین به بالا بخوانید.

برای اهداف نمایشی، از مجموعه داده‌های قیمت املاک بریتانیا استفاده خواهیم کرد.

EXPLAIN PLAN indexes = 1
SELECT
    postcode1,
    type,
    COUNT(*) AS property_count,
    AVG(price) AS avg_price
FROM
    uk_price_paid
WHERE
    is_new = 1  
    AND date >= ‘2023-01-01’
GROUP BY
    postcode1, type
ORDER BY
    avg_price DESC;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای پرس و جو بالا، خروجی را به صورت زیر دریافت می کنیم:

Expression (Project names)
Limit (preliminary LIMIT (without OFFSET))
Sorting (Sorting for ORDER BY)
Expression ((Before ORDER BY + Projection))
Aggregating
Expression (Before GROUP BY)
Expression
ReadFromMergeTree (default.uk_price_paid)

Indexes:
PrimaryKey
Condition: true
Parts: 1/1
Granules: 3598/3598

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در تجزیه و تحلیل طرح اجرای پرس و جو، تفسیر مراحل از پایین به بالا (در این مورد از ReadMergeTree تا Limit) ضروری است، زیرا هر لایه نشان دهنده یک عملیات متوالی انجام شده روی داده است.

AST را توضیح دهید: با این بند، می‌توانیم درخت نحو انتزاعی را کاوش کنیم، همچنین می‌توانیم آن را از طریق Graphviz تجسم کنیم.

برای پرس و جو:

EXPLAIN AST graph = 1
SELECT
    postcode1,
    type,
    COUNT(*) AS property_count,
    AVG(price) AS avg_price
FROM
    uk_price_paid
WHERE
    is_new = 1  
    AND date >= ‘2023-01-01’
GROUP BY
    postcode1, type
ORDER BY
    avg_price DESC;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درخت نحو انتزاعی را به صورت زیر دریافت می کنیم:

PIPELINE را توضیح دهید: بررسی درونی خط لوله پرس و جو می تواند به شما کمک کند بطری های پرس و جو را شناسایی کنید.

برای پرس و جو:

EXPLAIN PIPELINE graph = 1
SELECT
    postcode1,
    type,
    COUNT(*) AS property_count,
    AVG(price) AS avg_price
FROM
    uk_price_paid
WHERE
    is_new = 1  
    AND date >= ‘2023-01-01’
GROUP BY
    postcode1, type
ORDER BY
    avg_price DESC;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی را به صورت زیر دریافت می کنیم:

ClickHouse به طور طبیعی پرس و جوها را موازی می کند و هر مرحله به طور پیش فرض از چندین رشته استفاده می کند. در این مثال، مراحل توسط 4 رشته مدیریت می شوند، به این معنی که هر رشته تقریباً یک چهارم داده ها را قبل از ترکیب نتایج به صورت موازی پردازش می کند. این رویکرد سرعت اجرا را به میزان قابل توجهی افزایش می دهد.به عنوان مثال، شناسایی مراحلی که در الف اجرا می شوند تک رشته کلید بهینه سازی پرس و جوهای کند است. با جداسازی این تنگناها، می‌توانیم بخش‌های خاصی از پرس و جو را برای بهبود عملکرد هدف‌گیری کنیم و به طور کلی از اجرای سریع‌تر و کارآمدتر اطمینان حاصل کنیم.

قابلیت های یکپارچه سازی

ClickHouse با طیف وسیعی از ابزارهای داده، از جمله فرآیندهای ETL/ELT و ابزارهای BI مانند Apache Superset سازگاری بالایی دارد. این تقریباً از همه فرمت‌های داده رایج پشتیبانی می‌کند و یکپارچگی را در بین اکوسیستم‌های مختلف یکپارچه می‌کند.

چرا کلیک هاوس و مهاجرت را انتخاب کنیم؟

انتخاب ClickHouse مزایای قابل توجهی را ارائه می دهد، به ویژه برای سازمان هایی که با تجزیه و تحلیل داده ها در مقیاس بزرگ سر و کار دارند. ترکیب منحصر به فرد آن از عملکرد، مقرون به صرفه بودن و پشتیبانی جامعه، آن را به انتخابی قانع کننده برای مهاجرت از پایگاه های داده سنتی تبدیل می کند.

مزایای عملکرد

ClickHouse برای بهینه سازی شده است OLAP بارهای کاری، ارائه سرعت استثنایی هم در جذب داده و هم در اجرای پرس و جو، ارائه عملکرد پرس و جوی فرعی حتی در هنگام پردازش میلیاردها ردیف. این باعث می شود آن را برای تجزیه و تحلیل زمان واقعی و تصمیم گیری در صنایع داده فشرده ایده آل کند. این کلید اصلی در ClickHouse نقش مهمی در تعیین نحوه ذخیره و جستجوی داده ها دارد. مهم است که ستون‌هایی را انتخاب کنید که اغلب پرس و جو می‌شوند، زیرا کلید اصلی باید اجرای پرس و جو را بهینه کند، به ویژه برای WHERE بند در ClickHouse، کلید اصلی برای هر ردیف منحصر به فرد نیست.

داستان های موفقیت در دنیای واقعی

بسیاری از سازمان ها با موفقیت به ClickHouse مهاجرت کرده اند و به بهبودهای قابل توجهی در عملکرد و صرفه جویی در هزینه دست یافته اند. از غول‌های تجارت الکترونیک گرفته تا شرکت‌های مالی، داستان‌های موفقیت بر توانایی ClickHouse در تبدیل قابلیت‌های تجزیه و تحلیل داده‌ها در مقیاس برجسته است. برای جزئیات بیشتر، به Appopters ClickHouse مراجعه کنید.

اجرای ClickHouse در Kubernetes

در این راهنما، فرآیند اجرای ClickHouse در خوشه Kubernetes را در 7 مرحله مرور خواهیم کرد:

مرحله 1: Kubectl را نصب کنید

ابتدا باید نصب کنیم kubectl، ابزار خط فرمان برای تعامل با خوشه های Kubernetes. دستورات زیر را در ترمینال خود اجرا کنید:

sudo apt-get update
sudo apt-get install -y kubectl
# Download Minikube
# Please check your OS configuration and download from:
# https://minikube.sigs.k8s.io/docs/start/?arch=%2Flinux%2Fx86-64%2Fstable%2Fbinary+download
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube version
minikube start

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مرحله، Kubernetes را به صورت محلی راه اندازی کرده اید.

مرحله 2: Altinity ClickHouse Operator را نصب کنید

در مرحله بعد، اپراتور Altinity ClickHouse را برای مدیریت استقرار ClickHouse خود دانلود و نصب می کنیم:

kubectl apply -f https://raw.githubusercontent.com/Altinity/clickhouse-operator/master/deploy/operator/clickhouse-operator-install-bundle.yaml

kubectl get pods -n kube-system

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما باید پاد عملگر ClickHouse را در حال اجرا ببینید که نشان می دهد اپراتور با موفقیت مستقر شده است.

مرحله 3: پایگاه داده ClickHouse را نصب کنید

حالا باید خود پایگاه داده ClickHouse را نصب کنیم. این مراحل را دنبال کنید:

یک مثال پیکربندی اولیه برای نسخه ی نمایشی ما:

apiVersion: “clickhouse.altinity.com/v1”
kind: “ClickHouseInstallation”
metadata:
  name: my-clickhouse
  namespace: test-clickhouse-operator
spec:
  configuration:
    clusters:
      – name: cluster
        layout:
          shardsCount: 1
          replicasCount: 1
  templates:
    podTemplates:
      – name: clickhouse-pod-template
        spec:
          containers:
            – name: clickhouse
              image: clickhouse/clickhouse-server:latest
              resources:
                requests:
                  cpu: “100m”
                  memory: “1Gi”
                limits:
                  cpu: “1”
                  memory: “2Gi”
  defaults:
    templates:
      podTemplate: clickhouse-pod-template

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون پیکربندی را اعمال کنید و وضعیت پادها و سرویس ها را بررسی کنید:

cat clickhouse-install.yaml | kubectl apply -f –
kubectl get pods -n test-clickhouse-operator
kubectl get services -n test-clickhouse-operator

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

باید ببینید که سرویس‌ها همانطور که در پیکربندی نصب شما تعریف شده‌اند اجرا می‌شوند.

مرحله 4: به پایگاه داده ClickHouse متصل شوید

برای تعامل با پایگاه داده ClickHouse، باید مشتری ClickHouse را روی ماشین محلی خود نصب کنیم. اگر از سیستم عامل دیگری استفاده می کنید، به راهنمای نصب رسمی ClickHouse مراجعه کنید.

برای نصب ClickHouse دستورات زیر را اجرا کنید:

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
sudo clickhouse start

kubectl -n test-clickhouse-operator port-forward 9000:9000 &

clickhouse-client

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 5: خدمات خود را آزمایش کنید

برای اطمینان از اینکه همه چیز به درستی اجرا می شود، دستورات زیر را اجرا کنید:

kubectl get pods -n test-clickhouse-operator
kubectl get services -n test-clickhouse-operator

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 6: کوئری ها را اجرا کنید

حال، بیایید یک جدول ایجاد کنیم و چند پرس و جو را در ClickHouse اجرا کنیم:

clickhouse-client
CREATE TABLE test_table (
    id UInt32,
    name String
) ENGINE = MergeTree()
ORDER BY id;

INSERT INTO test_table VALUES (1, ‘CloudRaft’), (2, ‘ClickHouse’);
SELECT * FROM test_table;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما باید نتایج را در CLI با مسیر تغییر یافته ببینید، که نشان می دهد شما مستقیماً با خوشه ClickHouse در تعامل هستید.

مرحله 7: تست بار

برای ارزیابی بیشتر عملکرد نصب ClickHouse خود، استفاده از ابزارهای تست بار مانند Apache JMeter یا k6 را برای شبیه سازی بارهای جستجوی افزایش یافته در نظر بگیرید. با اضافه کردن گره های بیشتری به خوشه، زمان های پاسخ پرس و جو را اندازه گیری کنید.

تفاوت های کلیدی بین PostgreSQL و ClickHouse

در حالی که هر دو Postgres و ClickHouse اهداف متفاوتی دارند، تمایز کلیدی در نحوه مدیریت آنها نهفته است. همانند سازی و خرد کردن. Postgres اساساً برای بارهای کاری تراکنشی (OLTP) طراحی شده است، جایی که ثبات و دوام داده در اولویت قرار دارد. از سوی دیگر، ClickHouse برای بارهای کاری تحلیلی (OLAP) و برای پرس و جوی پرسرعت و تجزیه و تحلیل داده در مقیاس بزرگ بهینه شده است.

نماهای مادی شده

در ClickHouse، Materialized Views یک ویژگی قدرتمند است که برای بهبود عملکرد پرس و جو با از پیش جمع آوری و ذخیره داده ها طراحی شده است. بر خلاف نماهای معمولی که در حین اجرای پرس و جو محاسبه می شوند، نماهای واقعی نتایج یک پرس و جو را به صورت فیزیکی ذخیره می کنند و امکان خواندن سریعتر را فراهم می کنند. این نماها همچنین می‌توانند از قابلیت‌های فشرده‌سازی کارآمد و دسترسی سریع مدل ذخیره‌سازی ستونی استفاده کنند و عملکرد را بیشتر افزایش دهند.

نماهای مادی به ویژه در محیط هایی که عملکرد پرس و جو حیاتی است مفید هستند، زیرا نتایج از پیش محاسبه شده ای را ارائه می دهند که در زمان اجرا صرفه جویی می کند.نماهای Materialized Postgres باید به صورت دستی دوباره به روز شوند، در حالی که ClickHouse به طور خودکار آنها را با فلسفه درج و بهینه سازی بعد به روز می کند.

مقیاس گذاری ClickHouse

در ClickHouse می توان از طریق مقیاس گذاری به دست آورد همانند سازی و خرد کردن مکانیسم ها اینها به توزیع داده ها و پرس و جوها در چندین گره برای عملکرد و تحمل خطا کمک می کنند.

ClickHouse به طور سنتی به آن متکی است باغ وحش، یک سرویس متمرکز برای هماهنگی سیستم های توزیع شده. ZooKeeper با حفظ ابرداده، مدیریت قفل‌ها و مدیریت خرابی‌ها، اطمینان می‌دهد که کپی‌های داده در سراسر گره‌ها همگام هستند. این به عنوان یک جزء کلیدی برای ثابت نگه داشتن حالت خوشه عمل می کند و اطمینان می دهد که ماکت ها از هم جدا نمی شوند و عملیات خواندن و نوشتن به درستی توزیع می شوند.

همانند سازی

Replication تضمین می‌کند که کپی‌هایی از همان داده‌ها در چندین گره ذخیره می‌شوند تا افزونگی ایجاد کنند و تحمل خطا را بهبود بخشند. Replication در ClickHouse در سطح جدول است.

ReplicatedMergeTree موتوری است که برای جداول تکراری استفاده می شود.
هر جدول دارای یک ماکت در چندین سرور است و این رونوشت ها با هم هماهنگ نگه داشته می شوند.

Clickhouse-Keeper هماهنگی بین این کپی‌ها را مدیریت می‌کند و با مدیریت قفل‌ها، تراکنش‌ها و ابرداده‌های مرتبط با تکرار، از ثبات اطمینان حاصل می‌کند.
در صورتی که یک ماکت پایین بیاید، سیستم همچنان می‌تواند از کپی‌های موجود بخواند و بنویسد.

مثال فرآیند تکرار:

بیایید فرض کنیم دو کپی وجود دارد، A و B. یک نوشتن در Replica A ثبت می شود و به Replica B تکرار می شود، با اطمینان از اینکه هر دو دارای داده های یکسان هستند. این به صورت ناهمزمان اتفاق می افتد تا از مشکلات تاخیر جلوگیری شود. ### Sharding Sharding در Clickhouse فرآیند تقسیم افقی داده ها به بخش های کوچکتر و توزیع آن در سرورهای مختلف (شاردها) است. این به Clickhouse اجازه می دهد تا با توزیع بار، مجموعه داده های بسیار بزرگی را مدیریت کند.

جدول توزیع شده: Clickhouse از یک جدول توزیع شده برای دستیابی به اشتراک گذاری استفاده می کند. جدول توزیع شده یک جدول منطقی است که در بالای جداول محلی قرار می گیرد (در گره های مختلف تقسیم شده است) و به عنوان یک مسیریاب پرس و جو عمل می کند.
هنگامی که یک پرس و جو بر روی یک جدول توزیع شده اجرا می شود، به طور خودکار به قطعه (های) مربوطه بر روی کلید اشتراک گذاری هدایت می شود.

مثال فرآیند شاردینگ:

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

نتیجه گیری

در نتیجه، ClickHouse یک راه حل قدرتمند برای مشاغلی که به دنبال تجزیه و تحلیل با سرعت بالا و مقیاس بزرگ هستند، ارائه می دهد. با ذخیره‌سازی ستونی، عملکرد جستجوی بلادرنگ، و مقیاس‌پذیری از طریق تکرار و اشتراک‌گذاری، به عنوان یک جایگزین عالی برای سازمان‌هایی که از پایگاه‌های داده مبتنی بر ردیف سنتی مانند Postgres در حال انتقال هستند، عمل می‌کند. به ویژه در صنایعی مانند تجزیه و تحلیل وب، هوش تجاری و تجزیه و تحلیل گزارش، ClickHouse نیازهای بازیابی و تجزیه و تحلیل سریع داده ها را برآورده می کند.

با این حال، در حالی که ClickHouse در عملکرد پرس و جو و مقیاس پذیری برتر است، ممکن است پیچیدگی هایی را در درج داده ها در مقایسه با پایگاه های داده سنتی ایجاد کند، و برای موارد استفاده OLTP مناسب نیست. سازمان‌هایی که قصد مهاجرت به ClickHouse را دارند، باید این مبادلات را بسنجید، به‌ویژه اگر به درج‌های بی‌درنگ یا به‌روزرسانی‌های مکرر نیاز داشته باشند. در نهایت، مقیاس‌پذیری، مقرون‌به‌صرفه بودن و پشتیبانی جامعه رو به رشد، ClickHouse را به انتخابی قانع‌کننده برای برنامه‌های مدرن مبتنی بر داده تبدیل می‌کند و نحوه مدیریت و تجزیه و تحلیل داده‌ها را متحول می‌کند.

ClickHouse به دلیل سرعت و کارایی بی نظیر خود در پردازش کلان داده ها به سرعت در حال جلب توجه است. به عنوان مثال، Cloudflare از ClickHouse برای پردازش میلیون‌ها ردیف در ثانیه استفاده می‌کند و مصرف حافظه را تا چهار برابر کاهش می‌دهد و آن را به یک بازیکن کلیدی در تجزیه و تحلیل‌های مقیاس بزرگ تبدیل می‌کند. ClickHouse با ویژگی‌های پیشرفته و عملکرد پرس و جو در زمان واقعی خود به یک انتخاب برای شرکت‌هایی تبدیل می‌شود که مجموعه‌های داده عظیم را مدیریت می‌کنند.
در این مقاله، دلیل محبوبیت فزاینده ClickHouse برای تجزیه و تحلیل، ویژگی‌های کلیدی آن و نحوه استقرار آن در Kubernetes را بررسی خواهیم کرد. ما همچنین برخی از بهترین روش‌ها را برای مقیاس‌پذیری ClickHouse برای مدیریت بارهای کاری رو به رشد و به حداکثر رساندن عملکرد پوشش خواهیم داد.

مقدمه

ClickHouse یک سیستم مدیریت پایگاه داده SQL ستون محور (DBMS) با کارایی بالا است که برای پردازش تحلیلی آنلاین (OLAP) طراحی شده است و در مدیریت مجموعه داده های بزرگ با سرعت قابل توجهی، به ویژه برای فیلتر کردن و جمع آوری داده ها عالی است. با استفاده از ذخیره‌سازی ستونی، دسترسی سریع به داده‌ها و فشرده‌سازی کارآمد را ممکن می‌سازد، و برای صنایعی که نیاز به بازیابی و تجزیه و تحلیل سریع داده‌ها دارند، ایده‌آل است. موارد استفاده متداول آن عبارتند از تجزیه و تحلیل وب، که در آن حجم وسیعی از داده های ردیابی را پردازش می کند، هوش تجاری برای تقویت تصمیم گیری با سرعت بالا، و تجزیه و تحلیل گزارش برای نظارت و عیب یابی در مقیاس بزرگ.

ویژگی های کلیدی Clickhouse:

  • ذخیره سازی ستونی: دسترسی سریع به داده ها و فشرده سازی کارآمد را فعال می کند و سرعت جستجوهای تحلیلی و فشرده سازی کارآمد را افزایش می دهد.
  • کارایی و مقیاس پذیری بالا: بهینه شده برای مدیریت مجموعه داده های عظیم و پرس و جوهای پیچیده با موتورهای جدول منحصر به فرد که نحوه ذخیره داده ها را تعیین می کند.
  • تجزیه و تحلیل زمان واقعی: از پردازش و تجزیه و تحلیل داده ها در زمان واقعی پشتیبانی می کند.
  • به حداکثر رساندن استفاده از سخت افزار: ClickHouse برای استفاده مؤثر از تمام منابع موجود سیستم طراحی شده است.
  • عملکرد غنی: طیف گسترده ای از توابع داخلی را ارائه می دهد که دستکاری و تجزیه و تحلیل داده ها را افزایش می دهد. ### چگونه کلیک هاوس کار می کند؟

ClickHouse برای سرعت و مقیاس‌پذیری طراحی شده است و آن را برای مدیریت حجم وسیعی از داده‌ها ایده‌آل می‌سازد. ماهیت توزیع شده آن امکان تکثیر داده ها را در چندین گره فراهم می کند و هم تحمل خطا و هم در دسترس بودن بالا را تضمین می کند.

معماری

ClickHouse بر روی یک معماری توزیع شده عمل می کند که در آن داده ها در سراسر گره ها تقسیم و تکثیر می شوند. الف را به کار می گیرد معماری هیچ چیز مشترک، حرکت به سمت یک مدل محاسباتی و ذخیره سازی جدا شده، تسهیل اجرای موازی و برداری.

توضیحات تصویر

نمونه ای از Shared Nothing ClickHouse Cluster با 3 سرور مشابه

مکانیسم ذخیره سازی

ClickHouse از فضای ذخیره‌سازی ستونی استفاده می‌كند كه به آن اجازه می‌دهد تا حجم زیادی از داده‌ها را به سرعت بخواند و فشرده كند. سازمان‌هایی که از سیستم‌های مبتنی بر ردیف مانند Postgres مهاجرت می‌کنند، می‌توانند از نظر عملکرد سود قابل توجهی داشته باشند.
جداول از منحصر به فرد استفاده می کنند موتورهای رومیزی– به ویژه خانواده موتور MergeTree – برای ذخیره داده ها به طور موثر، با استفاده از نقاط قوت ClickHouse در پردازش تحلیلی.

اجرای پرس و جو

ClickHouse از یک موتور جستجوی منحصربه‌فرد بهینه‌سازی شده برای بازیابی داده‌ها با سرعت بالا استفاده می‌کند و از دستورالعمل‌های Single Instruction، Multiple Data (SIMD) برای پردازش چندین نقطه داده به طور همزمان استفاده می‌کند. این پردازش موازی به طور قابل توجهی عملکرد را به خصوص برای پرس و جوهای پیچیده افزایش می دهد. همانطور که در فیلم A Day in the Life of a Query نشان داده شده است، ClickHouse به طور موثر پرس و جوها را تجزیه و اجرا می کند و به جای بازیابی صرفاً داده های خام، بر پاسخ به سؤالات خاص تمرکز می کند.
برای درک بیشتر اجرای پرس و جو، می توانیم از EXPLAIN بند این EXPLAIN بند در SQL برای نمایش طرح اجرای یک پرس و جو استفاده می شود. هنگامی که یک پرس و جو را با EXPLAIN، پایگاه داده در واقع پرس و جو را اجرا نمی کند. در عوض، تفکیک دقیقی از نحوه اجرای پرس و جو، از جمله مراحلی که بهینه ساز پرس و جو انجام خواهد داد را نشان می دهد.

برای ClickHouse مراحل اجرای پرس و جو به صورت زیر است:

توضیحات تصویر

منبع: درون نگری عملکرد بند توضیح

توضیح طرح: طرح پرس و جو مراحلی را که باید برای پرس و جو اجرا شود به صورت کلی نشان می دهد، اما طرح پرس و جو نشان نمی دهد که چگونه ClickHouse با استفاده از منابع موجود در دستگاه، پرس و جو را اجرا می کند، برای بررسی اینکه به چه ترتیبی عبارت ها را بررسی می کند مفید است. در حال اجرا هستند، طرح را از پایین به بالا بخوانید.

برای اهداف نمایشی، از مجموعه داده‌های قیمت املاک بریتانیا استفاده خواهیم کرد.

EXPLAIN PLAN indexes = 1 
SELECT
    postcode1,
    type,
    COUNT(*) AS property_count,
    AVG(price) AS avg_price
FROM
    uk_price_paid
WHERE
    is_new = 1  
    AND date >= '2023-01-01'
GROUP BY
    postcode1, type
ORDER BY
    avg_price DESC;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای پرس و جو بالا، خروجی را به صورت زیر دریافت می کنیم:

Expression (Project names)
Limit (preliminary LIMIT (without OFFSET))
Sorting (Sorting for ORDER BY)
Expression ((Before ORDER BY + Projection))
Aggregating
Expression (Before GROUP BY)
Expression
ReadFromMergeTree (default.uk_price_paid)

Indexes:
    PrimaryKey
    Condition: true
    Parts: 1/1
    Granules: 3598/3598
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در تجزیه و تحلیل طرح اجرای پرس و جو، تفسیر مراحل از پایین به بالا (در این مورد از ReadMergeTree تا Limit) ضروری است، زیرا هر لایه نشان دهنده یک عملیات متوالی انجام شده روی داده است.

AST را توضیح دهید: با این بند، می‌توانیم درخت نحو انتزاعی را کاوش کنیم، همچنین می‌توانیم آن را از طریق Graphviz تجسم کنیم.

برای پرس و جو:

EXPLAIN AST graph = 1
SELECT
    postcode1,
    type,
    COUNT(*) AS property_count,
    AVG(price) AS avg_price
FROM
    uk_price_paid
WHERE
    is_new = 1  
    AND date >= '2023-01-01'
GROUP BY
    postcode1, type
ORDER BY
    avg_price DESC;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درخت نحو انتزاعی را به صورت زیر دریافت می کنیم:

توضیحات تصویر

PIPELINE را توضیح دهید: بررسی درونی خط لوله پرس و جو می تواند به شما کمک کند بطری های پرس و جو را شناسایی کنید.

برای پرس و جو:

EXPLAIN PIPELINE graph = 1
SELECT
    postcode1,
    type,
    COUNT(*) AS property_count,
    AVG(price) AS avg_price
FROM
    uk_price_paid
WHERE
    is_new = 1  
    AND date >= '2023-01-01'
GROUP BY
    postcode1, type
ORDER BY
    avg_price DESC;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی را به صورت زیر دریافت می کنیم:

توضیحات تصویر

ClickHouse به طور طبیعی پرس و جوها را موازی می کند و هر مرحله به طور پیش فرض از چندین رشته استفاده می کند. در این مثال، مراحل توسط 4 رشته مدیریت می شوند، به این معنی که هر رشته تقریباً یک چهارم داده ها را قبل از ترکیب نتایج به صورت موازی پردازش می کند. این رویکرد سرعت اجرا را به میزان قابل توجهی افزایش می دهد.
به عنوان مثال، شناسایی مراحلی که در الف اجرا می شوند تک رشته کلید بهینه سازی پرس و جوهای کند است. با جداسازی این تنگناها، می‌توانیم بخش‌های خاصی از پرس و جو را برای بهبود عملکرد هدف‌گیری کنیم و به طور کلی از اجرای سریع‌تر و کارآمدتر اطمینان حاصل کنیم.

قابلیت های یکپارچه سازی

ClickHouse با طیف وسیعی از ابزارهای داده، از جمله فرآیندهای ETL/ELT و ابزارهای BI مانند Apache Superset سازگاری بالایی دارد. این تقریباً از همه فرمت‌های داده رایج پشتیبانی می‌کند و یکپارچگی را در بین اکوسیستم‌های مختلف یکپارچه می‌کند.

چرا کلیک هاوس و مهاجرت را انتخاب کنیم؟

انتخاب ClickHouse مزایای قابل توجهی را ارائه می دهد، به ویژه برای سازمان هایی که با تجزیه و تحلیل داده ها در مقیاس بزرگ سر و کار دارند. ترکیب منحصر به فرد آن از عملکرد، مقرون به صرفه بودن و پشتیبانی جامعه، آن را به انتخابی قانع کننده برای مهاجرت از پایگاه های داده سنتی تبدیل می کند.

مزایای عملکرد

ClickHouse برای بهینه سازی شده است OLAP بارهای کاری، ارائه سرعت استثنایی هم در جذب داده و هم در اجرای پرس و جو، ارائه عملکرد پرس و جوی فرعی حتی در هنگام پردازش میلیاردها ردیف. این باعث می شود آن را برای تجزیه و تحلیل زمان واقعی و تصمیم گیری در صنایع داده فشرده ایده آل کند.
این کلید اصلی در ClickHouse نقش مهمی در تعیین نحوه ذخیره و جستجوی داده ها دارد. مهم است که ستون‌هایی را انتخاب کنید که اغلب پرس و جو می‌شوند، زیرا کلید اصلی باید اجرای پرس و جو را بهینه کند، به ویژه برای WHERE بند در ClickHouse، کلید اصلی برای هر ردیف منحصر به فرد نیست.

داستان های موفقیت در دنیای واقعی

بسیاری از سازمان ها با موفقیت به ClickHouse مهاجرت کرده اند و به بهبودهای قابل توجهی در عملکرد و صرفه جویی در هزینه دست یافته اند. از غول‌های تجارت الکترونیک گرفته تا شرکت‌های مالی، داستان‌های موفقیت بر توانایی ClickHouse در تبدیل قابلیت‌های تجزیه و تحلیل داده‌ها در مقیاس برجسته است. برای جزئیات بیشتر، به Appopters ClickHouse مراجعه کنید.

اجرای ClickHouse در Kubernetes

در این راهنما، فرآیند اجرای ClickHouse در خوشه Kubernetes را در 7 مرحله مرور خواهیم کرد:

مرحله 1: Kubectl را نصب کنید

ابتدا باید نصب کنیم kubectl، ابزار خط فرمان برای تعامل با خوشه های Kubernetes. دستورات زیر را در ترمینال خود اجرا کنید:

sudo apt-get update
sudo apt-get install -y kubectl
# Download Minikube
# Please check your OS configuration and download from:
# https://minikube.sigs.k8s.io/docs/start/?arch=%2Flinux%2Fx86-64%2Fstable%2Fbinary+download
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube version
minikube start
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مرحله، Kubernetes را به صورت محلی راه اندازی کرده اید.

مرحله 2: Altinity ClickHouse Operator را نصب کنید

در مرحله بعد، اپراتور Altinity ClickHouse را برای مدیریت استقرار ClickHouse خود دانلود و نصب می کنیم:


kubectl apply -f https://raw.githubusercontent.com/Altinity/clickhouse-operator/master/deploy/operator/clickhouse-operator-install-bundle.yaml

kubectl get pods -n kube-system

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما باید پاد عملگر ClickHouse را در حال اجرا ببینید که نشان می دهد اپراتور با موفقیت مستقر شده است.

مرحله 3: پایگاه داده ClickHouse را نصب کنید

حالا باید خود پایگاه داده ClickHouse را نصب کنیم. این مراحل را دنبال کنید:

یک مثال پیکربندی اولیه برای نسخه ی نمایشی ما:


apiVersion: "clickhouse.altinity.com/v1"
kind: "ClickHouseInstallation"
metadata:
  name: my-clickhouse
  namespace: test-clickhouse-operator
spec:
  configuration:
    clusters:
      - name: cluster
        layout:
          shardsCount: 1
          replicasCount: 1
  templates:
    podTemplates:
      - name: clickhouse-pod-template
        spec:
          containers:
            - name: clickhouse
              image: clickhouse/clickhouse-server:latest
              resources:
                requests:
                  cpu: "100m"
                  memory: "1Gi"
                limits:
                  cpu: "1"
                  memory: "2Gi"
  defaults:
    templates:
      podTemplate: clickhouse-pod-template
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. اکنون پیکربندی را اعمال کنید و وضعیت پادها و سرویس ها را بررسی کنید:
cat clickhouse-install.yaml | kubectl apply -f -
kubectl get pods -n test-clickhouse-operator
kubectl get services -n test-clickhouse-operator
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

باید ببینید که سرویس‌ها همانطور که در پیکربندی نصب شما تعریف شده‌اند اجرا می‌شوند.

مرحله 4: به پایگاه داده ClickHouse متصل شوید

برای تعامل با پایگاه داده ClickHouse، باید مشتری ClickHouse را روی ماشین محلی خود نصب کنیم. اگر از سیستم عامل دیگری استفاده می کنید، به راهنمای نصب رسمی ClickHouse مراجعه کنید.

برای نصب ClickHouse دستورات زیر را اجرا کنید:

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
sudo clickhouse start

kubectl -n test-clickhouse-operator port-forward  9000:9000 &

clickhouse-client
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 5: خدمات خود را آزمایش کنید

برای اطمینان از اینکه همه چیز به درستی اجرا می شود، دستورات زیر را اجرا کنید:

kubectl get pods -n test-clickhouse-operator
kubectl get services -n test-clickhouse-operator
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 6: کوئری ها را اجرا کنید

حال، بیایید یک جدول ایجاد کنیم و چند پرس و جو را در ClickHouse اجرا کنیم:

clickhouse-client
CREATE TABLE test_table (
    id UInt32,
    name String
) ENGINE = MergeTree()
ORDER BY id;

INSERT INTO test_table VALUES (1, 'CloudRaft'), (2, 'ClickHouse');
SELECT * FROM test_table;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما باید نتایج را در CLI با مسیر تغییر یافته ببینید، که نشان می دهد شما مستقیماً با خوشه ClickHouse در تعامل هستید.

مرحله 7: تست بار

برای ارزیابی بیشتر عملکرد نصب ClickHouse خود، استفاده از ابزارهای تست بار مانند Apache JMeter یا k6 را برای شبیه سازی بارهای جستجوی افزایش یافته در نظر بگیرید. با اضافه کردن گره های بیشتری به خوشه، زمان های پاسخ پرس و جو را اندازه گیری کنید.

تفاوت های کلیدی بین PostgreSQL و ClickHouse

در حالی که هر دو Postgres و ClickHouse اهداف متفاوتی دارند، تمایز کلیدی در نحوه مدیریت آنها نهفته است. همانند سازی و خرد کردن. Postgres اساساً برای بارهای کاری تراکنشی (OLTP) طراحی شده است، جایی که ثبات و دوام داده در اولویت قرار دارد. از سوی دیگر، ClickHouse برای بارهای کاری تحلیلی (OLAP) و برای پرس و جوی پرسرعت و تجزیه و تحلیل داده در مقیاس بزرگ بهینه شده است.

نماهای مادی شده

در ClickHouse، Materialized Views یک ویژگی قدرتمند است که برای بهبود عملکرد پرس و جو با از پیش جمع آوری و ذخیره داده ها طراحی شده است. بر خلاف نماهای معمولی که در حین اجرای پرس و جو محاسبه می شوند، نماهای واقعی نتایج یک پرس و جو را به صورت فیزیکی ذخیره می کنند و امکان خواندن سریعتر را فراهم می کنند. این نماها همچنین می‌توانند از قابلیت‌های فشرده‌سازی کارآمد و دسترسی سریع مدل ذخیره‌سازی ستونی استفاده کنند و عملکرد را بیشتر افزایش دهند.

نماهای مادی به ویژه در محیط هایی که عملکرد پرس و جو حیاتی است مفید هستند، زیرا نتایج از پیش محاسبه شده ای را ارائه می دهند که در زمان اجرا صرفه جویی می کند.
نماهای Materialized Postgres باید به صورت دستی دوباره به روز شوند، در حالی که ClickHouse به طور خودکار آنها را با فلسفه درج و بهینه سازی بعد به روز می کند.

مقیاس گذاری ClickHouse

در ClickHouse می توان از طریق مقیاس گذاری به دست آورد همانند سازی و خرد کردن مکانیسم ها اینها به توزیع داده ها و پرس و جوها در چندین گره برای عملکرد و تحمل خطا کمک می کنند.

ClickHouse به طور سنتی به آن متکی است باغ وحش، یک سرویس متمرکز برای هماهنگی سیستم های توزیع شده. ZooKeeper با حفظ ابرداده، مدیریت قفل‌ها و مدیریت خرابی‌ها، اطمینان می‌دهد که کپی‌های داده در سراسر گره‌ها همگام هستند. این به عنوان یک جزء کلیدی برای ثابت نگه داشتن حالت خوشه عمل می کند و اطمینان می دهد که ماکت ها از هم جدا نمی شوند و عملیات خواندن و نوشتن به درستی توزیع می شوند.

همانند سازی

Replication تضمین می‌کند که کپی‌هایی از همان داده‌ها در چندین گره ذخیره می‌شوند تا افزونگی ایجاد کنند و تحمل خطا را بهبود بخشند. Replication در ClickHouse در سطح جدول است.

  • ReplicatedMergeTree موتوری است که برای جداول تکراری استفاده می شود.
  • هر جدول دارای یک ماکت در چندین سرور است و این رونوشت ها با هم هماهنگ نگه داشته می شوند.
  • Clickhouse-Keeper هماهنگی بین این کپی‌ها را مدیریت می‌کند و با مدیریت قفل‌ها، تراکنش‌ها و ابرداده‌های مرتبط با تکرار، از ثبات اطمینان حاصل می‌کند.
  • در صورتی که یک ماکت پایین بیاید، سیستم همچنان می‌تواند از کپی‌های موجود بخواند و بنویسد.

مثال فرآیند تکرار:

  • بیایید فرض کنیم دو کپی وجود دارد، A و B. یک نوشتن در Replica A ثبت می شود و به Replica B تکرار می شود، با اطمینان از اینکه هر دو دارای داده های یکسان هستند. این به صورت ناهمزمان اتفاق می افتد تا از مشکلات تاخیر جلوگیری شود. ### Sharding Sharding در Clickhouse فرآیند تقسیم افقی داده ها به بخش های کوچکتر و توزیع آن در سرورهای مختلف (شاردها) است. این به Clickhouse اجازه می دهد تا با توزیع بار، مجموعه داده های بسیار بزرگی را مدیریت کند.
  • جدول توزیع شده: Clickhouse از یک جدول توزیع شده برای دستیابی به اشتراک گذاری استفاده می کند. جدول توزیع شده یک جدول منطقی است که در بالای جداول محلی قرار می گیرد (در گره های مختلف تقسیم شده است) و به عنوان یک مسیریاب پرس و جو عمل می کند.
  • هنگامی که یک پرس و جو بر روی یک جدول توزیع شده اجرا می شود، به طور خودکار به قطعه (های) مربوطه بر روی کلید اشتراک گذاری هدایت می شود.

مثال فرآیند شاردینگ:

  • فرض کنید شما 3 گره دارید (گره 1، نود 2، نود 3) و داده ها توسط یک کلید مانند شناسه کاربری تقسیم می شوند. یک جدول توزیع شده داده ها را بر اساس شناسه کاربر تقسیم می کند و داده های کاربران مختلف را در گره های مختلف ذخیره می کند. درخواست‌های مربوط به داده‌های خاص کاربر مستقیماً به قسمتی که داده‌های آن کاربر را نگه می‌دارد هدایت می‌شود و عملکرد را بهبود می‌بخشد.

نتیجه گیری

در نتیجه، ClickHouse یک راه حل قدرتمند برای مشاغلی که به دنبال تجزیه و تحلیل با سرعت بالا و مقیاس بزرگ هستند، ارائه می دهد. با ذخیره‌سازی ستونی، عملکرد جستجوی بلادرنگ، و مقیاس‌پذیری از طریق تکرار و اشتراک‌گذاری، به عنوان یک جایگزین عالی برای سازمان‌هایی که از پایگاه‌های داده مبتنی بر ردیف سنتی مانند Postgres در حال انتقال هستند، عمل می‌کند. به ویژه در صنایعی مانند تجزیه و تحلیل وب، هوش تجاری و تجزیه و تحلیل گزارش، ClickHouse نیازهای بازیابی و تجزیه و تحلیل سریع داده ها را برآورده می کند.

با این حال، در حالی که ClickHouse در عملکرد پرس و جو و مقیاس پذیری برتر است، ممکن است پیچیدگی هایی را در درج داده ها در مقایسه با پایگاه های داده سنتی ایجاد کند، و برای موارد استفاده OLTP مناسب نیست. سازمان‌هایی که قصد مهاجرت به ClickHouse را دارند، باید این مبادلات را بسنجید، به‌ویژه اگر به درج‌های بی‌درنگ یا به‌روزرسانی‌های مکرر نیاز داشته باشند. در نهایت، مقیاس‌پذیری، مقرون‌به‌صرفه بودن و پشتیبانی جامعه رو به رشد، ClickHouse را به انتخابی قانع‌کننده برای برنامه‌های مدرن مبتنی بر داده تبدیل می‌کند و نحوه مدیریت و تجزیه و تحلیل داده‌ها را متحول می‌کند.


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

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

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

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