ClickHouse’u CentOS 7 Üzerine Kurulumu ve Kullanımı
Giriş
Büyük veri analizi ve gerçek zamanlı raporlama günümüz iş dünyasının vazgeçilmez bir parçası haline gelmiştir. Bu ihtiyaçları karşılamak için geliştirilen birçok veritabanı çözümü arasında ClickHouse, yüksek performanslı, sütun tabanlı ve açık kaynaklı bir OLAP (Online Analytical Processing) veritabanı yönetim sistemi olarak öne çıkmaktadır. Yandex tarafından geliştirilen ClickHouse, petabaytlarca veriyi milisaniyeler içinde sorgulama yeteneği ile bilinir. Bu makalede, ClickHouse’un ne olduğunu, temel özelliklerini ve CentOS 7 işletim sistemi üzerine nasıl kurulup kullanılacağını adım adım ayrıntılı bir şekilde inceleyeceğiz.
ClickHouse’un temel özellikleri şunlardır:
* Sütun Tabanlı Depolama: Verileri satır yerine sütun bazında depolar. Bu, analitik sorgularda yalnızca ilgili sütunların okunmasını sağlayarak I/O performansını büyük ölçüde artırır.
* Yüksek Performans: Gelişmiş sıkıştırma algoritmaları, vektörel sorgu işleme, paralelleştirme ve disk I/O optimizasyonları sayesinde çok büyük veri kümeleri üzerinde bile inanılmaz hızlarda sorgu yanıtları sunar.
* Ölçeklenebilirlik: Yatayda ölçeklenebilir bir mimariye sahiptir. Verileri birden fazla sunucuya dağıtarak (sharding) ve replikasyon ile yüksek erişilebilirlik sağlayarak büyüyen veri hacimlerine kolayca uyum sağlar.
* SQL Desteği: Standart SQL benzeri bir sorgu dili kullanır, bu da mevcut SQL bilgisine sahip geliştiricilerin ve analistlerin ClickHouse’u kolayca öğrenmesini ve kullanmasını sağlar.
* Gerçek Zamanlı Analiz: Veri yazma hızları da oldukça yüksektir, bu da sürekli akan veriler üzerinde gerçek zamanlı analiz yapılmasına olanak tanır.
* Açık Kaynak: Apache 2.0 lisansı altında açık kaynaklıdır, bu da topluluk desteği ve esnek kullanım imkanları sunar.
ClickHouse genellikle web analizi, IoT veri analizi, finansal verilerin analizi, ağ izleme, uygulama performansı izleme ve iş zekası raporlama gibi senaryolarda kullanılır. CentOS 7 ise sunucu ortamlarında yaygın olarak kullanılan, kararlı ve güvenilir bir Linux dağıtımıdır. Bu kombinasyon, güçlü bir analitik altyapı oluşturmak için ideal bir temel sunar.
Ön Gereksinimler ve Sistem Hazırlığı
ClickHouse kurulumuna başlamadan önce CentOS 7 sistemimizin belirli gereksinimleri karşıladığından ve bazı temel hazırlıkların yapıldığından emin olmalıyız.
Sistem Güncellemesi
Sisteminizi güncel tutmak, güvenlik açıklarını kapatmak ve en son paket sürümlerine sahip olmak için her zaman iyi bir uygulamadır.
sudo yum update -y
sudo yum install -y epel-release # Bazı ek araçlar için gerekli olabilir
SELinux ve Firewall Ayarları
ClickHouse’un düzgün çalışabilmesi için SELinux ve güvenlik duvarı ayarlarının yapılması gerekebilir. Genellikle SELinux’u devre dışı bırakmak veya izin verici moda almak, kurulumu basitleştirir. Güvenlik duvarının ise ClickHouse’un kullandığı portları açması gerekir.
SELinux’u Devre Dışı Bırakma (Önerilir)
SELinux’u anlık olarak devre dışı bırakmak için:
sudo setenforce 0
Sistem yeniden başlatıldığında da geçerli olması için /etc/selinux/config dosyasını düzenleyin:
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
Bu değişikliğin tam olarak etkinleşmesi için sunucuyu yeniden başlatmanız gerekebilir. Ancak test ortamları için setenforce 0 genellikle yeterlidir. Üretim ortamlarında, SELinux politikalarını ClickHouse’a uygun şekilde yapılandırmak daha güvenli bir yaklaşımdır, ancak bu makalenin kapsamı dışındadır.
Güvenlik Duvarı Ayarları
ClickHouse varsayılan olarak iki ana port kullanır:
* 8123/tcp: HTTP/HTTPS protokolü için (örneğin, web arayüzleri veya HTTP API’si ile etkileşim).
* 9000/tcp: ClickHouse’un kendi istemcisi (native client) için.
* 9009/tcp: Sunucular arası iletişim (interserver) için, özellikle replikasyon ve sharding senaryolarında kullanılır.
Bu portları güvenlik duvarında açmalıyız:
sudo firewall-cmd --add-port=8123/tcp --permanent
sudo firewall-cmd --add-port=9000/tcp --permanent
sudo firewall-cmd --add-port=9009/tcp --permanent # Replikasyon/Sharding için
sudo firewall-cmd --reload
Güvenlik duvarı durumunu kontrol etmek için:
sudo firewall-cmd --list-all
Gerekli Paketlerin Kurulumu
ClickHouse’un çalışması için doğrudan gerekli olmasa da, sistem yönetimi ve sorun giderme için bazı temel yardımcı programları kurmak faydalıdır.
sudo yum install -y curl wget lsof net-tools
ClickHouse Kurulumu
CentOS 7 üzerine ClickHouse’u kurmanın en kolay yolu, ClickHouse’un resmi YUM deposunu kullanmaktır.
ClickHouse Yum Deposunun Eklenmesi
İlk olarak, ClickHouse RPM paketlerinin imzalarını doğrulamak için GPG anahtarını içe aktarmamız gerekiyor. Ardından, YUM deposunu sistemimize ekleyeceğiz.
sudo yum install -y yum-utils # yum-config-manager için
sudo rpm --import https://repo.clickhouse.com/CLICKHOUSE-KEY.GPG
Şimdi /etc/yum.repos.d/clickhouse.repo adında bir dosya oluşturarak ClickHouse deposunu tanımlayalım:
sudo tee /etc/yum.repos.d/clickhouse.repo <
Depo tanımının doğru bir şekilde eklendiğini doğrulamak için:
yum repolist | grep clickhouse
ClickHouse Sunucu ve İstemci Paketlerinin Kurulumu
Depo eklendikten sonra, ClickHouse sunucu ve istemci paketlerini kolayca kurabiliriz.
sudo yum install -y clickhouse-server clickhouse-client
Bu komut, ClickHouse sunucu ve istemci uygulamalarını bağımlılıklarıyla birlikte kuracaktır. Kurulum tamamlandığında, ClickHouse servisi otomatik olarak başlatılmayabilir. Servisi elle başlatacağız ve otomatik başlatmayı ayarlayacağız.
Kurulum Sonrası İlk Kontroller
Kurulumun başarılı olduğunu doğrulamak için ClickHouse sunucusunun ve istemcisinin versiyonlarını kontrol edebiliriz:
clickhouse-server --version
clickhouse-client --version
Bu komutlar, kurulu ClickHouse versiyonunu göstermelidir.
ClickHouse Yapılandırması
ClickHouse, oldukça esnek bir yapılandırma sistemine sahiptir. Ana yapılandırma dosyaları XML formatındadır ve /etc/clickhouse-server/ dizininde bulunur.
Ana Yapılandırma Dosyaları
* /etc/clickhouse-server/config.xml: ClickHouse sunucusunun ana yapılandırma dosyasıdır. Genel ayarlar, portlar, veri ve log dizinleri, güvenlik ayarları gibi birçok parametreyi içerir.
* /etc/clickhouse-server/users.xml: Kullanıcı hesapları, parolalar, yetkilendirmeler ve profil ayarları bu dosyada tanımlanır.
* /etc/clickhouse-server/config.d/: Bu dizin, ana config.xml dosyasını değiştirmeden özel yapılandırmalar eklemek için kullanılır. Bu dizindeki .xml uzantılı dosyalar, ana yapılandırma dosyasına dahil edilir ve üzerine yazabilir. Bu yaklaşım, yükseltmeler sırasında yapılandırma değişikliklerini korumak için önerilir.
Veri ve Log Dizinleri
Varsayılan olarak, ClickHouse verilerini /var/lib/clickhouse/ dizininde, loglarını ise /var/log/clickhouse-server/ dizininde saklar. Bu dizinleri config.xml dosyasında değiştirebilirsiniz. Özellikle büyük veri kümeleriyle çalışırken, veri dizinini yüksek performanslı bir diske (SSD/NVMe) taşımak önemlidir.
config.xml dosyasında ilgili bölümler:
/var/lib/clickhouse/tmp/
/var/lib/clickhouse/user_files/
/var/log/clickhouse-server/clickhouse-server.log
/var/log/clickhouse-server/clickhouse-server.err.log
information
Bu yolları değiştirdikten sonra, yeni dizinleri oluşturmanız ve ClickHouse kullanıcısına (genellikle clickhouse) gerekli izinleri vermeniz gerekmektedir.
Ağ Ayarları
config.xml dosyasındaki etiketi, ClickHouse sunucusunun hangi ağ arayüzlerinden bağlantıları kabul edeceğini belirler.
* :: veya 0.0.0.0: Tüm ağ arayüzlerinden bağlantıları kabul eder (varsayılan).
* 127.0.0.1: Yalnızca yerel makineden gelen bağlantıları kabul eder (daha güvenli, ancak uzaktan erişimi engeller).
* 192.168.1.100: Belirli bir IP adresinden gelen bağlantıları kabul eder.
Üretim ortamlarında, güvenlik nedeniyle ClickHouse sunucusuna yalnızca belirli IP adreslerinden veya bir VPN üzerinden erişime izin vermek iyi bir uygulamadır.
Kullanıcı ve Yetkilendirme Yönetimi
/etc/clickhouse-server/users.xml dosyası, ClickHouse kullanıcılarını ve onların yetkilerini tanımlar. Varsayılan olarak default adında bir kullanıcı mevcuttur ve parolası yoktur. Bu, güvenlik açığı oluşturur ve üretim ortamlarında mutlaka değiştirilmelidir.
Yeni bir kullanıcı eklemek veya default kullanıcısının parolasını değiştirmek için users.xml dosyasını düzenleyebilirsiniz:
guclu_parola
::/0
default
default
cok_guclu_parola_2
192.168.1.0/24
10.0.0.5
default
default
Değişiklikleri yaptıktan sonra ClickHouse servisini yeniden başlatmanız gerekir.
Performans Odaklı Yapılandırma İpuçları
ClickHouse, performansı artırmak için birçok yapılandırma parametresi sunar. İşte bazı önemli olanlar:
* max_memory_usage: Bir sorgunun kullanabileceği maksimum RAM miktarını byte cinsinden belirler. Aşırı bellek tüketimini önlemek için önemlidir.
* max_threads: Bir sorgunun kullanabileceği maksimum CPU çekirdeği/thread sayısını belirler.
* merge_tree ayarları: MergeTree motoru için birleştirme ve bölümleme ayarları. Genellikle varsayılan değerler iyi bir başlangıç noktasıdır, ancak büyük ölçekli sistemlerde ince ayar yapılabilir.
* max_table_size_for_sync_alter: ALTER işlemlerinin senkronize olarak çalışması için tablonun maksimum boyutu.
* log_queries: Tüm sorguları loglamak için 1 olarak ayarlanabilir, ancak üretimde performans etkisi olabilir.
Bu ayarlar genellikle config.xml içinde veya config.d/ dizinindeki özel bir dosyada yapılır.
ClickHouse Servisini Yönetme
ClickHouse sunucusu, bir systemd servisi olarak kurulur, bu da onu standart systemctl komutları ile kolayca yönetmenizi sağlar.
Servis Komutları
* Servisi Başlatma:
sudo systemctl start clickhouse-server
* Servisi Durdurma:
sudo systemctl stop clickhouse-server
* Servisi Yeniden Başlatma: (Yapılandırma değişikliklerinden sonra sıkça kullanılır)
sudo systemctl restart clickhouse-server
* Servis Durumunu Kontrol Etme:
sudo systemctl status clickhouse-server
Bu komut, servisin çalışıp çalışmadığını, son log girdilerini ve varsa hataları gösterir.
Otomatik Başlatma
Sistemin yeniden başlatılması durumunda ClickHouse servisinin otomatik olarak başlamasını sağlamak için:
sudo systemctl enable clickhouse-server
Otomatik başlatmayı devre dışı bırakmak için:
sudo systemctl disable clickhouse-server
ClickHouse Kullanımı ve Temel İşlemler
ClickHouse servisi çalışır durumda olduğunda, veritabanı ile etkileşime geçmeye başlayabiliriz. Bunun için clickhouse-client komut satırı aracını kullanacağız.
ClickHouse İstemcisine Bağlanma
Varsayılan ayarlarla (yerel makineden, default kullanıcısı ve parola yok):
clickhouse-client
Eğer parola belirlediyseniz veya uzaktan bağlanıyorsanız:
clickhouse-client --host --port 9000 --user --password
Örneğin, yerel makineden my_user kullanıcısı ile bağlanmak için:
clickhouse-client --user my_user --password cok_guclu_parola_2
Başarılı bir bağlantıdan sonra :) istemini görmelisiniz.
Veritabanı Oluşturma
ClickHouse'da bir veritabanı oluşturmak oldukça basittir:
CREATE DATABASE my_database;
Oluşturulan veritabanını kullanmak için:
USE my_database;
Mevcut veritabanlarını listelemek için:
SHOW DATABASES;
Tablo Oluşturma (ENGINE Tipleri)
ClickHouse'un kalbi, farklı depolama ve işleme özelliklerine sahip tablo motorlarıdır (ENGINE). Analitik iş yükleri için en yaygın ve güçlü motor ailesi MergeTree ailesidir. MergeTree motorları, verileri sütun tabanlı olarak depolar, sıkıştırır, sıralar, bölümlere ayırır ve dizinler oluşturur.
Örnek bir MergeTree tablosu oluşturalım:
CREATE TABLE events (
event_time DateTime,
event_type String,
user_id UInt64,
country String,
duration_ms UInt32,
referrer String Nullable
) ENGINE = MergeTree()
ORDER BY (event_time, user_id)
PARTITION BY toYYYYMM(event_time);
Bu tanımda:
* events: Tablonun adı.
* event_time, event_type, user_id vb.: Sütun adları ve veri tipleri. Nullable bir sütunun NULL değerleri içerebileceğini belirtir.
* ENGINE = MergeTree(): Tablonun MergeTree motorunu kullanacağını belirtir.
* ORDER BY (event_time, user_id): Verilerin diskte event_time ve user_id sütunlarına göre sıralanacağını belirtir. Bu, birincil dizini oluşturur ve sorgu performansını doğrudan etkiler. WHERE ve GROUP BY ifadelerinde sıkça kullanılan sütunları buraya eklemek önemlidir.
* PARTITION BY toYYYYMM(event_time): Verilerin event_time sütununa göre yıl-ay bazında mantıksal bölümlere ayrılacağını belirtir. Bu, eski verilerin kolayca silinmesini veya belirli zaman aralıklarındaki sorguların daha hızlı çalışmasını sağlar.
Mevcut tabloları listelemek için:
SHOW TABLES;
Bir tablonun şemasını görmek için:
DESCRIBE TABLE events;
Veri Ekleme (INSERT)
ClickHouse'a veri eklemek için INSERT INTO ifadesi kullanılır.
Tek satır ekleme:
INSERT INTO events VALUES ('2023-10-26 10:00:00', 'login', 101, 'TR', 150, NULL);
INSERT INTO events (event_time, event_type, user_id, country) VALUES ('2023-10-26 10:05:00', 'logout', 101, 'TR');
Birden çok satır ekleme (performans için önerilir):
INSERT INTO events VALUES
('2023-10-26 10:10:00', 'view_product', 102, 'US', 500, 'homepage'),
('2023-10-26 10:15:00', 'add_to_cart', 102, 'US', 200, 'product_page'),
('2023-10-26 10:20:00', 'login', 103, 'DE', 100, NULL);
Veri Sorgulama (SELECT)
ClickHouse'un ana gücü, yüksek performanslı sorgulama yeteneğidir. Standart SQL benzeri sorgu sözdizimi kullanılır.
Tüm verileri listeleme (dikkatli olun, büyük tablolar için tehlikelidir):
SELECT * FROM events LIMIT 5;
Belirli sütunları ve koşulları kullanarak sorgulama:
SELECT event_time, event_type, user_id
FROM events
WHERE country = 'US' AND event_time >= '2023-10-26 10:00:00'
ORDER BY event_time DESC
LIMIT 10;
Toplamsal sorgular (Aggregate queries):
SELECT
country,
count() AS total_events,
avg(duration_ms) AS avg_duration
FROM events
WHERE event_type IN ('view_product', 'add_to_cart')
GROUP BY country
HAVING total_events > 1
ORDER BY total_events DESC;
Zaman bazlı gruplama:
SELECT
toStartOfDay(event_time) AS event_day,
event_type,
count() AS daily_count
FROM events
WHERE event_time >= '2023-10-01 00:00:00'
GROUP BY event_day, event_type
ORDER BY event_day, daily_count DESC;
Örnek Bir Veri Seti ile Çalışma
ClickHouse'un performansını test etmek için büyük bir örnek veri seti oluşturalım.
INSERT INTO events SELECT
now() - INTERVAL rand() % (30 24 3600) SECOND AS event_time, -- Son 30 gün içinde rastgele bir zaman
arrayElement(['login', 'logout', 'view_product', 'add_to_cart', 'purchase'], rand() % 5 + 1) AS event_type,
rand() % 100000 AS user_id, -- 100 bin farklı kullanıcı
arrayElement(['TR', 'US', 'DE', 'UK', 'FR', 'ES', 'IT'], rand() % 7 + 1) AS country,
rand() % 5000 AS duration_ms, -- 0-5000 ms arası süre
if(rand() % 2 = 0, arrayElement(['homepage', 'search_results', 'category_page', 'ad_campaign'], rand() % 4 + 1), NULL) AS referrer
FROM numbers(10000000); -- 10 milyon satır ekle
Bu komut, 10 milyon rastgele olay kaydı oluşturur. Bu işlem birkaç saniye sürebilir. Şimdi bu büyük veri seti üzerinde karmaşık sorgular çalıştırabiliriz:
SELECT
country,
event_type,
count() AS total_events,
avg(duration_ms) AS avg_duration_ms,
min(event_time) AS first_event,
max(event_time) AS last_event
FROM events
WHERE event_time >= now() - INTERVAL 7 DAY AND event_type IN ('view_product', 'purchase')
GROUP BY country, event_type
ORDER BY total_events DESC
LIMIT 20;
Bu sorgu, son 7 gün içindeki ürün görüntüleme ve satın alma olaylarını ülkelere ve olay tiplerine göre gruplayarak toplam olay sayısını, ortalama süreyi, ilk ve son olay zamanını getirir. Bu tür bir sorgunun ClickHouse'da ne kadar hızlı çalıştığını görmek etkileyici olacaktır.
Veri Tipleri
ClickHouse, çok çeşitli veri tiplerini destekler. En yaygın kullanılanlar şunlardır:
* Sayısal: UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64 (işaretsiz ve işaretli tamsayılar), Float32, Float64 (kayan noktalı sayılar).
* Tarih ve Zaman: Date (sadece tarih), DateTime (tarih ve saat), DateTime64 (milisaniye hassasiyetli tarih ve saat).
* Dizeler: String (değişken uzunlukta dizeler), FixedString(N) (sabit uzunlukta dizeler).
* Diğer: LowCardinality(String) (düşük benzersiz değere sahip dizeler için optimize edilmiş), Array(T) (dizi tipleri), Tuple(T1, T2, ...) (demet tipleri), Nullable(T) (NULL değerleri kabul eden tipler).
Dizinler (Indeksler)
ClickHouse'da birincil dizin (primary index), ORDER BY ifadesiyle tanımlanır ve seyrek bir dizindir (sparse index). Bu, her satır için değil, belirli aralıklarla dizin girdileri oluşturulduğu anlamına gelir. Bu seyrek yapı, dizin boyutunu küçültür ve disk I/O'yu azaltır.
ORDER BY sütunları, WHERE koşullarında ve GROUP BY ifadelerinde kullanıldığında sorgu performansını büyük ölçüde artırır. Ayrıca, ClickHouse Skip Indexes (atlama dizinleri) ve Projections gibi ikincil dizin tiplerini de destekler. Bunlar, birincil dizin olmayan sütunlarda filtreleme veya toplama işlemlerini hızlandırmak için kullanılabilir.
ClickHouse Performans İpuçları ve En İyi Uygulamalar
ClickHouse'un potansiyelini tam olarak kullanmak için bazı performans ipuçlarını ve en iyi uygulamaları göz önünde bulundurmak önemlidir.
Donanım Seçimi
* CPU: ClickHouse, sorguları paralelleştirmek için çok çekirdekli işlemcilerden (high core count) faydalanır. Yüksek saat hızlı CPU'lar da faydalıdır.
* RAM: Mümkün olduğunca fazla RAM, ClickHouse'un verileri önbelleğe almasına, ara sonuçları depolamasına ve daha hızlı sorgular çalıştırmasına yardımcı olur.
* Disk: Veri depolama için kesinlikle SSD veya NVMe sürücüler kullanılmalıdır. Özellikle ORDER BY ve PARTITION BY sütunları üzerinde yoğun I/O olduğundan, hızlı diskler kritik öneme sahiptir.
Veri Modellemesi
Sütun Tabanlı Yapı: ClickHouse'un sütun tabanlı doğasından faydalanmak için, sorgularınızda yalnızca ihtiyacınız olan sütunları seçin (SELECT yerine SELECT column1, column2).
* Denormalizasyon: Geleneksel ilişkisel veritabanlarında normalizasyon önemliyken, OLAP sistemleri genellikle denormalizasyonu tercih eder. Join işlemleri ClickHouse'da maliyetli olabilir, bu yüzden sıkça birlikte sorgulanan verileri aynı tabloda tutmak performansı artırır.
* LowCardinality Tipi: Eğer bir String sütunu az sayıda benzersiz değere sahipse (örneğin, ülke kodları, event tipleri), LowCardinality(String) veri tipini kullanmak hem depolama alanından tasarruf sağlar hem de sorgu performansını artırır.
Sorgu Optimizasyonu
* WHERE Koşulları: ORDER BY ile tanımlanan birincil dizin sütunları üzerindeki WHERE koşulları sorguları en çok hızlandırır.
* PREWHERE: Eğer bir WHERE koşulu, tablonun büyük bir kısmını filtreliyorsa, PREWHERE anahtar kelimesini kullanmak, yalnızca filtrelenmiş satırlar için diğer sütunların okunmasını sağlayarak I/O'yu azaltır.
SELECT Kullanımından Kaçınma: Sadece ihtiyacınız olan sütunları seçmek, I/O ve ağ trafiğini azaltır.
* Uygun Agrega Fonksiyonları: ClickHouse, çok sayıda optimize edilmiş agrega fonksiyonuna sahiptir. Bunları doğru kullanmak performansı artırır.
* LIMIT Kullanımı: Büyük sonuç kümeleri döndürmek yerine LIMIT kullanarak yalnızca ihtiyacınız olan kadarını almak önemlidir.
MergeTree Motor Ailesinin Önemi
MergeTree motor ailesi, ClickHouse'un temelini oluşturur ve farklı kullanım senaryoları için özelleşmiş türevleri bulunur:
* MergeTree: Temel motor, sıralama, bölümleme, dizinleme ve veri sıkıştırma sağlar.
* ReplacingMergeTree: Aynı sıralama anahtarına sahip yinelenen satırları otomatik olarak kaldırır (son yazılan satırı tutar).
* SummingMergeTree: Aynı sıralama anahtarına sahip satırları birleştirirken, belirtilen sayısal sütunları toplar. Analitik toplama tabloları için idealdir.
* AggregatingMergeTree: Önceden hesaplanmış toplamsal durumları depolamak için kullanılır, özellikle Materialized Views ile birlikte etkilidir.
* CollapsingMergeTree: Satırları işaretleyerek (işaretçi sütunu ile) silme veya güncelleme işlemlerini simüle eder.
Doğru MergeTree motorunu seçmek, veri işleme ve sorgu performansını önemli ölçüde etkileyebilir.
Dizinleme Stratejileri
ORDER BY ifadesiyle tanımlanan birincil dizin, sorgularda en sık kullanılan WHERE koşullarını ve GROUP BY sütunlarını içermelidir. Ayrıca, büyük tablolar için PARTITION BY kullanarak verileri mantıksal bölümlere ayırmak, sorguların yalnızca ilgili bölümleri okumasını sağlayarak performansı artırır.
Veri Sıkıştırma
ClickHouse, MergeTree tablolarında verileri otomatik olarak sıkıştırır. Varsayılan sıkıştırma algoritması LZ4'tür. İhtiyaca göre ZSTD veya Delta gibi farklı sıkıştırma algoritmaları da kullanılabilir. Bu, disk alanından tasarruf sağlarken I/O performansını da artırır.
Replikasyon ve Sharding
* Replikasyon: Veri kaybını önlemek ve yüksek erişilebilirlik sağlamak için ClickHouse, Apache ZooKeeper kullanarak replikasyonu destekler. ReplicatedMergeTree motorları, verilerin birden fazla sunucu arasında senkronize edilmesini sağlar.
* Sharding: Petabaytlarca veriyi yönetmek ve sorgu yükünü dağıtmak için ClickHouse, verileri birden fazla sunucuya dağıtma (sharding) yeteneğine sahiptir. Distributed tablo motoru, istemcilerin tüm shard'lara tek bir noktadan sorgu göndermesine olanak tanır ve sorgu sonuçlarını birleştirir.
Bu konular ileri düzey kurulumlar için olup, bu makalenin kapsamı dışındadır, ancak ClickHouse'un ölçeklenebilirlik yeteneklerinin önemli bir parçasıdır.
ClickHouse İzleme (Monitoring)
ClickHouse sunucusunun sağlığını ve performansını izlemek, sorunları erken tespit etmek ve optimizasyon yapmak için kritik öneme sahiptir. ClickHouse, kendi içinde zengin izleme mekanizmaları sunar.
Sistem Tabloları
ClickHouse, system veritabanında sunucu durumu hakkında birçok bilgi içeren özel tablolar sunar:
* system.metrics: Sunucunun anlık metrik değerlerini (CPU kullanımı, bellek, disk I/O, ağ trafiği vb.) içerir.
* system.events: Çeşitli olayların (sorgu başlatma, veri okuma, yazma vb.) sayıcılarını içerir.
* system.query_log: Çalıştırılan tüm sorguların detaylı bir logunu tutar (sorgu metni, başlangıç zamanı, süre, sonuç boyutu, kullanıcı vb.). Performans sorunlarını gidermek için çok değerlidir.
* system.processes: Şu anda çalışan sorguları listeler. Uzun süren veya kaynak tüketen sorguları tespit etmek için kullanılır.
* system.parts: MergeTree tablolarının fiziksel parçaları hakkında bilgi verir.
* system.mutations: ALTER TABLE ... UPDATE/DELETE gibi mutasyonların durumunu gösterir.
Örnek olarak, şu anda çalışan sorguları görmek için:
SELECT query_id, query, elapsed, read_rows, read_bytes
FROM system.processes;
En son tamamlanan sorguları görmek için:
SELECT query_start_time, query_duration_ms, query, read_rows, read_bytes, result_rows, result_bytes
FROM system.query_log
ORDER BY query_start_time DESC
LIMIT 10;
Prometheus/Grafana Entegrasyonu
ClickHouse, HTTP arayüzü üzerinden Prometheus formatında metrikler sunabilir. Bu sayede Prometheus ile entegre edilerek metrikler toplanabilir ve Grafana gibi araçlarla görselleştirilebilir. Bu, ClickHouse kümenizin detaylı ve kapsamlı bir şekilde izlenmesini sağlar.
config.xml dosyasında Prometheus metriklerini etkinleştirmek için:
/metrics
8123
Bu sayede Prometheus, http://clickhouse_server_ip:8123/metrics adresinden metrikleri çekebilir.
Sıkça Sorulan Sorular ve Sorun Giderme
ClickHouse kullanırken karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:
Yaygın Hatalar ve Çözümleri
* "Cannot allocate memory": Bu hata genellikle bir sorgunun max_memory_usage limitini aştığında veya sistemde yeterli RAM kalmadığında ortaya çıkar. Çözümler:
* max_memory_usage ayarını artırın (dikkatli olun, sistem kararlılığını etkileyebilir).
* Sorgunuzu optimize edin (daha az veri okuyun, daha verimli agregasyonlar kullanın).
* Sisteme daha fazla RAM ekleyin.
* "Too many parts": MergeTree tabloları, verileri küçük parçalar halinde yazar ve bu parçaları zamanla birleştirir. Çok fazla küçük parça, sorgu performansını düşürebilir. Çözüm:
* OPTIMIZE TABLE FINAL; komutunu çalıştırarak parçaları manuel olarak birleştirin.
* merge_tree ayarlarını (max_parts_in_total, min_bytes_for_wide_part) gözden geçirin.
* "Connection refused": ClickHouse sunucusuna bağlanılamadığında ortaya çıkar. Çözümler:
* ClickHouse servisinin çalışıp çalışmadığını kontrol edin: sudo systemctl status clickhouse-server.
* Güvenlik duvarı ayarlarını kontrol edin, 8123 (HTTP) ve 9000 (Native) portlarının açık olduğundan emin olun.
* config.xml dosyasındaki listen_host ayarını kontrol edin, doğru IP adresinden erişime izin verildiğinden emin olun.
* "Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded": Bu, max_memory_usage limitinin aşıldığını gösterir. Yukarıdaki "Cannot allocate memory" çözümlerine bakın.
Kaynak Tüketimi Sorunları
* Yüksek CPU Kullanımı:
* Çok sayıda eş zamanlı karmaşık sorgu olabilir. system.processes tablosunu kontrol edin.
* Sorgularınızı optimize edin, daha verimli dizinler kullanın.
* max_threads ayarını düşürerek her sorgunun kullanabileceği çekirdek sayısını sınırlayın.
* Yüksek Disk I/O:
* Büyük veri birleştirmeleri (MergeTree motoru tarafından).
* Sık ve büyük veri yazma işlemleri.
Sorgularınızın çok fazla sütun okuması (SELECT ).
* Disk hızını kontrol edin, daha hızlı disklere geçmeyi düşünün.
Genel olarak, sorun giderme adımları genellikle ClickHouse loglarını (/var/log/clickhouse-server/) incelemek, system.query_log ve system.processes tablolarını kontrol etmekle başlar.
Sonuç
Bu kapsamlı makalede, ClickHouse'un ne olduğunu ve neden analitik iş yükleri için güçlü bir çözüm olduğunu ele aldık. CentOS 7 işletim sistemi üzerine ClickHouse'u kurmak için gerekli ön hazırlıkları, kurulum adımlarını, temel yapılandırmaları ve servis yönetimini detaylı bir şekilde anlattık. Ayrıca, clickhouse-client aracılığıyla veritabanı ve tablo oluşturma, veri ekleme ve gelişmiş sorgulama tekniklerini örneklerle gösterdik.
ClickHouse'un performansından en iyi şekilde yararlanmak için donanım seçimi, veri modellemesi, sorgu optimizasyonu, MergeTree motor ailesinin doğru kullanımı ve dizinleme stratejileri gibi en iyi uygulamaları inceledik. Son olarak, sunucu sağlığını izlemek için sistem tablolarının kullanımına ve Prometheus/Grafana entegrasyonuna kısaca değindik ve sıkça karşılaşılan sorunlara yönelik çözüm önerileri sunduk.
ClickHouse, büyük veri kümeleri üzerinde gerçek zamanlı analitik sorgular çalıştırmak isteyen her kuruluş için güçlü, esnek ve ölçeklenebilir bir çözümdür. Bu rehber, ClickHouse yolculuğunuza başlamak için sağlam bir temel sağlamaktadır. Daha fazla bilgi ve ileri düzey konular için ClickHouse'un resmi dokümantasyonunu ve geniş topluluğunu keşfetmeye devam etmeniz önerilir.
