Для хранения различных типов данных широко используются базы данных. Базы данных бывают разных типов: реляционные, объектные, объектно-ориентированные, сетевые, функциональные. Однако существует еще один тип баз данных — колоночные. В колоночных базах данных данные хранятся и обрабатываются не по строкам, а по столбцам. Благодаря этой особенности данные быстро обрабатываются и масштабируются. Высокопроизводительная обработка запросов в ClickHouse делает ее идеальным выбором для работы с большими объемами и оперативной аналитикой данных.
Одной из самых известных и популярных колоночных баз данных является ClickHouse — бесплатная СУБД с открытым исходным кодом, первоначально разработанная компанией Яндекс. Впоследствии разработка перешла под контроль другой компании — ClickHouse, Inc. Благодаря высокой скорости обработки данных, ClickHouse хорошо зарекомендовала себя при работе с большими и аналитическими данными. Ознакомиться с архитектурой ClickHouse более подробно можно в документации.
В данной статье мы произведем установку СУБД ClickHouse на операционную систему Ubuntu 22.04, а также рассмотрим несколько практических примеров использования.
Для установки ClickHouse на операционную систему Ubuntu 22.04 нам понадобится:
Сервер или виртуальная машина с предустановленной ОС Ubuntu 22.04.
Чтобы арендовать облачный или выделенный сервер в Timeweb Cloud, необходимо пройти регистрацию.
Переходим по ссылке для регистрации нового пользователя. Мы выберем регистрацию на физическое лицо и заполним следующие данные:
ФИО,
адрес электронной почты,
номер телефона.
После регистрации на указанный адрес почты придет сообщение с ссылкой для активации аккаунта и входа в панель — перейдите по ней.
После того, как учетная запись была создана и активирована, можно арендовать облачный сервер.
1) Переходим на страницу авторизации и входим в аккаунт при помощи логина или адреса электронной почты и пароля или при помощи ВКонтакте, GitHub, Google.
2) После успешной авторизации отобразится панель управления текущего проекта. Переходим в раздел «Облачные серверы» и нажимаем «Создать» или «Добавить».
3) Выбираем операционную систему, которая будет установлена на сервер. В нашем случае нам необходима Ubuntu версии 22.04.
4) Выбираем регион, в котором будет находиться наш сервер. Выбирать рекомендуется тот регион, который ближе всего находится к вам физически. У каждого доступного региона справа вверху отображается ping, т.е. время, необходимое для передачи данных с вашего компьютера на сервер. Чем меньше указанное время, тем быстрее будет осуществляться передача данных.
5) Далее выбираем необходимую конфигурацию для сервера.
Так как в данной статье упор делается только на установке и на демонстрации возможностей СУБД, то выберем минимально поддерживаемую конфигурацию ClickHouse — 2 ГБ оперативной памяти, двухъядерный процессор и 40 ГБ места на жестком диске. В реальности вам необходимо выбирать именно ту конфигурацию, которая будет удовлетворять вашим потребностям при работе с ClickHouse.
Стоит отметить что для оптимальной работы с ClickHouse желательно выбирать минимум 4 ГБ оперативной памяти для выполнения нетривиальных запросов, а также выбирать оптимальное количество ядер процессора (чем больше ядер, тем лучше, но необходим минимум двухядерный процессор) и минимум 2 ГБ свободного места на жестком диске. Если не соблюдать системные требования, то запустить ClickHouse не получится, и в лог-файлах будут отображаться ошибки типа Linux threads max count is too low, Available memory at server startup is too low, Maximum number of threads is lower than 30000. Выбираем соответствующий тариф.
6) Далее необходимо решить, будет ли сервер доступен из внешний сети или же только из приватной (частной) сети.
7) По желанию можно оформить дополнительные услуги, включая резервные копии и защиту от DDoS–атак (последняя доступна в Санкт–Петербурге и Москве).
8) Также заранее можно загрузить SSH–ключ, чтобы не входить на север при помощи пароля.
9) Можно задать необходимое имя для сервера которое будет отображаться в панели управления, а также выбрать проект.
10) Для создания сервера необходимо нажать на кнопку «Заказать».
Если на вашем аккаунте недостаточно средств, то будет выведено предупреждение о необходимости пополнить баланс. После оплаты и создания сервера откроется Дашборд сервера, где можно будет найти IP–адрес, логин и пароль для подключения.
Все команды, которые будут перечислены далее в статье, необходимо выполнять от имени root
-пользователя или от имени обычного пользователя с правами sudo
.
Перед тем как приступать к установке ClickHouse, необходимо выполнить следующие требования:
1) При работе с ClickHouse в Production-окружениях необходимо выключить swap, если он используется. Сделать это можно двумя способами:
1.1) Отключить SWAP до последующей перезагрузки сервера при помощи команды:
swapoff -a
1.2) Отключить SWAP перманентно (на постоянной основе). Для этого необходимо открыть на редактирование файл /etc/fstab
при помощи любого текстового редактора и добавить перед строкой, содержащей слово swap
, символ решетки #
, чтобы получилось как на скриншоте ниже:
Сохраните изменения и выйдите из файла.
2) Заранее установить пакет tzdata
, если он отсутствует в системе. Для его установки необходимо выполнить команду:
apt update && apt -y install tzdata
cloud
Для установки ClickHouse на Ubuntu 22.04 необходимо выполнить следующие шаги.
1) Устанавливаем необходимые пакеты:
apt -y install apt-transport-https ca-certificates dirmngr
2) Импортируем GPG-ключ от официального репозитория Ubuntu с целью возможности безопасной загрузки проверенных пакетов ClickHouse:
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754
3) Создаем файл с официальным репозиторием ClickHouse:
echo "deb https://packages.clickhouse.com/deb stable main" | tee /etc/apt/sources.list.d/clickhouse.list
4) Обновляем списки пакетов и устанавливаем серверный и клиентский пакеты clickhouse
:
apt update && apt -y install clickhouse-server clickhouse-client
5) В процессе установки система предложит задать пароль для стандартного (дефолтного) пользователя:
После ввода пароля установщик сообщит, что пароль будет сохранен в файле /etc/clickhouse-server/users.d/default-password.xml
:
6) После того как установка будет завершена, необходимо запустить ClickHouse при помощи команды:
service clickhouse-server start
7) Для проверки статуса ClickHouse необходимо использовать команду:
service clickhouse-server status
Если в выводе команды отображается active (running)
, то Clickhouse успешно запущен и работает.
На этом установка ClickHouse завершена.
Рассмотрим использование ClickHouse на практике. Для начала необходимо подключиться к СУБД при помощи официальной клиентской программы, которая была установлена вместе с сервером:
clickhouse-client --password
Необходимо ввести пароль для дефолтного пользователя, который был задан на этапе установки ClickHouse. Если пароль был введен правильно, то появится приглашение к вводу и отобразится строка с текущим статусом подключения:
Стоит отметить, что в качестве языка запросов в ClickHouse используется язык SQL, который применяется в других СУБД, таких как MySQL и PostgreSQL. Для начала создадим новую базу данных с именем info
. Для создания базы данных используется оператор CREATE DATABASE
:
CREATE DATABASE info;
Точку с запятой в конце команды можно не указывать. После каждого успешного выполненного запроса, в консоли будет выводится уникальный номер выполненного запроса (Query id) а также сообщение Ok.
Убедимся, что ранее созданная база данных info
присутствует в списке доступных баз данных. Для этого выведем список всех доступных баз данных при помощи команды SHOW DATABASES
:
SHOW DATABASES;
По умолчанию в ClickHouse присутствуют 4 системные базы данных: INFORMATION_SCHEMA
, default
, information_schema
, system
. Также на скриншоте выше мы можем обнаружить нашу созданную базу данных с именем info
.
Создадим таблицу в базе данных info
. Для этого сначала выберем данную базу данных в качестве последующих запросов по умолчанию, используя оператор USE
(так система поймет, что все последующие операции будут применятся только к выбранной базе данных):
USE info;
Создадим таблицу с именем orders
, которая будет состоять из 4 столбцов: order_id
, customer_name
, customer_phone_number
, customer_email
:
CREATE TABLE orders (
order_id UInt64 NOT NULL,
customer_name String NOT NULL,
customer_phone_number UInt32,
customer_email String
) ENGINE = MergeTree()
PRIMARY KEY order_id
ORDER BY order_id;
Разберем пример по созданию таблицы более подробно.
CREATE TABLE
— оператор для создания таблиц;order_id UInt64 NOT NULL
— столбец с именем order_id
. Тип данных столбца — UInt64
, который означает что для хранения данных используются 64–битные целые числа. NOT NULL
означает, что столбец не поддерживает пустые значения;customer_name String NOT NULL
— столбец с именем customer_name
. Тип данных столбца — String
, который означает, что для хранения данных используется строка произвольной длины. При этом длина строки не ограничена. NOT NULL
означает что столбец не поддерживает пустые значения;customer_phone_number UInt32
— столбец с именем customer_phone_number
. Тип данных столбца — UInt32
, который означает, что для хранения данных используются 32–битные целые числа;customer_email String
— столбец с именем customer_email
. Тип данных столбца — String
. Длина строки не ограничена;ENGINE = MergeTree()
— указывается движок для хранения данных. В данном случае в качестве движка используется MergeTree
. Он используется при работе с большим количеством данных, которые должны быть добавлены в таблицу, при этом их необходимо быстро записать. PRIMARY KEY order_id
— столбец с именем order_id
выступает в роли первичного ключа, при помощи которого можно однозначно идентифицировать каждую запись.ORDER BY order_id
— означает, что данные будут упорядочены по столбцу order_id
. Теперь добавим в ранее созданную таблицу orders
данные о покупателе. Для добавления данных используется оператор INSERT INTO
:
INSERT INTO orders VALUES (10001, 'Alex', 79670140511, 'user_mail@gmail.com');
Таблицы можно модифицировать, например, чтобы добавить новый столбец. Добавим в ранее созданную таблицу orders
новый столбец с именем customer_address
и зададим ему тип данных String
(строковый формат данных), используя оператор ALTER TABLE
:
ALTER TABLE orders ADD COLUMN customer_address String;
Так же, как и в языке SQL, чтобы выбрать необходимые данные, используется оператор SELECT
. Выполним несколько запросов на выборку данных. Для начала выполним обычный запрос на выборку, в котором выберем все данные из столбцов order_id
и customer_name
:
SELECT order_id, customer_name FROM orders;
Теперь выполним запрос на выборку с использованием условий. Для этого используется оператор WHERE
. Выберем все данные из столбцов order_id
и customer_name
, у которых в столбце customer_name
используется значение Alex
:
SELECT order_id, customer_name FROM orders WHERE customer_name = 'Alex';
Для того чтобы обновить данные в таблице, необходимо использовать операторы ALTER TABLE
и UPDATE
. Изменим имя покупателя с Alex
на John
в столбце customer_name
таблицы orders
при помощи следующего запроса:
ALTER TABLE orders UPDATE customer_name='alex' where customer_name='John';
Для удаления данных из таблицы используются операторы ALTER TABLE
и DELETE
. Удалим имя покупателя из столбца customer_name
таблицы orders
:
ALTER TABLE orders DELETE WHERE customer_name='John';
Как и в языке SQL, ClickHouse поддерживает оператор JOIN
для выборки данных из двух и более таблиц. Рассмотрим использование JOIN
на конкретном примере. Создадим новую базу данных с именем users
:
CREATE DATABASE users;
Выберем данную базу данных для дальнейшего использования:
USE users;
Создадим две новые таблицы:
CREATE TABLE users_parted1 (
id Int32,
name String,
age Int32
) ENGINE = MergeTree ORDER BY id;
CREATE TABLE users_parted2 (
id Int32,
address String,
phone String
) ENGINE = MergeTree ORDER BY id;
Добавим данные в каждую таблицу:
INSERT INTO users_parted1 (id, name, age) VALUES (1, 'Tom', 47), (2, 'Kate', 28), (3, 'Bob', 44);
INSERT INTO users_parted2 (id, address, phone) VALUES (1, '123 Main St', '76765945543'), (3, '456 Elm St', '76764790143'), (4, '789 Oak St', '70067425543');
Выполним INNER JOIN
(внешнее соединение)? т.е. запрос на объединение двух таблиц, используя столбец.
SELECT *
FROM users_parted1
INNER JOIN users_parted2
ON users_parted1.id = users_parted2.id;
Для удаления объектов используется оператор DROP
, после которого указывается тип удаляемого объекта. Например, для удаления таблицы используется оператор DROP TABLE
. Удалим ранее созданную таблицу orders
:
DROP TABLE orders;
Для того чтобы удалить базу данных, необходимо воспользоваться оператором DROP DATABASE
:
DROP DATABASE info;
Разверните ClickHouse на облачном сервере
ClickHouse представляет собой колоночную аналитическую СУБД, в которой данные хранятся в виде столбцов, в то время как в традиционных реляционных СУБД данные хранятся в виде строк. Благодаря данному преимуществу ClickHouse быстро обрабатывает большой массив данных.