Nhiều nhóm phát triển chuyển sang DynamoDB để xây dựng kiến trúc hướng sự kiện và các ứng dụng hiệu quả, thân thiện với người dùng trên quy mô lớn. Là cơ sở dữ liệu vận hành, DynamoDB được tối ưu hóa cho các giao dịch theo thời gian thực ngay cả khi được triển khai trên nhiều vị trí địa lý. Tuy nhiên, nó không cung cấp hiệu suất mạnh mẽ cho các mẫu truy cập tìm kiếm và phân tích.
Mặc dù cơ sở dữ liệu NoSQL như DynamoDB thường có đặc điểm mở rộng tuyệt vời nhưng chúng chỉ hỗ trợ một số hoạt động hạn chế tập trung vào xử lý giao dịch trực tuyến. Điều này gây khó khăn cho việc tìm kiếm, lọc, tổng hợp và nối dữ liệu mà không dựa nhiều vào các chiến lược lập chỉ mục hiệu quả.
DynamoDB lưu trữ dữ liệu một cách chuyên sâu bằng cách phân vùng dữ liệu trên một số lượng lớn nút dựa trên trường khóa phân vùng do người dùng chỉ định có trong mỗi mục. Khóa phân vùng do người dùng chỉ định này có thể được kết hợp tùy ý với khóa sắp xếp để biểu thị khóa chính. Khóa chính hoạt động như một chỉ mục, giúp cho các thao tác truy vấn không tốn kém. Thao tác truy vấn có thể thực hiện so sánh đẳng thức (=) trên khóa phân vùng và các thao tác so sánh (>, <, =, GIỮA) trên khóa sắp xếp nếu được chỉ định.
Việc thực hiện các truy vấn phân tích không nằm trong sơ đồ trên yêu cầu sử dụng thao tác quét, thao tác này thường được thực thi bằng cách quét song song trên toàn bộ bảng DynamoDB. Những lần quét này có thể chậm và tốn kém về thông lượng đọc vì chúng yêu cầu đọc toàn bộ bảng. Quá trình quét cũng có xu hướng chậm lại khi kích thước bảng tăng lên vì có nhiều dữ liệu cần quét hơn để tạo ra kết quả. Nếu muốn hỗ trợ các truy vấn phân tích mà không gặp phải chi phí quét quá cao, chúng ta có thể tận dụng các chỉ mục phụ mà chúng ta sẽ thảo luận tiếp theo.
Trong DynamoDB, chỉ mục phụ thường được sử dụng để cải thiện hiệu suất ứng dụng bằng cách lập chỉ mục các trường được truy vấn thường xuyên. Các thao tác truy vấn trên chỉ mục phụ cũng có thể được sử dụng để hỗ trợ các tính năng cụ thể thông qua các truy vấn phân tích có yêu cầu được xác định rõ ràng.
Các chỉ mục phụ bao gồm việc tạo các khóa phân vùng và các khóa sắp xếp tùy chọn trên các trường mà chúng ta muốn truy vấn. Có hai loại chỉ mục phụ:
Chỉ mục phụ cục bộ (LSI): LSI mở rộng các thuộc tính khóa băm và phạm vi cho một phân vùng.
Chỉ mục phụ toàn cầu (GSI): GSI là các chỉ mục được áp dụng cho toàn bộ bảng thay vì một phân vùng duy nhất.
Tuy nhiên, như Nike đã phát hiện ra , việc lạm dụng GSI trong DynamoDB có thể gây tốn kém. Phân tích trong DynamoDB, trừ khi chúng chỉ được sử dụng để tra cứu điểm rất đơn giản hoặc quét phạm vi nhỏ, có thể dẫn đến việc sử dụng quá mức các chỉ mục phụ và chi phí cao.
Chi phí cho năng lực cung cấp khi sử dụng chỉ mục có thể tăng lên nhanh chóng vì tất cả các cập nhật vào bảng cơ sở cũng phải được thực hiện trong GSI tương ứng. Trên thực tế, AWS khuyên rằng dung lượng ghi được cung cấp cho chỉ mục phụ toàn cục phải bằng hoặc lớn hơn dung lượng ghi của bảng cơ sở để tránh hạn chế việc ghi vào bảng cơ sở và làm tê liệt ứng dụng. Chi phí cho khả năng ghi được cung cấp tăng tuyến tính theo số lượng GSI được định cấu hình, khiến việc sử dụng nhiều GSI để hỗ trợ nhiều mẫu truy cập trở nên rất tốn kém.
DynamoDB cũng không được thiết kế phù hợp để lập chỉ mục dữ liệu trong các cấu trúc lồng nhau, bao gồm mảng và đối tượng. Trước khi lập chỉ mục dữ liệu, người dùng sẽ cần chuẩn hóa dữ liệu, làm phẳng các đối tượng và mảng lồng nhau. Điều này có thể làm tăng đáng kể số lượng ghi và chi phí liên quan.
Để kiểm tra chi tiết hơn về cách sử dụng chỉ mục phụ của DynamoDB cho phân tích, hãy xem blog của chúng tôi Chỉ mục phụ dành cho phân tích trên DynamoDB .
Điểm mấu chốt là đối với các trường hợp sử dụng phân tích, bạn có thể đạt được lợi thế đáng kể về hiệu suất và chi phí bằng cách đồng bộ hóa bảng DynamoDB với một công cụ hoặc dịch vụ khác hoạt động như một chỉ mục phụ bên ngoài để chạy các phân tích phức tạp một cách hiệu quả.
Một cách tiếp cận để xây dựng chỉ mục phụ trên dữ liệu của chúng tôi là sử dụng DynamoDB với Elaticsearch. Elaticsearch dựa trên đám mây, chẳng hạn như Elastic Cloud hoặc Amazon OpenSearch Service, có thể được sử dụng để cung cấp và định cấu hình các nút theo kích thước của chỉ mục, bản sao và các yêu cầu khác. Một cụm được quản lý yêu cầu một số thao tác để nâng cấp, bảo mật và duy trì hiệu suất, nhưng ít hơn so với việc tự mình chạy cụm đó hoàn toàn trên các phiên bản EC2.
Vì phương pháp sử dụng Plugin Logstash cho Amazon DynamoDB không được hỗ trợ và khá khó thiết lập nên thay vào đó, chúng tôi có thể truyền luồng ghi từ DynamoDB vào Elaticsearch bằng cách sử dụng Luồng DynamoDB và hàm AWS Lambda. Cách tiếp cận này yêu cầu chúng ta thực hiện hai bước riêng biệt:
Chúng ta phải viết và kết nối cả hai hàm lambda này với các quyền chính xác để đảm bảo rằng chúng ta không bỏ sót bất kỳ thao tác ghi nào vào bảng của mình. Khi chúng được thiết lập cùng với hoạt động giám sát cần thiết, chúng tôi có thể nhận tài liệu trong Elaticsearch từ DynamoDB và có thể sử dụng Elaticsearch để chạy các truy vấn phân tích trên dữ liệu.
Ưu điểm của phương pháp này là Elaticsearch hỗ trợ lập chỉ mục toàn văn bản và một số loại truy vấn phân tích. Elaticsearch hỗ trợ khách hàng bằng nhiều ngôn ngữ và công cụ khác nhau như Kibana để trực quan hóa có thể giúp nhanh chóng xây dựng trang tổng quan. Khi một cụm được định cấu hình chính xác, độ trễ truy vấn có thể được điều chỉnh để có các truy vấn phân tích nhanh đối với dữ liệu chảy vào Elaticsearch.
Nhược điểm bao gồm chi phí thiết lập và bảo trì giải pháp có thể cao. Ngay cả Elaticsearch được quản lý cũng yêu cầu xử lý việc sao chép, phân chia lại, tăng trưởng chỉ mục và điều chỉnh hiệu suất của các phiên bản cơ bản.
Elaticsearch có kiến trúc được liên kết chặt chẽ, không tách biệt tính toán và lưu trữ. Điều này có nghĩa là tài nguyên thường được cung cấp quá mức vì chúng không thể mở rộng quy mô một cách độc lập. Ngoài ra, nhiều khối lượng công việc, chẳng hạn như đọc và ghi, sẽ tranh giành cùng một tài nguyên điện toán.
Elaticsearch cũng không thể xử lý các bản cập nhật một cách hiệu quả. Việc cập nhật bất kỳ trường nào sẽ kích hoạt việc lập chỉ mục lại toàn bộ tài liệu. Tài liệu Elaticsearch là bất biến, vì vậy mọi bản cập nhật đều yêu cầu tài liệu mới phải được lập chỉ mục và phiên bản cũ được đánh dấu là đã xóa. Điều này dẫn đến việc tính toán bổ sung và I/O được sử dụng để lập chỉ mục lại ngay cả những trường không thay đổi và để ghi toàn bộ tài liệu khi cập nhật.
Vì lambda kích hoạt khi nhìn thấy bản cập nhật trong luồng DynamoDB nên chúng có thể có độ trễ tăng đột biến do khởi động nguội . Quá trình thiết lập yêu cầu số liệu và giám sát để đảm bảo rằng nó xử lý chính xác các sự kiện từ luồng DynamoDB và có thể ghi vào Elaticsearch.
Về mặt chức năng, về mặt truy vấn phân tích, Elaticsearch thiếu hỗ trợ cho các phép nối , tính năng này rất hữu ích cho các truy vấn phân tích phức tạp liên quan đến nhiều hơn một chỉ mục. Người dùng Elaticsearch thường phải chuẩn hóa dữ liệu, thực hiện các phép nối phía ứng dụng hoặc sử dụng các đối tượng lồng nhau hoặc mối quan hệ cha-con để khắc phục hạn chế này.
Thuận lợi
Nhược điểm
Cách tiếp cận này có thể hoạt động tốt khi triển khai tìm kiếm toàn văn bản trên dữ liệu trong DynamoDB và bảng thông tin bằng Kibana. Tuy nhiên, các hoạt động cần thiết để điều chỉnh và duy trì cụm Elaticsearch trong sản xuất, việc sử dụng tài nguyên không hiệu quả và thiếu khả năng tham gia có thể là một thách thức.
Rockset là cơ sở dữ liệu phân tích và tìm kiếm được quản lý hoàn toàn, được xây dựng chủ yếu để hỗ trợ các ứng dụng thời gian thực có yêu cầu QPS cao. Nó thường được sử dụng làm chỉ mục phụ bên ngoài cho dữ liệu từ cơ sở dữ liệu OLTP.
Rockset có trình kết nối tích hợp với DynamoDB, có thể dùng để giữ dữ liệu được đồng bộ hóa giữa DynamoDB và Rockset. Chúng ta có thể chỉ định bảng DynamoDB mà chúng ta muốn đồng bộ hóa nội dung và bộ sưu tập Rockset lập chỉ mục cho bảng. Rockset lập chỉ mục nội dung của bảng DynamoDB trong ảnh chụp nhanh đầy đủ rồi đồng bộ hóa các thay đổi mới khi chúng xảy ra. Nội dung của bộ sưu tập Rockset luôn đồng bộ với nguồn DynamoDB; cách nhau không quá vài giây ở trạng thái ổn định.
Rockset tự động quản lý tính toàn vẹn và nhất quán của dữ liệu giữa bảng DynamoDB và bộ sưu tập Rockset bằng cách giám sát trạng thái của luồng và cung cấp khả năng hiển thị về các thay đổi phát trực tuyến từ DynamoDB.
Nếu không có định nghĩa lược đồ, bộ sưu tập Rockset có thể tự động điều chỉnh khi các trường được thêm/xóa hoặc khi cấu trúc/loại dữ liệu tự thay đổi trong DynamoDB. Điều này có thể thực hiện được bằng cách gõ động mạnh mẽ vàcác lược đồ thông minh giúp loại bỏ nhu cầu về bất kỳ ETL bổ sung nào.
Bộ sưu tập Rockset mà chúng tôi lấy từ DynamoDB hỗ trợ SQL để truy vấn và các nhà phát triển có thể dễ dàng sử dụng mà không cần phải học ngôn ngữ dành riêng cho miền. Nó cũng có thể được sử dụng để phục vụ các truy vấn tới các ứng dụng qua API REST hoặc sử dụng thư viện máy khách bằng một số ngôn ngữ lập trình. Bộ siêu dữ liệu ANSI SQL mà Rockset hỗ trợ có thể hoạt động nguyên bản trên các mảng và đối tượng JSON được lồng sâu, đồng thời tận dụng các chỉ mục được tạo tự động trên tất cả các trường, để có được độ trễ mili giây ngay cả trên các truy vấn phân tích phức tạp.
Rockset đã đi tiên phong trong việc phân tách điện toán-điện toán , cho phép tách biệt khối lượng công việc trong các đơn vị điện toán riêng biệt trong khi chia sẻ cùng một dữ liệu thời gian thực cơ bản. Điều này mang lại cho người dùng hiệu quả tài nguyên cao hơn khi hỗ trợ nhập và truy vấn đồng thời hoặc nhiều ứng dụng trên cùng một tập dữ liệu.
Ngoài ra, Rockset còn đảm nhiệm việc bảo mật, mã hóa dữ liệu và kiểm soát quyền truy cập dựa trên vai trò để quản lý quyền truy cập vào dữ liệu đó. Người dùng Rockset có thể tránh nhu cầu về ETL bằng cách tận dụng các phép biến đổi đầu vào mà chúng tôi có thể thiết lập trong Rockset để sửa đổi dữ liệu khi dữ liệu được đưa vào bộ sưu tập. Người dùng cũng có thể tùy ý quản lý vòng đời của dữ liệu bằng cách thiết lập chính sách lưu giữ để tự động xóa dữ liệu cũ hơn. Cả việc nhập dữ liệu và phân phát truy vấn đều được quản lý tự động, cho phép chúng tôi tập trung vào việc xây dựng và triển khai các trang tổng quan và ứng dụng trực tiếp, đồng thời loại bỏ nhu cầu vận hành và quản lý cơ sở hạ tầng.
Đặc biệt có liên quan đến việc đồng bộ hóa với DynamoDB, Rockset hỗ trợ các bản cập nhật cấp trường tại chỗ để tránh việc lập chỉ mục lại tốn kém. So sánh Rockset và Elaticsearch về khả năng nhập, truy vấn và hiệu quả để chọn công cụ phù hợp cho công việc.
Chúng tôi có thể sử dụng Rockset để triển khai phân tích thời gian thực đối với dữ liệu trong DynamoDB mà không cần bất kỳ mối lo ngại nào về vận hành, mở rộng quy mô hoặc bảo trì. Điều này có thể tăng tốc đáng kể sự phát triển của các ứng dụng thời gian thực. Nếu muốn xây dựng ứng dụng của mình trên dữ liệu DynamoDB bằng Rockset, bạn có thể bắt đầu miễn phí tại đây .