TimescaleDB Nedir ve Neden Kullanmalısınız?
Zaman serisi verileri, günümüzün dijital dünyasında giderek daha fazla önem kazanmaktadır. IoT cihazlarından finansal piyasa verilerine, sunucu performans metriklerinden sensör okumalarına kadar birçok alanda sürekli akan veri akışlarını depolamak, analiz etmek ve sorgulamak kritik hale gelmiştir. Geleneksel ilişkisel veritabanları, bu tür verilerin büyük hacimleriyle başa çıkmakta zorlanabilirken, TimescaleDB gibi özel olarak zaman serisi verileri için tasarlanmış çözümler öne çıkmaktadır.
TimescaleDB, PostgreSQL tabanlı, açık kaynaklı bir zaman serisi veritabanıdır. PostgreSQL’in güvenilirliğini, esnekliğini ve zengin ekosistemini korurken, zaman serisi verilerine özgü performans ve ölçeklenebilirlik yetenekleri ekler. Temel olarak bir PostgreSQL uzantısı (extension) olarak çalıştığı için, mevcut PostgreSQL araç ve becerilerinizi kullanarak zaman serisi verilerinizi yönetebilirsiniz.
TimescaleDB Kullanmanın Avantajları:
- Performans ve Ölçeklenebilirlik: Verileri otomatik olarak zaman aralıklarına göre parçalayarak (chunking) ve sıkıştırarak sorgu performansını artırır ve depolama maliyetlerini düşürür.
- Full SQL Desteği: PostgreSQL’in tüm gücünü ve esnekliğini kullanmaya devam edersiniz. Karmaşık sorgular, join’ler, indeksler ve fonksiyonlar zaman serisi verileriniz üzerinde de çalışır.
- Otomatik Parçalama (Automatic Partitioning): Zaman bazlı parçalama işlemini sizin yerinize otomatik olarak yönetir. Bu, manuel parça yönetimi yükünü ortadan kaldırır.
- Veri Sıkıştırma: Eski verileri sıkıştırarak depolama alanından tasarruf sağlar ve sorgu performansını artırır.
- Sürekli Toplamalar (Continuous Aggregates): Sıkça sorgulanan özet verileri arka planda otomatik olarak önbelleğe alarak sorgu hızını önemli ölçüde artırır.
- Geniş Ekosistem Entegrasyonu: PostgreSQL tabanlı olduğu için Grafana, Tableau gibi birçok BI ve görselleştirme aracıyla kolayca entegre olabilir.
CentOS 7 Üzerine TimescaleDB Kurulumu İçin Ön Hazırlıklar
TimescaleDB kurulumuna başlamadan önce, CentOS 7 sunucunuzun bazı temel gereksinimleri karşıladığından ve gerekli ön hazırlıkların yapıldığından emin olmalıyız. TimescaleDB bir PostgreSQL uzantısı olduğu için öncelikle PostgreSQL’in kurulu ve çalışır durumda olması gerekmektedir.
Sistem Güncellemesi ve Temel Paketler
Herhangi bir kuruluma başlamadan önce sistem paket listesini güncellemek ve mevcut paketleri yükseltmek iyi bir uygulamadır:
sudo yum update -y
sudo yum install -y epel-release # Gerekli olabilecek ek paketler için
PostgreSQL Kurulumu
CentOS 7’nin varsayılan depolarında bulunan PostgreSQL sürümü genellikle eski olabilir. TimescaleDB’nin en güncel özelliklerinden faydalanmak ve daha iyi performans elde etmek için PostgreSQL’in daha yeni bir sürümünü (örneğin PostgreSQL 13 veya 14) kurmanız önerilir. Bunun için PostgreSQL YUM deposunu eklememiz gerekmektedir:
# PostgreSQL YUM deposunu ekleyin
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
PostgreSQL 13 sunucu ve istemci paketlerini kurun (isteğe bağlı olarak 14 de seçilebilir)
sudo yum install -y postgresql13-server postgresql13
Veritabanını başlatın
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
PostgreSQL servisini etkinleştirin ve başlatın
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13
Bu adımlarla PostgreSQL 13 başarıyla kurulmuş ve çalışır duruma getirilmiş olmalıdır. postgresql-13 yerine kurduğunuz sürüme göre postgresql-XX kullanmayı unutmayın.
TimescaleDB Deposu Ekleme
TimescaleDB paketlerini indirmek için TimescaleDB’nin kendi YUM deposunu sistemimize eklememiz gerekmektedir:
sudo tee /etc/yum.repos.d/timescale_timescaledb.repo <
Bu komut, TimescaleDB deposunu /etc/yum.repos.d/ dizinine ekleyecektir. Artık TimescaleDB paketlerini yum komutuyla kurmaya hazırız.
TimescaleDB Kurulumu ve Yapılandırması
Ön hazırlıkları tamamladığımıza göre, TimescaleDB'yi kurma ve PostgreSQL ile entegre etme adımlarına geçebiliriz.
TimescaleDB Paketini Kurma
TimescaleDB paketini kurmak için aşağıdaki komutu kullanın. PostgreSQL sürümünüze uygun paketi seçtiğinizden emin olun (örneğin, PostgreSQL 13 için timescaledb-2-postgresql-13):
sudo yum install -y timescaledb-2-postgresql-13
PostgreSQL Yapılandırması (postgresql.conf)
TimescaleDB'nin PostgreSQL ile düzgün çalışabilmesi için postgresql.conf dosyasında bazı değişiklikler yapılması gerekmektedir. TimescaleDB, bu optimizasyonları kolaylaştırmak için timescaledb-tune adında bir araç sunar. Bu araç, sunucunuzun kaynaklarına (RAM, CPU vb.) göre en uygun yapılandırma ayarlarını önerir.
# PostgreSQL yapılandırma dosyasının yolunu belirtin
PostgreSQL 13 için varsayılan yol: /usr/pgsql-13/bin/pg_config
sudo timescaledb-tune --pg-config=/usr/pgsql-13/bin/pg_config
Bu komut, postgresql.conf dosyasında yapılması gereken değişiklikleri size gösterecektir. Genellikle aşağıdaki gibi bir çıktı alırsınız:
Detected PostgreSQL configuration file at: /var/lib/pgsql/13/data/postgresql.conf
Detected PostgreSQL data directory at: /var/lib/pgsql/13/data
Recommendations for postgresql.conf:
shared_preload_libraries = 'timescaledb'
max_connections = 100
shared_buffers = 128MB
effective_cache_size = 384MB
maintenance_work_mem = 64MB
work_mem = 4MB
wal_buffers = 16MB
min_wal_size = 80MB
max_wal_size = 1GB
default_statistics_target = 100
random_page_cost = 4.0
cpu_tuple_cost = 0.01
cpu_index_tuple_cost = 0.005
cpu_operator_cost = 0.0025
effective_io_concurrency = 1
max_worker_processes = 8
max_parallel_workers = 8
max_parallel_workers_per_gather = 2
For best results, please add these to your postgresql.conf file.
Bu önerileri uygulamak için, postgresql.conf dosyasını bir metin düzenleyici ile açın ve önerilen satırları ekleyin veya mevcut değerleri değiştirin. En kritik olanı, shared_preload_libraries satırına timescaledb eklemektir:
sudo vi /var/lib/pgsql/13/data/postgresql.conf
Dosyada shared_preload_libraries satırını bulun ve şu şekilde güncelleyin:
shared_preload_libraries = 'timescaledb'
Diğer önerilen ayarları da (örneğin max_connections, shared_buffers vb.) dosyanıza ekleyebilir veya güncelleyebilirsiniz. Değişiklikleri kaydettikten sonra PostgreSQL servisini yeniden başlatmanız gerekmektedir:
sudo systemctl restart postgresql-13
Veritabanı Oluşturma ve TimescaleDB Uzantısını Etkinleştirme
Şimdi TimescaleDB uzantısını kullanacağımız bir veritabanı oluşturup bu veritabanında uzantıyı etkinleştirmeliyiz.
# postgres kullanıcısı olarak psql'e bağlanın
sudo -u postgres psql
Yeni bir veritabanı oluşturun
CREATE DATABASE timeseries_db;
Oluşturduğunuz veritabanına bağlanın
\c timeseries_db
TimescaleDB uzantısını etkinleştirin
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
Uzantının başarıyla yüklendiğini kontrol edin
SELECT * FROM pg_extension WHERE extname = 'timescaledb';
psql'den çıkın
\q
extname değeri timescaledb olan bir satır görüyorsanız, kurulum başarılı demektir!
TimescaleDB Kullanımına Başlama: Temel Kavramlar ve Örnekler
TimescaleDB'yi kurup yapılandırdıktan sonra, zaman serisi verilerinizi depolamak ve sorgulamak için kullanmaya başlayabiliriz.
Hypertable Oluşturma
TimescaleDB'nin en temel kavramı "hypertable"dır. Hypertable, normal bir PostgreSQL tablosu gibi görünür ve çalışır, ancak arka planda TimescaleDB'nin otomatik parçalama, sıkıştırma ve performans optimizasyonlarından faydalanır. Bir hypertable oluşturmak için önce normal bir tablo tanımlar, ardından bu tabloyu create_hypertable fonksiyonu ile hypertable'a dönüştürürsünüz.
-- Bağlantı oluşturduğunuz veritabanına (timeseries_db)
-- sudo -u postgres psql -d timeseries_db
-- Normal bir tablo oluşturun
CREATE TABLE sensor_data (
time TIMESTAMPTZ NOT NULL,
device_id INT,
temperature DOUBLE PRECISION,
humidity DOUBLE PRECISION
);
-- Bu tabloyu 'time' sütununu kullanarak bir hypertable'a dönüştürün
SELECT create_hypertable('sensor_data', 'time');
Burada time sütunu, zaman serisi verilerinin anahtar sütunudur ve TIMESTAMPTZ (zaman dilimi destekli zaman damgası) veri tipinde olmalıdır. create_hypertable fonksiyonu, bu sütunu kullanarak verileri otomatik olarak parçalamaya başlayacaktır.
Veri Ekleme (INSERT)
Hypertable'lara veri eklemek, normal PostgreSQL tablolarına veri eklemekle aynıdır:
INSERT INTO sensor_data (time, device_id, temperature, humidity) VALUES
(NOW(), 1, 25.5, 60.2),
(NOW() - INTERVAL '1 minute', 1, 25.0, 60.0),
(NOW() - INTERVAL '2 minutes', 2, 22.1, 55.3),
(NOW() - INTERVAL '5 minutes', 1, 24.8, 61.0);
Veri Sorgulama (SELECT)
TimescaleDB, zaman serisi verileri için optimize edilmiş özel fonksiyonlar sunsa da, standart SQL sorgularınızı da kullanabilirsiniz.
Temel Sorgular:
-- Son eklenen 5 veriyi görüntüle
SELECT * FROM sensor_data ORDER BY time DESC LIMIT 5;
-- Son 1 saat içindeki verileri filtrele
SELECT * FROM sensor_data WHERE time > NOW() - INTERVAL '1 hour';
-- Belirli bir cihazın son 30 dakikadaki sıcaklık verilerini al
SELECT time, temperature FROM sensor_data
WHERE device_id = 1 AND time > NOW() - INTERVAL '30 minutes'
ORDER BY time ASC;
Zaman Tabanlı Agregasyonlar (time_bucket):
TimescaleDB'nin en güçlü özelliklerinden biri, verileri belirli zaman aralıklarına göre gruplamak için kullanılan time_bucket fonksiyonudur. Bu, zaman serisi analizlerinde ortalama, maksimum, minimum gibi değerleri hesaplamak için çok kullanışlıdır.
-- Her 15 dakikada bir cihazın ortalama sıcaklığını ve nemini hesapla
SELECT
time_bucket('15 minutes', time) AS fifteen_min_interval,
device_id,
AVG(temperature) AS avg_temp,
AVG(humidity) AS avg_humidity
FROM sensor_data
GROUP BY fifteen_min_interval, device_id
ORDER BY fifteen_min_interval DESC, device_id;
time_bucket('15 minutes', time) ifadesi, time sütunundaki zaman damgalarını 15 dakikalık dilimlere böler ve her dilim için bir başlangıç zamanı döndürür.
Veri Sıkıştırma (Opsiyonel ama Önemli)
Büyük hacimli zaman serisi verileriyle çalışırken depolama maliyetleri önemli olabilir. TimescaleDB, eski verileri sıkıştırarak bu maliyetleri düşürmenize yardımcı olur. Sıkıştırma, hypertable'ınız üzerinde bir politika olarak ayarlanır.
-- Hypertable'da sıkıştırmayı etkinleştirin
ALTER TABLE sensor_data SET (timescaledb.compress = TRUE);
-- Sıkıştırma için hangi sütunların nasıl sıkıştırılacağını belirtin (isteğe bağlı)
ALTER TABLE sensor_data ADD COLUMN IF NOT EXISTS device_id_compressed INT; -- Örnek: sıkıştırılacak sütun
-- 7 günden eski verileri sıkıştırmak için bir sıkıştırma politikası oluşturun
SELECT add_compression_policy('sensor_data', INTERVAL '7 days');
Bu komutlar, 7 günden eski verilerin otomatik olarak sıkıştırılmasını sağlayacaktır. Sıkıştırılmış veriler hala sorgulanabilir durumdadır, ancak yazma performansı düşebilir.
Sonuç ve Sıkça Sorulan Sorular (SSS)
Bu rehberde, CentOS 7 üzerinde TimescaleDB'yi adım adım nasıl kuracağınızı ve temel kullanımını öğrendiniz. PostgreSQL'in gücünü zaman serisi verileriyle birleştiren TimescaleDB, IoT, izleme, finansal analiz ve daha birçok alanda ölçeklenebilir ve performanslı çözümler sunar. Artık hypertable'lar oluşturabilir, veri ekleyebilir ve güçlü SQL sorgularıyla zaman serisi verilerinizi analiz edebilirsiniz. İleri seviye özellikler olan sürekli toplamalar, veri sıkıştırma politikaları ve downsampling gibi konuları keşfetmeniz, TimescaleDB deneyiminizi daha da zenginleştirecektir.
Sıkça Sorulan Sorular (SSS)
TimescaleDB ücretli mi?
TimescaleDB'nin temel sürümü tamamen açık kaynaklı ve ücretsizdir. TimescaleDB Enterprise sürümü ise ek özellikler ve destek sunar, ancak çoğu kullanım durumu için açık kaynak sürüm yeterlidir.
Hangi PostgreSQL sürümleriyle uyumlu?
TimescaleDB genellikle PostgreSQL'in son 3-4 ana sürümüyle uyumludur. Bu rehberde PostgreSQL 13 kullanıldı, ancak TimescaleDB'nin resmi belgelerinden en güncel uyumluluk bilgilerini kontrol etmeniz önerilir.
Verilerimi nasıl yedeklerim?
TimescaleDB, standart PostgreSQL yedekleme araçlarıyla (örneğin pg_dump ve pg_restore) uyumludur. Hypertable'lar da normal tablolar gibi yedeklenir. Ek olarak, TimescaleDB, büyük veritabanları için özel yedekleme ve geri yükleme araçları da sunabilir.
Performans sorunları yaşarsam ne yapmalıyım?
Performans sorunları yaşıyorsanız şunları kontrol edebilirsiniz:
timescaledb-tunearacını tekrar çalıştırarak yapılandırma önerilerini uyguladığınızdan emin olun.- Sorgularınız için uygun indeksler (özellikle
timesütununda) oluşturun. - Hypertable'ınızın chunk (parça) boyutlarını ve zaman aralıklarını optimize edin.
- Veri sıkıştırma politikalarını uygulayarak eski verilerin performansını artırın.
- PostgreSQL loglarını ve sorgu planlarını (EXPLAIN ANALYZE) inceleyerek darboğazları tespit edin.
CentOS 7 dışında başka işletim sistemlerinde kurulabilir mi?
Evet, TimescaleDB birçok farklı platformda kurulabilir. Debian/Ubuntu gibi Linux dağıtımları, Docker kapsayıcıları ve bulut platformları (AWS, Google Cloud, Azure) üzerinde de TimescaleDB kurulumu mümkündür. Kurulum adımları işletim sistemine göre farklılık gösterebilir.
