Vượt xa Redis: Hướng dẫn thực hành DragonflyDB

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Rào cản đơn luồng trong hạ tầng hiện đại

Tôi đã tin dùng Redis cho việc lưu trữ cache và quản lý session trong gần một thập kỷ. Nó nhanh một cách ổn định và cực kỳ tin cậy. Tuy nhiên, khi tôi chuyển khối lượng công việc của mình sang các instance cloud cấu hình cao—những máy chủ có 64 hoặc 128 vCPU—tôi đã vấp phải một nút thắt cổ chai khó chịu. Dù trả tiền cho sức mạnh tính toán khổng lồ, instance Redis của tôi vẫn chạm ngưỡng giới hạn của một nhân CPU duy nhất trong khi 63 nhân còn lại hoàn toàn nhàn rỗi.

Điều này xảy ra vì Redis hoạt động trên mô hình thực thi đơn luồng. Nó tránh được các khóa (lock) phức tạp, giúp giữ sự đơn giản, nhưng lại khiến việc mở rộng theo chiều dọc (vertical scaling) gần như không thể. Để tận dụng nhiều sức mạnh hơn, bạn thường phải triển khai Redis Cluster. Điều này làm tăng thêm các lớp hạ tầng phức tạp và gánh nặng quản lý mà hầu hết các đội ngũ đều muốn tránh.

Dragonfly: Đa luồng ngay từ thiết kế

Dragonfly được xây dựng để giải quyết sự không tương thích cụ thể này về phần cứng. Đây là một kho lưu trữ dữ liệu trong bộ nhớ (in-memory data store) hoàn toàn tương thích với các API của Redis và Memcached nhưng sử dụng kiến trúc “shared-nothing”. Thay vì một luồng thực hiện tất cả công việc, Dragonfly tạo ra một luồng cho mỗi nhân CPU. Mỗi luồng quản lý một phân đoạn dữ liệu riêng biệt của nó.

Tháng trước, tôi đã chuyển một microservice có lưu lượng truy cập cao sang Dragonfly. Kết quả đến ngay lập tức. Trên một instance duy nhất, nó xử lý 4 triệu yêu cầu mỗi giây một cách dễ dàng. Nếu thông lượng Redis của bạn đang chững lại, Dragonfly là lộ trình nâng cấp hợp lý nhất.

Cài đặt Dragonfly trên máy chủ của bạn

Việc thiết lập rất dễ dàng vì Dragonfly duy trì khả năng tương thích giao thức. Bạn có thể tiếp tục sử dụng các thư viện client hiện tại như redis-py hoặc ioredis mà không cần chạm vào logic ứng dụng.

Cách 1: Chạy với Docker (Khuyên dùng)

Docker là cách hiệu quả nhất để triển khai cho cả môi trường phát triển và sản xuất. Sử dụng lệnh này để bắt đầu:

docker run --network=host --ulimit memlock=-1 docker.dragonflydb.io/dragonflydb/dragonfly

Tôi luôn sử dụng cờ --network=host. Nó loại bỏ độ trễ mạng của container, điều cực kỳ quan trọng khi bạn đang theo đuổi độ trễ dưới một phần nghìn giây (sub-millisecond). Cờ --ulimit memlock=-1 cũng quan trọng không kém; nó ngăn hệ điều hành chuyển bộ nhớ của Dragonfly sang ổ cứng (swap), điều vốn dĩ sẽ làm giảm hiệu suất nghiêm trọng.

Cách 2: Cài đặt Binary thủ công

Nếu bạn muốn chạy trực tiếp trên bare metal hoặc VM tiêu chuẩn, bạn có thể tải bản phát hành mới nhất trực tiếp từ GitHub:

wget https://github.com/dragonflydb/dragonfly/releases/latest/download/dragonfly-x86_64.tar.gz
tar -xvzf dragonfly-x86_64.tar.gz
sudo mv dragonfly /usr/local/bin/

Khởi động nó bằng lệnh sau:

dragonfly --logtostderr --port 6379

Cấu hình sẵn sàng cho môi trường sản xuất

Dragonfly loại bỏ các tệp .conf truyền thống để chuyển sang sử dụng các cờ dòng lệnh. Cách tiếp cận này gọn gàng hơn nhiều cho các đợt triển khai container hóa hiện đại. Dưới đây là các cài đặt tôi ưu tiên cho môi trường sản xuất:

  • --mem_high_watermark_mb: Xác định ngưỡng bộ nhớ tối đa. Trên máy chủ 16GB RAM, tôi đặt giá trị này là 12288 (12GB). Điều này để lại 4GB đệm cho hệ điều hành và các tác vụ nền.
  • --proactor_threads: Dragonfly thường tự động phát hiện tất cả các nhân. Sử dụng cờ này nếu bạn cần gán cơ sở dữ liệu vào một nhóm tài nguyên CPU cụ thể.
  • --snapshot_cron: Cài đặt này xử lý việc sao lưu tại một thời điểm nhất định. Đặt giá trị thành "*/5 * * * *" sẽ kích hoạt việc lưu dữ liệu sau mỗi năm phút.

Một lệnh khởi động điển hình cho một node sản xuất sẽ như sau:

dragonfly --mem_high_watermark_mb=8192 \
          --proactor_threads=8 \
          --dump_dir=/var/lib/dragonfly \
          --snapshot_cron="0 * * * *" \
          --requirepass="mat_khau_bao_mat_cua_ban"

Di cư và chuẩn bị dữ liệu

Việc di chuyển dữ liệu từ các hệ thống cũ thường yêu cầu định dạng lại. Tôi thường thấy mình cần chuyển đổi các tập dữ liệu thô trước khi đưa chúng vào lệnh SET.

Khi tôi cần nhanh chóng chuyển đổi các bản xuất CSV thành JSON cho các lần nhập này, tôi sử dụng toolcraft.app/vi/tools/data/csv-to-json. Nó chạy hoàn toàn trên trình duyệt, vì vậy không có dữ liệu nhạy cảm nào rời khỏi máy của bạn. Đây là một công cụ tiết kiệm thời gian đáng kể khi tạo nguyên mẫu cho các schema cache mới hoặc chuẩn bị các tập lệnh Python để tải dữ liệu hàng loạt vào Dragonfly.

Xác minh và Giám sát

Bạn không cần phải học các công cụ mới để quản lý Dragonfly. Công cụ redis-cli tiêu chuẩn hoạt động hoàn hảo.

redis-cli -p 6379
127.0.0.1:6379> INFO
# Máy chủ
dragonfly_version: 1.14.0
...

Đo lường hiệu quả

Để thấy sự khác biệt, hãy chạy thử nghiệm chịu tải (stress test) giữa thiết lập Redis cũ và Dragonfly trên cùng một cấu hình phần cứng. Sử dụng redis-benchmark với mức độ đồng thời cao để xem giới hạn nằm ở đâu:

redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 1000000 -t set,get -q

Trong các thử nghiệm gần đây của tôi trên instance AWS c6g.4xlarge, Dragonfly mang lại thông lượng cao gấp 4 lần cho các hoạt động SET so với Redis độc lập. Quan trọng hơn, độ trễ p99 vẫn ở mức thấp nhất quán ngay cả khi tải nặng.

Hỗ trợ Prometheus gốc

Tính năng giám sát đã được tích hợp sẵn. Dragonfly cung cấp một endpoint tương thích với Prometheus tại :8080/metrics theo mặc định. Bạn sẽ không cần cài đặt một exporter riêng biệt như khi làm với Redis. Chỉ cần thêm mục tiêu vào tệp prometheus.yml của bạn:

scrape_configs:
  - job_name: 'dragonfly'
    static_configs:
      - targets: ['localhost:8080']

Lời kết

Dragonfly không chỉ là một phiên bản nhanh hơn của một công cụ cũ. Đó là một sự tư duy lại hoàn toàn về cách các cơ sở dữ liệu trong bộ nhớ nên hoạt động trên phần cứng hiện đại. Bằng cách thoát khỏi các hạn chế đơn luồng, nó cho phép bạn đơn giản hóa hạ tầng của mình. Bạn có thể thay thế một Redis Cluster cồng kềnh bằng một instance duy nhất, hiệu quả cao. Nếu bạn đang gặp khó khăn với thông lượng hoặc sự phức tạp của cluster, việc chuyển đổi là một bước đi ít rủi ro nhưng mang lại hiệu quả hiệu suất rất cao.

Share: