Giới thiệu
- Năm 2017, Discord đã chia sẻ cách họ chuyển cơ sở dữ liệu từ MongoDB sang Cassandra để lưu trữ tin nhắn
- Cassandra mang lại khả năng mở rộng, khả năng chịu lỗi và dễ bảo trì, nhưng theo thời gian, các vấn đề hiệu năng và gánh nặng bảo trì ngày càng tăng
- Năm 2022, Discord tiếp tục chuyển cơ sở dữ liệu sang ScyllaDB
Các vấn đề với Cassandra
- Cấu trúc lưu trữ tin nhắn: Tin nhắn được phân vùng và lưu trữ theo
channel_id và bucket
- Vấn đề hot partition: Khi lưu lượng dồn vào một kênh cụ thể, độ trễ của toàn bộ cơ sở dữ liệu sẽ tăng lên
- Vấn đề bảo trì: Hiệu năng suy giảm do các tác vụ nén SSTable và vấn đề garbage collection của JVM
Thay đổi kiến trúc
- Áp dụng ScyllaDB: Cơ sở dữ liệu tương thích Cassandra được viết bằng C++, giúp giải quyết vấn đề garbage collection
- Dịch vụ dữ liệu: Đặt một dịch vụ trung gian giữa API và cơ sở dữ liệu để điều tiết lưu lượng và cải thiện hiệu năng
- Sử dụng Rust: Dùng Rust để viết mã đồng thời an toàn và nhanh
Dịch vụ dữ liệu
- Gộp yêu cầu: Khi nhiều người dùng yêu cầu cùng một dữ liệu, chỉ truy vấn cơ sở dữ liệu một lần rồi chia sẻ kết quả
- Định tuyến dựa trên consistent hashing: Định tuyến các yêu cầu của cùng một kênh đến cùng một instance dịch vụ để giảm tải cho cơ sở dữ liệu
Di trú quy mô lớn
- Xây dựng cụm ScyllaDB: Sử dụng SSD cục bộ và RAID để tạo cấu hình lưu trữ nhanh và bền bỉ
- Di trú dữ liệu: Dùng trình di trú dữ liệu viết bằng Rust để chuyển dữ liệu nhanh chóng
- Xác thực dữ liệu tự động: Gửi một lượng nhỏ yêu cầu đọc đến cả hai cơ sở dữ liệu rồi so sánh kết quả để xác minh tính toàn vẹn dữ liệu
Vài tháng sau
- Hiệu năng cải thiện: Mang lại hiệu năng tốt hơn Cassandra với số lượng node ít hơn
- Giảm độ trễ: Hiệu năng truy xuất và chèn tin nhắn được cải thiện đáng kể
- Trường hợp sử dụng sản phẩm mới: Nhờ cải thiện hiệu năng, có thể triển khai các tính năng mới
# Tóm tắt của GN⁺
- Discord đã chuyển cơ sở dữ liệu sang ScyllaDB để giải quyết các vấn đề hiệu năng của Cassandra
- Thông qua dịch vụ dữ liệu viết bằng Rust và ScyllaDB, Discord quản lý lưu lượng hiệu quả và cải thiện hiệu năng
- Trong quá trình di trú dữ liệu, Discord đã sử dụng các phương pháp nhanh và hiệu quả để hoàn tất việc chuyển đổi mà không có downtime
- Bài viết này trình bày những thách thức và cách giải quyết trong một cuộc di trú cơ sở dữ liệu quy mô lớn, hữu ích với những ai quan tâm đến vận hành hệ thống lớn
1 bình luận
Ý kiến trên Hacker News
Bài blog đổ lỗi cho GC, nhưng thực ra vấn đề nằm ở cách dùng Cassandra hoặc cách Cassandra xử lý việc xóa hàng loạt
Nếu dùng giao thức chat phân tán thì đã không gặp vấn đề này
Ý kiến bổ sung từ đồng sáng lập ScyllaDB
tombstone_gc=repairmớiLớp dịch vụ gợi nhớ đến Varnish Cache
Việc xóa các tin nhắn cũ gần như là bất khả thi
Đây là một bài viết được viết rất tốt
Số lượng node lưu trữ tin nhắn của Discord ít hơn dự đoán
Lưu trữ dữ liệu và khai thác dữ liệu là hai vấn đề khác nhau
Đội ngũ ScyllaDB đã ưu tiên cải thiện hiệu năng và triển khai truy vấn ngược
Thảo luận về "How Discord Stores Trillions of Messages"