Chuyển đến nội dung

PHẦN III: Dữ Liệu Dẫn Xuất

Trang này thuộc ấn bản thứ 1, ấn bản thứ 2 chưa có sẵn.

Trong Phần IPhần II của cuốn sách này, chúng ta đã xây dựng từng bước tất cả các cân nhắc quan trọng đối với một cơ sở dữ liệu phân tán, từ cách tổ chức dữ liệu trên đĩa cho đến giới hạn của tính nhất quán phân tán khi có lỗi xảy ra. Tuy nhiên, phần thảo luận đó giả định rằng ứng dụng chỉ sử dụng một cơ sở dữ liệu duy nhất.

Trên thực tế, các hệ thống dữ liệu thường phức tạp hơn. Trong một ứng dụng lớn, bạn thường cần truy cập và xử lý dữ liệu theo nhiều cách khác nhau, và không có một cơ sở dữ liệu nào có thể đáp ứng tất cả những nhu cầu đó cùng một lúc. Do đó, ứng dụng thường dùng kết hợp nhiều kho dữ liệu (datastores), chỉ mục (indexes), bộ nhớ cache, hệ thống phân tích… và triển khai các cơ chế để di chuyển dữ liệu từ kho này sang kho khác.

Trong phần cuối này của cuốn sách, chúng ta sẽ xem xét các vấn đề xung quanh việc tích hợp nhiều hệ thống dữ liệu khác nhau, có thể với các mô hình dữ liệu khác nhau và được tối ưu cho các pattern truy cập khác nhau, thành một kiến trúc ứng dụng thống nhất. Khía cạnh xây dựng hệ thống này thường bị các nhà cung cấp bỏ qua khi họ tuyên bố sản phẩm của mình có thể đáp ứng mọi nhu cầu. Trên thực tế, tích hợp các hệ thống khác nhau là một trong những việc quan trọng nhất cần làm trong một ứng dụng nghiêm túc.

Hệ Thống Nguồn và Dữ Liệu Dẫn Xuất

Nhìn ở mức cao, các hệ thống lưu trữ và xử lý dữ liệu có thể được chia thành hai loại lớn:

Hệ thống nguồn (Systems of record)

Một hệ thống nguồn, còn gọi là nguồn sự thật (source of truth), lưu giữ phiên bản có thẩm quyền của dữ liệu của bạn. Khi dữ liệu mới đến, ví dụ như từ đầu vào của người dùng, nó được ghi vào đây trước. Mỗi sự kiện được biểu diễn chính xác một lần (biểu diễn thường được chuẩn hóa / normalized). Nếu có sự khác biệt giữa một hệ thống khác và hệ thống nguồn, thì giá trị trong hệ thống nguồn (theo định nghĩa) là giá trị đúng.

Hệ thống dữ liệu dẫn xuất (Derived data systems)

Dữ liệu trong một hệ thống dẫn xuất là kết quả của việc lấy dữ liệu hiện có từ hệ thống khác và biến đổi hoặc xử lý theo một cách nào đó. Nếu bạn mất dữ liệu dẫn xuất, bạn có thể tạo lại từ nguồn gốc. Ví dụ điển hình là bộ nhớ cache: dữ liệu có thể được phục vụ từ cache nếu có, nhưng nếu cache không chứa thứ bạn cần, bạn có thể quay lại cơ sở dữ liệu gốc. Các giá trị phi chuẩn hóa (denormalized values), chỉ mục, và materialized view cũng thuộc loại này. Trong hệ thống gợi ý (recommendation systems), dữ liệu tóm tắt dự đoán thường được dẫn xuất từ log sử dụng.

Về mặt kỹ thuật, dữ liệu dẫn xuất là dư thừa (redundant), theo nghĩa nó sao chép thông tin đã có. Tuy nhiên, nó thường rất cần thiết để đạt được hiệu suất tốt khi truy vấn. Nó thường được phi chuẩn hóa (denormalized). Bạn có thể dẫn xuất nhiều dataset khác nhau từ một nguồn duy nhất, cho phép bạn nhìn dữ liệu từ các “góc nhìn” khác nhau.

Không phải tất cả hệ thống đều phân biệt rõ ràng giữa hệ thống nguồn và dữ liệu dẫn xuất trong kiến trúc, nhưng đây là một sự phân biệt rất hữu ích, vì nó làm rõ luồng dữ liệu trong hệ thống của bạn: nó làm rõ phần nào của hệ thống có đầu vào và đầu ra gì, và chúng phụ thuộc vào nhau như thế nào.

Hầu hết các cơ sở dữ liệu, storage engine và ngôn ngữ truy vấn về bản chất không phải là hệ thống nguồn hay hệ thống dẫn xuất. Cơ sở dữ liệu chỉ là một công cụ: bạn dùng nó như thế nào là tùy bạn. Sự phân biệt giữa hệ thống nguồn và hệ thống dữ liệu dẫn xuất không phụ thuộc vào công cụ, mà phụ thuộc vào cách bạn sử dụng nó trong ứng dụng.

Bằng cách làm rõ dữ liệu nào được dẫn xuất từ dữ liệu nào khác, bạn có thể mang lại sự rõ ràng cho một kiến trúc hệ thống vốn khó hiểu. Điểm này sẽ là chủ đề xuyên suốt trong phần cuối này của cuốn sách.

Tổng Quan Các Chương

Chúng ta sẽ bắt đầu ở Chương 11 bằng cách xem xét các hệ thống luồng dữ liệu hướng lô (batch-oriented dataflow systems) như MapReduce, và xem chúng cung cấp cho chúng ta những công cụ và nguyên tắc tốt như thế nào để xây dựng các hệ thống dữ liệu quy mô lớn. Trong Chương 12 chúng ta sẽ lấy những ý tưởng đó và áp dụng chúng vào luồng dữ liệu (data streams), cho phép chúng ta làm những điều tương tự với độ trễ thấp hơn. Trong Chương 13 chúng ta khám phá các ý tưởng về cách chúng ta có thể sử dụng những công cụ này để xây dựng các ứng dụng đáng tin cậy, có khả năng mở rộng và dễ bảo trì trong tương lai. Chương 14 kết thúc cuốn sách với đạo đức, quyền riêng tư và tác động xã hội của các hệ thống dữ liệu.

Mục Lục