ClickHouse-Operator: Часть-1 – обзор и установка в Kubernetes

Немного об ClickHouse

Настал тот час когда прилетел интересный task по разворачиванию ClickHouse для бекенд команды. Все мы знаем, что пихать базы данных в kubernetes не есть бест практис, особенно для продакшена!!! Но мы будем не мы, если не попробуем развернуть его в kubernetes =). 

В пределах этого поста не будем глубоко погружаться в работу и структуру данной базы, немножко поговорим про сам ClickHouse, особенности, терминологию и перейдем к оператору.

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

Данные в СlickHouse хранятся в столбцах (взято с офф документации):

в то время как в обычных SQL базах в строках(на изображении показан только порядок расположения данных):

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

Для работы с ClickHouse представлены два интерфейса, которые можно обернуть в TLS если нужна дополнительная безопасность:
  – TCP:  по умолчанию 9000 (используется для доступа на прямую)
  – HTTP: по умолчанию 8123 (то есть ми можем делать GET or POST запроси в базу используя curl и не только)

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

Шардирование

Шардирование – горизонтальное масштабирование кластера, при котором разные части одной базы распределяются на разные шарды. Шард состоит из одного или нескольких хостов. Выделенного мастера нет, по этому запись или чтение происходит с любой реплики.

На примере показано два сервера(пода), на каждом сервере созданы одинаковее таблицы. Данные при записи разделяются на некоторые части, часть данных записывается  в один шард, а половину во второй. Для примера есть табличка с 6 миллионами записей, мы можем разместить 3 миллиона на первый шард и три на второй, когда обратиться пользователь, данные собираются, агрегируются(суммируются, объединяются), отправляются пользователю.

Для реализации шардирования существует Engine=Distributed дистрибьютор таблиц. В ClickHouse таблицы можно разделить на виртуальнее или реальные.

– реальные: хранят физически данные на дисках
  Engine = MergeTree

– виртуальные: ничего не хранят
  Engine = Distributor

Движок дистрибьютор позволяет собрать данные с разных шардов, обєдинить их, посчитать количество и отдать пользователю, подробнее про движки можно почитать здесь. Стоит помнить, что он в себе ничего не хранит.

Все настройки производиться на уровне таблиц, clickhouse не использует модель репликации instanceinstance, репликацию и шардирование нужно настраивать на уровне таблиц. Теперь немного поговорим об репликации.

Репликация

Репликация внутри шарда используются для отказоустойчивости и распараллеливания чтения. Если говорить про распараллеливание, то здесь мы можем отправлять первый запрос в одном шарде на первый сервер, после чего с этого же шарда отправить запрос на второй сервер. Репликация работает только для отдельных таблиц с использованием движка MergeTree. 

Для настройки репликации используется zookeeper. Зукипер содержит в себе информацию о реплицируемых таблицах, его можно поднимать на отдельных серверах ири размещать на сервере с ClickHouse

Кратко о том как работает зукипер. Он постоянно забирает себе актуальные данные с реплик, по этому все репликации смотрят на него. Когда реплика видит что в зукипере появились новые данные, она идет на прямую в реплику и скачивает их себе. Когда реплика данные забрала, зукипер отмечает в себе что данные благополучно забрали.

Таким образом если реплика вышла из строя, она подключается к зукиперу, находит все необходимые данные которые ей нужны. Когда есть нужные данные или их части, реплика идет на работающую реплику (в которой данные есть) и скачивает их себе.

Рекомендуют Зукипер использовать для хранения только состояния репликаций и выносить на отдельные ноды. Так как он тоже кушает системные ресурсы и когда падает, начинаются проблемы с репликацией. Подробнее как установить Зукипер и базовая его настройка смотрим здесь

Установка

Документация https://docs.altinity.com/clickhouseonkubernetes/
Репозиторий оператораhttps://github.com/Altinity/clickhouse-operator/blob/master/docs/

clickhouse-operetoropen source проект, который облегчает работу администраторам и devops инженерам, так как часть рутинной работы, микро менеджменту и администрированию кластера забирает на себя. Что в свою очередь позволяет не вдаваться в подробности (как там внутри все работает). Мы просто даем ему высокоуровневые задачи и он их выполняет.

Оператор сопровождает весь жизненный цикл работы кластера. Выполняя ежедневные задачи по масштабированию, шардированию, изменению конфигураций и прочего.

Пример следующих задач которые умеет делать оператор:

  – конфигурирование ClickHouse
  – добавление и удаление шардов и реплик
  – обновление нод кластера
  – мониторинг состояния кластера
  – при необходимости удаляет кластер

Для начала установим сам оператор, далее опишем примитивный PoC single-node ClickHouse, а после развернем его используя оператор.

Сами разработчики в докладах рекомендуют использовать kubectl для установки в обход helm. Потому что при установке через kubectl получаем гибкое и более автоматизированное администрирование чем при установке helm, но никто не запрещает его использовать. В нашем случае воспользуюсь kubectl.

clickhouse-operator

Заранее забегу наперед, в процессе установки и тестирования заметил особенность: если устанавливать оператор в неймспейс kube-system – кластер можно создавать в любом неймспейсе, но, если установить в другой ns – тогда кластер нужно устанавливать в той же неймспейс где и сам оператор! Рекомендую перед установкой ознакомиться с содержимым манифеста, посмотреть расширенную настройку и только тогда устанавливать.

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

Пример пользователя с манифеста clickhouse-operator-install-bundle.yaml

Устанавливать будем манифест с именем clickhouse-operator-install-bundle.yaml в kube-system неймспейс, варианты других установок здесь:

проверяем статус оператора:

Отлично, с установкой не возникло никаких проблем, идем далее.

ClickHouse Кластер

Теперь нужно описать как должен выглядеть наш кластер, после чего задеплоить его. Создадим простой в один шард, без реплик, без зукипера, но с PVC. В таком сетапе разработчики должны ознакомляться с ним, и после тестирования будем иметь полную картину какой ClickHouse нам нужно разворачивать на проде.

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

Что мне понравилось, есть разные вариации, ми можем создавать несколько шаблонов (pvc, users, etc), устанавливать и потом подключать при создании кластера, или всю конфигурацию описать в одному манифесте. Второй вариант больше подходит, потому что в одному манифесте у нас будет все необходимое для работы кластера в одном файле.

Для хранения данных будем использовать Persistent Storage. Коротко и доходчиво по Storage в операторе описано здесь, разработчики постарались облегчить нам жизнь и сделали шаблоны на любой вкус. Рекомендується использовать тип стореджа local, потому что сейчас локальные пути на дисках инкапсулируются в сам kubernetes, что облегчает всем жизнь, а раньше доводилось все делать руками, указывать пути. 

После просмотра примеров, создал файл backend-clickhouse-single-node.yaml в котором описал свой кластер с некоторыми параметрами, получилось как то так:

создадим неймспейс и задеплоим манифест:

проверим статус кластера:

посмотрим на сервис:

где:
–  chendpoint-backendсервис с типом LoadBalancer который дает доступ ко всем шардам, доступен из мира, но ми закрыли его ограничив доступ офисными IP.
–  chi-backend-shard-0-0сервис нашего шарда.

Проверим доступ с офиса используя curl:

хорошо, теперь переключимся на другого провайдера и посмотрим, будет ли доступ:

как видим доступа нет.

Подключение к ClickHouse

Теперь остается вопрос, как же подключаться к clickhouse? Если говорить про внешнее подключение есть много разных GUI IDE которые рекомендует сам ClickHouse,  но для тестов нам хватит clickhouse-cli, установим его:

посмотрим доступные ключи и попробуем подключиться с офиса по внешнему url service alb:

подключаемся:

Для доступа внутри кластера нужно использовать внутренний кубернетес local DNS, пример такого URL:

провалимся в под приложения, которое находиться в неймспейсе ***-qa-***-** и постучимся курлом:

теперь с єтого же пода, но используя clickhouse-cli:

Проверка Storage

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

посмотрим на PVC:

подключимся в под и глянем путь монтирования:

storage подключен.

Подключаемся к кластеру ClickHouse, смотрим какие базы сейчас есть:

Создадим тестовую с именем testdb:

теперь таблицу с именем test:

Удаляем под и ждем когда поднимется новый:

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

Отлично, все сохранились.

Что ж, первоначальный сетап готов. Мы установили кластер в один шард, создали два пользователя, один pvc для хранения данных, осталось продумать как делать бекап и восстановление, мониторинг, автоматизацию для установки оператора, создания и изменения кластеров для разных команд.

Полезные ссылки

Оператор в Kubernetes для управления кластерами БД.
clickhouse documentation
https://docs.altinity.com/clickhouseonkubernetes/
https://github.com/Altinity/clickhouse-operator/tree/master/docs/chi-examples
https://cloud.yandex.ru/docs/managed-clickhouse/concepts/sharding
https://cloud.yandex.ru/docs/managed-clickhouse/concepts/replication 

Click to rate this post!
[Total: 3 Average: 5]