Запускаем сервер Yandex ClickHouse в виде контейнера Docker с настройкой для обработки большого объема хранимых данных

ClickHouse — колоночная СУБД, предназначенная для решения задач аналитической обработки данных. Несмотя на то, что в большинстве случаев ClickHouse должен использоваться для работы в режиме множества серверов, объединенных в кластер, в случаях, когда объем обрабатываемых данных составляет 1-2 TB, он может обрабатываться и на одном сервере.

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

Настройка Docker

Если у вас уже настроен и установлен Docker, просто пропустите этот шаг. Если Docker не установлен, установите его по одному из руководств: Ubuntu 16.04 и 18.04, Debian 9 и 10, Centos 7 и приступайте к следующему шагу.

Настройка ClickHouse

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

sudo mkdir -p /opt/clickhouse/{data,etc,log}

Теперь запустим ClickHouse в пробном режиме:

sudo docker run -d --name clickhouse_1 \
     --ulimit nofile=262144:262144 \
     -v /opt/clickhouse/log:/var/log/clickhouse-server \
     -v /opt/clickhouse/data:/var/lib/clickhouse \
     yandex/clickhouse-server

Убедимся, что соединение с сервером работает:

sudo docker run -it --rm --link clickhouse_1:clickhouse-server \
             yandex/clickhouse-client --host clickhouse-server

Проверьте, что сервер отвечает на запросы:

SELECT now()

┌───────────────now()─┐
│ 2019-04-01 15:46:39 │
└─────────────────────┘

1 rows in set. Elapsed: 0.003 sec. 

e29c32808cc4 🙂 select version();

SELECT version()

┌─version()─┐
│ 19.4.2.7  │
└───────────┘

Теперь выполним экспорт конфигурационных файлов сервера в каталог хоста, чтобы вы позже могли их изменять:

sudo docker exec -it clickhouse_1 cat /etc/clickhouse-server/config.xml > config.xml
sudo docker exec -it clickhouse_1 cat /etc/clickhouse-server/users.xml > users.xml

sudo mv config.xml users.xml

Теперь остановим сервер ClickHouse и запустим его с внешними файлами конфигурации:

sudo docker stop clickhouse_1
sudo docker rm clickhouse_1

sudo docker run -d --restart=always --name clickhouse_1 \
   --ulimit nofile=262144:262144 \
   -p 127.0.0.1:8123:8123 -p 127.0.0.1:9000:9000 \
   -v /opt/clickhouse/log:/var/log/clickhouse-server \
   -v /opt/clickhouse/data:/var/lib/clickhouse \
   -v /opt/clickhouse/etc/users.xml:/etc/clickhouse-server/users.xml \
   -v /opt/clickhouse/etc/config.xml:/etc/clickhouse-server/config.xml \
   yandex/clickhouse-server

Проверьте доступность сервера как мы проверяли ранее:

sudo docker run -it --rm --link clickhouse_1:clickhouse-server \
             yandex/clickhouse-client --host clickhouse-server

Проверьте, что сервер отвечает на запросы:

SELECT now()

┌───────────────now()─┐
│ 2019-04-01 15:46:39 │
└─────────────────────┘

1 rows in set. Elapsed: 0.003 sec. 

e29c32808cc4 🙂 select version();

SELECT version()

┌─version()─┐
│ 19.4.2.7  │
└───────────┘

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

Дополнительная настройка ClickHouse

Рассмотрим две переменных ClickHouse, изменение которых положительно влияет на производительность выполнения запросов:

  • mark_cache_size — размер кэша, используемый для выполнения запросов, рекомендуем подбирать от размера RAM;
  • max_memory_usage — максимальный размер памяти, который может использовать ClickHouse, рекомендуем выделять как можно больше, в зависимости от доступной памяти на сервере.

Заключение

Вы научились устанавливать CllickHouse в режиме Docker с использованием внешних каталогов для хранения настроек, данных и журналов в пространстве хост-системы. Эта конфигурация может использоваться как для нужд разработки, как аналитическое хранилище небольшого объема или как узел многоузловой конфигурации.