1 điểm bởi GN⁺ 2024-05-17 | 1 bình luận | Chia sẻ qua WhatsApp

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 gianmô 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 tthờ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 ProDatomic 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đườ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 TransactorsPeers.
  • 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ạngGarbage 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 đọcthao 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ệttừ chối.
  • Các hàm phê duyệttừ 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ệttừ 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ệttừ 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

 
GN⁺ 2024-05-17
Ý 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

    • Cuộc thảo luận trong quá trình làm việc rất thú vị. Cũng khá bất ngờ khi Jepsen không phát hiện ra lỗi nghiêm trọng. Việc làm rõ tài liệu và các hành vi bất thường được chủ đích là một kết quả hữu ích. Đây là một bài tập có giá trị, giúp tăng sự tự tin khi vận hành ngân hàng sử dụng Datomic.
  • Hiểu hành vi giao dịch của Datomic

    • Đây là lần đầu tôi đọc kỹ một báo cáo Jepsen, và tôi rất thích phần giải thích rõ ràng về hành vi giao dịch của Datomic. Tôi nhận ra trước đây mình chưa thực sự hiểu rõ sự khác biệt với cơ sở dữ liệu SQL. Cấu trúc giao dịch của Datomic và việc đổi tên các thành phần trong đó khá đáng chú ý.
  • Giá trị của báo cáo về Datomic

    • Đây là một báo cáo rất chi tiết và là một phân tích xuất sắc về một cơ sở dữ liệu tốt. Tôi cũng rất vui khi tài liệu đã trở nên rõ ràng hơn và được cập nhật. Cũng nghĩ sẽ thật tuyệt nếu Apple từng nhờ Jepsen phân tích FoundationDB.
  • Nguồn gốc cái tên Jepsen

    • Cái tên Jepsen được lấy từ ca sĩ Carly Rae Jepsen. Tôi nghĩ đây là một cái tên hoàn hảo cho nghiên cứu hệ thống phân tán.
  • Hữu ích cho việc viết chương trình Clojure

    • Lúc nào cũng là công việc tuyệt vời. Tôi thích đọc những nội dung như thế này để tìm hiểu về các hệ thống này và nhặt nhạnh những chi tiết nhỏ hữu ích cho việc viết chương trình Clojure.
  • Xây dựng kho dữ liệu kiểu Datomic

    • Gần đây tôi đang xây dựng một kho dữ liệu kiểu Datomic nên báo cáo này có vẻ sẽ rất hữu ích. Tôi cũng thích bài phân tích về MongoDB, và khuyên mọi người nên xem thêm các phân tích về Redis, RethinkDB và những hệ khác.
  • Mô hình dữ liệu của Datomic

    • Mô hình dữ liệu của Datomic khá trực quan nếu bạn đã quen với triple store/RDF. Tuy vậy, điều này lại không thường được nhắc đến trong tài liệu hay các thảo luận trực tuyến. Tôi tự hỏi liệu đó là vì mọi người không quen với các khái niệm này, hay vì mối liên hệ với semantic web có thể gây nhầm lẫn.
  • Làm rõ tài liệu của Datomic

    • Jepsen đã làm rõ các tình huống vi phạm tính bất biến, nhưng có vẻ cách tiếp cận của Datomic tập trung vào việc làm rõ tài liệu. Có vẻ nhóm Datomic đang xem những vi phạm này là lỗi từ phía người dùng.
  • Ưu điểm của thiết kế đơn luồng

    • Quyết định thiết kế xử lý thao tác ghi bằng một luồng duy nhất đã phát huy hiệu quả. Datomic là sản phẩm của một thiết kế xuất sắc, và tôi muốn dùng lại nó lần nữa.
  • Đặc tính giao dịch của Datomic

    • Dù tôi chưa dùng Datomic quá nhiều, tôi không thấy ngạc nhiên khi các giao dịch về cơ bản là xử lý theo lô. Nó hoạt động trên một luồng duy nhất nên ít điều kiện tranh chấp hơn; chậm theo thiết kế nhưng an toàn.