- vừa được xem lúc

[Redis] - Giải pháp xử lý 300 triệu bản ghi với Redis

0 0 35

Người đăng: TheLight

Theo Viblo Asia

Đây là câu chuyện về 1 lần chuyển đổi hệ thống của Instagram.

Lúc đó họ cần một giải pháp map 300 triệu bức ảnh với user id tương ứng, các yêu cầu đặt ra là:

  • Trả về giá trị tương ứng theo khóa với tốc độ cực nhanh
  • Tiết kiệm bộ nhớ, sử dụng 1 server với RAM 17GB hoặc 34GB chứ ko phải cỡ 68GB
  • Phù hợp với hạ tầng hiện tại đã có
  • Bền vững, an toàn, ko để mất dữ liệu

Giải pháp đơn giản nhất là lưu vào các hàng trong database, với các cột "Media ID" và "User ID". Tuy nhiên một cơ sở dữ liệu SQL có vẻ quá mức cần thiết cũng như không đem lại hiệu suất cao, các bản ghi này ko bao giờ update, chỉ insert, chẳng cần transaction và cũng chẳng có quan hệ nào giữa các bảng.

Thay vào đó các kỹ sư của Instagram đã quyết định chuyển sang Redis, một key-value store nâng cao mà họ đã mở rộng và đem lại sức mạnh cho phần main feed của họ. Redis không chỉ là 1 cơ chế key-value thông thường dạng lưu vào rồi lấy ra như Memcached mà nó thực sự là 1 công cụ lợi hại trong lĩnh vực key-value.

Redis cung cấp những kiểu dữ liệu tính toán mạnh mẽ như sorted sets và lists. Ngoài ra còn cung cấp một cơ chế bảo toàn dữ liệu có thể cấu hình, dữ liệu được lưu trữ ngầm theo khoảng thời gian và có thể cài đặt để chạy master-slave. Tất cả server Redis của Instagram được deploy với master-slave với các slave lưu vào ổ cứng hàng phút.

Ban đầu, họ quyết định dùng Redis theo cách đơn giản nhất có thể. Với mỗi ID, key sẽ là media ID và value sẽ là user ID:

SET media:1155315 939
GET media:1155315
> 939

Khi thử nghiệm giải pháp này họ tìm ra rằng Redis cần khoảng 70MB để lưu trữ 1,000,000 key theo cách này. Mở rộng ra với 300,000,000, con số thực tế mà họ cần, nó sẽ tốn vào khoảng 21GB bộ nhớ, như vậy đã là lớn hơn server 17GB của Amazon EC2

Họ tìm đến sự trợ giúp từ: Pieter Noordhuis, một trong những dev chính của Redis, và anh ta đã khuyên họ rằng, hãy sử dụng Redis Hash. Hash trong Redis là một dạng từ điển mà có thể mã hóa, đóng gói(encode) trong bộ nhớ rất hiệu quả. Trong phần setting của Redis có một cấu hình là 'hash-zipmap-max-entries' dùng để tùy chỉnh số lượng thực thể tối đa một hash có thể chứa mà vẫn đảm bảo việc encode hiệu quả. Họ đã nghiên cứu và tìm ra rằng con số 1000 là tốt nhất, bất kỳ con số nào cao hơn khi chạy lệnh HSET sẽ gây ra cảnh báo với hoạt động của CPU.

Để tận dụng lợi thế của kiểu dữ liệu Hash, họ đóng lưu Media ID vào từng key, ví dụ key tên là "mediabucket + mã bucket" (mã bucket = Media ID chia cho 1000 và bỏ phần dư). Ví dụ với Media ID là 1155315 thì mã bucket sẽ là 1155 (1155315 / 1000 = 1155).

HSET "mediabucket:1155" "1155315" "939"
HGET "mediabucket:1155" "1155315"
> "939"

Kích thước đã thay đổi một cách bất ngờ, với 1,000,000 key (đóng gói thành 1000 hash, mỗi hash chứa 1000 key), Redis chỉ cần 16MB để lưu trữ. Nhân lên với 300 triệu key, con số tổng sẽ là 5GB, trong thực tế chi phí rẻ hơn rất nhiều, chỉ vào khoảng 1/3 so với trước đây. Và hơn cả là việc truy xuất hash có độ phức tạp là O(1) nên tốc độ xử lý là vô cùng nhanh.

Nếu bạn hứng thú với những điều trên, đây là đoạn mã các kỹ sư của Instagram đã dùng để test (họ có test cả Memcached trong đoạn mã để so sánh và nó tốn khoảng 52MB cho 1 triệu key): https://gist.github.com/mikeyk/1329319

Nguồn:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Caching đại pháp 2: Cache thế nào cho hợp lý?

Caching rất dễ. Mình không nói đùa đâu, caching rất là dễ. Ai cũng có thể làm được chỉ sau 10 phút đọc tutorial. Nó cũng giống như việc đứa trẻ lên 3 đã có thể cầm bút để vẽ vậy.

0 0 126

- vừa được xem lúc

Caching đại pháp 1: Nấc thang lên level của developer

Bí quyết thành công trong việc đáp ứng hệ thống triệu user của những công ty lớn (và cả công ty nhỏ). Tại sao caching lại là kỹ thuật tối quan trọng để phù phép ứng dụng rùa bò của chúng ta thành siêu phẩm vạn người mê.

0 0 82

- vừa được xem lúc

Cache dữ liệu Nodejs với Redis

Một tí gọi là lý thuyết để anh em tham khảo. Cache là gì. Lợi ích của việc cache data. .

0 0 111

- vừa được xem lúc

Nguyên tắc hoạt động của redis server

Sự ra đời của Redis. . Câu chuyện bắt đầu khi tác giả của Redis, Salvatore Sanfilippo. (nickname: antirez), cố gắng làm những công việc gần như là không.

0 0 97

- vừa được xem lúc

Viết ứng dụng chat realtime với Laravel, VueJS, Redis và Socket.IO, Laravel Echo

Xin chào tất cả các bạn, đây là một trong những bài post đầu tiên của mình. Sau bao năm toàn đi đọc các blog tích luỹ được chút kiến thức của các cao nhân trên mạng.

0 0 918

- vừa được xem lúc

Tìm hiểu tổng quan về Redis

1. Lời mở đầu.

0 0 368