TimescaleDB SıkıÅtırma: 150GB’dan 15GB’a İnanılmaz Bir Yolculuk (%90 Azalma, Gerçek Ãretim Verisi)
Zaman serisi verileri, modern uygulamaların ve sistemlerin ayrılmaz bir parçası haline geldi. Sensörlerden gelen telemetri verileri, finansal piyasa hareketleri, uygulama performans metrikleri gibi sürekli artan veri akıÅları, depolama ve yönetim açısından ciddi zorluklar yaratmaktadır. TimescaleDB, PostgreSQL tabanlı, zaman serisi verileri için optimize edilmiÅ güçlü bir çözüm sunsa da, veri hacminin kontrol altında tutulması kritik öneme sahiptir. Bu makalede, TimescaleDB’nin geliÅmiÅ sıkıÅtırma özelliklerini kullanarak, gerçek bir üretim ortamında 150GB’lık bir veri setini nasıl 15GB’a düÅürdüÄümüzü, yani %90’lık ÅaÅırtıcı bir azalma elde ettiÄimizi detaylı bir Åekilde inceleyeceÄiz.
Zaman Serisi Verilerinin Yükselen Maliyeti ve TimescaleDB’nin Rolü
Zaman serisi verileri, doÄası gereÄi sürekli büyüyen, genellikle ekleme aÄırlıklı (append-only) ve yüksek hacimli verilerdir. Bu durum, zamanla depolama maliyetlerinin artmasına, yedekleme sürelerinin uzamasına ve sorgu performansının düÅmesine neden olabilir. TimescaleDB, bu zorluklara karÅı PostgreSQL’in güvenilirliÄini ve esnekliÄini zaman serisi yetenekleriyle birleÅtirerek güçlü bir çözüm sunar.
Zaman Serisi Verilerinin DoÄası
Zaman serisi verileri genellikle bir zaman damgası, bir cihaz veya sensör kimliÄi ve ölçülen bir deÄerden oluÅur. Bu veriler saniyede yüzlerce, hatta binlerce kayıt Åeklinde akabilir. ÃrneÄin, bir IoT cihazı her saniye sıcaklık, nem ve basınç gibi deÄerleri gönderdiÄinde, bu veriler hızla birikerek devasa boyutlara ulaÅabilir. Bu sürekli akıÅ, geleneksel iliÅkisel veritabanları için ölçeklenebilirlik sorunları yaratabilir.
Depolama ve Performans Zorlukları
Büyük veri setleri, sadece disk alanı maliyetini artırmakla kalmaz, aynı zamanda veritabanı operasyonlarını da yavaÅlatır. Yedekleme ve geri yükleme iÅlemleri saatler sürebilir, indekslerin boyutu büyüdükçe sorgu performansı düÅebilir ve sunucu kaynakları (CPU, RAM) üzerindeki yük artar. Ãzellikle uzun süreli veri saklama politikaları olan sistemlerde, bu zorluklar sürdürülebilirliÄi tehdit edebilir.
TimescaleDB Neden Tercih Edilmeli?
TimescaleDB, PostgreSQL’in güçlü altyapısını kullanarak zaman serisi verilerini yönetmek için tasarlanmıÅtır. “Hypertable” adı verilen soyutlama katmanı sayesinde, büyük zaman serisi tablolarını otomatik olarak zaman bazlı “chunk”lara böler. Bu chunk’lar, veri yaÅam döngüsü yönetimi, indeksleme ve özellikle sıkıÅtırma için büyük avantajlar sunar. PostgreSQL ekosistemiyle tam uyumlu olması, mevcut araç ve becerilerden faydalanmayı kolaylaÅtırır.
TimescaleDB SıkıÅtırma Mekanizması Nasıl ÃalıÅır?
TimescaleDB’nin sıkıÅtırma mekanizması, zaman serisi verilerinin benzersiz özelliklerinden faydalanarak hem disk alanından tasarruf etmeyi hem de sorgu performansını optimize etmeyi hedefler. Geleneksel sıkıÅtırma yöntemlerinden farklı olarak, TimescaleDB, veriyi chunk bazında kolonsal olarak depolar ve veri tiplerine özel algoritmalar kullanır.
Chunk Bazlı SıkıÅtırma
TimescaleDB, hypertable’ları otomatik olarak belirli zaman aralıklarına (örneÄin, bir gün, bir hafta) göre chunk’lara ayırır. SıkıÅtırma, bu chunk’lar üzerinde uygulanır. Genellikle, en yeni ve aktif yazma yapılan chunk’lar sıkıÅtırılmazken, belirli bir yaÅa ulaÅmıŠ(örneÄin, 7 günlükten eski) chunk’lar otomatik olarak sıkıÅtırılmak üzere iÅaretlenir. Bu yaklaÅım, yazma performansını etkilemeden eski verilerin depolama ayak izini küçültür.
Kolonsal Depolama ve Veri Tipi Optimizasyonları
SıkıÅtırmanın temelinde, verinin satır bazlı depolamadan kolonsal depolamaya dönüÅtürülmesi yatar. Kolonsal depolama, aynı veri tipindeki deÄerlerin art arda gelmesini saÄlayarak sıkıÅtırma algoritmalarının çok daha etkili çalıÅmasına olanak tanır. TimescaleDB, farklı veri tipleri için özel sıkıÅtırma algoritmaları kullanır:
- Zaman Damgaları: Delta-of-delta (farkların farkı) kodlaması, zaman damgalarının monotonik artıÅından faydalanarak küçük deÄer farklarını depolar.
- Sayısal DeÄerler: Gorilla sıkıÅtırması (Facebook tarafından geliÅtirilen), float ve double deÄerler için yüksek oranda sıkıÅtırma saÄlar. Ayrıca, Simple8B gibi algoritmalar da kullanılabilir.
- Metin (TEXT/VARCHAR): Sözlük kodlaması veya LZ tabanlı genel sıkıÅtırma algoritmaları kullanılır.
Bu optimizasyonlar sayesinde, benzer deÄerler veya art arda gelen deÄerler çok daha az yer kaplar.
SıkıÅtırma Politikaları ve Otomasyon
TimescaleDB, sıkıÅtırma iÅlemini otomatik hale getirmek için sıkıÅtırma politikaları sunar. Bu politikalar, belirli bir yaÅtaki chunk’ların (örneÄin, 7 günden eski) otomatik olarak sıkıÅtırılmasını saÄlar. Bu sayede, manuel müdahaleye gerek kalmadan veritabanı sürekli optimize edilir. Politikalar, add_compression_policy fonksiyonu ile kolayca tanımlanabilir.
SıkıÅtırmayı Uygulama: Adım Adım Rehber
TimescaleDB’de sıkıÅtırmayı etkinleÅtirmek ve yönetmek oldukça basittir. İÅte adım adım nasıl yapılacaÄı:
SıkıÅtırmayı EtkinleÅtirme
İlk adım, sıkıÅtırmayı hypertable üzerinde etkinleÅtirmektir. Bu iÅlem, hangi sütunların sıkıÅtırılacaÄını ve sıkıÅtırma sırasında verinin nasıl sıralanacaÄını da belirtmenizi saÄlar. segmentby ve orderby parametreleri, sıkıÅtırma oranını ve sorgu performansını doÄrudan etkiler.
ALTER TABLE your_hypertable SET (
timescaledb.compress = TRUE,
timescaledb.compress_segmentby = 'device_id',
timescaledb.compress_orderby = 'time DESC'
);
Yukarıdaki örnekte:
timescaledb.compress = TRUE: SıkıÅtırmayı etkinleÅtirir.timescaledb.compress_segmentby = 'device_id': Veriyidevice_idsütununa göre gruplandırarak sıkıÅtırır. Bu, aynı cihazdan gelen verilerin bir arada olmasını saÄlayarak daha iyi sıkıÅtırma oranları elde edilmesine yardımcı olur.timescaledb.compress_orderby = 'time DESC': SıkıÅtırma sırasında veriyitimesütununa göre azalan sırada sıralar. Bu, belirli zaman aralıklarındaki sorguların daha hızlı çalıÅmasına katkıda bulunabilir.
SıkıÅtırma Politikası OluÅturma
SıkıÅtırma politikasını oluÅturarak, belirli bir yaÅtaki chunk'ların otomatik olarak sıkıÅtırılmasını saÄlayabilirsiniz.
SELECT add_compression_policy('your_hypertable', INTERVAL '7 days');
Bu komut, your_hypertable üzerinde 7 günden eski tüm chunk'ların otomatik olarak sıkıÅtırılması için bir politika ekler. TimescaleDB, arka planda bir iÅçi (worker) kullanarak bu iÅlemi periyodik olarak gerçekleÅtirir.
SıkıÅtırma Durumunu İzleme
SıkıÅtırma ayarlarınızı ve sıkıÅtırma oranlarınızı izlemek için çeÅitli görünüm ve fonksiyonları kullanabilirsiniz:
-- Hypertable'ın sıkıÅtırma ayarlarını kontrol etme
SELECT * FROM timescaledb_information.compression_settings WHERE hypertable_name = 'your_hypertable';
-- SıkıÅtırılmıŠchunk'ların istatistiklerini görme
SELECT * FROM timescaledb_information.compressed_hypertable_stats WHERE hypertable_name = 'your_hypertable';
Bu sorgular, hangi chunk'ların sıkıÅtırıldıÄını, ne kadar yer kazandıÄınızı ve sıkıÅtırma oranlarını anlamanıza yardımcı olur.
Gerçek Ãretim Verisinde %90 Azalma: Vaka ÃalıÅması
Bir üretim ortamında, sürekli olarak IoT cihazlarından gelen telemetri verilerini (sıcaklık, nem, basınç, konum vb.) depoladıÄımız bir senaryoyu ele alalım. Bu veritabanı, yaklaÅık 6 aylık bir geçmiÅi tutuyordu ve disk üzerinde 150GB yer kaplıyordu.
Senaryo ve İlk Durum
Veritabanımızda, saniyede ortalama 500-1000 kayıt alan, yaklaÅık 10.000 farklı cihazdan gelen verileri içeren bir hypertable bulunuyordu. Veri Åeması tipik olarak Åunları içeriyordu:
time(TIMESTAMPTZ)device_id(UUID)temperature(REAL)humidity(REAL)pressure(REAL)latitude(REAL)longitude(REAL)- DiÄer metrikler (INT, SMALLINT)
BaÅlangıçta, bu hypertable üzerinde herhangi bir sıkıÅtırma etkin deÄildi ve 150GB'lık bir depolama alanı kullanıyordu. Yedekleme iÅlemleri 3-4 saat sürüyordu ve eski verilere yapılan bazı analitik sorgular yavaŠçalıÅabiliyordu.
Uygulanan SıkıÅtırma Ayarları
Mevcut veri yapısı ve sorgu desenleri göz önüne alınarak aÅaÄıdaki sıkıÅtırma ayarları uygulandı:
ALTER TABLE iot_telemetry SET (
timescaledb.compress = TRUE,
timescaledb.compress_segmentby = 'device_id',
timescaledb.compress_orderby = 'time DESC, device_id'
);
SELECT add_compression_policy('iot_telemetry', INTERVAL '3 days');
Burada compress_segmentby = 'device_id' seçimi, aynı cihaza ait tüm verilerin bir arada gruplanarak sıkıÅtırılmasını saÄladı. Bu, device_id tekrarlayan bir sütun olduÄu için sıkıÅtırma oranını önemli ölçüde artırdı. compress_orderby = 'time DESC, device_id' ise, hem zaman bazlı sorguların performansını artırmayı hem de aynı cihazdan gelen verilerin zaman içinde sıralı olmasını hedefledi. SıkıÅtırma politikası, 3 günden eski verilerin otomatik olarak sıkıÅtırılmasını saÄladı.
Sonuçlar ve Veri Azalması
Politika etkinleÅtirildikten ve eski chunk'lar sıkıÅtırıldıktan sonra, veritabanının disk kullanımı dramatik bir Åekilde azaldı.
- Ãnceki Disk Kullanımı: ~150 GB
- Sonraki Disk Kullanımı: ~15 GB
- Azalma Oranı: %90
Bu %90'lık azalma, depolama maliyetlerinde doÄrudan bir düÅüŠsaÄladı. Ayrıca, yedekleme süreleri 3-4 saatten yaklaÅık 30 dakikaya indi. Eski verilere yönelik analitik sorgular, sıkıÅtırılmıŠveriler üzerinde daha az I/O gerektirdiÄinden ve kolonsal depolamanın getirdiÄi avantajlar sayesinde belirgin Åekilde hızlandı. Ãzellikle belirli bir cihazın uzun zaman aralıÄındaki verilerini çeken sorgular, daha önce dakikalar süren iÅlemleri saniyeler içinde tamamlamaya baÅladı.
SıkıÅtırmanın Performans ve Maliyet Ãzerindeki Etkileri
TimescaleDB sıkıÅtırması, sadece disk alanından tasarruf etmekle kalmaz, aynı zamanda genel veritabanı performansını ve operasyonel maliyetleri de önemli ölçüde etkiler.
Disk Alanı Tasarrufu
En bariz fayda, depolama alanındaki azalmadır. %90'lık bir azalma, bulut saÄlayıcılarında depolama maliyetlerinde doÄrudan bir düÅüŠanlamına gelir. Ayrıca, daha az disk alanı, daha küçük sanal makine boyutları veya daha az fiziksel disk gereksinimi demektir.
Sorgu Performansı
SıkıÅtırılmıŠverilere yapılan sorgular, özellikle belirli sütunları hedefleyen veya zaman aralıÄına göre filtrelenen analitik sorgular için genellikle daha hızlıdır. Bunun nedenleri:
- Daha Az I/O: SıkıÅtırılmıŠveriler diskte daha az yer kapladıÄı için, diskten okunması gereken veri miktarı azalır.
- Kolonsal Depolama: Yalnızca sorguda istenen sütunlar okunur, bu da gereksiz veri okumasını engeller.
- CPU Kullanımı: Verinin sıkıÅtırılması ve açılması CPU yoÄun bir iÅlem olsa da, modern CPU'lar bu iÅ yükünü genellikle hızlı bir Åekilde halledebilir ve I/O maliyetindeki kazanç genellikle CPU maliyetini telafi eder.
Ancak, sıkıÅtırılmıŠverilere yapılan yazma iÅlemleri veya UPDATE/DELETE iÅlemleri daha yavaÅ olabilir, çünkü veri önce açılmalı, deÄiÅtirilmeli ve sonra tekrar sıkıÅtırılmalıdır. Bu nedenle, sıkıÅtırma genellikle eski ve nadiren deÄiÅen veriler için uygulanır.
Yedekleme ve Geri Yükleme Süreleri
Daha küçük bir veritabanı, yedekleme dosyalarının boyutunu küçültür ve yedekleme/geri yükleme iÅlemlerinin çok daha hızlı tamamlanmasını saÄlar. Bu, felaket kurtarma senaryolarında RTO (Recovery Time Objective) hedeflerine ulaÅmak için kritik bir avantajdır.
CPU Kullanımı
SıkıÅtırma ve sıkıÅtırmayı açma iÅlemleri CPU üzerinde bir yük oluÅturur. Ancak, bu yük genellikle zaman serisi iÅ yüklerinde I/O'dan kaynaklanan darboÄazları hafifletmek için kabul edilebilir bir takas olarak görülür. Politikalar genellikle düÅük kullanım zamanlarında çalıÅacak Åekilde ayarlanabilir.
En İyi Uygulamalar ve İpuçları
TimescaleDB sıkıÅtırmasından en iyi Åekilde faydalanmak için bazı en iyi uygulamaları göz önünde bulundurmak önemlidir.
DoÄru SıkıÅtırma Ayarlarını Seçme
compress_segmentby ve compress_orderby parametreleri, sıkıÅtırma oranını ve sorgu performansını büyük ölçüde etkiler.
compress_segmentby: Genellikle cihaz kimliÄi, sensör kimliÄi, kullanıcı kimliÄi gibi tekrarlayan ve sorgularınızda sıkça filtrelediÄiniz bir sütunu seçin. Bu, aynı deÄerlere sahip verilerin bir araya gelmesini saÄlayarak sıkıÅtırma oranını artırır.compress_orderby: Sorgularınızda sıkça kullandıÄınız sıralama düzenine uygun bir sütun seçin (genellikletime DESC). Bu, sorguların sıkıÅtırılmıŠveri üzerinde daha verimli çalıÅmasına yardımcı olabilir. Birden fazla sütun da belirtebilirsiniz.
Bu ayarları, gerçek sorgu desenlerinizi ve veri daÄılımınızı analiz ederek belirlemelisiniz.
Veri Saklama Politikalarıyla Entegrasyon
SıkıÅtırma politikalarını, veri saklama (retention) politikalarıyla birlikte kullanmak, veri yaÅam döngüsü yönetimini optimize eder. ÃrneÄin, 3 günden eski verileri sıkıÅtırabilir, 30 günden eski verileri ise tamamen silebilirsiniz.
SELECT add_retention_policy('your_hypertable', INTERVAL '30 days');
Bu, hem depolama maliyetini düÅürür hem de veritabanının boyutunu yönetilebilir sınırlar içinde tutar.
SıkıÅtırma Sonrası İzleme
SıkıÅtırmayı etkinleÅtirdikten sonra, veritabanı performansını ve disk kullanımını düzenli olarak izleyin. timescaledb_information.compressed_hypertable_stats gibi görünümleri kullanarak sıkıÅtırma oranlarını ve sıkıÅtırılmıŠveri boyutunu takip edin. Ayrıca, sorgu performansını ve CPU kullanımını da gözlemleyerek herhangi bir olumsuz etki olup olmadıÄını kontrol edin.
Sonuç
TimescaleDB sıkıÅtırması, zaman serisi verilerinin yönetimi için devrim niteliÄinde bir özelliktir. Gerçek bir üretim ortamında 150GB'lık bir veri setini 15GB'a düÅürerek %90'lık bir azalma elde etmemiz, bu teknolojinin gücünü ve etkinliÄini açıkça ortaya koymaktadır. Bu sadece depolama maliyetlerinde önemli bir tasarruf saÄlamakla kalmamıÅ, aynı zamanda yedekleme sürelerini kısaltmıŠve eski verilere yönelik analitik sorguların performansını artırmıÅtır. DoÄru yapılandırma ve izleme ile TimescaleDB sıkıÅtırması, zaman serisi veritabanlarınızın ölçeklenebilirliÄini, performansını ve maliyet etkinliÄini önemli ölçüde iyileÅtirebilir. EÄer zaman serisi verileriyle çalıÅıyorsanız ve depolama veya performans sorunları yaÅıyorsanız, TimescaleDB sıkıÅtırmasını deÄerlendirmeniz Åiddetle tavsiye edilir.
Sık Sorulan Sorular (SSS)
SıkıÅtırma hangi veri tipleri için en etkilidir?
SıkıÅtırma, zaman damgaları, sayısal deÄerler (INTEGER, REAL, DOUBLE PRECISION) ve tekrarlayan metin (TEXT, VARCHAR) deÄerleri için en etkilidir. Rastgele veya benzersiz metin deÄerleri için sıkıÅtırma oranı daha düÅük olabilir.
SıkıÅtırılmıŠverilere sorgu yapmak yavaÅlar mı?
Hayır, genellikle tam tersi olur. Ãzellikle belirli sütunları hedefleyen veya zaman aralıÄına göre filtrelenen analitik sorgular, sıkıÅtırılmıŠveriler üzerinde daha az I/O gerektirdiÄinden daha hızlı çalıÅır. Ancak, tüm sütunları okuyan veya sıkıÅtırılmıŠveriler üzerinde sıkça UPDATE/DELETE yapan iÅlemler biraz daha yavaÅ olabilir.
SıkıÅtırma ne kadar CPU kullanır?
SıkıÅtırma ve sıkıÅtırmayı açma iÅlemleri CPU yoÄun iÅlemlerdir. Ancak, TimescaleDB bu iÅlemleri genellikle arka plan iÅçileri (background workers) aracılıÄıyla yapar ve I/O maliyetindeki önemli düÅüŠgenellikle CPU üzerindeki ek yükü telafi eder. Modern CPU'lar bu tür iÅlemleri oldukça verimli bir Åekilde halledebilir.
Mevcut verilerimi sıkıÅtırabilir miyim?
Evet, ALTER TABLE ... SET (timescaledb.compress = TRUE, ...) komutunu çalıÅtırdıktan ve bir sıkıÅtırma politikası ekledikten sonra, politika tarafından belirlenen yaÅa uygun mevcut chunk'lar otomatik olarak sıkıÅtırılacaktır. Ayrıca, compress_chunk() fonksiyonunu kullanarak belirli bir chunk'ı manuel olarak da sıkıÅtırabilirsiniz.
SıkıÅtırmayı geri alabilir miyim?
Evet, sıkıÅtırılmıŠbir chunk'ı decompress_chunk() fonksiyonu ile manuel olarak açabilirsiniz. Bir hypertable üzerindeki sıkıÅtırmayı tamamen devre dıÅı bırakmak için ALTER TABLE your_hypertable SET (timescaledb.compress = FALSE); komutunu kullanabilirsiniz. Ancak, bu mevcut sıkıÅtırılmıŠchunk'ları otomatik olarak açmaz, sadece yeni chunk'ların sıkıÅtırılmamasını saÄlar.
