Những điều Notion học được khi sharding Postgres
(notion.so)- Đầu năm nay, Notion đã bị sập 5 phút và triển khai quá trình sharding PostgreSQL đã được chuẩn bị trong vài tháng
→ Phản hồi ngay lập tức bắt đầu xuất hiện rằng hệ thống đã nhanh hơn rất nhiều
- Khi nào họ quyết định sharding?
→ Sau khi tăng trưởng hàng chục nghìn lần trong 5 năm, Postgres monolith từng hoạt động tốt bắt đầu vượt quá dung lượng
→ VACUUM bắt đầu liên tục bị gián đoạn, và dự kiến TXID wraparound sẽ sớm xảy ra, nên họ bắt đầu công việc sharding
- Thiết kế schema sharding
→ Sharding ở cấp độ ứng dụng
⇨ Sẽ sharding dữ liệu nào
⇨ Sẽ phân vùng và chia dữ liệu bằng khóa nào
⇨ Cần tạo bao nhiêu shard và nên cấu hình chúng như thế nào
→ Quyết định #1
⇨ Notion có mô hình dữ liệu được tổ chức theo đơn vị block
⇨ Họ quyết định sharding tất cả các bảng được liên kết từ bảng block (Space, Discussion, Comment, v.v.)
→ Quyết định #2
⇨ block được phân vùng theo workspace ID
⇨ Mỗi workspace được gán một UUID nên họ tận dụng điều này
→ Quyết định #3
⇨ Cấu trúc gồm 480 shard logic và 32 DB vật lý
Lý do chọn 480 thay vì 512 là lũy thừa của 2, là vì đây là con số có thể chia tách linh hoạt hơn
- Di chuyển sang shard
→ 1. Ghi kép vào cả DB cũ và DB mới (kèm Audit Log)
→ 2. Sau khi bắt đầu ghi kép, khởi động backfill dữ liệu từ DB cũ sang DB mới
→ 3. Kiểm chứng dữ liệu của DB mới
→ 4. Chuyển sang DB mới (thực hiện theo kiểu incremental)
- Những bài học rút ra một cách khó khăn
→ Hãy sharding sớm hơn: vì họ đã chờ đến khi tải trên DB hiện tại trở nên quá lớn, nên bản thân quá trình migration cũng tạo thêm gánh nặng và buộc phải làm rất chậm
→ Hãy nhắm tới việc di chuyển không downtime: thông lượng của ghi kép là nút thắt cổ chai cốt lõi ở thời điểm chuyển đổi cuối cùng.
→ Hãy dùng PK tổng hợp thay vì khóa phân vùng riêng: nếu gộp id là PK của DB hiện tại với space_id là khóa phân vùng, thì có thể đã không cần phải truyền các space_id bên trong ứng dụng
1 bình luận
Câu chuyện về TXID của Postgres luôn là một trong những chủ đề thường xuyên được nhắc đến
Những điểm yếu của PostgreSQL https://vi.news.hada.io/topic?id=1829
Những điều học được sau 5 năm mở rộng quy mô PostgreSQL https://vi.news.hada.io/topic?id=4101