giriiş
ClickHouse, yüksek performanslı OLAP sorguları ve gerçek zamanlı analizler gerçekleştirmede üstün performans gösteren, açık kaynaklı, sütunlu bir veritabanı yönetim sistemidir. Ancak, özellikle veri hacimleri büyüdükçe, ClickHouse için veri depolama alanını ölçeklendirmek zor olabilir. Verimli bir çözüm, seyrek erişilen verileri daha uygun maliyetli depolama alanlarına taşırken, sık erişilen verileri daha hızlı ve daha pahalı depolama alanlarında tutmanıza olanak tanıyan katmanlı depolama kullanmaktır. ClickHouse, yerel diskler ve DigitalOcean Spaces gibi uzak seçenekler de dahil olmak üzere çeşitli veri depolama arka uçlarını destekler. Büyük veri hacimlerini yönetirken, birden fazla depolama cihazı kullanmak yaygındır.
DigitalOcean Spaces, ClickHouse katmanlı depolama mimarisine katman olarak entegre edilebilen bir nesne depolama hizmetidir. Bu kılavuz, DigitalOcean Spaces'ı ClickHouse kümeniz için katmanlı bir depolama seçeneği olarak yapılandırma adımlarında size yol gösterecektir.
Bu kılavuzda, toplu günlükleri ClickHouse'a gönderen basit bir Go uygulaması kuracağız. Günlükler önce sıcak depolamada (varsayılan disk, yerel olarak da bilinir) depolanacak ve ardından belirli bir zaman aralığından (2 dakika) sonra soğuk depolamaya (örneğin, DO Spaces gibi S3 tabanlı depolama) taşınacaktır.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
- DigitalOcean'da bir Bulut hesabı.
- Bir DigitalOcean Spaces kovası.
- DigitalOcean Spaces'a erişim anahtarları.
- ClickHouse yapılandırmaları ve nesne depolamasına ilişkin temel giriş.
Adım 1 — Bir DigitalOcean Alanı oluşturun ve yapılandırın
DigitalOcean Cloud hesabınıza giriş yapın ve yeni bir alan (kova) oluşturun. Bu kova, nadiren erişilen veriler için katmanlı depolama alanı olarak kullanılacaktır.
- Gösterge tablosunun Spaces bölümüne gidin.
- “Yeni Alan Oluştur”a tıklayın, bir ad girin, bir bölge seçin ve izinleri ayarlayın.
- Son Nokta URL'sine dikkat edin.
- Erişim anahtarını ve gizli anahtarı bir yere not edin, çünkü bunlara bir sonraki adımlarda ihtiyacınız olacak.
Bu noktada, kovanız oluşturulmuş ve ClickHouse ile entegre olmaya hazırdır.
Adım 2 — ClickHouse sunucusunu bir Docker konteynerinde kurma
Başlamak için bir klasör oluşturun ve adını “clickhouse” koyun.
mkdir clickhouseBu klasörde bir Dockerfile oluşturun ve {YOUR_AWS_ACCESS_KEY_ID} ve {YOUR_AWS_SECRET_ACCESS_KEY} değerlerini erişim anahtarınız ve gizli anahtarınızla değiştirin.
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"]Tanım:
- access_key_id ve secret_access_key: Bunlar DigitalOcean Spaces için kimlik bilgilerinizdir.
Uyarı: Bu kılavuzda basitlik sağlamak amacıyla kimlik bilgilerini Dockerfile'a ekledik, ancak bu yaklaşım üretim ortamlarında önerilmez.
Adım 3 — ClickHouse'u S3 uyumlu depolama için yapılandırın
Bu adımda, ClickHouse'u depolama sisteminizde bir katman olarak DigitalOcean Spaces kullanacak şekilde yapılandıracaksınız. Bu, depolama yapılandırmasını ClickHouse kurulumunuzdaki config.xml dosyasına eklemeyi içerir.
Spaces kovasını depolama diski olarak kullanmak için, önce ClickHouse yapılandırma dosyasında bildirmeniz gerekir. Mevcut config.xml dosyasını değiştirebilir veya tercihen conf.d klasörüne daha sonra config.xml ile birleştirilecek yeni bir dosya ekleyebilirsiniz.
<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>Bu bölüm, ClickHouse'un nadiren erişilebilen verileri depolamak için kullanabileceği uzak bir diski (DigitalOcean Space) yapılandırır.
Not: {YOUR_S3_SPACES_BUCKET_URL} değerlerini uç nokta URL'niz ile değiştirin.
Adım 4 — Katmanlı depolamaya sahip bir tablo oluşturun
Şimdi, ClickHouse'da katmanlı depolama kullanan bir tablo oluşturun. Hangi verilerin yerel disklerde, hangilerinin uzak disklerde (Spaces) depolanacağını belirlemek için birden fazla depolama politikası belirleyebilirsiniz.
Belirli bir süre sonra eski verileri DigitalOcean Spaces'e taşıyan bir saklama politikası tanımlayın:
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';Tanım:
- Varsayılan: Bu, son veya sık kullanılan verilerin depolandığı yerel disk depolama alanıdır.
- s3: eski verilerin taşındığı uzak depolama alanıdır (DigitalOcean Spaces).
Bu yapılandırma, yeni verilerin yerel diske yazılmasını ve eski verilerin otomatik olarak DigitalOcean Spaces'e aktarılmasını sağlar.
Adım 5 — ClickHouse Sunucusunu Çalıştırın
ClickHouse sunucusunu başlatmak için aşağıdaki komutu çalıştırın:
docker build -t clickhouse-demo .
docker run -d --name clickhouse-demo -p 8123:8123 -p 9000:9000 clickhouse-demoAğ bağlantı noktaları
- 8123: Bu, ClickHouse ile HTTP arayüzü üzerinden iletişim kurmak için kullanılan HTTP bağlantı noktasıdır. (http://localhost:8123/play). Bu bağlantı noktasını, bir tarayıcı veya curl ya da Postman gibi komut satırı araçları aracılığıyla SQL sorguları çalıştırmak için kullanabilirsiniz. Genellikle ClickHouse ile HTTP üzerinden etkileşim kuran web uygulamaları veya istemciler için kullanılır.
- 9000: Bu TCP portu, ClickHouse istemcilerinin ve sunucularının ana ClickHouse protokolünü kullanarak birbirleriyle iletişim kurmaları için kullanılan ana porttur.
- Kaynak: https://clickhouse.com/docs/en/guides/sre/network-ports
Şunu kullanarak doğrulayın:
docker ps
Adım 6 — Günlükleri gönderen basit bir Go programı çalıştırın
Yeni bir klasörde, şu adlı bir dosya: ana.git ClickHouse'a günlükleri gönderen bir tane oluşturun.
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.")
}Paket bağımlılıklarını yüklemek için:
go mod init example.com/clickhouse-logging
go get github.com/ClickHouse/clickhouse-go
go get github.com/sirupsen/logrusUygulamayı çalıştırmak için:
go run main.goAdım 7 — Sonuçları onaylayın
ClickHouse istemcisini başlatmak için aşağıdaki komutu çalıştırın:
docker exec -it clickhouse-demo clickhouse-clientClickHouse kümesindeki günlükleri doğrulamak için:
SELECT * FROM tiered_logsBu günlük girişi için depolama diskini incelediğimizde, bunun varsayılan (yerel) diskte (sıcak depolama olarak da bilinir) depolandığını görüyoruz.
SELECT name, disk_name FROM system.parts WHERE table = 'tiered_logs';
CREATE TABLE sorgusunda belirtilen iki dakikalık aralıktan sonra, bu raporların S3 disklerine (uzak kova/alan) - soğuk depolama olarak da adlandırılır - taşındığını kontrol edebilirsiniz.
Ayrıca DigitalOcean Cloud kullanıcı arayüzünde kovamızın artık veri içerdiğini görebiliriz:
Sonuç
Bu kılavuzu izleyerek, DigitalOcean Spaces'ı ClickHouse için kademeli bir depolama seçeneği olarak başarıyla yapılandırdınız. Bu yapılandırma, aktif veriler için yüksek performanslı depolama sağlarken, seyrek erişilen verileri uygun maliyetli nesne depolamasına taşıyarak depolama maliyetlerini optimize etmenize ve performansı artırmanıza olanak tanır.























