Xây dựng dịch vụ web có tính sẵn sàng cao mà không cần cơ sở dữ liệu
Khám phá
- Với một startup mới, thông thường sẽ chọn các web framework như Rails, Django, Node cùng với các cơ sở dữ liệu như MySQL, PostgreSQL, MongoDB
- Nhưng nếu có thể gộp dịch vụ web và instance cơ sở dữ liệu thành một thì sao? Có thể tiếp cận theo cách lưu toàn bộ dữ liệu trong RAM
- Khi dùng RAM làm cơ sở dữ liệu, không còn cần tuần tự hóa dữ liệu bằng truy vấn SQL
- Chỉ mục có thể được triển khai bằng bảng băm trong bộ nhớ
- Tác vụ nền có thể được xử lý bằng các luồng bên trong một tiến trình lớn
- Nếu tiến trình bị crash, có thể khôi phục bằng cách chụp snapshot RAM định kỳ và ghi các thay đổi xuống đĩa
Mở rộng
- Khi xuất hiện khách hàng yêu cầu tính sẵn sàng cao, có thể sao chép máy chủ bằng thuật toán đồng thuận Raft
- Nếu máy chủ leader gặp sự cố, một leader mới sẽ được bầu để xử lý yêu cầu
- Theo cách này, có thể triển khai rolling deployment mà không cần khởi động lại máy chủ
Tách ra
- Khi số lượng khách hàng lớn tăng lên, có thể phân chia dịch vụ web bằng sharding để xử lý
- Cung cấp cụm chuyên dụng cho từng khách hàng doanh nghiệp
- Điểm nghẽn chính có thể là hiệu năng của commit thread
Stack của chúng tôi
- Dùng Common Lisp: hỗ trợ đa luồng rất tốt và phù hợp cho hot reloading mã
- Dùng bknr.datastore và bknr.cluster: sử dụng thư viện Braft của Baidu để triển khai Raft
- Dùng EFS để lưu tệp hình ảnh: dễ xử lý lỗi và kiểm thử hơn S3
Tóm tắt
- Kiến trúc này phù hợp với các startup mới, và khi dùng Common Lisp thì nhiều công cụ đã sẵn có
- Xin cảm ơn những đóng góp của bknr.datastore, Braft và Raft
Tổng hợp của GN⁺
- Bài viết này giới thiệu một kiến trúc mới để xây dựng dịch vụ web có tính sẵn sàng cao mà không cần cơ sở dữ liệu
- Dùng RAM làm cơ sở dữ liệu và đảm bảo tính sẵn sàng cao thông qua thuật toán đồng thuận Raft
- Sử dụng Common Lisp để hỗ trợ đa luồng và hot reloading mã
- Kiến trúc này phù hợp với các startup mới, cho phép phát triển và gỡ lỗi nhanh
- Các dự án có chức năng tương tự gồm Redis và Memcached
1 bình luận
Ý kiến trên Hacker News
Việc tự tạo transaction log thay vì dùng SQLite là khá kỳ lạ
ramdiskvà sao chép sang bộ nhớ lưu trữ bền vững bằng các công cụ tiêu chuẩn sẽ đơn giản hơnViệc tự xây dựng cơ sở dữ liệu in-memory thay vì dùng MySQL, Postgres, Redis, MongoDB, v.v. là rất phức tạp
Không muốn học những khía cạnh cơ bản của MySQL hay Postgres là một sự lãng phí thời gian
Đây là kiến trúc tương tự Nomad, Consul và Vault của HashiCorp
Có một hiểu lầm rằng RAM rất rẻ
Đã từng thấy một dự án dùng thư mục hệ thống tệp làm bảng và file JSON làm hàng
Dùng cơ sở dữ liệu quan hệ ổn định hơn
Đã tự triển khai một tầng đồng thuận Raft để tránh thứ gì đó phức tạp hơn
Các ứng dụng desktop và mobile hiện đại thường dùng cơ sở dữ liệu như SQLite
Tự xây dựng cơ sở dữ liệu in-memory không hề đơn giản hơn việc cài Postgres hay SQLite