Инженер на минималках: установка и настройка ClickHouse

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Базы данных — один из важнейших инструментов в арсенале аналитика. А ClickHouse — это высокопроизводительная аналитическая СУБД, которая заточена на то, чтобы переваривать огромные массивы данных. Поэтому полезно будет разобраться, как самостоятельно установить ClickHouse в Yandex Cloud или на VDS-сервере, как создать пользователей и активировать веб-интерфейс и доступ по сети. Этим и займемся в статье.

Дисклеймер: Я Женя Кузнецов, увлеченный диджитал-стратег, который любит копаться в данных и визуализировать их. Но я не инженер данных, поэтому могу вольно интерпретировать некоторые понятия — хотя факты стараюсь проверять.

Зачем мне впервые понадобилась база данных?

Дело в том, как устроена Яндекс Метрика и коннекторы к ней из Yandex DataLens.

В Logs API Яндекс Метрики данные о достижении целей собраны в несколько массивов:

  • ym:s:goalsID — номера целей, достигнутых за данный визит;

  • ym:s:goalsSerialNumber — порядковые номера достижений цели с конкретным идентификатором;

  • ym:s:goalsDateTime — время достижения каждой цели (в часовом поясе UTC+3).

А в коннекторе DataLens к Яндекс Метрике доступны только:

  • общее количество достижений любой цели,

  • конверсия в достижение любой цели,

  • текстовое поле с названием достигнутой цели.

И если при построении чарта сделать фильтрацию по этому тексту (т. е. попытаться вывести количество достижений цели и отфильтровать их по названию достигнутой цели) — то данные с метрикой разойдутся, причем значительно.

Также не получится посчитать и производные метрики вроде конверсии. Данные по отдельным целям доступны только в Logs Api Яндекс Метрики.

Есть лайфхак, как обойти это, не выгружая данные, но он работает, только если нужно отслеживать какую-то одну макроконверсию. Об этом я расскажу в отдельном материале.

Почему ClickHouse?

ClickHouse — это высокопроизводительная аналитическая система управления базами данных (СУБД) с открытым исходным кодом. Яндекс разработал ее для решения задач веб-аналитики в Яндекс Метрике.

Что важно, на мой взгляд:

  • система быстрая и заточена под работу с большими массивами данных,

  • используется в крупных продуктовых командах, поэтому уметь в ней работать — плюс к резюме,

  • она опенсорсная.

К тому же ClickHouse использует собственный диалект SQL, близкий к стандартному, но содержащий различные расширения: массивы и вложенные структуры данных, функции высшего порядка, вероятностные структуры, функции для работы с URI.

Подробнее про особенности ClickHouse можно почитать в официальной документации.

Итак, есть проблема, мы выбрали инструмент. Осталось только разобраться, как им пользоваться. И тут нам доступны варианты:

  1. Простой: развернуть ClickHouse в Yandex Cloud. За простоту придется платить, причем около 5 тысяч рублей в месяц в минимальной конфигурации. Но зато все можно сделать в простом и наглядном веб-интерфейсе.

  2. Продвинутый: развернуть ClickHouse на собственной виртуальной машине (VDS).

Мне в работе нужно обращаться к базе извне, поэтому вариант, как развернуть ClickHouse локально, я не рассматриваю.

ClickHouse в облаке

Кратко процедура создания ClickHouse в облаке описана в кейсе «Веб-аналитика с расчетом воронок и когорт на данных Яндекс Метрики», но там не хватает скриншотов — поэтому кратко пробегусь по процессу настройки.

1. Переходим в Managed Service for ClickHouse и выбираем «Создать кластер ClickHouse».

2. Выбираем конфигурацию сервера. Под простенькие задачи хватит и минимальной.

3. Важно сделать кластер публичным — в блоке «Хосты» нажимаем на карандаш и включаем опцию «Публичный доступ».

4. В блоке «Настройки СУБД» можно выключить управление пользователями через SQL, указать имя пользователя, пароль и имя базы данных.

5. В блоке «Сервисные настройки» нужно включить опции: «Доступ из DataLens», «Доступ из консоли управления», «Доступ из Метрики и AppMetrica», «Доступ из Serverless».

В течение нескольких минут кластер ClickHouse будет создан.

ClickHouse на своем сервере

Этот путь делится на два шага: покупку VDS и собственно установку ClickHouse.

Покупка VDS

1. Для покупки виртуальной машины нужно определиться с хостингом — я выбрал NetAngels. 

Обратите внимание на минимальные требования из документации — не менее 4 ГБ оперативной памяти. Я пробовал запускать на 2 ГБ — машина зависала во время выполнения даже несложных SQL-запросов.

2. После выбора через нескольких минут создастся виртуальная машина, а на почту придут реквизиты для доступа по SSH. Я выбрал сборку от NetAngels на базе Debian 11.

3. Переходим в терминал и выполняем все шаги установки.

Я не заморачивался и сделал всё в веб-версии.

Установка ClickHouse

1. Устанавливаем или проверяем, установлены ли следующие пакеты:

  • apt-transport-https — для возможности взаимодействовать с репозиториями по https;

  • ca-certificates — набор корневых сертификатов;

  • dirmngr — для управления сетевыми сертификатами.

sudo apt-get install -y apt-transport-https ca-certificates dirmngr

В моем случае пакеты уже установлены.

2. Настраиваем ключи.

GNUPGHOME=$(mktemp -d)

sudo GNUPGHOME="$GNUPGHOME" gpg --no-default-keyring --keyring /usr/share/keyrings/clickhouse-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 8919F6BD2B48D754

sudo rm -rf "$GNUPGHOME"

sudo chmod +r /usr/share/keyrings/clickhouse-keyring.gpg

3. Указываем репозиторий.

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

4. Обновляем кэш.

sudo apt-get update

5. Запускаем установку сервера и клиента. Тут возможны разные варианты.

  • Быстрая установка без лишних вопросов (команда -y говорит отвечать YES во всех вопросах). Для пользователя default не будет установлен пароль, но, с другой стороны, мы скоро его деактивируем.

sudo apt-get install -y clickhouse-server clickhouse-client

  • Установка без пропуска вопросов — нам будет предложено задать пароль для пользователя default.

sudo apt-get install clickhouse-server clickhouse-client

  • Также мы можем задать специфическую версию при установке. Первый раз я ставил именно так, поскольку без принудительного указания ставились достаточно старые версии (что-то из серии 19.1.*)

sudo apt-get install clickhouse-server=24.1.5.6 clickhouse-client=24.1.5.6 clickhouse-common-static=24.1.5.6

Список всех версий можно найти на GitHub.

Все, ClickHouse установлен!

Подробная справка по установке — в официальной документации ClickHouse.

Запуск сервера и авторизация

Тут же нам подсказывают две основные команды — для запуска сервера и для подключения как пользователь default.

1. Запускаем сервер.

sudo clickhouse start

2. Авторизуемся как пользователь default (понадобится заданный ранее пароль).

clickhouse-client

3. Выполняем SQL-запрос, чтобы убедиться, что все работает.

SELECT 1

Конфигурация сервера

Файлы конфигурации в формате .xml лежат в папке /etc/clickhouse-server/. Причем можно либо напрямую править основной файл конфигурации, либо создать подпапку config.d по адресу etc/clickhouse-server/config.d/ и в нее положить свой файл конфигурации. Эти файлы будут объединены до того, как конфигурация вступит в силу.

Важно не забывать, что после изменения настроек нужно перезапускать сервер. Для этого могут быть использованы команды:

# Перезагрузка конфигурации сервера

sudo service clickhouse-server reload

# Полная перезагрузка сервера

sudo service clickhouse-server restart

Подробнее о конфигурации — в официальной справке.

Создание пользователей

Теперь наша задача создать пользователей, из-под которых мы будем выполнять все SQL-запросы. Для этого нужно пройти несколько шагов.

1. Включаем SQL User Mode для пользователя Default. Когда мы задали пароль при установке — в папке users.d создался файл default-password.xml с паролем пользователя. Необходимо добавить в него команды:

<clickhouse>

   <users>

       <default>

       <password remove='1' />

       <password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>

              

       <access_management>1</access_management>

       <named_collection_control>1</named_collection_control>

       <show_named_collections>1</show_named_collections>

       <show_named_collections_secrets>1</show_named_collections_secrets>

   </default>

   </users>

</clickhouse>

2. Перезапускаем сервер, чтобы настройки применились.

sudo service clickhouse-server restart

Создание администратора для базы данных

1.  Входим как пользователь default, чтобы создать администратора для базы данных, который сможет создавать базы, таблицы и пользователей, а также выдавать доступы.

CREATE USER clickhouse_admin IDENTIFIED BY 'qwerty';

2. Выдаем этому пользователю права на все базы и таблицы.

GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION;

Подробнее про SQL-пользователей и роли — в справке ClickHouse.

Проверка администратора и создание базы данных

1. Перезайдем под новым пользователем и проверим, что все работает.

clickhouse-client --user clickhouse_admin --password qwerty

2. Создадим базу данных и пользователя для нее.

CREATE DATABASE test_database;

Создадим таблицу.

CREATE TABLE test_database.test_table (

   id UInt64,

   column1 String,

   column2 String

)

ENGINE MergeTree

ORDER BY id;

3. Заполним таблицу данными.

INSERT INTO test_database.test_table

   (id, column1, column2)

VALUES

   (1, 'A', 'abc'),

   (2, 'A', 'def'),

   (3, 'B', 'abc'),

   (4, 'B', 'def');

4. Посмотрим содержимое таблицы.

SELECT *

FROM test_database.test_table

Создание и проверка пользователя

1. Создадим отдельного пользователя с правами только к созданной базе.

CREATE USER clickhouse_user IDENTIFIED BY 'password';

GRANT ALL ON test_database.* TO clickhouse_user WITH GRANT OPTION;

Подробнее про выдачу прав пользователям — в справке ClickHouse.

2. Проверим пользователя. Для этого сначала авторизуемся.

clickhouse-client --user clickhouse_user --password password

А затем выполним запрос к нашей базе.

SELECT *

FROM test_database.test_table

На этом мы закончили с созданием пользователей:

  • создали админа, из-под которого мы можем создавать пользователей и базы данных,

  • создали пользователя с доступом только к созданной базе test_database.

Отключение SQL User Mode и ограничение прав пользователя default

Чтобы отозвать права на управление у пользователя default, изменим настройки в файле default-password.xml.

<clickhouse>

   <users>

       <default>

           <password remove='1' />

           <password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>

           <profile>readonly</profile>

           <access_management>0</access_management>

           <!--

           <named_collection_control>1</named_collection_control>

           <show_named_collections>1</show_named_collections>

           <show_named_collections_secrets>1</show_named_collections_secrets>

           -->

       </default>

   </users>

</clickhouse>

Справка по управлению доступом в ClickHouse.

Также мы можем полностью отключить пользователя default. Для этого достаточно скорректировать открывающий тег.

<default remove="remove">

</default>

Активация возможности подключаться по сети

По умолчанию ClickHouse слушает запросы на локальной петле и не принимает запросов по сети. Для решения задачи нам нужно разрешить обработку сетевых запросов.

1. В папке etc/clickhouse-server/config.d/ создадим файл default-config.xml и добавим в него следующие строки.

<clickhouse>

   <listen_host>::</listen_host>

</clickhouse>

2. Перезагрузим сервер.

sudo service clickhouse-server restart

Теперь ClickHouse доступен по IP-адресу сервера через порт 8123. Безопасное соединение через https я не настраивал.

В моем случае это:

http://213.189.220.34:8123/

Активация веб-интерфейса Tabix

Если мы хотим иметь веб-интерфейс по адресу нашего сервера, необходимо активировать Tabix (опенсорсный визуальный интерфейс для ClickHouse).

1. Скорректируем наш файл конфигурации default-config.xml.

<clickhouse>

   <listen_host>::</listen_host>

   <http_server_default_response><![CDATA[<html ng-app="SMI2"><head><base href="http://ui.tabix.io/"></head><body><div ui-view="" class="content-ui"></div><script src="http://loader.tabix.io/master.js"></script></body></html>]]></http_server_default_response>

</clickhouse>

2. Перезапустим сервер.

sudo service clickhouse-server restart

Теперь веб-интерфейс доступен по ссылке — осталось только ввести логин и пароль.

Авторизация пользователя в Tabix

При попытке авторизоваться как пользователь я столкнулся с ошибкой в консоли разработчика — Tabix ругался на права к таблице system.dictionaries.

Code: 497. DB::Exception: clickhouse_user: Not enough privileges. To execute this query, it's necessary to have the grant SELECT(name, `attribute.names`, `attribute.types`, key) ON system.dictionaries. (ACCESS_DENIED) (version 24.1.5.6 (official build))

Для решения этой ошибки надо зайти под админом и выдать пользователю права на соответствующую таблицу.

GRANT SELECT ON system.dictionaries TO clickhouse_user WITH GRANT OPTION;

После авторизации можно полноценно пользоваться базой данных.

Подключение к серверу

Проверим подключение с помощью Python. Для этого импортируем библиотеку clickhouse_connect.

import clickhouse_connect

Укажем реквизиты сервера, попробуем подключиться и узнать версию базы данных.

client = clickhouse_connect.get_client(

   host='213.189.220.34',

   port=8123,

   username='clickhouse_user',

   password='password'

)

client.server_version

Подробнее про clickhouse_connect — в официальной справке ClickHouse.

Вместо заключения

Мы используем ClickHouse в своем стеке технологий, чтобы:

— строить дашборды на данных Метрики, рекламных систем и CRM (для нас и для заказчиков),

— визуализировать спрос (про это читайте другую мою статью DIY-маркетинг: как проанализировать спрос на рынке с помощью KeyCollector, Python и DataLens),

— собирать SEO-дашборды на данных API панелей вебмастеров,

— исследовать модели атрибуции (строить отчет в разных срезах).

В общем, если хотите работать с данными, нужна база, в которой можно их собирать, хранить и исследовать. Не всегда под рукой есть девопс, который все сам сделает. Не всегда есть 5 тысяч в месяц на базу в Яндекс Облаке, чтобы все было в визуальном интерфейсе и без сложностей. Поэтому стоит научиться разворачивать базу для себя.

Причем ClickHouse — не единственный вариант, есть куча других БД, которые можно использовать. Но именно ClickHouse справляется даже с огромными массивами данных о крупных продуктах, так что опыт работы с ним будет очень полезен.

Если после прочтения моей статьи вам захотелось узнать больше подробностей о том, как развернуть ClickHouse для своих нужд, — вы можете пройти мини-курсы Яндекса:

  • Витрина данных для веб‑аналитики в ClickHouse®,

  • Managed Service for ClickHouse®.

Источник: https://habr.com/ru/articles/801757/


Интересные статьи

Интересные статьи

По умолчанию компонент ScrollView в SwiftUI позволяет своему содержимому заполнять все доступное пространство, а индикаторы прокрутки аккуратно располагаются на краю экрана. Однако с помощью модификат...
В предыдущей статье мы остановились на особенностях производства и сборки в цехах Commodore. Сегодня предлагаем вам продолжить знакомство с историей легендарного компьютера, рассказанной инженерами то...
Подробное руководство по установке системы мониторинга Zabbix версии 5.4-1 на Ubuntu Server Версии 20.04
Стажёрскую программу в Southbridge мы запустили три с половиной месяца назад, чтобы найти новых коллег и поделиться знаниями и опытом с теми, кому интересно развиваться в DevOps-направлении. За это ...
Хочешь знать, как и откуда добывают нефть, и зачем для этого нужны математики, инженеры и программисты? Это первая часть из серии статей, представляющих собой очень быстрое обзорн...