- Awal tahun ini, Notion sempat mengalami downtime selama 5 menit sambil menjalankan sharding PostgreSQL yang telah dikerjakan selama beberapa bulan
→ Respons langsung mulai muncul bahwa performanya menjadi jauh lebih cepat
- Kapan memutuskan untuk melakukan sharding
→ Setelah tumbuh puluhan ribu kali selama 5 tahun, monolit Postgres yang selama ini digunakan dengan baik mulai melampaui kapasitasnya
→ VACUUM mulai terus-menerus terhenti, dan karena diperkirakan TXID wraparound akan segera terjadi, pekerjaan sharding pun dimulai
- Merancang skema sharding
→ Sharding di level aplikasi
⇨ Data apa yang akan di-shard
⇨ Dengan key apa data akan dipartisi dan dibagi
⇨ Berapa banyak shard yang perlu dibuat, dan bagaimana strukturnya
→ Keputusan #1
⇨ Notion memiliki model data yang disusun berdasarkan unit block
⇨ Diputuskan untuk me-shard semua tabel yang terhubung dari tabel block (Space, Discussion, Comment, dll.)
→ Keputusan #2
⇨ block dipartisi berdasarkan workspace ID
⇨ Karena setiap workspace diberi UUID, hal ini digunakan untuk itu
→ Keputusan #3
⇨ Terdiri dari 480 shard logis dan 32 DB fisik
Alasan memilih 480, bukan 512 yang merupakan pangkat dua, adalah karena 480 adalah angka yang bisa dibagi lebih fleksibel
- Memigrasikan ke shard
→ 1. Menulis ganda ke DB lama & baru (bersama Audit Log)
→ 2. Setelah penulisan ganda dimulai, memulai backfill data dari DB lama ke DB baru
→ 3. Memverifikasi data di DB baru
→ 4. Beralih ke DB baru (dilakukan secara incremental)
- Pelajaran yang didapat dengan susah payah
→ Lakukan sharding lebih awal: karena menunggu sampai beban pada DB yang ada menjadi besar, migrasi itu sendiri juga menjadi beban sehingga tidak ada pilihan selain melakukannya secara perlahan
→ Jadikan migrasi zero downtime sebagai target: throughput dari penulisan ganda menjadi bottleneck utama pada saat cutover akhir.
→ Gunakan composite PK alih-alih partition key terpisah: jika id yang merupakan PK DB lama digabungkan dengan space_id yang merupakan partition key, maka tidak perlu meneruskan space_id di dalam aplikasi
1 komentar
Pembahasan tentang TXID di Postgres selalu menjadi salah satu topik yang sering muncul
Cacat-cacat PostgreSQL https://id.news.hada.io/topic?id=1829
Hal-hal yang dipelajari selama 5 tahun melakukan scaling PostgreSQL https://id.news.hada.io/topic?id=4101