Как использовать контейнер DigitalOcean Spaces в качестве многоуровневого хранилища в ClickHouse?

0 Акции
0
0
0
0

Введение

ClickHouse — это система управления столбчатыми базами данных с открытым исходным кодом, которая превосходно справляется с высокопроизводительными OLAP-запросами и аналитикой в режиме реального времени. Однако масштабирование хранилища данных для ClickHouse может быть сложной задачей, особенно по мере роста объёмов данных. Одним из эффективных решений является использование многоуровневого хранения, которое позволяет перемещать редко используемые данные в более экономичное хранилище, сохраняя при этом часто используемые данные на более быстром и дорогом хранилище. ClickHouse поддерживает различные варианты хранения данных, включая локальные диски и удалённые решения, такие как DigitalOcean Spaces. При управлении большими объёмами данных часто используется несколько устройств хранения.

DigitalOcean Spaces — это сервис объектного хранения, который можно интегрировать в качестве слоя в архитектуру многоуровневого хранилища ClickHouse. Это руководство поможет вам настроить DigitalOcean Spaces в качестве многоуровневого хранилища для вашего кластера ClickHouse.

В этом руководстве мы настроим простое приложение на Go, которое будет отправлять пакетные журналы в ClickHouse. Сначала журналы будут храниться в «горячем» хранилище (диске по умолчанию, также называемом локальным), а затем по истечении заданного времени (2 минуты) будут перемещены в «холодное» хранилище (например, в хранилище на базе S3, например, в DO Spaces).

Предпосылки

Прежде чем начать, убедитесь, что у вас есть следующее:

  • Облачный аккаунт на DigitalOcean.
  • Ведро DigitalOcean Spaces.
  • Ключи доступа к DigitalOcean Spaces.
  • Базовое введение в конфигурации ClickHouse и хранилище объектов.

Шаг 1 — Создание и настройка DigitalOcean Space

Войдите в свою учётную запись DigitalOcean Cloud и создайте новое пространство (корзину). Эта корзина будет использоваться как многоуровневое хранилище для редко используемых данных.

  • Перейдите в раздел «Пространства» на панели инструментов.

  • Нажмите “Создать новое пространство”, введите имя, выберите регион и настройте разрешения.

  • Обратите внимание на URL конечной точки.

  • Запишите ключ доступа и секретный ключ, так как они понадобятся вам на следующих этапах.

На этом этапе ваш контейнер создан и готов к интеграции с ClickHouse.

Шаг 2 — Настройка сервера ClickHouse в Docker-контейнере

Для начала создайте папку и назовите ее “clickhouse”.

mkdir clickhouse

Создайте Dockerfile в этой папке и замените значения {YOUR_AWS_ACCESS_KEY_ID} и {YOUR_AWS_SECRET_ACCESS_KEY} на ваш ключ доступа и секретный ключ.

FROM clickhouse/clickhouse-server:latest
# Copy the config file to the container
COPY storage.xml /etc/clickhouse-server/config.d/storage.xml
# Copy the S3 table creation script
COPY create.sql /docker-entrypoint-initdb.d/
# Set environment variables for S3 credentials
ENV AWS_ACCESS_KEY_ID={YOUR_AWS_ACCESS_KEY_ID}
ENV AWS_SECRET_ACCESS_KEY={YOUR_AWS_SECRET_ACCESS_KEY}
# Expose ClickHouse HTTP and native ports
EXPOSE 8123 9000
USER clickhouse
# --config-file ./programs/server/config.xml
CMD ["clickhouse-server", "--config-file", "/etc/clickhouse-server/config.xml"]

Описание:

  • access_key_id и secret_access_key: это ваши учетные данные для DigitalOcean Spaces.

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

Шаг 3 — Настройте ClickHouse для S3-совместимого хранилища

На этом этапе вам нужно настроить ClickHouse для использования DigitalOcean Spaces в качестве уровня вашей системы хранения данных. Для этого необходимо добавить конфигурацию хранилища в файл config.xml в вашей установке ClickHouse.

Чтобы использовать контейнер Spaces в качестве диска хранения, необходимо сначала объявить его в конфигурационном файле ClickHouse. Вы можете изменить существующий файл config.xml или, что предпочтительнее, добавить новый файл в папку conf.d, который впоследствии будет объединён с config.xml.

<clickhouse>
<storage_configuration>
<disks>
<s3>
<type>s3</type>
<endpoint>{YOUR_S3_SPACES_BUCKET_URL}</endpoint>
<use_environment_credentials>true</use_environment_credentials>
</s3>
</disks>
</storage_configuration>
</clickhouse>

В этом разделе настраивается удаленный диск (DigitalOcean Space), который ClickHouse может использовать для хранения редко доступных данных.

Примечание: замените значения {YOUR_S3_SPACES_BUCKET_URL} на URL-адрес вашей конечной точки.

Шаг 4 — Создайте таблицу с многоуровневым хранилищем

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

Определите политику хранения, которая перемещает старые данные в DigitalOcean Spaces по истечении определенного периода времени:

CREATE TABLE IF NOT EXISTS tiered_logs (
event_time DateTime,
level String,
message String
) ENGINE = MergeTree
ORDER BY (event_time)
TTL toDateTime(event_time) + INTERVAL 2 MINUTE TO VOLUME 'cold'
SETTINGS storage_policy = 's3_tiered';

Описание:

  • по умолчанию: это локальное дисковое хранилище, где хранятся последние или часто используемые данные.
  • s3: удаленное хранилище (DigitalOcean Spaces), куда перемещаются старые данные.

Такая конфигурация гарантирует, что новые данные записываются на локальный диск, а старые данные автоматически переносятся в DigitalOcean Spaces.

Шаг 5 — Запуск сервера ClickHouse

Чтобы запустить сервер ClickHouse, выполните следующую команду:

docker build -t clickhouse-demo .
docker run -d --name clickhouse-demo -p 8123:8123 -p 9000:9000 clickhouse-demo

Сетевые порты
  • 8123: Это HTTP-порт, используемый для взаимодействия с ClickHouse через HTTP-интерфейс. (http://localhost:8123/play). Вы можете использовать этот порт для выполнения SQL-запросов через браузер или с помощью инструментов командной строки, таких как curl или Postman. Он часто используется для веб-приложений или клиентов, взаимодействующих с ClickHouse по HTTP.
  • 9000: Этот TCP-порт является основным портом для взаимодействия клиентов и серверов ClickHouse друг с другом с использованием основного протокола ClickHouse.
  • Ссылка: https://clickhouse.com/docs/en/guides/sre/network-ports

Проверьте с помощью:

docker ps

Шаг 6 — Запустите простую программу Go, которая отправляет логи

В новой папке файл с именем main.go Создайте такой, который будет отправлять логи в ClickHouse.

package main
import (
"database/sql"
"fmt"
"log"
"os"
"time"
"github.com/ClickHouse/clickhouse-go"
"github.com/sirupsen/logrus"
)
type ClickHouseHook struct {
db *sql.DB
entries []logrus.Entry
batchSize int
}
// NewClickHouseHook establishes a connection to ClickHouse using the provided DSN.
func NewClickHouseHook(dsn string, batchSize int) (*ClickHouseHook, error) {
db, err := sql.Open("clickhouse", dsn)
if err != nil {
return nil, err
}
if err := db.Ping(); err != nil {
if exception, ok := err.(*clickhouse.Exception); ok {
log.Fatalf("[%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace)
} else {
log.Fatal(err)
}
}
return &ClickHouseHook{db: db, batchSize: batchSize}, nil
}
// Fire is triggered by Logrus to log entries to ClickHouse.
func (hook *ClickHouseHook) Fire(entry *logrus.Entry) error {
hook.entries = append(hook.entries, *entry)
if len(hook.entries) >= hook.batchSize {
if err := hook.flush(); err != nil {
return err
}
}
return nil
}
// flush sends the collected log entries to ClickHouse in a batch.
func (hook *ClickHouseHook) flush() error {
tx, err := hook.db.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("INSERT INTO tiered_logs (event_time, level, message) VALUES (?, ?, ?)")
if err != nil {
return err
}
defer stmt.Close()
for _, entry := range hook.entries {
if _, err := stmt.Exec(entry.Time, entry.Level.String(), entry.Message); err != nil {
return err
}
}
if err := tx.Commit(); err != nil {
return err
}
// Clear the entries after flushing
hook.entries = nil
return nil
}
// Levels returns the logging levels for which the hook is triggered.
func (hook *ClickHouseHook) Levels() []logrus.Level {
return logrus.AllLevels
}
func main() {
// ClickHouse DSN (replace with your credentials and host)
dsn := "tcp://localhost:9000?database=default&username=default&password=&debug=true"
// Create ClickHouse hook with a batch size of 5
hook, err := NewClickHouseHook(dsn, 5)
if err != nil {
log.Fatalf("failed to connect to ClickHouse: %v", err)
}
defer hook.db.Close()
// Set up logrus
logger := logrus.New()
logger.Out = os.Stdout
logger.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
})
logger.AddHook(hook)
// Log some entries
for i := 0; i < 10; i++ {
logger.WithFields(logrus.Fields{
"iteration": i,
}).Info("This is an info log entry")
time.Sleep(time.Second)
}
// Flush any remaining log entries before exiting
if err := hook.flush(); err != nil {
log.Fatalf("failed to flush logs to ClickHouse: %v", err)
}
fmt.Println("Logs sent to ClickHouse.")
}

Чтобы установить зависимости пакета:

go mod init example.com/clickhouse-logging
go get github.com/ClickHouse/clickhouse-go
go get github.com/sirupsen/logrus

Чтобы запустить приложение:

go run main.go

Шаг 7 — Подтверждение результатов

Чтобы запустить клиент ClickHouse, выполните следующую команду:

docker exec -it clickhouse-demo clickhouse-client

Чтобы проверить логи в кластере ClickHouse:

SELECT * FROM tiered_logs

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

SELECT name, disk_name FROM system.parts WHERE table = 'tiered_logs';

По истечении двухминутного интервала, указанного в запросе CREATE TABLE, вы можете проверить, что эти отчеты были перемещены на диски S3 (удалённое хранилище/пространство) — также называемое холодным хранилищем.

Мы также можем видеть в пользовательском интерфейсе DigitalOcean Cloud, что наше хранилище теперь содержит данные:

Результат

Следуя этому руководству, вы успешно настроили DigitalOcean Spaces в качестве многоуровневого хранилища для ClickHouse. Такая конфигурация позволяет оптимизировать затраты на хранение и повысить производительность за счёт переноса редко используемых данных в экономичное объектное хранилище, сохраняя при этом высокую производительность для активных данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может понравиться