Notion’ın Postgres’i shard ederken öğrendikleri
(notion.so)- Yılın başında Notion’ı 5 dakikalığına kapatıp, birkaç aydır üzerinde çalıştıkları PostgreSQL sharding işlemini gerçekleştirdiler
→ Sonuç olarak hemen “inanılmaz hızlandı” tepkileri gelmeye başladı
- Sharding yapmaya ne zaman karar verildi
→ 5 yılda on binlerce kat büyürken, uzun süre sorunsuz kullanılan Postgres monolit kapasite sınırını aşmaya başlamıştı
→ VACUUM sürekli kesintiye uğramaya başlamıştı ve yakında TXID wraparound yaşanacağı öngörüldüğü için sharding çalışması başlatıldı
- Sharding şemasını tasarlamak
→ Uygulama seviyesinde sharding
⇨ Hangi veriler shard edilecek
⇨ Veriler hangi anahtarla partition edilerek bölünecek
⇨ Kaç shard oluşturulmalı ve nasıl yapılandırılmalı
→ Karar #1
⇨ Notion’ın veri modeli block birimi etrafında kuruluydu
⇨ block tablosuna bağlı tüm tabloları shard etmeye karar verdiler (Space, Discussion, Comment vb.)
→ Karar #2
⇨ block, workspace ID ile partition ediliyor
⇨ Her workspace’e bir UUID atandığı için bunu kullandılar
→ Karar #3
⇨ Yapı 480 mantıksal shard ve 32 fiziksel DB’den oluşuyor
512 gibi 2’nin kuvveti olan bir sayı yerine 480’in seçilme nedeni, daha esnek biçimde bölünebilmesi
- Shard’lara taşımak
→ 1. Eski ve yeni DB’ye çift yazım yapmak (Audit Log ile birlikte)
→ 2. Çift yazım başladıktan sonra eski DB’deki verileri yeni DB’ye backfill etmek
→ 3. Yeni DB’deki verileri doğrulamak
→ 4. Yeni DB’ye geçmek (incremental olarak ilerledi)
- Zor yoldan öğrenilen dersler
→ Daha erken shard edin: Mevcut DB üzerindeki yük çok artana kadar beklendiği için, migration’ın kendisi de ekstra yük yarattı ve bu yüzden yavaş ilerlemek zorunda kaldılar
→ Hedefiniz zero-downtime taşıma olsun: Nihai geçiş sırasında çift yazımın throughput’u temel darboğaz oldu.
→ Ayrı bir partition anahtarı yerine bileşik PK kullanın: Mevcut DB’nin PK’si olan id ile partition anahtarı olan space_id birleştirilseydi, uygulama içinde space_id değerlerini taşımaya gerek kalmayabilirdi
1 yorum
Postgres’in TXID konusu her zaman gündeme gelen başlıklardan biridir
PostgreSQL’in kusurları https://tr.news.hada.io/topic?id=1829
5 yıl boyunca PostgreSQL ölçeklerken öğrenilenler https://tr.news.hada.io/topic?id=4101