Giới thiệu TimeSeries Data Abstraction Layer của Netflix
(netflixtechblog.com)- Khi Netflix mở rộng sang nhiều lĩnh vực như VoD và Gaming, khả năng lưu trữ và xử lý lượng dữ liệu thời gian khổng lồ (mức petabyte) với độ trễ tính bằng mili giây ngày càng trở nên quan trọng.
- Dựa trên mô hình trừu tượng Key-Value và nền tảng Data Gateway, Netflix đã phát triển mô hình trừu tượng TimeSeries để cung cấp giải pháp lưu trữ và truy vấn hiệu quả dữ liệu sự kiện theo thời gian trên nhiều trường hợp sử dụng khác nhau.
Thách thức
- Tại Netflix, dữ liệu thời gian liên tục được tạo ra và sử dụng từ tương tác người dùng, mức độ hiển thị tài nguyên, cũng như hoạt động của mạng microservice phức tạp.
- Việc quản lý hiệu quả các dữ liệu này là yếu tố quan trọng để bảo đảm trải nghiệm người dùng và độ tin cậy của hệ thống.
- Các thách thức chính:
- Thông lượng cao: phải quản lý tối đa 10 triệu lượt ghi mỗi giây trong khi vẫn duy trì tính sẵn sàng cao.
- Truy vấn hiệu quả trên tập dữ liệu cực lớn: cần lưu trữ dữ liệu ở quy mô petabyte, trả về kết quả đọc theo khóa chính trong mức mili giây thấp, đồng thời hỗ trợ tìm kiếm và tổng hợp qua nhiều thuộc tính phụ.
- Đọc và ghi toàn cầu: hỗ trợ thao tác đọc/ghi ở bất kỳ đâu trên thế giới và cung cấp mô hình nhất quán có thể điều chỉnh.
- Cấu hình có thể điều chỉnh: cung cấp khả năng phân tách tập dữ liệu trong kho dữ liệu đơn tenant hoặc đa tenant.
- Xử lý lưu lượng tăng đột biến: phải quản lý các đợt tăng traffic xảy ra khi phát hành nội dung mới hoặc khôi phục sau sự cố khu vực.
- Hiệu quả chi phí: phải tối ưu hóa lưu giữ dài hạn trong khi giảm thiểu chi phí hạ tầng.
Mô hình trừu tượng TimeSeries
- Phân vùng dữ liệu: sử dụng chiến lược phân vùng theo thời gian độc đáo và cách tiếp cận event bucket để xử lý hiệu quả workload tăng đột biến và đơn giản hóa truy vấn.
- Lưu trữ linh hoạt: được thiết kế để tích hợp với nhiều backend lưu trữ khác nhau như Apache Cassandra và Elasticsearch.
- Khả năng cấu hình: cung cấp nhiều tùy chọn có thể tinh chỉnh cho từng tập dữ liệu, mang lại sự linh hoạt để thích ứng với nhiều trường hợp sử dụng.
- Khả năng mở rộng: hỗ trợ mở rộng theo chiều ngang và chiều dọc để xử lý thông lượng và khối lượng dữ liệu ngày càng tăng khi cơ sở người dùng và dịch vụ của Netflix phát triển.
- Hạ tầng shard: tận dụng Data Gateway Platform để triển khai hạ tầng đơn tenant và/hoặc đa tenant với mức cách ly truy cập và traffic cần thiết.
Mô hình dữ liệu
- Áp dụng mô hình dữ liệu sự kiện riêng nhằm đóng gói dữ liệu sự kiện để có thể truy vấn hiệu quả.
- Event item: event item là cặp khóa-giá trị mà người dùng dùng để lưu dữ liệu cho một sự kiện cụ thể. Ví dụ: {"device_type": "ios"}
- Event: event là một tập hợp có cấu trúc gồm một hoặc nhiều event item. Event xảy ra tại một thời điểm cụ thể và được nhận diện bằng timestamp do client tạo ra cùng với định danh sự kiện (như UUID). Tổ hợp event_time và event_id tạo thành một phần của khóa idempotency duy nhất của sự kiện, cho phép người dùng retry request một cách an toàn
- Time series ID: time_series_id là tập hợp của một hoặc nhiều event phát sinh trong khoảng thời gian lưu giữ của tập dữ liệu. Ví dụ, device_id lưu tất cả các event phát sinh trên một thiết bị cụ thể trong thời gian lưu giữ. Mọi event đều là bất biến và dịch vụ TimeSeries chỉ thực hiện append event vào time series ID tương ứng
- Namespace: namespace là tập hợp của time series ID và dữ liệu event, đại diện cho toàn bộ tập dữ liệu TimeSeries. Người dùng có thể tạo một hoặc nhiều namespace cho từng use case. Mô hình trừu tượng này áp dụng nhiều tùy chọn có thể điều chỉnh ở cấp namespace
API
- WriteEventRecordsSync: endpoint này ghi một batch event và gửi xác nhận độ bền dữ liệu trở lại client. Nó được dùng khi người dùng cần đảm bảo về độ bền dữ liệu
- WriteEventRecords: đây là phiên bản fire-and-forget của endpoint trên. Nó đưa batch event vào hàng đợi mà không có xác nhận độ bền. Trường hợp này phù hợp cho logging hoặc tracing khi người dùng ưu tiên thông lượng hơn và có thể chấp nhận mất mát dữ liệu nhỏ
- ReadEventRecords: khi có tổ hợp namespace, timeSeriesId, timeInterval và eventFilters tùy chọn, endpoint này trả về tất cả event phù hợp theo thứ tự giảm dần của event_time với độ trễ thấp ở mức mili giây
- SearchEventRecords: khi có tiêu chí tìm kiếm và khoảng thời gian, endpoint này trả về mọi event phù hợp. Các use case này phù hợp với đọc eventual consistency
- AggregateEventRecords: khi có tiêu chí tìm kiếm và chế độ tổng hợp (ví dụ: DistinctAggregation), endpoint này thực hiện phép tổng hợp tương ứng trong khoảng thời gian chỉ định. Tương tự endpoint Search, người dùng có thể chấp nhận eventual consistency và độ trễ có thể cao hơn (mức giây)
Tầng lưu trữ
- Tầng lưu trữ của TimeSeries gồm kho dữ liệu chính và kho dữ liệu chỉ mục tùy chọn.
- Apache Cassandra được ưu tiên làm kho dữ liệu để bảo đảm độ bền trong các kịch bản thông lượng cao.
- Elasticsearch được ưu tiên làm kho dữ liệu cho mục đích indexing.
Kho dữ liệu chính
- Tận dụng Apache Cassandra để xử lý các use case của TimeSeries.
- Quản lý dữ liệu bằng Temporal Partitioning, chia dữ liệu thành các chunk theo khoảng thời gian
- Time slice: ánh xạ tới bảng Cassandra tương ứng với khoảng thời gian lưu giữ
- Time bucket: phân chia lại dữ liệu trong time slice để tối ưu truy vấn theo phạm vi thời gian cụ thể
- Event bucket: tiếp tục phân chia time bucket để xử lý khối lượng lớn ghi vào time series trong thời gian ngắn
- Bảng dữ liệu lưu dữ liệu event thực tế, còn bảng metadata lưu thông tin cấu hình time slice theo namespace
Kho dữ liệu chỉ mục
- Để hỗ trợ các mẫu truy cập phụ thông qua thuộc tính không phải khóa chính, dữ liệu được lập chỉ mục vào Elasticsearch.
- Người dùng có thể cấu hình theo namespace danh sách các thuộc tính dùng cho tìm kiếm và tổng hợp.
Control plane
- Data plane xử lý thao tác đọc/ghi, còn control plane cấu hình mọi khía cạnh trong hoạt động của namespace
- Data plane giao tiếp với stack điều khiển TimeSeries, và stack này tương tác với Data Gateway control plane
- Cấu hình namespace cho phép điều chỉnh linh hoạt nhiều yếu tố khác nhau (ví dụ: phân vùng thời gian, buffering, consistency, retention...)
Cấu hình namespace
- Thông qua snippet cấu hình thể hiện tính linh hoạt của dịch vụ, có thể điều chỉnh nhiều yếu tố theo từng namespace.
Provisioning hạ tầng
- Dựa trên nhiều tham số khác nhau, hệ thống suy ra cấu hình tối ưu thông qua workflow provisioning tự động.
- Sau khi provision hạ tầng ban đầu, hệ thống sẽ mở rộng theo workload của người dùng.
Khả năng mở rộng
- Do khả năng dự báo mức sử dụng ở giai đoạn provision ban đầu còn hạn chế, cần phải điều chỉnh sau đó
- Mở rộng ngang: các instance máy chủ TimeSeries tự động scale up hoặc scale down theo nhu cầu traffic.
- Mở rộng dọc: có thể scale theo chiều dọc các instance máy chủ TimeSeries hoặc instance lưu trữ để có CPU, RAM và/hoặc dung lượng lưu trữ gắn kèm lớn hơn.
- Mở rộng đĩa: có thể gắn EBS để lưu dữ liệu, và khi dung lượng đĩa đạt đến một ngưỡng nhất định thì sẽ mở rộng volume EBS.
- Điều chỉnh các tập dữ liệu bị phân vùng quá mức hoặc chưa đủ thông qua tái phân vùng dữ liệu
Nguyên tắc thiết kế
- Idempotency của event: tích hợp idempotency vào mọi endpoint biến đổi để người dùng có thể retry request an toàn.
- Hedging dựa trên SLO: gán mục tiêu service-level objective (SLO) cho các endpoint khác nhau để bảo đảm hiệu năng.
- Trả về một phần: nếu client nhạy cảm với độ trễ, có thể chấp nhận tập kết quả một phần.
- Pagination thích ứng: nếu tầng dịch vụ nhận thấy tập dữ liệu time series có mật độ dày, nó sẽ điều chỉnh động fanout factor.
- Cửa sổ ghi giới hạn: giúp dữ liệu trở nên bất biến nhanh nhất có thể để có thể áp dụng các tối ưu hóa.
- Buffering khi ghi: để xử lý workload tăng đột biến, các event được gộp trong thời gian ngắn nhằm phân bổ tải đồng đều hơn.
- Nén động: khi dữ liệu trở nên bất biến, hệ thống dùng chiến lược nén để tối ưu hiệu năng đọc.
Hiệu năng thực tế
- Dịch vụ có thể ghi dữ liệu ở mức mili giây thấp và duy trì độ trễ đọc điểm ổn định.
Time Series được sử dụng tại Netflix như thế nào
Mô hình trừu tượng TimeSeries đóng vai trò quan trọng trên các dịch vụ cốt lõi của Netflix. Dưới đây là một số use case có tác động lớn
- Tracing và insight: thực hiện truy vết log trên toàn bộ ứng dụng và microservice trong Netflix để hiểu giao tiếp giữa các dịch vụ, hỗ trợ debug sự cố và trả lời các yêu cầu hỗ trợ
- Theo dõi tương tác người dùng: theo dõi hàng triệu tương tác người dùng như phát video, tìm kiếm, mức độ tương tác với nội dung, từ đó cung cấp insight giúp cải thiện theo thời gian thực thuật toán gợi ý của Netflix và nâng cao trải nghiệm người dùng tổng thể
- Phát hành tính năng và phân tích hiệu năng: theo dõi việc phát hành và hiệu năng của các tính năng sản phẩm mới, giúp kỹ sư Netflix đo lường cách người dùng tương tác với tính năng, từ đó hỗ trợ ra quyết định dựa trên dữ liệu cho các cải tiến tiếp theo
- Theo dõi asset impression và tối ưu hóa: theo dõi mức độ hiển thị asset để bảo đảm nội dung và asset được phân phối hiệu quả, đồng thời cung cấp phản hồi thời gian thực phục vụ tối ưu hóa
- Quản lý thanh toán và đăng ký: lưu trữ dữ liệu lịch sử liên quan đến quản lý thanh toán và đăng ký để bảo đảm tính chính xác của lịch sử giao dịch và hỗ trợ các yêu cầu dịch vụ khách hàng
Cải tiến trong tương lai
Khi các use case tiếp tục phát triển và nhu cầu làm cho mô hình trừu tượng này hiệu quả chi phí hơn ngày càng lớn, Netflix dự định cải tiến mạnh dịch vụ trong vài tháng tới. Một số hướng bao gồm
- Lưu trữ phân tầng để tăng hiệu quả chi phí: hỗ trợ chuyển dữ liệu cũ và ít được truy cập sang object storage rẻ hơn nhưng có thời gian tới first byte lâu hơn, qua đó có thể giúp Netflix tiết kiệm hàng triệu USD
- Dynamic event bucketing: thay vì dùng cấu hình khá tĩnh khi provision namespace, hệ thống sẽ hỗ trợ phân chia khóa theo thời gian thực vào các partition có kích thước tối ưu khi event được stream vào. Ưu điểm lớn của chiến lược này là giảm tổng chi phí read amplification bằng cách không phân vùng những
time_series_idkhông cần phân vùng. Ngoài ra, trong Cassandra 4.x cũng có những cải tiến đáng kể đối với việc đọc tập con dữ liệu từ các partition rất rộng, điều này có thể làm giảm nhu cầu phải chia nhỏ toàn bộ tập dữ liệu một cách mạnh tay từ trước - Caching: tận dụng tính bất biến của dữ liệu để cache thông minh theo từng khoảng thời gian riêng lẻ
- Count và các phép tổng hợp khác: một số người dùng chỉ quan tâm đến số lượng event trong một khoảng thời gian nhất định thay vì lấy toàn bộ dữ liệu event
Kết luận
- TimeSeries Abstraction là một thành phần quan trọng trong hạ tầng dữ liệu online của Netflix, hỗ trợ cả các quyết định theo thời gian thực lẫn dài hạn.
- Khi Netflix tiếp tục mở rộng sang các lĩnh vực mới, TimeSeries Abstraction sẽ vẫn là yếu tố cốt lõi của nền tảng và góp phần mở rộng năng lực cho streaming và xa hơn nữa
Ý kiến của GN⁺
- Kinh nghiệm của Netflix trong việc xử lý ổn định khối lượng lớn dữ liệu time series thông qua mô hình trừu tượng TimeSeries, đồng thời đạt được khả năng mở rộng, tính linh hoạt và hiệu quả chi phí, là điều rất ấn tượng. Đặc biệt, các kỹ thuật tối ưu theo đặc tính dữ liệu và mẫu truy cập như phân vùng theo thời gian, buffering khi ghi, nén động rất nổi bật
- Đây không chỉ là một cơ sở dữ liệu time series đơn thuần, mà là một tầng trừu tượng cho phép tận dụng linh hoạt nhiều hệ lưu trữ như Cassandra, Elasticsearch, đồng thời có cơ chế điều khiển để provision và vận hành hạ tầng phù hợp với đặc tính workload. Thông qua lớp trừu tượng này, người dùng có thể ẩn đi sự phức tạp và tập trung vào dữ liệu
- Hiện hệ thống cho thấy năng lực tiếp nhận dữ liệu ở quy mô petabyte và xử lý 15 triệu event mỗi giây, là hình mẫu đáng tham khảo cho các doanh nghiệp muốn xây dựng pipeline dữ liệu time series hiệu năng cao. Đặc biệt, với các dịch vụ quy mô lớn, không chỉ khối lượng và tốc độ dữ liệu mà cả yếu tố chi phí cũng phải được cân nhắc một cách tổng thể
- Hệ thống đang được ứng dụng rộng rãi trong các mảng cốt lõi của hoạt động kinh doanh Netflix như tracing, phân tích hành vi người dùng, quản lý thanh toán, cho thấy dữ liệu time series là động lực cho ra quyết định dựa trên dữ liệu và đổi mới dịch vụ. Đây không chỉ là logging đơn giản mà còn là nền tảng cho các dịch vụ dựa trên ML/AI như gợi ý thời gian thực
- Có thể thấy rõ ý chí tiếp tục tiến hóa thông qua các kế hoạch cải tiến như lưu trữ phân tầng, phân vùng động, và các phép tổng hợp. Để đáp ứng yêu cầu kinh doanh thay đổi nhanh chóng, kiểu đổi mới liên tục như vậy sẽ là điều cần thiết. Cũng có thể kỳ vọng kinh nghiệm tích lũy trong quá trình này sẽ được chia sẻ thông qua open source hoặc các hình thức khác
Chưa có bình luận nào.