Wie kann ich einen DigitalOcean Spaces-Bucket als gestaffelten Speicher in ClickHouse verwenden?

0 Aktien
0
0
0
0

Einführung

ClickHouse ist ein Open-Source-Datenbankmanagementsystem mit spaltenorientierter Datenstruktur, das sich durch seine hohe Performance bei OLAP-Abfragen und Echtzeitanalysen auszeichnet. Die Skalierung des Datenspeichers für ClickHouse kann jedoch, insbesondere bei wachsenden Datenmengen, eine Herausforderung darstellen. Eine effiziente Lösung bietet die Verwendung von Tiered Storage. Dadurch können selten genutzte Daten auf kostengünstigeren Speicher ausgelagert werden, während häufig genutzte Daten auf schnellerem, aber teurerem Speicher verbleiben. ClickHouse unterstützt verschiedene Speicher-Backends, darunter lokale Festplatten und Remote-Optionen wie DigitalOcean Spaces. Bei der Verwaltung großer Datenmengen ist der Einsatz mehrerer Speichergeräte üblich.

DigitalOcean Spaces ist ein Objektspeicherdienst, der als Schicht in die mehrstufige Speicherarchitektur von ClickHouse integriert werden kann. Diese Anleitung führt Sie durch die Schritte zur Konfiguration von DigitalOcean Spaces als mehrstufige Speicheroption für Ihren ClickHouse-Cluster.

In dieser Anleitung richten wir eine einfache Go-Anwendung ein, die Batch-Logs an ClickHouse sendet. Zuerst werden die Logs im Hot Storage (der Standardfestplatte, auch lokal genannt) gespeichert und dann nach einem festgelegten Zeitintervall (2 Minuten) in den Cold Storage (z. B. einen S3-basierten Speicher wie DO Spaces) verschoben.

Voraussetzungen

Bevor Sie beginnen, stellen Sie bitte sicher, dass Sie Folgendes haben:

  • Ein Cloud-Konto bei DigitalOcean.
  • Ein DigitalOcean Spaces Bucket.
  • Zugangsschlüssel zu DigitalOcean Spaces.
  • Grundlegende Einführung in die ClickHouse-Konfigurationen und die Objektspeicherung.

Schritt 1 – Erstellen und Konfigurieren eines DigitalOcean-Bereichs

Melden Sie sich in Ihrem DigitalOcean Cloud-Konto an und erstellen Sie einen neuen Speicherplatz (Bucket). Dieser Bucket dient als gestaffelter Speicher für selten genutzte Daten.

  • Wechseln Sie im Dashboard zum Bereich „Spaces“.

  • Klicken Sie auf “Neuen Bereich erstellen”, geben Sie einen Namen ein, wählen Sie eine Region aus und legen Sie Berechtigungen fest.

  • Beachten Sie die Endpunkt-URL.

  • Notieren Sie sich den Zugriffsschlüssel und den geheimen Schlüssel, da Sie diese in den nächsten Schritten benötigen.

An diesem Punkt ist Ihr Bucket erstellt und bereit zur Integration mit ClickHouse.

Schritt 2 – Einrichten des ClickHouse-Servers in einem Docker-Container

Erstellen Sie zunächst einen Ordner und benennen Sie ihn “clickhouse”.

mkdir clickhouse

Erstellen Sie in diesem Ordner eine Dockerfile und ersetzen Sie die Werte {YOUR_AWS_ACCESS_KEY_ID} und {YOUR_AWS_SECRET_ACCESS_KEY} durch Ihren Zugriffsschlüssel und Ihren geheimen Schlüssel.

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"]

Beschreibung:

  • access_key_id und secret_access_key: Dies sind Ihre Zugangsdaten für DigitalOcean Spaces.

Warnung: Der Einfachheit halber haben wir in dieser Anleitung die Zugangsdaten in die Dockerfile aufgenommen. Für Produktionsumgebungen wird diese Vorgehensweise jedoch nicht empfohlen.

Schritt 3 – ClickHouse für S3-kompatiblen Speicher konfigurieren

In diesem Schritt konfigurieren Sie ClickHouse so, dass DigitalOcean Spaces als Speicherebene in Ihrem Speichersystem verwendet wird. Dazu fügen Sie die Speicherkonfiguration zur Datei config.xml in Ihrer ClickHouse-Installation hinzu.

Um den Spaces-Bucket als Speichermedium zu verwenden, müssen Sie ihn zunächst in der ClickHouse-Konfigurationsdatei deklarieren. Sie können die bestehende config.xml-Datei bearbeiten oder, besser noch, eine neue Datei im Ordner conf.d hinzufügen, die später in die config.xml-Datei integriert wird.

<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>

In diesem Abschnitt wird ein externer Datenträger (DigitalOcean Space) konfiguriert, den ClickHouse zur Speicherung von Daten verwenden kann, die nur selten benötigt werden.

Hinweis: Ersetzen Sie die Werte {YOUR_S3_SPACES_BUCKET_URL} durch Ihre Endpunkt-URL.

Schritt 4 – Erstellen Sie einen Tisch mit gestaffelter Ablagefläche.

Erstellen Sie nun in ClickHouse eine Tabelle, die gestaffelte Speicherung verwendet. Sie können mehrere Speicherrichtlinien festlegen, um zu bestimmen, welche Daten auf lokalen und welche auf entfernten Datenträgern (Spaces) gespeichert werden.

Definieren Sie eine Aufbewahrungsrichtlinie, die ältere Daten nach einer festgelegten Zeitspanne in DigitalOcean Spaces verschiebt:

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';

Beschreibung:

  • Standard: Dies ist der lokale Festplattenspeicher, auf dem kürzlich oder häufig verwendete Daten gespeichert werden.
  • s3: ist der Remote-Speicher (DigitalOcean Spaces), in den ältere Daten verschoben werden.

Diese Konfiguration stellt sicher, dass neue Daten auf die lokale Festplatte geschrieben und ältere Daten automatisch zu DigitalOcean Spaces migriert werden.

Schritt 5 – ClickHouse-Server starten

Um den ClickHouse-Server zu starten, führen Sie folgenden Befehl aus:

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

Netzwerkanschlüsse
  • 8123: Dies ist der HTTP-Port, der für die Kommunikation mit ClickHouse über die HTTP-Schnittstelle verwendet wird (http://localhost:8123/play). Über diesen Port können Sie SQL-Abfragen im Browser oder mit Kommandozeilentools wie curl oder Postman ausführen. Er wird häufig für Webanwendungen oder Clients verwendet, die über HTTP mit ClickHouse interagieren.
  • 9000: Dieser TCP-Port ist der Hauptport, über den ClickHouse-Clients und -Server mithilfe des ClickHouse-Hauptprotokolls miteinander kommunizieren.
  • Referenz: https://clickhouse.com/docs/en/guides/sre/network-ports

Überprüfen Sie dies mit:

docker ps

Schritt 6 – Führen Sie ein einfaches Go-Programm aus, das Protokolle sendet

In einem neuen Ordner befindet sich eine Datei mit dem Namen main.go Erstellen Sie eine, die Protokolle an ClickHouse sendet.

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.")
}

So installieren Sie Paketabhängigkeiten:

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

So führen Sie die Anwendung aus:

go run main.go

Schritt 7 – Ergebnisse bestätigen

Um den ClickHouse-Client zu starten, führen Sie folgenden Befehl aus:

docker exec -it clickhouse-demo clickhouse-client

So überprüfen Sie die Protokolle im ClickHouse-Cluster:

SELECT * FROM tiered_logs

Bei der Überprüfung des Speichermediums für diesen Logeintrag stellen wir fest, dass er auf dem Standard-Datenträger (lokaler Datenträger) gespeichert ist – auch bekannt als Hot Storage.

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

Nach Ablauf des in der CREATE TABLE-Abfrage angegebenen Zwei-Minuten-Intervalls können Sie überprüfen, ob diese Berichte auf S3-Disks (Remote-Bucket/Speicherplatz) – auch Cold Storage genannt – verschoben wurden.

In der DigitalOcean Cloud-Benutzeroberfläche können wir außerdem sehen, dass unser Bucket jetzt Daten enthält:

Ergebnis

Mit dieser Anleitung haben Sie DigitalOcean Spaces erfolgreich als mehrstufige Speicherlösung für ClickHouse konfiguriert. Diese Konfiguration ermöglicht es Ihnen, die Speicherkosten zu optimieren und die Leistung zu verbessern, indem selten genutzte Daten in kostengünstigen Objektspeicher verschoben werden, während gleichzeitig ein leistungsstarker Speicher für aktive Daten erhalten bleibt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Das könnte Ihnen auch gefallen