+4

Tích hợp HAProxy và KeepAlived cho Redis Replication

Mở đầu

Bạn vừa học được cách dựng 1 cụm Redis Replication với các node Master - Slave kết hợp với Redis Sentinel chạy failover siêu mượt mà, trong code bạn trỏ đến địa chỉ con Master để đọc ghi dữ liệu, tuy nhiên 1 ngày đẹp trời Node Master lăn ra chết, Sentinel tự động chuyển Master sang 1 node khác khiến code bạn chạy lỗi tóe loe. Bạn bị sếp chửi, bạn buồn, bạn lên mạng tìm kiếm cách để có thể tự động xác định được node Master mới khi quá trình Failover diễn ra. Bài viết này sẽ giúp bạn tìm ra giải pháp cho vấn đề đó.

Sơ qua Redis Replication

Hy vọng trong thời gian tới có thể viết 1 bài chi tiết về Redis Replication, còn đây là sơ lược về Redis Replication cho bạn nào chưa biết. Redis Replication sẽ gồm các node Master và Slave, node Master chịu trách nhiệm đọc-ghi, node Slave chịu trách nhiệm đọc, backup dữ liệu từ Master. Nhưng thế này thì bình thường quá, người ta nghĩ ra thêm Redis-sentinel để khi node Master down thì Sentinel sẽ tự tìm ra node Slave thích hợp (dựa trên mức độ ưu tiên replica-priority). Mô hình Redis + Sentinel thường được cài đặt sẽ như sau:

Tuy nhiên có 1 số ý kiến cho rằng mô hình trên chưa tối ưu, mô hình tối ưu hơn sẽ là:

Khi mà service Sentinel sẽ được tách ra 1 node riêng phòng trường hợp chết cả service Redis và Sentinel.

Bắt đầu với phần chính

Đó là tất cả những gì về Redis Replication bạn cần biết để đi đến phần tiếp theo. Mô hình mình hướng dẫn các bạn trong bài này sẽ như phía bên trên. Ta có cụm 2 node HAProxy + KeepAlived để tìm ra Node Master trong Redis Replication. Ơ vậy tại sao cần 2 node ??? 1 node là đủ để tìm rồi mà? Đúng vậy, 1 node là đủ để tìm được rồi, tuy nhiên Redis có Failover thì HAProxy cũng cần có Failover đó là KeepAlived để tránh trường hợp node HAProxy die thì cũng tèo cả đám. Ở đây VIP không phải là 1 node mà là Virtual IP được tạo ra để Failover. Người dùng hoặc Application sẽ truy cập redis replication qua VIP.

Cài đặt và cấu hình KeepAlived

Ở bài này mình sử dụng CentOS nên cài đặt bằng yum nếu bạn sử dụng Ubuntu thì dùng apt, tất cả đều tương tự.

Cài đặt Keepalived với câu lệnh:

yum -y install keepalived

Cấu hình Keepalived tại node Master:

vrrp_script chk_haproxy {
    script "pkill -0 haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    interface eth0
    state MASTER
    virtual_router_id 51
    priority 101
    virtual_ipaddress {
        10.5.9.111
    }
    track_script {
        chk_haproxy
    }
}

Cấu hình KeepAlived tại node Slave:

vrrp_script chk_haproxy {
    script "pkill -0 haproxy"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    interface eth0
    state BACKUP
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        10.5.9.111
    }
    track_script {
        chk_haproxy
    }
}

Giải thích:

vrrp_script chk_haproxy là script giúp kiểm tra service haproxy còn sống không, nếu service chết priority sẽ bị giảm xuống và được chuyển sang cho node BACKUP

interface: interface mà ta setup Virtual IP (sử dụng lệnh ifconfig để xem)

state [MASTER/BACKUP]: Trạng thái của node

virtual_router_id: Giá trị này ở các node phải giống nhau

priority: Độ ưu tiên của node (Cao hơn sẽ là Master)

virtual_ipaddress: Phần khai báo VIP

track_script: Khai báo script bên trên

Cấu hình để có thể bind tới địa chỉ VIP

echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf

Cài đặt và cấu hình KeepAlived

Cài đặt Keepalived với câu lệnh:

yum -y install haproxy

Cấu hình tại trên cả 2 node Master và Backup

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    log                     global
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen stats
    bind *:8080
    mode http
    stats enable
    stats uri /stats
    stats realm HAProxy\ Statistics
    stats admin if TRUE

listen redis_clusters
    bind *:6379
    mode tcp
    timeout connect  3h
    timeout server  3h
    timeout client  3h
    option tcp-check
    tcp-check connect                        # Dùng để connect đến back-end server
    tcp-check send AUTH\ vccloud1\r\n        # Thêm dòng này nếu như Redis có password
    tcp-check send PING\r\n                  # Check kết nối
    tcp-check expect string +PONG            # Dự đoán output trả về
    tcp-check send info\ replication\r\n     # Lấy thông tin về replication
    tcp-check expect string role:master      # Nếu trả về role là master thì xác nhận node master
    tcp-check send QUIT\r\n                  # Thoát kết nối
    tcp-check expect string +OK              # Dự đoán output trả về (bỏ cũng được)
    server redis-cluster-1 10.5.9.198:6379 check inter 1s
    server redis-cluster-2 10.5.9.105:6379 check inter 1s
    server redis-cluster-3 10.5.10.126:6379 check inter 1s

Giải thích:

Block globaldefaults chứa các config toàn cục giữ nguyên như ban đầu.

Block Listen stats để tạo trang theo dõi trạng thái các node tại port 8080 đường dẫn /stats

Block redis_clusters

  • bind *:6379; Cho phép truy cập từ mọi IP
  • mode: Protocol sử dụng
  • tcp-check: dùng để gửi các lệnh tcp đến back-end server tìm ra master node
  • server: Khai báo các back-end Redis Cluster Server

Như vậy là đã cài đặt và cấu hình xong KeepAlived + HAProxy, giờ khởi động các service:

systemctl restart haproxy
systemctl restart keepalived

Truy cập IP_MASTER:8080/stats hoặc IP_SLAVE:8080/stats có thông số như hình là HAProxy thành công (2 node Slave down - 1 node Master Up):

Để test VIP thì bạn có thể sử dụng lệnh, hiện connected là thành công

telnet VIP 6379

Kết

Đây là kết quả sau quá trình gần 1 tuần tìm hiểu của mình nên chắc chắn sẽ còn nhiều thiếu sót hoặc sai. Hy vọng bài viết này sẽ giúp được các bạn một chút trong công việc, nếu có thắc mắc gì thì comment ở dưới nhé. Để ủng hộ mình thì có thể Follow hoặc Vote Up nhé 😃))). Hẹn gặp bạn ở bài viết tiếp theo.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.