ClickHouse Nedir? Gerçek Zamanlı Analitik için Işık Hızında, Sütun Tabanlı Veritabanı

YUNUS EMRE ATAY

clickHouse

ClickHouse, Yandex tarafından geliştirilmiş, gerçek zamanlı analitik (OLAP) iş yükleri için tasarlanmış açık kaynaklı, kolonsal bir veritabanı yönetim sistemidir (DBMS). Adını “Click” (Tıklama) ve “House” (Ambar) kelimelerinden alır; temel olarak web analitiği ve büyük veri kümelerinde milisaniyeler içinde sorgu sonuçları döndürmek için tasarlanmıştır.


ClickHouse’un Önemli Özellikleri

  • Kolonsal Depolama (Columnar Storage): Geleneksel satır tabanlı veritabanlarının aksine, ClickHouse verileri sütunlar halinde depolar. Bu yapı, analitik sorgularda (yalnızca belirli sütunlara erişildiğinde) I/O miktarını önemli ölçüde azaltır ve yüksek sıkıştırma oranları sağlar.
  • Yüksek Performans: Saniyede milyarlarca satırı işleyebilme kapasitesine sahiptir. Vektörel sorgu yürütme motoru ve modern CPU mimarilerine uyumlu yapısı sayesinde benzersiz bir hız sunar.
  • Ölçeklenebilirlik (Scalability): Yatay olarak kolayca ölçeklenebilir. Sharding (parçalama) ve çoğaltma (replication) özellikleri, çok büyük veri setlerinin dağıtık bir kümede yönetilmesine olanak tanır.
  • Gerçek Zamanlı Analitik: Veri yazılır yazılmaz sorgulanabilir, bu da anlık gösterge tabloları (dashboards) ve gerçek zamanlı iş zekası (BI) uygulamaları için idealdir.


Adım Adım ClickHouse Kurulumu (Linux Tabanlı)

ClickHouse’un resmi repolarından RHEL/CentOS için gerekli olan üç ana paketi indirmeniz gerekmektedir:

  • clickhouse-client: Sunucuya bağlanmak için kullanılan komut satırı istemcisini içerir.
  • clickhouse-common-static: Ana ClickHouse ikililerini ve statik kütüphaneleri içerir.
  • clickhouse-server: Sunucu bileşenlerini, yapılandırma dosyalarını ve servis birimlerini içerir.

İndirilen RPM’lerin Kurulması:

rpm -ivh clickhouse-common-static-23.11.2.11.x86_64.rpm
rpm -ivh clickhouse-server-23.11.2.11.x86_64.rpm
rpm -ivh cclickhouse-client-23.11.2.11.x86_64.rpm

Kurulum başarılı olduktan sonra, ClickHouse servisini başlatın ve sistem başlangıcında açılması için etkinleştirin:

# Servisi başlatın
sudo systemctl start clickhouse-server

# Servisin sistem başlangıcında otomatik başlamasını sağlayın
sudo systemctl enable clickhouse-server

# Servis durumunu kontrol edin
sudo systemctl status clickhouse-server

Kurulum tamamlandıktan sonra, ClickHouse istemcisi ile sunucuya bağlanabilirsiniz:

clickhouse-client

⚙️ ClickHouse Optimizasyonu: Başlangıç Ayarları

Kurulum tamamlandıktan sonra, ClickHouse sunucusunun performanslı ve güvenli çalışması için bazı temel konfigürasyonları düzenlemek önemlidir. Bu ayarlar, genellikle /etc/clickhouse-server/config.xml ve /etc/clickhouse-server/users.xml dosyalarında yapılır. Öncelikle clickhouse kullanıcısına bir şifre atayalım.

passwd clickhouse
Changing password for user clickhouse.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

2 Ayrı config dosyamız var. Bu izinler, bu dosyaları düzenlemek için yeterli değil. Değişiklikleri yapmak için gerekli yetkileri verelim.

  • /etc/clickhouse-server/config.xml (Sunucu Genel Ayarları)
  • /etc/clickhouse-server/users.xml (Kullanıcı ve Kaynak Kısıtlamaları)
ll /etc/clickhouse-server/config.xml 
-r-------- 1 clickhouse clickhouse 77938 Dec 13  2023 /etc/clickhouse-server/config.xml


ll /etc/clickhouse-server/users.xml
-r-------- 1 clickhouse clickhouse 5672 Dec 13  2023 /etc/clickhouse-server/users.xml

chmod 660 /etc/clickhouse-server/config.xml
chmod 660 /etc/clickhouse-server/users.xml

1. Ağ Erişimi (Config.xml)

Varsayılan olarak ClickHouse, yalnızca yerel bağlantılara (localhost) izin verir. Eğer sunucuya uzaktan erişim (örneğin bir BI aracı veya başka bir sunucudan) sağlamak istiyorsanız, bu ayarı değiştirmeniz gerekir.

Değiştirilecek Dosya: /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

Açıklama: 0.0.0.0 olarak ayarlamak, ClickHouse’un tüm ağ arayüzlerinden gelen bağlantıları dinlemesini sağlar. Eğer yalnızca belirli bir IP’den erişime izin vermek istiyorsanız, o IP adresini buraya yazmalısınız. Güvenlik için, bu değişikliği yaptıktan sonra sunucunuzun güvenlik duvarını (firewall) (varsayılan portlar: 8123 HTTP, 9000 TCP) doğru yapılandırdığınızdan emin olun.

2. İstemci/Kullanıcı Ayarları (Users.xml)

Varsayılan default kullanıcısı, testler için uygun olsa da, gerçek uygulamalarda özel kullanıcılar oluşturulması güvenlik açısından şarttır.

A. Varsayılan (Default) Kullanıcının Şifresini Değiştirme

default kullanıcısı başlangıçta şifresizdir ve tüm yerel erişime sahiptir. Bu durumu düzeltmek için:

Değiştirilecek Dosya: /etc/clickhouse-server/users.xml

<users>
    <default>
        <profile>default</profile>
        <networks>
            <ip>::/0</ip> 
        </networks>
        <password>YENI_VE_GUCLU_PAROLANIZ</password>
        
        </default>
</users>

Uyarı: Şifreyi değiştirdikten sonra, bundan böyle clickhouse-client ile bağlanırken şifrenizi belirtmeniz gerekecektir: clickhouse-client --user default --password YENI_VE_GUCLU_PAROLANIZ

B. Yeni Bir Uygulama Kullanıcısı Ekleme

Üretim ortamlarında default kullanıcısını kullanmak yerine, her uygulama veya servis için özel yetkilendirilmiş bir kullanıcı oluşturmak daha güvenlidir.

Aynı /etc/clickhouse-server/users.xml dosyasına <default> bloğunun hemen altına yeni bir kullanıcı bloğu ekleyin.

Değiştirilecek Dosya: /etc/clickhouse-server/users.xml

<users>
    <default>
...
    </default>
    
    <emre_user>
        <profile>readonly</profile>

        <password>emre1234</password>

        <networks>
            <ip>::/0</ip>
        </networks>

        <quota>default</quota>
    </emre_user>

3. Bellek Sınırları (Users.xml – Profile Ayarları)

Analitik sorgular çok fazla RAM tüketebilir. Kullanıcı veya profil bazında sorgu başına bellek sınırlarını ayarlamak, tek bir hatalı veya çok karmaşık sorgunun tüm sunucuyu çökertmesini engeller.

Değiştirilecek Dosya: /etc/clickhouse-server/users.xml

<profiles>
    <default>
        <max_memory_usage>10000000000</max_memory_usage
        <max_rows_to_read>1000000000</max_rows_to_read>
    </default>
</profiles>

4. Disk Yolunun Tanımlanması

Veri ve metadata için ayrı diskler kullanıyorsanız veya varsayılan yer yerine daha büyük bir diski kullanmak istiyorsanız, bu parametreleri belirtmelisiniz.

<path> : Veri (data) dosyalarının saklanacağı ana dizin. Yüksek hızlı SSD kullanılması önerilir.

<tmp_path> : Büyük sorguların geçici dosyalarının tutulduğu dizin. Yetersiz bellek durumunda buraya yazılır

Dosya: /etc/clickhouse-server/config.xml

<path>/var/lib/clickhouse/</path> 

<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>

5. Loglama

ClickHouse, farklı amaçlar için birden fazla log dosyası kullanır. Bu log dosyalarının konumu, boyutu ve detay seviyesi (config.xml dosyasındaki <logger> bloğunda) özelleştirilebilir.

Dosya: /etc/clickhouse-server/config.xml

</logger>
        <level>trace</level>
        <log>/var/log/clickhouse-server/log</log>
        <errorlog>/var/log/clickhouse-server/err_log</errorlog>
        <size>1000M</size>
        <count>10</count>
</logger>
ParametreAçıklamaÖnerilen DeğerKullanım Amacı
<level>Loglama seviyesi. Hangi önemdeki mesajların loglanacağını belirler.information (Üretim)Hata ayıklama (debug veya trace) ve üretim (information, warning, error) arasında seçim.
<log>Ana sunucu olaylarının (başlatma, durdurma, genel bilgiler) kaydedildiği dosya yolu./var/log/clickhouse-server/clickhouse.logSunucu durumunu takip etme.
<errorlog>Yalnızca kritik hata mesajlarının (error seviyesinde) kaydedildiği dosya yolu./var/log/clickhouse-server/clickhouse.err.logSorun giderme ve kritik hataları izleme.
<size>Her bir log dosyasının diskte kaplayacağı maksimum boyut. Bu sınıra ulaşıldığında log rotasyonu başlar.100MDisk alanı yönetimini sağlamak.
<count>Tutulacak log dosyası sayısı. (Örn: clickhouse.log.1, clickhouse.log.2…).10Geçmiş olayları makul bir süre saklamak.

Log seviyeleri, önem sırasına göre (en az önemli olandan en kritik olana) şu şekildedir:

1. trace (İzleme)

  • Önem: En Düşük.
  • İçerik: Çok fazla detay içerir; neredeyse her fonksiyon çağrısı, iç döngü ve düşük seviyeli operasyonun kaydını tutar.
  • Kullanım Alanı: Çok derinlemesine hata ayıklama ve geliştiriciler tarafından spesifik bir yazılım hatasının kaynağını bulma.
  • Uyarı: Üretim (Production) ortamlarında KESİNLİKLE kullanılmamalıdır, çünkü çok büyük log dosyaları oluşturur ve performansı ciddi ölçüde düşürür.

2. debug (Hata Ayıklama)

  • Önem: Düşük.
  • İçerik: Uygulama akışı ve durum değişiklikleri hakkında detaylı bilgiler.
  • Kullanım Alanı: Geliştirme veya test ortamlarında, bir özelliğin veya entegrasyonun beklenen şekilde çalışıp çalışmadığını anlamak için kullanılır.

3. information (Bilgilendirme)

  • Önem: Orta (Genel Üretim Seviyesi).
  • İçerik: Sunucu başlangıcı/durdurulması, bağlantı bilgileri, uzun süren sorgular (sorgu süreleri) ve genel sistem olayları gibi önemli durum güncellemelerini içerir.
  • Kullanım Alanı: Standart üretim ortamları için önerilen seviyedir. Sunucu sağlığını ve genel sorgu trafiğini izlemek için yeterli bilgiyi sağlar.

4. warning (Uyarı)

  • Önem: Yüksek.
  • İçerik: Kritik olmayan, ancak gelecekte sorun çıkarabilecek potansiyel sorunlara işaret eden mesajlar. Örneğin, yavaş çalışan sorguların zaman aşımına yaklaşması, bazı konfigürasyon sorunları.
  • Kullanım Alanı: Kritik durumların önlenmesi ve proaktif sistem bakımı için önemlidir.

5. error (Hata)

  • Önem: En Yüksek (Kritik).
  • İçerik: Uygulamanın çalışmasını doğrudan etkileyen ve acil müdahale gerektiren ciddi hatalar (örneğin disk I/O hataları, veritabanı kilitlenmeleri, servis başlatma hataları).
  • Kullanım Alanı: Sunucunun kararlılığını sağlamak için mutlaka izlenmesi gereken kritik sorunlardır.


ClickHouse İstemcisine Bağlanma ve İlk Tabloyu Oluşturma

Bu bölümde, RPM paketleriyle kurduğunuz ClickHouse sunucusuna, belirlediğiniz kullanıcı adı ve şifre ile bağlanma ve temel bir veri yapısı oluşturma adımlarını göreceksiniz.

1. ClickHouse İstemcisine Bağlanma

users.xml dosyasında varsayılan kullanıcı (default) için bir parola belirlediğiniz için, artık istemciyi başlatırken kullanıcı adı ve parolayı belirtmelisiniz.

# default kullanıcısı ve belirlediğiniz şifre ile bağlanın (Örn: 12345678)
clickhouse-client --user default --password 12345678

2. Yeni Bir Veritabanı Oluşturma

Analitik verilerimizi izole etmek için bir veritabanı oluşturalım.

:) CREATE DATABASE web_analytics;

CREATE DATABASE web_analytics

Ok.

:) USE web_analytics;

USE web_analytics

Ok.

3. Tablo Oluşturma (MergeTree Motoru Kullanarak)

ClickHouse’un kalbi, analitik sorgular için tasarlanmış depolama motoru olan MergeTree motorudur. Bu motor, yüksek sıkıştırma, sıralı depolama ve hızlı veri okuma sağlar.

:) CREATE TABLE page_views (
    event_time DateTime,          -- Ziyaretin tam zamanı
    user_id UInt32,               -- Ziyaretçinin benzersiz ID'si
    session_id UUID,              -- Oturum ID'si
    page_url LowCardinality(String), -- Ziyaret edilen sayfa (Tekrarlayan String'ler için optimize)
    visit_duration_sec UInt16     -- Sayfada geçirilen süre (saniye)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_time)   -- Verileri aya göre bölümlendir (Partitioning)
ORDER BY (user_id, event_time)      -- Verileri bu sütunlara göre diskte sırala (Sorting Key)
SETTINGS index_granularity = 8192;  -- MergeTree'nin temel ayarı

4. Veri Ekleme (INSERT)

Şimdi oluşturduğumuz tabloya örnek veriler ekleyelim:

:) INSERT INTO page_views VALUES 
    ('2025-12-07 20:00:00', 1001, generateUUIDv4(), '/anasayfa', 45),
    ('2025-12-07 20:05:30', 1002, generateUUIDv4(), '/urunler/42', 120),
    ('2025-12-07 20:07:15', 1001, generateUUIDv4(), '/hakkimizda', 15);

INSERT INTO page_views

Ok. 3 rows in set.

5. Basit Analitik Sorgu (SELECT)

Eklediğiniz veriler üzerinde basit bir analitik sorgu çalıştıralım:

:) SELECT 
    user_id, 
    count() AS total_visits, 
    avg(visit_duration_sec) AS avg_time_sec
FROM page_views 
GROUP BY user_id 
ORDER BY total_visits DESC;

Sorgu Sonucu:

Query id: d72e2978-f6d2-449e-b5b5-0b3e7e11c592

┌─user_id─┬─total_visits─┬─avg_time_sec─┐
│    1001 │            2 │           30 │
│    1002 │            1 │          120 │
└─────────┴──────────────┴──────────────┘

2 rows in set. Elapsed: 0.002 sec.

%s için bir yanıt yazın

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

Hey!

Merhaba! Ben EMRE, teknoloji, yazılım veri tabanı ve veri analitiği alanlarına tutkuluyum. Bu blogda, öğrendiklerimi ve tecrübelerimi paylaşarak faydalı içerikler sunmayı hedefliyorum. Boş zamanlarımda yeni teknolojiler keşfetmeyi, yazmayı ve kendimi geliştirmeyi seviyorum.

ıletısım adreslerım