29 poin oleh xguru 2021-10-18 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
xguru 2021-10-18

Pembahasan tentang TXID di Postgres selalu menjadi salah satu topik yang sering muncul