Datomic: cơ sở dữ liệu hệ thống ghi nhận mục đích chung
# Bối cảnh của Datomic
- Datomic là cơ sở dữ liệu mục đích chung dành cho các hệ thống ghi nhận.
- Trạng thái cơ sở dữ liệu được biểu diễn bằng các bộ ba
[entity, attribute, value] (EAV), được gọi là datom.
- Schema kiểm soát kiểu và lực lượng bản số của các thuộc tính.
- Đây là một cơ sở dữ liệu thời gian có mô hình hóa thời gian một cách tường minh.
- Mỗi giao dịch được định danh bằng dấu thời gian logic
t và thời gian đồng hồ thực txInstant.
- Giao dịch có thể thêm hoặc xóa datom.
- Mọi datom đều giữ tham chiếu đến giao dịch.
- Cơ sở dữ liệu là một tập hợp liên tục tăng lên của các bộ như vậy.
# Tính năng của Datomic
- Người dùng có thể yêu cầu trạng thái snapshot của cơ sở dữ liệu theo thời gian logic hoặc thời gian đồng hồ thực.
- Có thể xem toàn bộ lịch sử của cơ sở dữ liệu.
- Có thể truy vấn qua API kiểu Datalog, API duyệt đồ thị khai báo, và kiểu dữ liệu
Entity theo phong cách ODM.
- Có hai phiên bản: Datomic Pro và Datomic Cloud.
# 1.1 Kiến trúc
- Datomic Pro được cấu thành từ nhiều dịch vụ phối hợp với nhau.
- Transactors thực thi giao dịch ghi, duy trì chỉ mục, và ghi dữ liệu vào kho lưu trữ.
- Peers là các client dày, bao gồm thư viện JVM để gửi giao dịch, chạy truy vấn, và cache kết quả.
- Clients là các client mỏng, chuyển tiếp giao dịch và truy vấn tới peer server.
- Mỗi giao dịch được thêm vào log theo thứ tự thời gian.
- Dữ liệu được lưu dưới dạng cây bền vững và bất biến trong các kho dữ liệu như Cassandra hoặc DynamoDB.
- Sử dụng phép toán Sequential CaS để đảm bảo thứ tự giao dịch toàn cục.
- Peers kết nối trực tiếp tới kho lưu trữ và transactors.
# 1.2 Mô hình giao dịch
- Datomic có một mô hình giao dịch độc đáo.
- Nó tách biệt nghiêm ngặt đường đọc và đường ghi.
- Đọc lấy trạng thái bất biến của cơ sở dữ liệu.
- Giao dịch ghi được biểu diễn như một danh sách có thứ tự các thao tác.
- Hàm giao dịch đọc trạng thái cơ sở dữ liệu và trả về một tập thao tác mới.
- Hàm giao dịch không trả về giá trị cho bên gọi.
- Giao dịch chỉ trả về các hiệu ứng.
- NuBank sử dụng Datomic để cung cấp dịch vụ tài chính.
# 1.3 Tính nhất quán
- Hệ thống quảng bá giao dịch ACID, đồng thời hứa hẹn rõ ràng về mô hình nhất quán và đảm bảo độ bền.
- Giao dịch được lưu như một lần ghi nguyên tử duy nhất.
- Mọi peer đều nhìn thấy các giao dịch đã hoàn tất đến một thời điểm nhất định.
- Hệ thống đảm bảo giao dịch Serializable.
- Có thể gọi d/sync để đồng bộ với trạng thái mới nhất.
- Hệ thống được thiết kế như một hệ thống ghi đơn, nhưng nhiều transactor có thể chạy đồng thời.
# 2 Thiết kế kiểm thử
- Thiết kế bộ kiểm thử Datomic bằng thư viện kiểm thử Jepsen.
- Cài đặt Datomic Pro 1.0.7075 trên một cụm node Debian Bookworm.
- Provision bảng DynamoDB trên AWS.
- Chạy kiểm thử trên nhiều node khác nhau, bao gồm Transactors và Peers.
- Thực hiện các thao tác của bộ kiểm thử thông qua HTTP API.
- Chèn nhiều loại lỗi khác nhau, bao gồm phân hoạch mạng và Garbage Collection.
- Sử dụng dịch vụ systemd để khởi động lại transactors.
# 2.1 Append vào danh sách
- Thiết kế thao tác append vào danh sách bằng trình kiểm tra giao dịch Elle.
- Mỗi danh sách được nhận diện bằng khóa chính.
- Thực hiện các giao dịch bao gồm đọc và thao tác append.
- Datomic lưu các thuộc tính đa giá trị dưới dạng tập hợp không có thứ tự.
- Dùng hàm giao dịch để biểu diễn giao dịch đọc-ghi.
# 2.2 Append vào danh sách bằng CaS
- Sử dụng hàm db/cas để kiểm soát cập nhật đồng thời của một thuộc tính.
- Dùng mẫu CaS để đảm bảo snapshot isolation.
- Mỗi danh sách được mã hóa thành chuỗi một giá trị, phân tách bằng dấu phẩy.
# 2.3 Tính nhất quán nội bộ
- Thiết kế các thao tác để đo lường tính nhất quán nội bộ.
- Bao gồm các giao dịch thay đổi giá trị thuộc tính nhiều lần, hoặc thêm và xóa fact.
- Thực hiện phép toán CaS nhiều lần.
# 2.4 Phê duyệt
- Thiết kế một máy trạng thái mô phỏng phê duyệt và từ chối.
- Các hàm phê duyệt và từ chối lần lượt kiểm tra trạng thái tương ứng rồi hủy giao dịch.
# 3 Kết quả
- Không phát hiện hành vi nào vi phạm các tuyên bố an toàn cốt lõi của Datomic.
- Các giao dịch có vẻ như được thực thi theo tổng thứ tự.
- Các giao dịch đọc dùng (d/sync conn) phù hợp với thứ tự thời gian thực.
- Tính nhất quán nội bộ phù hợp với tài liệu của Datomic, nhưng khác với hành vi cơ sở dữ liệu thông thường.
# 3.1 Tính nhất quán nội bộ
- Hầu hết cơ sở dữ liệu cung cấp ngữ nghĩa thực thi tuần tự bên trong giao dịch.
- Datomic xử lý mọi thao tác trong giao dịch như thực thi đồng thời.
- Hàm giao dịch chỉ quan sát trạng thái cơ sở dữ liệu tại thời điểm bắt đầu giao dịch.
- Nếu xảy ra xung đột trên thuộc tính cardinality đơn, giao dịch sẽ bị hủy.
# 3.2 Sai lệch ghi ảo
- Vì các hàm giao dịch được thực thi đồng thời, những hàm đúng khi đứng riêng có thể tạo ra kết quả sai khi chạy cùng nhau.
- Nếu hàm phê duyệt và từ chối được gọi trong cùng một giao dịch, cả phê duyệt lẫn từ chối đều có thể cùng xảy ra.
- Điều này phù hợp với tài liệu của Datomic, nhưng có thể gây bất ngờ cho người dùng.
# 3.3 Predicate thực thể
- Có thể dùng predicate thực thể để đảm bảo các bất biến của cơ sở dữ liệu.
- Hệ thống cung cấp nhiều loại ràng buộc, bao gồm kiểu, tính duy nhất, và predicate tùy ý.
- Predicate thực thể kiểm tra toàn bộ trạng thái cơ sở dữ liệu để quyết định có cho phép giao dịch hay không.
- Thêm predicate thực thể vào các hàm phê duyệt và từ chối để đảm bảo bất biến.
Ý kiến của GN⁺
- Datomic là một cơ sở dữ liệu thời gian, rất hữu ích cho các hệ thống ghi nhận như dịch vụ tài chính, vì có thể dễ dàng truy vấn trạng thái dữ liệu trong quá khứ.
- Mô hình thực thi đồng thời của hàm giao dịch giúp tăng hiệu năng, nhưng có thể không quen thuộc với người dùng.
- Có thể triển khai dễ dàng các ràng buộc toàn vẹn dữ liệu phức tạp thông qua predicate thực thể.
- Việc được sử dụng trong các dịch vụ tài chính quy mô lớn như NuBank cho thấy độ ổn định và khả năng mở rộng đã được kiểm chứng.
- Mô hình giao dịch độc đáo của Datomic đòi hỏi cách tư duy khác với cơ sở dữ liệu truyền thống, nên có thể có đường cong học tập.
1 bình luận
Ý kiến trên Hacker News
Tóm tắt các bình luận trên Hacker News
Thảo luận thú vị và cải thiện tài liệu
Hiểu hành vi giao dịch của Datomic
Giá trị của báo cáo về Datomic
Nguồn gốc cái tên Jepsen
Hữu ích cho việc viết chương trình Clojure
Xây dựng kho dữ liệu kiểu Datomic
Mô hình dữ liệu của Datomic
Làm rõ tài liệu của Datomic
Ưu điểm của thiết kế đơn luồng
Đặc tính giao dịch của Datomic