Anasayfa » ClickHouse Replicated Cluster ve CHProxy Kurulumu

ClickHouse Replicated Cluster ve CHProxy Kurulumu

Bu yazımda, Redhat tabanlı Rocky Linux üzerinde 3 node’lu ClickHouse Replicated Cluster Kurulumu ve CHProxy yapılandırması nı adım adım anlatacağım. Daha önceki yazımda clickhouse cluster mimarileri hakkında detaylı bilgiler vermiştim okumak için linke tıklayınız.

Clickhouse Replicated Cluster

Yukarıdaki görselde belirttiğim gibi 4 sunucu üzerinde işlemler yapılacaktır. 3 sunucu database, 1 sunuda chproxy için kullanılacaktır. IP ve hostname bilgileri yukarıdaki şekildeki gibi olup kurulum aşamalarında hostname kullanılacaktır.

Sunucu IP ve Hostname Bilgileri:

IP AdresiSunucu AdıRol
192.168.26.111clickhouse1ClickHouse Node 1
192.168.26.112clickhouse2ClickHouse Node 2
192.168.26.113clickhouse3ClickHouse Node 3
192.168.26.104chproxyCHProxy Sunucusu

/etc/hosts Dosyalarını Düzenleme

Tüm sunucularda /etc/hosts dosyasına aşağıdaki satırları ekliyoruz:

192.168.26.111 clickhouse1
192.168.26.112 clickhouse2
192.168.26.113 clickhouse3
192.168.26.104 chproxy

Repo ve gerekli paketlerin kurulması

Her bir ClickHouse node’unda (111, 112, 113) aşağıdaki paketlerini kurup ve repo yu ekliyoruz:

sudo yum install -y yum-utils
sudo curl -o /etc/yum.repos.d/clickhouse.repo https://packages.clickhouse.com/rpm/clickhouse.repo
sudo dnf clean all
sudo dnf makecache

Clickhouse ve Client kurulumu

Database sunucularında (clickhouse1,clickhouse2,clickhouse3) aşağıdaki gibi clickhouse-server ve client kurulumunu yapıyoruz:

sudo dnf install -y clickhouse-server clickhouse-client

Data dizini oluşturma:

Database sunucularında (clickhouse1,clickhouse2,clickhouse3) data dizini oluşturulup owner verilir. Veri tabanı data verilerini bu dizinine yönlendireceğiz.

mkdir -p /ch_data/
chown -R clickhouse:clickhouse /ch_data

Clickhouse parametre dosyalarının düzenlenmesi:

Clickhouse da parametreler xml formatındaki dosyalar içerisinde yazılmaktadır. Bu xml dosyaları /etc/clickhouse-server/ dizininin altındaki config.xml de veya /etc/clickhouse-server/config.d nin altına yer alır. Yönetimsel olarak daha esnek olduğu için /etc/clickhouse-server/config.d dizinine configleri yazacağız. Config.d dosyasına oluşturacağımız bazı xml dosyaları ve açıklamaları aşağıda verilmiştir.(3 database sunumuzda da aşağıdaki xml dosyaları oluşturulur.)

  • datapath.xml :

Data dizinini yazacağımız config dosyasıdır. Database dosyalarını yazması için /ch_data/ dizini oluşturmuştuk. Bu paramereyi aşağıdaki gibi set ediyoruz.

vi /etc/clickhouse-server/config.d/datapath.xml
<clickhouse>
    <custom_cached_disks_base_directory>/ch_data/caches/</custom_cached_disks_base_directory>
    <path>/ch_data/clickhouse/</path>
    <metadata_path>/ch_data/clickhouse/disks/blob_storage_disk/</metadata_path>
    <tmp_path>/ch_data/tmp/</tmp_path>
    <user_files_path>/ch_data/user_files/</user_files_path>
    <path>/ch_data/access/</path>
    <format_schema_path>/ch_data/format_schemas/</format_schema_path>
</clickhouse>
  • enable-keeper.xml :

Replicated Cluster da leader yönetimi için Keeper kullanılması gerekiyor. Clickhouse-server kurulumu ile Clickhouse-Keeper servisi defaultta gelmektedir. Bizde defaultta gelen chkeeper ‘ı kullanacağız. Alternatif olarak Zookeeper kullanılabilir.

vi /etc/clickhouse-server/config.d/enable-keeper.xml
<clickhouse>
  <keeper_server>
    <tcp_port>9181</tcp_port>
    <server_id>1</server_id>
    <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
    <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>

    <coordination_settings>
        <operation_timeout_ms>10000</operation_timeout_ms>
        <session_timeout_ms>30000</session_timeout_ms>
        <raft_logs_level>trace</raft_logs_level>
    </coordination_settings>

    <raft_configuration>
        <server>
            <id>1</id>
            <hostname>clickhousedb01</hostname>
            <port>9234</port>
        </server>
        <server>
            <id>2</id>
            <hostname>clickhousedb02</hostname>
            <port>9234</port>
        </server>
        <server>
            <id>3</id>
            <hostname>clickhousedb03</hostname>
            <port>9234</port>
        </server>
    </raft_configuration>
  </keeper_server>
</clickhouse>
  • macros.xml :

Birden fazla sunucu (node) olan bir ClickHouse cluster’da, her sunucuda farklı node adı veya shard numarası olabilir. Bunları her defasında elle yazmak yerine, değişken gibi tanımlayıp otomatik kullanılmasını sağlıyoruz. Cluster da engine kullanarak tablo oluşturacağımızda shard ismi vermemiz gerekiyor. Her defasında manuel yazmak yerine macros ile değişken gibi tanımlıyoruz.

vi /etc/clickhouse-server/config.d/macros.xml
<clickhouse>
    <macros>
        <shard>1</shard>
        <replica>chdb_01</replica>
    </macros>
</clickhouse>
  • network-and-logging.xml

Logları hangi dizine ve dosyaya yazacağını ve dış networklerden bağlantı sağlayabilmesi için ayarlamaları yapıyoruz. Database port bilgisini de buradan değiştirebilirsiniz.

vi /etc/clickhouse-server/config.d/network-and-logging.xml
<clickhouse>
    <logger>
        <level>debug</level>
        <log>/ch_data/log/clickhouse-server/clickhouse-server.log</log>
        <errorlog>/ch_data/log/clickhouse-server/clickhouse-server.err.log</errorlog>
        <size>1000M</size>
        <count>3</count>
    </logger>
    <display_name>clickhouse</display_name>
    <listen_host>0.0.0.0</listen_host>
    <http_port>8123</http_port>
    <tcp_port>9000</tcp_port>
    <interserver_http_port>9009</interserver_http_port>
</clickhouse>
  • remote-servers.xml

Bu dosyamızda cluster adı ve cluster da bulunan diğer node larımız la ilgili bilgileri giriyoruz. Cluster adını mgch_cluster olarak gireceğim siz kendinize göre değiştirebilirsiniz.

vi /etc/clickhouse-server/config.d/remote-servers.xml
<clickhouse>
  <remote_servers replace="true">
    <mgch_cluster>
    <secret>mysecretphrase</secret>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>clickhouse1</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>clickhouse2</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>clickhouse3</host>
                <port>9000</port>
            </replica>
        </shard>
    </mgch_cluster>
  </remote_servers>
</clickhouse>

Oluşturduğumuz bu xml dosyalarının owner ve group clickhouse yapıyoruz.

cd /etc/clickhouse-server/config.d/
chown  clickhouse:clickhouse *
  • ClickHouse Sunucularını Başlatma:

Kurulum ve konfigurasyonlarımız bitti her bir node’da veri tabanı servisini başlatıyoruz:

systemctl start clickhouse-server.service

Veri Tabanına bağlanıp cluster durumunu kontrol ediyoruz.

[root@clickhouse1 ~]# clickhouse-client 
ClickHouse client version 25.3.2.39 (official build).
Connecting to localhost:9000 as user default.
Password for user (default): 
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 25.3.2.

Warnings:
 * Available memory at server startup is too low (2GiB).
 * Maximum number of threads is lower than 30000. There could be problems with handling a lot of simultaneous queries.
 * Linux transparent hugepages are set to "always". Check /sys/kernel/mm/transparent_hugepage/enabled
 * Linux threads max count is too low. Check /proc/sys/kernel/threads-max
clickhouse1 :) select * from system.clusters;

SELECT *
FROM system.clusters

Query id: 82eab29e-1a58-4ee3-afd2-deaf796f058a

Row 1:
──────
cluster:                 mgch_cluster
shard_num:               1
shard_name:              
shard_weight:            1
internal_replication:    1
replica_num:             1
host_name:               clickhouse1
host_address:            192.168.26.111
port:                    9000
is_local:                1
user:                    default
default_database:        
errors_count:            0
slowdowns_count:         0
estimated_recovery_time: 0
database_shard_name:     
database_replica_name:   
is_active:               ᴺᵁᴸᴸ
replication_lag:         ᴺᵁᴸᴸ
recovery_time:           ᴺᵁᴸᴸ
.
.
.

Cluster da database ve tablo oluşturup cluster da replice olup olmadığını kontrol ediyoruz. Herhangi bir obje oluşturacağımız zaman on cluster kullanmamız gerekiyor eğer yazmazsak sadece bağlı olduğumuz node da objeyi oluşturur.

CREATE DATABASE test1 ON CLUSTER mgch_cluster;

CREATE TABLE test1.test_table2 ON CLUSTER mgch_cluster
(
    id UInt64,
    name String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_table2', '{replica}')
ORDER BY id;

INSERT INTO test1.test_table2(id, name) VALUES
(10, 'Ali'),
(11, 'Ahmet'),
(12, 'Ayşe');

SELECT * FROM test1.test_table2;

CHProxy Kurulumu ve Config:

CHProxy , ClickHouse istemcilerinin birden fazla sunucuya tek bir giriş noktasından bağlanmasını sağlar. HTTP proxy olarak çalışır (ClickHouse’un HTTP API’sini kullanır). Bağlantıları yönetir ve sorgu önbellekleme yapabilir. Kullanıcı erişim kontrolü sağlar (yetkilendirme, rate limiting).

Alternatif olarak HAProxy , Nginx kullanılabilir. Bu üçü için aşağıdaki gibi bir karşılaştırma yapabiliriz.

  • HAProxy ve Nginx gibi genel amaçlı çözümlerden farklı olarak ClickHouse için özel olarak optimize edilmiştir.

CHProxy Kurulumu (192.168.26.104)

Chproxy sunucumuzda aşağıdaki adımlarla kurulumu yapıyoruz.

wget https://github.com/ContentSquare/chproxy/releases/download/v1.27.1/chproxy_1.27.1_linux_amd64.tar.gz
tar -xvf chproxy_1.27.1_linux_amd64.tar.gz
mv chproxy /usr/local/bin/
chmod +x /usr/local/bin/chproxy

Konfigürasyon Dosyasını Oluşturma

config.yml dosyasını oluşturup cluster ismi, nodes, kullanıcı, port bilgilerini,query cache, pooling gibi bilgileri bu yml dosyasına girebiliriz. Biz default olarak aşağıdaki gibi oluşturuyoruz.

mkdir /etc/chproxy
vi /etc/chproxy/config.yml
server:
  http:
    listen_addr: ":9090"
    allowed_networks: ["127.0.0.0/24", "192.168.26.1/24"]

clusters:
  - name: "mgch_cluster"
    nodes: [
      "clickhouse1:8123",
      "clickhouse2:8123",
      "clickhouse3:8123"
    ]
    users:
      - name: "default"
        password: ""
        max_concurrent_queries: 4
        max_execution_time: 1m

users:
  - name: "chproxy_user"
    password: "clickhouse"
    to_cluster: "mgch_cluster"
    to_user: "default"
    max_concurrent_queries: 2
    requests_per_minute: 100

Systemd Servis Oluşturma

Aşağıdaki gibi chproxy servisi oluşturuyoruz.

vi /etc/systemd/system/chproxy.service
[Unit]
Description=CHProxy Service
After=network.target

[Service]
Type=simple
User=nobody
ExecStart=/usr/local/bin/chproxy -config=/etc/chproxy/config.yml
Restart=always

[Install]
WantedBy=multi-user.target

Chproxy servisinin başlatılması

Oluşturduğumuz servisin çalışması için reload, start ve enable yapıyoruz.

systemctl daemon-reload
systemctl start chproxy.service
systemctl enable chproxy.service
systemctl status chproxy.service

Bu yazımızda ClickHouse Replicated Cluster kurulumu ve CHProxy yapılandırması adımlarını tamamladık. Replikasyonunun doğru çalıştığını test edebilir ve CHProxy üzerinden sorgularınızı dağıtabilirsiniz. Bu yapı, yüksek erişilebilirlik ve yük dengeleme açısından oldukça avantajlıdır.

Clickhouse resmi dokümantasyon için tıklayınız.

Chproxy resmi dokümantasyon için tıklayınız.

More Reading

Post navigation

1 Comment

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir