Создание ClickHouse-кластера

ClickHouse-кластер — это один или несколько хостов базы данных, между которыми можно настроить репликацию.

Важная информация

При создании кластера ClickHouse из 2 и более хостов Managed Service for ClickHouse автоматически создает кластер из 3 хостов ZooKeeper для управления репликацией и отказоустойчивостью. Эти хосты учитываются в расчете использованной квоты ресурсов в облаке , и в расчете стоимости кластера . Подробнее — в разделе о репликации для ClickHouse.

Количество хостов, которые можно создать вместе с ClickHouse-кластером, зависит от выбранного варианта хранилища:

  • При использовании сетевых дисков вы можете запросить любое количество хостов (от 1 до пределов текущей квоты).

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

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

  2. Выберите сервис Managed Service for ClickHouse.

  3. Нажмите кнопку Создать кластер.

  4. Введите имя кластера в поле Имя кластера. Имя кластера должно быть уникальным в рамках каталога.

  5. Выберите окружение, в котором нужно создать кластер (после создания кластера окружение изменить невозможно):

    • production — для стабильных версий ваших приложений.
    • prestable — для тестирования, в том числе самого сервиса Managed Service for ClickHouse. Prestable-окружение обновляется чаще, из-за чего в нем раньше исправляются уже известные проблемы, но могут происходить обратно несовместимые изменения.
  6. Выберите класс хостов — он определяет технические характеристики виртуальных машин, на которых будут развернуты хосты БД. Все доступные варианты перечислены в разделе Классы хостов. При изменении класса хостов для кластера меняются характеристики всех уже созданных экземпляров.

  7. В блоке Размер хранилища:

    • Выберите тип хранилища — более гибкое сетевое (network-hdd или network-ssd) или более быстрое локальное SSD-хранилище (local-ssd). Размер локального хранилища можно менять только с шагом 100 ГБ.

    • Выберите объем, который будет использоваться для данных и резервных копий. Подробнее о том, как занимают пространство резервные копии, см. раздел Резервные копии.

  8. В блоке База данных укажите атрибуты БД:

    • Имя БД.
    • Имя пользователя.
    • Пароль пользователя. Минимум 8 символов.
  9. В блоке Хосты укажите параметры хостов БД, создаваемых вместе с кластером (помните, что используя SSD-диски при создании ClickHouse-кластера можно задать не меньше 2 хостов). Чтобы изменить добавленный хост, наведите курсор на строку хоста и нажмите значок image.

  10. При необходимости настройте параметры СУБД:

    • Geobase uri — адрес архива с пользовательской геобазой в Object Storage.

    • Keep alive timeout — время в секундах после поступления последнего запроса к ClickHouse, в течение которого сервер ожидает новый запрос. Если в течение этого времени запросов не поступит, ClickHouse разорвет соединение. Подробнее см. в документации ClickHouse.

    • Log level — уровень логирования событий. На каждом следующем уровне лог будет содержать всю информацию из предыдущего:

      1. ERROR — информация об ошибках в работе кластера;
      2. WARNING — информация о событиях, которые могут привести к ошибкам в работе кластера;
      3. INFORMATION — подтверждения, информация о событиях, не приводящих к ошибкам в работе кластера;
      4. DEBUG — системная информации для последующего использования в отладке;
      5. TRACE — вся доступная информации о работе кластера.

      Подробнее об уровнях логирования см. в документации ClickHouse.

    • Mark cache size — приблизительный размер в байтах кэша засечек, используемых движками таблиц семейства MergeTree. Кэш общий для сервера, память выделяется по мере необходимости. Подробнее о логировании в ClickHouse см. в документации.

    • Max concurrent queries — максимальное количество одновременно обрабатываемых запросов. Подробнее см. в документации ClickHouse.

    • Max connections — максимальное количество входящих соединений. Подробнее см. в документации ClickHouse.

    • Max partition size to drop — максимальный размер в байтах партиции таблицы семейства MergeTree, которую можно удалить с помощью запроса DROP.

    • Max table size to drop — максимальный размер в байтах таблицы семейства MergeTree, которую можно удалить с помощью запроса DROP. Значение 0 означает, что можно удалять все таблицы без ограничений. Подробнее см. в документации ClickHouse.

    • Timezone — временная зона сервера. Указывается идентификатором IANA в виде часового пояса UTC или географического положения (например, Africa/Abidjan). Подробнее см. в документации ClickHouse.

    • Uncompressed cache size — размер кеша в байтах для несжатых данных, используемых движками таблиц семейства MergeTree. Подробнее см. в документации ClickHouse.

    • Compression — правила сжатия данных для таблиц семейства MergeTree.

      • Method — метод сжатия. Доступно два метода: LZ4 и zstd.
      • Min part size — минимальный размер куска данных таблицы в байтах. ClickHouse будет применять правило только к тем таблицам, у которых размер кусков больше или равен значению Min part size.
      • Min part size ratio — отношение размера наименьшего куска таблицы к полному размеру таблицы. ClickHouse будет применять правило только к тем таблицам, у которых такое отношение больше или равно значению Min part size ratio.

      Вы можете добавить несколько правил сжатия. ClickHouse проверит условия Min part size и Min part size ratio и применит правила к тем таблицам, для которых выполнены оба условия. Если к одной таблице подходит несколько правил, ClickHouse применит первое из них. Если ни одно из правил не подходит, ClickHouse применит метод сжатия LZ4. Подробнее см. в документации ClickHouse

    • Graphite rollup — конфигурации движка GraphiteMergeTree для прореживания и агрегирования/усреднения (rollup) данных Graphite. Вы можете настроить несколько конфигураций и использовать их для разных таблиц.

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

      • Name — имя конфигурации.
      • Patterns — набор правил прореживания. Правило применяется, если имя метрики соответствует значению параметра Regexp, а возраст данных соответствует значению группы параметров Retention.
        • Function — имя агрегирующей функции.
        • Regexp — регулярное выражение, которому должно соответствовать имя метрики.
        • Retention — параметры задержки. Функция применяется к данным, чей возраст оказался в интервале [Age, Age + Precision]. Вы можете задать несколько групп таких параметров.
          • Age — минимальный возраст данных в секундах.
          • Precision — точность определения возраста данных в секундах. Должен быть делителем для 86400 (количество секунд в сутках).
    • Merge tree — конфигурация движка MergeTree. Подробнее см. в документации ClickHouse

      • Max bytes to merge at min space in pool — максимальный общий размер куска данных для слияния, когда в фоновом пуле минимум свободных потоков.
      • Max replicated merges in queue — максимальное число задач слияния, которые могут одновременно находиться в очереди ReplicatedMergeTree.
      • Number of free entries in pool to lower max size of merge — предельное значение свободных записей в пуле. Если количество записей в пуле становится меньше этого значения, ClickHouse уменьшает максимальный размер куска данных для слияния. Это позволяет быстрее обрабатывать небольшие слияния, а не заполнять пул длительными.
      • Parts to delay insert — число активных кусков данных таблицы, при превышении которого ClickHouse будет искусственно уменьшать скорость вставки данных в таблицу.
      • Parts to throw insert — предельное число активных кусков данных таблицы, при превышении которого ClickHouse отправляет исключение 'Too many parts ...'.
      • Replicated deduplication window — число последних блоков хешей, которые ZooKeeper будет хранить (старые блоки будут удалены).
      • Replicated deduplication window seconds — время, в течение которого ZooKeeper хранит блоки хешей (старые блоки будут удалены).
  11. Нажмите кнопку Создать кластер.

Если у вас еще нет интерфейса командной строки Яндекс.Облака, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

Чтобы создать кластер:

  1. Проверьте, есть ли в каталоге подсети для хостов кластера:

    $ yc vpc subnet list
    

    Если ни одной подсети в каталоге нет, создайте нужные подсети в сервисе VPC.

  2. Посмотрите описание команды CLI для создания кластера:

    $ yc managed-clickhouse cluster create --help
    
  3. Укажите параметры кластера в команде создания (в примере приведены только обязательные флаги):

    $ yc managed-clickhouse cluster create \
       --cluster-name <имя кластера> \
       --environment <окружение, prestable или production> \
       --network-name <имя сети> \
       --host type=<clickhouse или zookeeper>,zone-id=<зона доступности>,subnet-id=<идентификатор подсети> \
       --resource-preset <класс хоста> \
       --clickhouse-disk-type <network-hdd | network-ssd | local-ssd> \
       --clickhouse-disk-size <размер хранилища в гигабайтах> \
       --user name=<имя пользователя>,password=<пароль пользователя> \
       --database name=<имя базы данных>
    

    Идентификатор подсети subnet-id необходимо указывать, если в выбранной зоне доступности создано 2 и больше подсетей.

Terraform позволяет быстро создать облачную инфраструктуру в Яндекс.Облаке. Состав инфраструктуры определяется с помощью конфигурационных файлов, в которых указываются требуемые облачные ресурсы и их параметры.

Если у вас ещё нет Terraform, установите его и настройте провайдер.

Чтобы создать кластер:

  1. Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:

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

    Пример структуры конфигурационного файла:

    resource "yandex_mdb_clickhouse_cluster" "<имя кластера>" {
      name        = "<имя кластера>"
      environment = "<окружение>"
      network_id  = "<идентификатор сети>"
    
      clickhouse {
        resources {
          resource_preset_id = "<класс хоста>"
          disk_type_id       = "<тип хранилища>"
          disk_size          = "<объем хранилища, ГБ>"
        }
      }
    
      database {
        name = "<имя базы данных>"
      }
    
      user {
        name     = "<имя пользователя БД>"
        password = "<пароль>"
        permission {
          database_name = "<имя БД, в которой создается пользователь>"
        }
      }
    
      host {
        type      = "CLICKHOUSE"
        zone      = "<зона доступности>"
        subnet_id = "<идентификатор подсети>"
      }
    }
    
    resource "yandex_vpc_network" "<имя сети>" {}
    
    resource "yandex_vpc_subnet" "<имя подсети>" {
      zone           = "<зона доступности>"
      network_id     = "<идентификатор сети>"
      v4_cidr_blocks = ["<диапазон>"]
    }
    

    Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера.

  2. Проверьте корректность конфигурацилонных файлов.

    1. В командной строке перейдите в каталог, в котором вы создали конфигурационный файл.
    2. Выполните проверку с помощь команды:
      terraform plan
      

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

  3. Создайте кластер.

    1. Если в конфигурации нет ошибок, выполните команду:
      terraform apply
      
    2. Подтвердите создание ресурсов.

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

Примеры

Создание кластера с одним хостом

Чтобы создать кластер с одним хостом, следует передать один параметр --host.

Допустим, нужно создать ClickHouse-кластер со следующими характеристиками:

  • С именем mych.
  • В окружении production.
  • В сети default.
  • С одним хостом ClickHouse класса s1.nano в подсети b0rcctk2rvtr8efcch64, в зоне доступности ru-central1-c.
  • С сетевым SSD-хранилищем объемом 20 ГБ.
  • С одним пользователем, user1, с паролем user1user1.
  • С одной базой данных, db1.

Запустите следующую команду:

$ yc managed-clickhouse cluster create \
     --cluster-name mych \
     --environment=production \
     --network-name default \
     --clickhouse-resource-preset s1.nano \
     --host type=clickhouse,zone-id=ru-central1-c,subnet-id=b0cl69g98qumiqmtg12a \
     --clickhouse-disk-size 20 \
     --clickhouse-disk-type network-ssd \
     --user name=user1,password=user1user1 \
     --database name=db1

Создание кластера с одним хостом

Допустим, нужно создать ClickHouse-кластер и сеть для него со следующими характеристиками:

  • С именем mych.
  • В окружении PRESTABLE.
  • В облаке с идентификатором b1gq90dgh25иuebiu75o.
  • В каталоге myfolder.
  • В новой сети mynet.
  • С одним хостом класса s2.micro в новой подсети mysubnet, в зоне доступности ru-central1-c. Подсеть mysubnet будет иметь диапазон 10.5.0.0/24.
  • С быстрым сетевым хранилищем объемом 32 ГБ.
  • С именем базы данных my_db.
  • C именем пользователя user1 и паролем user1user1.

Конфигурационный файл для такого кластера выглядит так:

provider "yandex" {
  token     = "<OAuth или статический ключ сервисного аккаунта>"
  cloud_id  = "b1gq90dgh25иuebiu75o"
  folder_id = "${data.yandex_resourcemanager_folder.myfolder.id}"
  zone      = "ru-central1-c"
}

resource "yandex_mdb_clickhouse_cluster" "mych" {
  name        = "mych"
  environment = "PRESTABLE"
  network_id  = "${yandex_vpc_network.mynet.id}"

  clickhouse {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 32
    }
  }

  database {
    name = "my_db"
  }

  user {
    name     = "user1"
    password = "user1user1"
    permission {
      database_name = "my_db"
    }
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-c"
    subnet_id = "${yandex_vpc_subnet.mysubnet.id}"
  }
}

resource "yandex_vpc_network" "mynet" {}

resource "yandex_vpc_subnet" "mysubnet" {
  zone           = "ru-central1-c"
  network_id     = "${yandex_vpc_network.mynet.id}"
  v4_cidr_blocks = ["10.5.0.0/24"]
}