Data migration luôn là một trong những vấn đề nhức nhối với chúng ta, đặc biệt là khi dữ liệu lên tới hàng terabyte. Nếu xử lý không đúng cách có thể gây ra hàng loạt lỗi hệ thống, sập website, thậm chí mất đi những dữ liệu quan trọng.
Vào thời điểm năm 2019, tại Pinterest có 4 Key-Values storage system độc lập, được vận hành bởi các team khác nhau, có các APIs và tính năng khác nhau. Điều đó dẫn tới chi phí phát triển và vận hành tăng cao do nhiều trùng lặp, và gây khó khăn cho các lập trình viên khi sử dụng chúng.
Bốn Key-Values storage system của Pinterest ở thời điểm đó là:
-
Terrapin: Một key-value storage read-only, batch-load, được phát triển dựa trên HDFS
-
Rockstore: Một multi-mode (readonly, read-write, streaming-write) key-value storage, dựa trên open-source Rocksplicator framework, được viết bằng C++ và sử dụng RocksDB làm storage engine
-
UserMetaStore: Một read-write key-value storage sử dụng thrift API trên nền HBase
-
Rocksandra: Một read-write, key-value storage dựa trên Cassandra, và cũng sử dụng RocksDB.
Một trong những thách thức lớn nhất khi hợp nhất các hệ thống là đánh giá tính khả thi của của việc đạt được “
feature parity” và tích hợp các feature này vào một platform duy nhất.
Feature parity có nghĩa là trên hệ thống mới vẫn thực hiện các tính năng tương tự hệ thống cũ (“do what the existing system does”).
Một thách thức khác là xác định xem nên hợp nhất hệ thống nào, xem xét những gì đã có và chưa có trên Pinterest.
Và cuối cùng, cũng là quan trọng nhất, chính là thuyết phục ban lãnh đạo và cũng như hàng trăm kỹ sư khác đây là một ý tưởng hay!
Một nhóm đã làm việc suốt hàng tháng trời để đào sâu vào các yêu cầu chi tiết và kỹ thuật, phân tích những điểm cần đánh đổi và lợi ích, từ đó đưa ra một bản kế hoạch và được chấp thuận.
Rockstore được đánh giá là hiệu quả nhất về chi phí và hiệu năng, đơn giản để vận hành và mở rộng với chi phí migration thấp, do đó đã được lựa chọn làm storage system duy nhất để tích hợp các storage system khác.
Với việc hợp nhất toàn bộ các Key-Values system với nhau (500 + key-value use case, 4PB unique data, 100M QPS) vào một interface duy nhất, không chỉ giúp giảm độ phức tạp của hệ thống, giảm chi phí vận hành, đồng thời cũng tăng 40-90% performance bởi việc sử dụng một storage hiệu quả hơn. Qua đó cũng giảm một lượng lớn chi phí cho công ty.
Trong bài viết sau, chúng ta cùng điểm qua ba điểm chính (không phải tất cả) để giúp đạt được kết quả này.
Innovation 1: API abstractions cho phép migrate data một cách liên tục
Sử dụng API mới được gọi là API KVStore. Khi tất cả mọi người đều sử dụng một API thống nhất duy nhất được xây dựng với ý định chung, nhóm platform có thể linh hoạt thực hiện các thay đổi, thậm chí thay đổi công cụ lưu trữ.
Quá trình migrate được chia thành 2 phase như sau:
- Phase 1: Read-only data migration (totally seamless)
- Phase 2: Read-write data migration (partially seamless)
Innovation 2: Sử dụng wide-column format giúp tiết kiệm chi phí xử lý trên CPU và giảm băng thông network.
Nhóm đã đưa ra một định dạng file mới phù hợp với wide-column access pattern. Điều đó có nghĩa là thay vì lưu trữ dữ liệu theo dạng binary blob, bạn có thể lưu và encode dữ liệu theo một định dạng cho phép truy xuất theo kiểu key-value bằng cách kết hợp cả primary key và local key.
Ví dụ: Bạn có một cấu trúc dữ liệu UserData
gồm 30 field dữ liệu mapping với user id
, thay vì lưu theo pair (key: user id, value: UserData)
, bạn có thể lưu theo kiểu (key: user id, (local key: UserData field 1, local value: Userdata value 1), (local key: UserData field 2, local value: Userdata value 2))
.
Innovation 3: Hệ thống tạo phiên bản cho dữ liệu read-only, batch-loaded giúp tránh việc block data migration giữa các cluster
Mời các bạn cùng đọc bài viết sau để tìm hiểu rõ hơn.
(by lpv)