Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Cách phân tích và tối ưu hóa việc sử dụng bộ nhớ trong Redis

Redis là kho dữ liệu trong bộ nhớ, có nghĩa là toàn bộ tập dữ liệu được lưu trong bộ nhớ (RAM). Mặc dù điều này rất tốt cho hiệu suất, nhưng khi kích thước của dữ liệu bắt đầu lớn hơn, ngày càng nhiều RAM cần được thêm vào để chứa tất cả dữ liệu đó. Điều này có thể nhanh chóng trở nên đắt đỏ và trước khi bạn biết điều đó, chi phí máy chủ bắt đầu tăng vọt, khiến bạn lo lắng về việc liệu Redis có thể mở rộng quy mô cho bạn theo cách tiết kiệm chi phí hay không.

Tất nhiên, đây là vấn đề chung với bất kỳ cơ sở dữ liệu nào, nhưng lại gây hại nhiều hơn trong trường hợp cơ sở dữ liệu trong bộ nhớ như Redis, vì RAM đắt hơn bộ nhớ thứ cấp như đĩa cứng và SSD. Tuy nhiên, chúng ta phải nhớ rằng Redis không dùng để lưu trữ hàng terabyte dữ liệu cho ứng dụng của bạn. Thay vào đó, nó được sử dụng để lưu trữ cụ thể dữ liệu cần được đọc (và ở mức độ thấp hơn, được ghi) với tốc độ rất cao, trong khi phần dữ liệu còn lại của bạn có thể nằm trên cơ sở dữ liệu truyền thống được hỗ trợ bằng đĩa. Vì vậy, Redis thường được sử dụng làm bộ nhớ đệm, chỉ chứa dữ liệu hoạt động nhiều nhất với yêu cầu thông lượng đọc / ghi cao (nghĩ đến bảng điểm và tin nhắn trò chuyện thời gian thực). Do đó, thủ phạm chính của việc sử dụng quá nhiều bộ nhớ với Redis là hành vi của ứng dụng. Ứng dụng của bạn có thể đang lưu trữ dữ liệu không cần thiết không có lợi khi ở trong Redis hoặc thậm chí dữ liệu hoàn toàn dư thừa, tức là dữ liệu chưa bao giờ được sử dụng cho bất kỳ mục đích nào như người dùng này đã từng làm.

Để chẩn đoán sự cố sử dụng quá nhiều bộ nhớ, rõ ràng chúng ta cần một cách để tìm ra khóa nào đang sử dụng nhiều bộ nhớ nhất để chúng ta có thể bắt đầu suy luận và hiểu hành vi nào của ứng dụng đang gây ra sự cố. Hãy nhớ rằng, tối ưu hóa quá sớm là gốc rễ của mọi điều xấu, và Redis không phải là ngoại lệ. Chúng ta hoàn toàn cần khả năng hiển thị các đặc điểm bộ nhớ của tập dữ liệu của mình để thậm chí bắt đầu suy nghĩ xem vấn đề nằm ở đâu và chúng ta có thể khắc phục nó như thế nào. Dưới đây, chúng tôi khám phá một số tùy chọn có sẵn để xem xét dữ liệu Redis của chúng tôi và tìm những khu vực có thể được hưởng lợi từ việc tối ưu hóa ở cấp ứng dụng.

Lệnh MEMORY USAGE

Lệnh được đặt tên phù hợp này có sẵn kể từ Redis 4.0.0 và là bước đầu tiên để gỡ lỗi bộ nhớ với Redis. Từ tài liệu:

Lệnh MEMORY USAGE báo cáo số byte mà một khóa và giá trị của nó yêu cầu được lưu trữ trong RAM. Mức sử dụng được báo cáo là tổng số lần phân bổ bộ nhớ cho dữ liệu và chi phí quản trị mà một khóa mà giá trị của nó yêu cầu.

Đây là một ví dụ:

MEMORY USAGE users_by_reputation
(integer) 2923419

Một số nguyên đơn giản đại diện cho số byte được sử dụng để lưu trữ khóa, giá trị và chi phí nội bộ được trả về. Để nhanh chóng tìm thấy mức sử dụng bộ nhớ của một khóa cụ thể, nó không đơn giản hơn thế này.

Hai khuyết điểm có thể xảy ra là:

  1. Lệnh này chỉ khả dụng trong Redis 4.0.0 trở lên. Điều này không bao gồm hầu hết các nhà cung cấp đám mây.
  2. Nó chỉ cho bạn biết bộ nhớ được sử dụng bởi một phím duy nhất, vì vậy trừ khi bạn biết trước phím hoặc các phím nào đang gây ra sự cố, lệnh này có rất ít hữu ích.

redis-rdb-tools

redis-rdb-tools là một công cụ dòng lệnh nhỏ tiện lợi vượt ra ngoài MEMORY USAGE khiêm tốn lệnh mà chúng ta đã thảo luận ở trên. Đây là một công cụ cấu hình bộ nhớ phổ biến và mạnh mẽ được xây dựng dành riêng cho Redis để phân tích cú pháp tệp Redis dump (.rdb) và tạo hồ sơ bộ nhớ chi tiết cho mỗi khóa trong kết xuất, bao gồm các chi tiết như bộ nhớ được sử dụng, kiểu dữ liệu, số phần tử, v.v ... Nó cũng cho phép bạn lọc các khóa được xử lý, vì vậy bạn có thể tùy chọn chạy phân tích trên một khóa cụ thể hoặc một tập hợp con các khóa phù hợp với một mẫu cụ thể. Đầu ra của phân tích là tệp CSV với các cột cho khóa, bộ nhớ đã sử dụng, kiểu dữ liệu, số phần tử, v.v.

Công cụ này quá tuyệt vời bởi vì, không giống như MEMORY USAGE , chỉ hoạt động trên một phím duy nhất, công cụ này phân tích toàn bộ tập dữ liệu và đưa ra kết quả ở định dạng CSV, có nghĩa là bạn có thể tải nó vào bất kỳ cơ sở dữ liệu SQL nào và thực hiện bất kỳ truy vấn nào bạn thích, sắp xếp và lọc nó theo ý muốn , với tất cả sức mạnh của SQL, cung cấp cho bạn cái nhìn sâu sắc về chi phí bộ nhớ cho dữ liệu của bạn. Như một phần thưởng, nếu bạn đang sử dụng các phiên bản Redis trước 4.0.0, bạn vẫn có thể sử dụng công cụ này để phân tích các khóa đơn nếu muốn, vì công cụ này hoạt động bằng cách phân tích cú pháp kết xuất nhị phân mà Redis tạo ra, thay vì dựa vào Redis để báo cáo việc sử dụng bộ nhớ. Mặt khác, sự khác biệt trong cách tiếp cận này có nghĩa là việc sử dụng bộ nhớ được tính toán chỉ mang tính ước tính hơn là một con số chính xác, như đã đề cập trong tài liệu của dự án. Tuy nhiên, đây không thực sự là vấn đề khi mục tiêu của chúng tôi là xác định các vấn đề sử dụng bộ nhớ, vì chúng tôi quan tâm nhiều hơn đến kích thước tương đối của các khóa và xác định các khóa sử dụng nhiều bộ nhớ hơn đáng kể mà chúng nên sử dụng, vì vậy một vài byte ở đây hoặc ở đó thực sự không liên quan.

Công cụ RDBT

RDBTools là một công cụ dựa trên web cung cấp một số công cụ để quản lý và tối ưu hóa Redis, với trọng tâm chính là tối ưu hóa bộ nhớ. Nó được sinh ra từ dự án redis-rdb-tools mã nguồn mở đã thảo luận ở trên. Với nó, chúng tôi có thể dễ dàng phân tích mức sử dụng bộ nhớ của máy chủ Redis của chúng tôi bằng cách chỉ cần trỏ đến phiên bản của chúng tôi và nhấp vào “Phân tích”. Công cụ tải xuống bản kết xuất từ ​​phiên bản đang chạy và phân tích nó, hiển thị cho bạn một giao diện người dùng mượt mà để lọc và sắp xếp các khóa của bạn dựa trên các tham số khác nhau như mức sử dụng bộ nhớ, kiểu dữ liệu, mã hóa, số phần tử, v.v., tương tự như dòng lệnh nhưng không có bất kỳ nỗ lực thủ công nào liên quan đến việc kết xuất, tạo hồ sơ bộ nhớ, thiết lập cơ sở dữ liệu, nhập hồ sơ, viết và chạy truy vấn, v.v.

Ngoài ra, RDBTools cũng tạo ra một số biểu đồ và đồ thị từ cấu hình bộ nhớ cho phép bạn hiểu rõ hơn về dữ liệu của mình, cùng với các đề xuất để tối ưu hóa cấu hình máy chủ Redis của bạn, dựa trên các tiêu chuẩn ngành và nhiều năm kinh nghiệm tối ưu hóa Redis, để rút ra tiết kiệm bộ nhớ hơn nữa. Ngoài tối ưu hóa bộ nhớ, có một loạt các tính năng khác hữu ích cho bất kỳ ai sử dụng Redis, như CLI phong phú được tích hợp sẵn, trình chỉnh sửa cấu hình với tài liệu nội tuyến, trình hiển thị dữ liệu trực tiếp phong phú, v.v.

RDBTools có sẵn dưới dạng hình ảnh docker, có sẵn trong docker hub và có thể chạy trên máy của riêng bạn, vì vậy bạn không cần phải lo lắng về việc rò rỉ dữ liệu nhạy cảm. Phiên bản dùng thử được cung cấp miễn phí vĩnh viễn, với một số giới hạn sử dụng. Xem trang giá để biết thêm thông tin về các gói trả phí khác nhau có sẵn.

Kết luận

Hết bộ nhớ là một vấn đề không thể tránh khỏi khi sử dụng cơ sở dữ liệu trong bộ nhớ như Redis. Giống như tất cả các vấn đề tối ưu hóa, bước đầu tiên là chẩn đoán vấn đề một cách chính xác. Điều quan trọng là phải chống lại sự cám dỗ nhanh chóng đi đến kết luận dựa trên các giả thuyết chưa được xác minh. “Đo lường, đo lường, đo lường” là tên của trò chơi khi nói đến tối ưu hóa và có nhiều phương pháp và công cụ khác nhau để hiểu sâu hơn về các vấn đề bộ nhớ Redis của bạn. Cái nào tốt nhất phụ thuộc vào nhu cầu cụ thể của bạn và vị trí của bạn trong quá trình phát triển. Đối với một người mới bắt đầu sử dụng Redis, việc theo dõi các phím riêng lẻ có thể là đủ để bắt đầu, trong khi đối với những người dùng Redis nặng, chắc chắn sẽ hợp lý khi sử dụng một công cụ GUI chuyên dụng với tất cả các chuông và còi để đỡ đau sau này. Dù lựa chọn của bạn là gì, hãy luôn đảm bảo hiểu gốc rễ vấn đề của bạn trước khi cố gắng giải quyết và hãy nhớ rằng nếu bạn đang gặp vấn đề về bộ nhớ với Redis, có thể bạn đang sử dụng nhiều bộ nhớ hơn mức thực sự cần thiết.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. tại sao Redis là luồng đơn (theo hướng sự kiện)

  2. Sử dụng Redis để lưu kết quả SQL vào bộ nhớ cache

  3. tại sao nó rất chậm với 100.000 bản ghi khi sử dụng đường dẫn trong redis?

  4. Làm cách nào để xả redis db khỏi python redis?

  5. Yêu cầu về không gian cấu trúc dữ liệu Redis