Các nhóm kỹ thuật thường cần chạy các bộ lọc, tập hợp và tìm kiếm văn bản phức tạp trên dữ liệu từ DynamoDB. Tuy nhiên, DynamoDB là cơ sở dữ liệu vận hành được tối ưu hóa cho việc xử lý giao dịch chứ không phải cho phân tích thời gian thực. Do đó, nhiều nhóm kỹ thuật đã đạt đến giới hạn về phân tích trên DynamoDB và tìm đến các phương án thay thế.
Đó là vì khối lượng công việc vận hành có kiểu truy cập rất khác so với khối lượng công việc phân tích phức tạp. DynamoDB chỉ hỗ trợ một nhóm hoạt động hạn chế, khiến việc phân tích trở nên khó khăn và trong một số trường hợp là không thể thực hiện được. Ngay cả AWS , công ty đứng sau DynamoDB, cũng khuyên các công ty nên cân nhắc chuyển tải phân tích sang các giải pháp được xây dựng có mục đích khác. Một giải pháp thường được nhắc đến là Elaticsearch mà chúng ta sẽ đi sâu vào hôm nay.
DynamoDB là một trong những cơ sở dữ liệu NoSQL phổ biến nhất và được nhiều công ty có quy mô web sử dụng trong trò chơi, mạng xã hội, IoT và dịch vụ tài chính. DynamoDB là cơ sở dữ liệu được lựa chọn nhờ khả năng mở rộng và tính đơn giản, cho phép đạt được hiệu suất chỉ vài mili giây ở quy mô 20 triệu yêu cầu mỗi giây. Để đạt được tốc độ này trên quy mô lớn, DynamoDB tập trung tối đa vào hiệu suất cho khối lượng công việc vận hành - các hoạt động có tần suất cao, độ trễ thấp trên các bản ghi dữ liệu riêng lẻ.
Elaticsearch là một công cụ tìm kiếm phân tán mã nguồn mở được xây dựng trên Lucene và được sử dụng cho các trường hợp sử dụng phân tích nhật ký và tìm kiếm văn bản. Elaticsearch là một phần của nhóm ELK lớn hơn bao gồm Kibana, một công cụ trực quan hóa cho bảng điều khiển phân tích. Mặc dù Elaticsearch được biết đến là linh hoạt và có khả năng tùy biến cao, nhưng đây là một hệ thống phân tán phức tạp đòi hỏi các hoạt động và quản lý cụm và chỉ mục để duy trì hiệu suất. Có các dịch vụ được quản lý của Elaticsearch có sẵn từ Elastic và AWS, vì vậy bạn không cần phải tự chạy nó trên các phiên bản EC2.
Shameless Plug: Rockset là cơ sở dữ liệu phân tích thời gian thực được xây dựng cho đám mây. Nó có một trình kết nối tích hợp với DynamoDB, đồng thời nhập và lập chỉ mục dữ liệu để tìm kiếm, tổng hợp và liên kết dưới giây. Nhưng bài đăng này nêu bật các trường hợp sử dụng của DynamoDB và Elaticsearch, trong trường hợp bạn muốn khám phá tùy chọn đó.
Bạn có thể sử dụng AWS Lambda để liên tục tải dữ liệu DynamoDB vào Elaticsearch để phân tích. Đây là cách nó hoạt động:
Có một phương pháp khác để đồng bộ hóa dữ liệu với Elaticsearch liên quan đến Plugin Logstash cho DynamoDB nhưng phương pháp này hiện không được hỗ trợ và có thể phức tạp khi định cấu hình.
Tìm kiếm văn bản là tìm kiếm văn bản bên trong tài liệu để tìm kết quả phù hợp nhất. Thông thường, bạn sẽ muốn tìm kiếm một phần của từ, từ đồng nghĩa hoặc trái nghĩa của các từ hoặc một chuỗi các từ với nhau để tìm ra kết quả tốt nhất. Một số ứng dụng thậm chí sẽ đánh giá các cụm từ tìm kiếm khác nhau dựa trên tầm quan trọng của chúng.
DynamoDB có thể hỗ trợ một số trường hợp sử dụng tìm kiếm văn bản hạn chế chỉ bằng cách sử dụng phân vùng để giúp lọc dữ liệu. Ví dụ: nếu bạn là một trang web thương mại điện tử, bạn có thể phân vùng dữ liệu trong DynamoDB dựa trên danh mục sản phẩm rồi chạy tìm kiếm trong bộ nhớ. Rõ ràng đây là cách bộ phận bán lẻ của Amazon.com xử lý rất nhiều trường hợp sử dụng tìm kiếm văn bản. DynamoDB cũng hỗ trợ hàm chứa cho phép bạn tìm chuỗi chứa chuỗi dữ liệu con cụ thể.
Một trang web thương mại điện tử có thể phân vùng dữ liệu dựa trên danh mục sản phẩm. Các thuộc tính bổ sung có thể được hiển thị cùng với dữ liệu đang được tìm kiếm như nhãn hiệu và màu sắc.
Trong trường hợp tìm kiếm toàn văn bản là cốt lõi đối với ứng dụng của bạn, bạn sẽ muốn sử dụng công cụ tìm kiếm như Elaticsearch với thứ hạng phù hợp. Đây là cách tìm kiếm văn bản hoạt động ở mức cao trong Elaticsearch:
Xếp hạng mức độ liên quan : Elaticsearch có xếp hạng mức độ liên quan mà nó cung cấp cho kết quả tìm kiếm ngay lập tức hoặc bạn có thể tùy chỉnh xếp hạng cho trường hợp sử dụng ứng dụng cụ thể của mình. Theo mặc định, Elaticsearch sẽ tạo điểm xếp hạng dựa trên tần suất thuật ngữ, tần suất tài liệu nghịch đảo và định mức độ dài trường.
Phân tích văn bản : Elaticsearch chia văn bản thành các mã thông báo để lập chỉ mục dữ liệu, được gọi là mã thông báo. Sau đó, bộ phân tích sẽ được áp dụng cho các thuật ngữ được chuẩn hóa để nâng cao kết quả tìm kiếm. Bộ phân tích tiêu chuẩn mặc định phân chia văn bản theo Hiệp hội Unicode để cung cấp hỗ trợ chung, đa ngôn ngữ.
Elaticsearch cũng có các khái niệm như tìm kiếm mờ, tìm kiếm tự động hoàn thành và thậm chí mức độ liên quan nâng cao hơn có thể được định cấu hình để đáp ứng các chi tiết cụ thể của ứng dụng của bạn.
Các bộ lọc phức tạp được sử dụng để thu hẹp tập kết quả, từ đó truy xuất dữ liệu nhanh hơn và hiệu quả hơn. Trong nhiều trường hợp tìm kiếm, bạn sẽ muốn kết hợp nhiều bộ lọc hoặc bộ lọc trên một phạm vi dữ liệu, chẳng hạn như trong một khoảng thời gian.
Dữ liệu phân vùng DynamoDB và việc chọn khóa phân vùng tốt có thể giúp lọc dữ liệu hiệu quả hơn. DynamoDB cũng hỗ trợ các chỉ mục phụ để bạn có thể sao chép dữ liệu của mình và sử dụng khóa chính khác để hỗ trợ các bộ lọc bổ sung. Chỉ mục phụ có thể hữu ích khi có nhiều kiểu truy cập cho dữ liệu của bạn.
Ví dụ: một ứng dụng hậu cần có thể được thiết kế để lọc các mặt hàng dựa trên trạng thái giao hàng của chúng. Để lập mô hình kịch bản này trong DynamoDB, chúng ta sẽ tạo một bảng cơ sở cho hoạt động hậu cần với khóa phân vùng là Item_ID
, khóa sắp xếp là Status
và thuộc tính của người mua, ETA
và SLA
.
Chúng tôi cũng cần hỗ trợ một mẫu truy cập bổ sung trong DynamoDB khi độ trễ phân phối vượt quá SLA. Các chỉ mục phụ trong DynamoDB có thể được tận dụng để lọc ra chỉ những lần phân phối vượt quá SLA.
Một chỉ mục sẽ được tạo trên trường ETADelayedBeyondSLA
, đây là bản sao của thuộc tính ETA đã có trong bảng cơ sở. Dữ liệu này chỉ được đưa vào ETADelayedBeyondSLA
khi ETA vượt quá SLA. Chỉ mục phụ là chỉ mục thưa thớt, giúp giảm lượng dữ liệu cần quét trong truy vấn. Người buyer
là khóa phân vùng và khóa sắp xếp là ETADelayedBeyondSLA
.
Chỉ mục phụ có thể được sử dụng để hỗ trợ nhiều mẫu truy cập trong ứng dụng, bao gồm các mẫu truy cập liên quan đến các bộ lọc phức tạp.
DynamoDB có thao tác lọc biểu thức trong API truy vấn và quét để lọc các kết quả không khớp với biểu thức. filterexpression
chỉ được áp dụng sau một truy vấn hoặc thao tác quét bảng, do đó bạn vẫn bị ràng buộc ở giới hạn dữ liệu 1MB cho một truy vấn. Điều đó cho thấy, filterexpression
rất hữu ích trong việc đơn giản hóa logic ứng dụng, giảm kích thước tải trọng phản hồi và xác thực thời gian tồn tại. Tóm lại, bạn vẫn cần phân vùng dữ liệu theo mẫu truy cập của ứng dụng hoặc sử dụng chỉ mục phụ để lọc dữ liệu trong DynamoDB.
DynamoDB sắp xếp dữ liệu theo khóa và giá trị để truy xuất dữ liệu nhanh và không lý tưởng cho việc lọc phức tạp. Khi bạn yêu cầu các bộ lọc phức tạp, bạn có thể muốn chuyển sang một công cụ tìm kiếm như Elaticsearch vì các hệ thống này rất lý tưởng cho việc tìm kiếm các truy vấn đống cỏ khô.
Trong Elaticsearch, dữ liệu được lưu trữ trong chỉ mục tìm kiếm, nghĩa là danh sách các tài liệu có giá trị cột được lưu trữ dưới dạng danh sách đăng. Bất kỳ truy vấn nào có vị từ (ví dụ: WHERE
user=A) đều có thể nhanh chóng tìm nạp danh sách tài liệu thỏa mãn vị từ đó. Khi danh sách đăng bài được sắp xếp, chúng có thể được hợp nhất nhanh chóng tại thời điểm truy vấn để đáp ứng tất cả các tiêu chí lọc. Elaticsearch cũng sử dụngbộ nhớ đệm đơn giản để tăng tốc quá trình truy xuất các truy vấn bộ lọc phức tạp được truy cập thường xuyên.
Truy vấn bộ lọc, thường được gọi là truy vấn không tính điểm trong Elaticsearch, có thể truy xuất dữ liệu nhanh hơn và hiệu quả hơn truy vấn tìm kiếm văn bản. Đó là vì sự liên quan là không cần thiết đối với những truy vấn này. Hơn nữa, Elaticsearch cũng hỗ trợ các truy vấn phạm vi để có thể truy xuất dữ liệu nhanh chóng giữa ranh giới trên và ranh giới dưới (ví dụ: age
từ 0-5).
Tập hợp là khi dữ liệu được thu thập và thể hiện dưới dạng tóm tắt để phân tích xu hướng hoặc thông tin kinh doanh. Ví dụ: bạn có thể muốn hiển thị số liệu sử dụng cho ứng dụng của mình trong thời gian thực.
DynamoDB không hỗ trợ các hàm tổng hợp. Giải pháp thay thế được AWS đề xuất là sử dụng DynamoDB và Lambda để duy trì chế độ xem dữ liệu tổng hợp trong bảng DynamoDB.
Hãy sử dụng tổng hợp lượt thích trên một trang truyền thông xã hội như Twitter làm ví dụ. Chúng tôi sẽ đặt tweet_ID
làm khóa chính và sau đó là khóa sắp xếp làm khoảng thời gian để chúng tôi tổng hợp lượt thích. Trong trường hợp này, chúng tôi sẽ kích hoạt luồng DynamoDB và đính kèm hàm Lambda để khi các tweet được thích (hoặc không thích), chúng sẽ được lập bảng trong like_count
kèm theo dấu thời gian (ví dụ: last_ updated
).
Trong trường hợp này, các luồng DynamoDB và hàm Lambda được sử dụng để lập bảng like_count làm thuộc tính trên bảng.
Một tùy chọn khác là giảm tải các tập hợp sang cơ sở dữ liệu khác, như Elaticsearch. Elaticsearch cốt lõi là một chỉ mục tìm kiếm và đã bổ sung các tiện ích mở rộng để hỗ trợ các chức năng tổng hợp. Một trong những phần mở rộng đó là các giá trị tài liệu , một cấu trúc được xây dựng tại thời điểm lập chỉ mục để lưu trữ các giá trị tài liệu theo cách hướng theo cột. Theo mặc định, cấu trúc này được áp dụng cho các trường hỗ trợ giá trị tài liệu và có một số dung lượng lưu trữ đi kèm với giá trị tài liệu. Nếu bạn chỉ yêu cầu hỗ trợ cho việc tổng hợp trên dữ liệu DynamoDB, thì việc sử dụng kho dữ liệu có thể nén dữ liệu một cách hiệu quả cho các truy vấn phân tích trên các tập dữ liệu rộng có thể sẽ hiệu quả hơn về mặt chi phí.
Dưới đây là tổng quan cấp cao về khung tổng hợp của Elaticsearch :
Tập hợp nhóm : Bạn có thể coi việc phân nhóm giống như GROUP BY
trong thế giới cơ sở dữ liệu SQL. Bạn có thể nhóm các tài liệu dựa trên giá trị trường hoặc phạm vi. Tập hợp nhóm Elaticsearch cũng bao gồm tập hợp lồng nhau và tập hợp cha-con là những giải pháp phổ biến cho việc thiếu hỗ trợ liên kết.
Tổng hợp số liệu: Số liệu cho phép bạn thực hiện các phép tính như SUM
, COUNT
, AVG
, MIN
, MAX
, v.v. trên một tập hợp tài liệu. Số liệu cũng có thể được sử dụng để tính toán các giá trị cho tập hợp nhóm.
Tập hợp đường ống : Đầu vào của tập hợp đường ống là các tập hợp khác chứ không phải là tài liệu. Các cách sử dụng phổ biến bao gồm mức trung bình và sắp xếp dựa trên số liệu.
Có thể có những tác động về hiệu suất khi sử dụng tập hợp, đặc biệt là khi bạn mở rộng quy mô Elaticsearch .
Mặc dù Elaticsearch là một giải pháp để thực hiện tìm kiếm và tổng hợp phức tạp trên dữ liệu từ DynamoDB, nhưng nhiều người đề xuất serverless đã bày tỏ lo ngại về lựa chọn này. Các nhóm kỹ thuật chọn DynamoDB vì nó không có máy chủ và có thể được sử dụng trên quy mô lớn với rất ít chi phí vận hành. Chúng tôi đã đánh giá một số tùy chọn phân tích khác trên DynamoDB , bao gồm Athena, Spark và Rockset về khả năng dễ dàng thiết lập, bảo trì, khả năng truy vấn và độ trễ trong một blog khác.
Rockset là một giải pháp thay thế cho Elaticsearch và Alex DeBrie đã hướng dẫn cách lọc và tổng hợp các truy vấn bằng SQL trên Rockset. Rockset là cơ sở dữ liệu dựa trên nền tảng đám mây có trình kết nối tích hợp với DynamoDB , giúp bạn dễ dàng bắt đầu và mở rộng quy mô các trường hợp sử dụng phân tích, bao gồm cả các trường hợp sử dụng liên quan đến các phép nối phức tạp. Bạn có thể khám phá Rockset như một giải pháp thay thế cho Elaticsearch trong bản dùng thử miễn phí của chúng tôi với khoản tín dụng $300.