Triển khai cụm RabbitMQ có tính sẵn sàng cao

RabbitMQ có ba chế độ triển khai chính:

1. Chế độ đơn lẻ

Chỉ chạy một phiên bản RabbitMQ trên một máy chủ. Đây là cấu hình đơn giản nhất, không cung cấp khả năng chịu lỗi hoặc khả năng mở rộng.

version: '3.1'
services:
  rabbitmq:
    restart: always
    image: rabbitmq:management
    container_name: rabbitmq
    ports:
      - 5672:5672
      - 15672:15672
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: 123456
    volumes:
      - ./data:/var/lib/rabbitmq

2. Chế độ chùm thông thường (Clustered Mode)

Trong chế độ này, nhiều nút RabbitMQ hoạt động cùng nhau để tạo thành một cụm. Tuy nhiên, trong cấu hình mặc định, mỗi hàng đợi (queue) chỉ tồn tại trên một nút duy nhất. Các nút khác trong cụm chỉ lưu trữ siêu dữ liệu (metadata) của hàng đợi. Khi một tin nhắn được gửi đến một nút và được tiêu thụ từ một nút khác, RabbitMQ sẽ thực hiện truyền tin nhắn tạm thời giữa các nút. Để tận dụng hiệu quả, các ứng dụng tiêu thụ (consumer) nên kết nối tới tất cả các nút trong cụm để lấy tin nhắn. Nếu không, có thể xảy ra điểm nghẽn hoặc mất mát tin nhắn nếu nút chứa dữ liệu hàng đợi gặp sự cố.

Để thiết lập chế độ chùm thông thường:

  • Đảm bảo giá trị của tệp `.erlang.cookie` giống nhau trên tất cả các nút trong cụm.
  • Đảm bảo các máy chủ có thể giao tiếp với nhau (ví dụ: `ping` thành công).

Ví dụ cấu hình với hai nút `rabbit01` và `rabbit02` sử dụng Docker Compose:

# docker-compose.yml cho nút 1
version: '3.1'
services:
  myrabbit01:
    restart: always
    image: rabbitmq:management
    container_name: myrabbit01
    ports:
      - 5672:5672
      - 15672:15672
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: 123456
      RABBITMQ_ERLANG_COOKIE: mysecretcookie
    volumes:
      - ./data01:/var/lib/rabbitmq
    hostname:
      rabbit01
    network_mode: bridge
# docker-compose.yml cho nút 2
version: '3.1'
services:
  myrabbit02:
    restart: always
    image: rabbitmq:management
    container_name: myrabbit02
    ports:
      - 5673:5672
      - 15673:15672
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: 123456
      RABBITMQ_ERLANG_COOKIE: mysecretcookie
    volumes:
      - ./data02:/var/lib/rabbitmq
    extra_hosts:
      - rabbit01 myrabbit01:172.17.0.2 # Thay thế bằng IP thực tế của myrabbit01
    hostname:
      rabbit02
    network_mode: bridge

Sau khi khởi chạy các container, tham gia cụm:

# Trên container myrabbit02
docker exec -it myrabbit02 bash
rabbitmqctl stop_app
rabbitmqctl reset
# Tham gia cụm với nút rabbit01 (có thể là nút RAM hoặc DISK)
rabbitmqctl join_cluster --ram rabbit@rabbit01
rabbitmqctl start_app
exit

Cấu hình ứng dụng Spring Boot để kết nối tới các địa chỉ của cụm:

spring:
  application:
    name: spring-boot-amqp
  rabbitmq:
    username: admin
    password: 123456
    addresses: 192.168.1.100:5673,192.168.1.100:5672 # Thay thế bằng IP và port của các nút

Lưu ý: Chế độ chùm thông thường không cung cấp tính sẵn sàng cao thực sự. Nếu nút chính chứa dữ liệu hàng đợi bị lỗi, tin nhắn có thể không khả dụng cho đến khi nút đó phục hồi hoặc có thể bị mất nếu không được lưu trữ bền vững.

3. Chế độ nhân bản (Mirrored Mode)

Chế độ nhân bản giải quyết vấn đề sẵn sàng cao của chế độ chùm thông thường bằng cách tạo ra các bản sao của hàng đợi trên nhiều nút. Điều này đảm bảo rằng dữ liệu hàng đợi có sẵn ngay cả khi một nút bị lỗi. Tuy nhiên, việc sao chép dữ liệu liên tục giữa các nút có thể làm giảm hiệu suất hệ thống và tiêu tốn băng thông mạng.

Chế độ nhân bản yêu cầu cấu hình chính sách (policy). Chính sách này xác định những hàng đợi hoặc exchange nào cần được nhân bản và cách thức nhân bản.

Ví dụ cấu hình chính sách để nhân bản tất cả các hàng đợi:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
  • `ha-all`: Tên của chính sách.
  • `"^"`: Biểu thức chính quy để khớp tên của exchange hoặc queue (ở đây là tất cả).
  • `{"ha-mode":"all"}`: Cấu hình chế độ nhân bản. Các tùy chọn cho `ha-mode` bao gồm:
    • `all`: Nhân bản hàng đợi trên tất cả các nút trong cụm.
    • `exactly`: Nhân bản trên một số lượng nút xác định (cần cấu hình `ha-params`).
    • `nodes`: Nhân bản trên các nút được chỉ định (cần cấu hình `ha-params`).

Chế độ nhân bản phù hợp cho các ứng dụng yêu cầu tính sẵn sàng rất cao.

Tóm lại, trong môi trường đám mây hiện đại, chế độ chùm thông thường thường đủ dùng cho hầu hết các trường hợp. Chế độ nhân bản nên được cân nhắc khi yêu cầu về tính sẵn sàng là cực kỳ quan trọng.

Thẻ: rabbitmq clustering High Availability Message Queue mirrored queues

Đăng vào ngày 23 tháng 7 lúc 07:04