Có nhiều công cụ hỗ trợ cho tạo redis cluster như: Sentinel, Dynomite, Reborn, … Trong bài viết này, chúng ta sẽ sử dụng sentinel (một tính năng có sẵn trong redis) để thực hiện giám sát trạng thái hoạt động của redis cluster và thực hiện failover tự động. Đảm bảo rằng hệ thống redis sẽ vẫn hoạt động khi có một trong số các redis server trong cụm cluster down.redis cluster with sentinel

Mô hình thực hiện gồm 03 redis server. Trong đó:

  • 01 redis master: 192.168.10.111

  • 02 redis slave: 192.168.10.112 và 192.168.10.186

Một số công việc cần thực hiện: cài đặt redis, cấu hình redis sentinel.

1. Cài đặt và cấu hình Redis từ source

Step1: Installing redis

cd /opt
curl -O http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-stable.tar.gz cd redis-stable
make
cp src/redis-cli /usr/bin/redis-cli
cp src/redis-server /usr/bin/redis-server

Step2: Configure redis

  • Tạo thư mục chứa cấu hình redis

sudo mkdir /etc/redis

  • Copy tệp mẫu redis.conf

sudo cp /opt/redis-stable/redis.conf /etc/redis

  • Sửa đổi tệp /etc/redis/redis.conf với thay đổi sau

Sử dụng supervised với hệ thống systemd. Chỉ định cố định thư mục chứa dump redis

sed -i 's/supervised no/supervised systemd/' /etc/redis/redis.conf
sed -i 's/dir .\//dir \/var\/lib\/redis/' /etc/redis/redis.conf

Sử dụng thông tin cho bash:

mkdir /etc/redis
cp /opt/redis-stable/redis.conf /etc/redis
sed -i 's/supervised no/supervised systemd/' /etc/redis/redis.conf
sed -i 's/dir .\//dir \/var\/lib\/redis/' /etc/redis/redis.conf
sed -i '/bind 127.0.0.1/c\bind 0.0.0.0' /etc/redis/redis.conf

Step3: Thiết lập redis chạy với systemd

Advertisement

Tạo tệp redis.service với thông tin sau để chạy với hệ thống systemd

cat >/etc/systemd/system/redis.service <<EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Tạo redis user và group để chạy redis

adduser --system --no-create-home redis
mkdir /var/lib/redis
chown redis:redis /var/lib/redis
chmod 770 /var/lib/redis

Start và enable redis service

systemctl start redis.service
systemctl enable redis.service

2. Redis cluster with redis-sentinel

Yêu cầu: Cài đặt redis trên 03 server. Mở firewall cho các port 6379 và 26389

Step1: Cấu hình replication

Chúng ta thiết lập cấu hình nhân bản redis trên các máy redis slave

Thực hiện thêm dòng sau vào tệp cấu hình redis.conf trên các máy redis slave:

echo 'slaveof 192.168.10.111 6379' >>/etc/redis/redis.conf
systemctl restart redis.service

Ở đây “slaveof” được sử dụng để thông báo cho redis cluster là server nào làm master và server nào được sử dụng làm slave. Khai báo thông tin master server là 192.168.10.111

Check thông tin replication trên một trong các redis server

redis-cli info replication

redis-cli info replication

Chúng ta thấy vai trò hiện tại của server02 là slave và địa chỉ IP của master hiện tại là 192.168.10.111.

  • Tạo cập key để kiểm tra
redis-cli
127.0.0.1:6379>set key value
127.0.0.1:6379> SET key1 "Hello world!"
OK
127.0.0.1:6379> SET key "Value"
OK

Trên các máy slave thực hiện get key

[root@server02 redis-stable]# redis-cli 
127.0.0.1:6379> GET *
(nil)
127.0.0.1:6379> KEYS *
1) "key"
2) "key1"
127.0.0.1:6379> get key1
"Hello world!"
127.0.0.1:6379>

Step2: Configure redis sentinel

Trên 03 redis server, tạo tệp sentinel.conf trong thư mục /etc/redis/ với nội dung sau:

cat >/etc/redis/sentinel.conf<<EOF
daemonize yes
pidfile '/var/run/redis/redis-sentinel.pid'
logfile '/var/log/redis/redis-sentinel.log'
bind 0.0.0.0
port 26379
sentinel monitor mymaster 192.168.10.111 6379 2
sentinel down-after-milliseconds mymaster 2000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

Ở đây, chúng ta cấu hình redis-sentinel trên mỗi redis server với cùng các thông tin sau:

  • Thiết lập redis cluster với tên “mymaster”. Chỉ định server 192.168.10.111 làm master hiện tại.
  • down-after-milliseconds: thiết lập khoảng thời gian mili giây mà master server không phản hồi, khi đó nó được xác định là down.
  • failover-timeout: khoảng thời gian mà failover lần tiếp theo sau khi thực hiện failover trước đó bị lỗi.
  • parallel-syncs: thiết lập số slave mà có thể được cấu hình lại để sử dụng master mới sau khi failover tại một thời điểm. Ở đây, chúng ta thiết lập tại một thời điểm chỉ một slave được sử dụng.

Step3: Start redis-sentinel

Chúng ta có thể tạo systemd cho redis-sentinel. Thực hiện tạo tệp như sau:

cat >/etc/systemd/system/redis-sentinel.service<<EOF
[Unit]
Description=Redis Sentinel
After=network.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis/sentinel.conf --sentinel --daemonize no
Restart=always
[Install]
WantedBy=multi-user.target
EOF

Thực hiện start và enable redis-sentinel với systemd

systemctl start redis-sentinel
systemctl enable redis-sentinel

Step4: Check redis-sentinel

  • Kiểm tra log redis-sentinel

redis log

Khi đó chúng ta thấy redis master hiện tại là 192.168.10.111 và các slave là 192.168.10.112 và 192.168.10.186. Nếu kiểm tra tệp cấu hình sentinel.conf lúc này, trên mỗi redis server tệp sentinel.conf sẽ tự động cập nhật thông tin cấu hình cuối và nội dung sẽ gồm thông tin các redis server còn lại mà sentinel sẽ giám sát và current-epoch 0.

  • Kiểm tra redis nào hiện tại đang là master

Chúng ta có thể thực hiện kiểm tra với dòng lệnh sau trên mất kỳ redis server.

localhost:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.10.111"
2) "6379"

    Có nhiều công cụ hỗ trợ cho tạo redis cluster như: Sentinel, Dynomite, Reborn, … Trong bài viết này, chúng ta sẽ sử dụng sentinel (một tính năng có sẵn trong redis) để thực hiện giám sát trạng thái hoạt động của redis cluster và thực hiện failover tự động. Đảm bảo rằng hệ thống redis sẽ vẫn hoạt động khi có một trong số các redis server trong cụm cluster down.redis cluster with sentinel

    Mô hình thực hiện gồm 03 redis server. Trong đó:

    • 01 redis master: 192.168.10.111

    • 02 redis slave: 192.168.10.112 và 192.168.10.186

    Một số công việc cần thực hiện: cài đặt redis, cấu hình redis sentinel.

    1. Cài đặt và cấu hình Redis từ source

    Step1: Installing redis

    cd /opt
    curl -O http://download.redis.io/redis-stable.tar.gz
    tar xzvf redis-stable.tar.gz cd redis-stable
    make
    cp src/redis-cli /usr/bin/redis-cli
    cp src/redis-server /usr/bin/redis-server

    Step2: Configure redis

    • Tạo thư mục chứa cấu hình redis

    sudo mkdir /etc/redis

    • Copy tệp mẫu redis.conf

    sudo cp /opt/redis-stable/redis.conf /etc/redis

    • Sửa đổi tệp /etc/redis/redis.conf với thay đổi sau

    Sử dụng supervised với hệ thống systemd. Chỉ định cố định thư mục chứa dump redis

    sed -i 's/supervised no/supervised systemd/' /etc/redis/redis.conf
    sed -i 's/dir .\//dir \/var\/lib\/redis/' /etc/redis/redis.conf

    Sử dụng thông tin cho bash:

    mkdir /etc/redis
    cp /opt/redis-stable/redis.conf /etc/redis
    sed -i 's/supervised no/supervised systemd/' /etc/redis/redis.conf
    sed -i 's/dir .\//dir \/var\/lib\/redis/' /etc/redis/redis.conf
    sed -i '/bind 127.0.0.1/c\bind 0.0.0.0' /etc/redis/redis.conf

    Step3: Thiết lập redis chạy với systemd

    Tạo tệp redis.service với thông tin sau để chạy với hệ thống systemd

    cat >/etc/systemd/system/redis.service <<EOF
    [Unit]
    Description=Redis In-Memory Data Store
    After=network.target
    
    [Service]
    User=redis
    Group=redis
    ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
    ExecStop=/usr/bin/redis-cli shutdown
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    EOF

    Tạo redis user và group để chạy redis

    adduser --system --no-create-home redis
    mkdir /var/lib/redis
    chown redis:redis /var/lib/redis
    chmod 770 /var/lib/redis

    Start và enable redis service

    systemctl start redis.service
    systemctl enable redis.service

    2. Redis cluster with redis-sentinel

    Yêu cầu: Cài đặt redis trên 03 server. Mở firewall cho các port 6379 và 26389

    Step1: Cấu hình replication

    Chúng ta thiết lập cấu hình nhân bản redis trên các máy redis slave

    Thực hiện thêm dòng sau vào tệp cấu hình redis.conf trên các máy redis slave:

    echo 'slaveof 192.168.10.111 6379' >>/etc/redis/redis.conf
    systemctl restart redis.service

    Ở đây “slaveof” được sử dụng để thông báo cho redis cluster là server nào làm master và server nào được sử dụng làm slave. Khai báo thông tin master server là 192.168.10.111

    Check thông tin replication trên một trong các redis server

    redis-cli info replication

    redis-cli info replication

    Chúng ta thấy vai trò hiện tại của server02 là slave và địa chỉ IP của master hiện tại là 192.168.10.111.

    • Tạo cập key để kiểm tra
    redis-cli
    127.0.0.1:6379>set key value
    127.0.0.1:6379> SET key1 "Hello world!"
    OK
    127.0.0.1:6379> SET key "Value"
    OK

    Trên các máy slave thực hiện get key

    [root@server02 redis-stable]# redis-cli 
    127.0.0.1:6379> GET *
    (nil)
    127.0.0.1:6379> KEYS *
    1) "key"
    2) "key1"
    127.0.0.1:6379> get key1
    "Hello world!"
    127.0.0.1:6379>

    Step2: Configure redis sentinel

    Trên 03 redis server, tạo tệp sentinel.conf trong thư mục /etc/redis/ với nội dung sau:

    cat >/etc/redis/sentinel.conf<<EOF
    daemonize yes
    pidfile '/var/run/redis/redis-sentinel.pid'
    logfile '/var/log/redis/redis-sentinel.log'
    bind 0.0.0.0
    port 26379
    sentinel monitor mymaster 192.168.10.111 6379 2
    sentinel down-after-milliseconds mymaster 2000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1
    EOF

    Ở đây, chúng ta cấu hình redis-sentinel trên mỗi redis server với cùng các thông tin sau:

    • Thiết lập redis cluster với tên “mymaster”. Chỉ định server 192.168.10.111 làm master hiện tại.
    • down-after-milliseconds: thiết lập khoảng thời gian mili giây mà master server không phản hồi, khi đó nó được xác định là down.
    • failover-timeout: khoảng thời gian mà failover lần tiếp theo sau khi thực hiện failover trước đó bị lỗi.
    • parallel-syncs: thiết lập số slave mà có thể được cấu hình lại để sử dụng master mới sau khi failover tại một thời điểm. Ở đây, chúng ta thiết lập tại một thời điểm chỉ một slave được sử dụng.

    Step3: Start redis-sentinel

    Chúng ta có thể tạo systemd cho redis-sentinel. Thực hiện tạo tệp như sau:

    cat >/etc/systemd/system/redis-sentinel.service<<EOF
    [Unit]
    Description=Redis Sentinel
    After=network.target
    [Service]
    ExecStart=/usr/bin/redis-server /etc/redis/sentinel.conf --sentinel --daemonize no
    Restart=always
    [Install]
    WantedBy=multi-user.target
    EOF

    Thực hiện start và enable redis-sentinel với systemd

    systemctl start redis-sentinel
    systemctl enable redis-sentinel

    Step4: Check redis-sentinel

    • Kiểm tra log redis-sentinel

    redis log

    Khi đó chúng ta thấy redis master hiện tại là 192.168.10.111 và các slave là 192.168.10.112 và 192.168.10.186. Nếu kiểm tra tệp cấu hình sentinel.conf lúc này, trên mỗi redis server tệp sentinel.conf sẽ tự động cập nhật thông tin cấu hình cuối và nội dung sẽ gồm thông tin các redis server còn lại mà sentinel sẽ giám sát và current-epoch 0.

    • Kiểm tra redis nào hiện tại đang là master

    Chúng ta có thể thực hiện kiểm tra với dòng lệnh sau trên mất kỳ redis server.

    localhost:26379> sentinel get-master-addr-by-name mymaster
    1) "192.168.10.111"
    2) "6379"
    • Stop redis master và check log trên redis slave
    systemctl stop redis.service
    tail -f /var/log/redis/redis-sentinel.log

    Chúng ta xem log trên từng redis slave sau:

    Trên Server 192.168.10.112

    redis sentinel log slave01

    Trên Server 192.168.10.186

    redis sentinel log slave02

    Quan sát log, chúng ta thấy tuần tự:

    sentinel giám sát thấy master down được đánh dấu lần đầu là +sdown (subjectively down state). Sau khi các redis server, ở đây sử dụng sentinel để giám sát xác nhận redis master đã down thật, khi đó trạng thái được đánh dấu là +odown ( objectively down state). Tiếp theo, sentinel vote (+vote) một sentinel khác mà thực hiện cố gắng failover lần đầu. Chúng ta thấy có quá trình chuyển đổi failover giữa các redis server. Và slave 192.168.10.186 được chọn làm master.

    Sử dụng lệnh để check redis server nào hiện tại đang có vai trò là master:

    [root@server02 redis-stable]# redis-cli -p 26379
    127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
    1) "192.168.10.186"
    2) "6379"

    Tham khảo thêm về redis sentinel tại: https://redis.io/topics/sentinel.

  • Stop redis master và check log trên redis slave
systemctl stop redis.service
tail -f /var/log/redis/redis-sentinel.log

Chúng ta xem log trên từng redis slave sau:

Trên Server 192.168.10.112

redis sentinel log slave01

Trên Server 192.168.10.186

redis sentinel log slave02

Quan sát log, chúng ta thấy tuần tự:

sentinel giám sát thấy master down được đánh dấu lần đầu là +sdown (subjectively down state). Sau khi các redis server, ở đây sử dụng sentinel để giám sát xác nhận redis master đã down thật, khi đó trạng thái được đánh dấu là +odown ( objectively down state). Tiếp theo, sentinel vote (+vote) một sentinel khác mà thực hiện cố gắng failover lần đầu. Chúng ta thấy có quá trình chuyển đổi failover giữa các redis server. Và slave 192.168.10.186 được chọn làm master.

Sử dụng lệnh để check redis server nào hiện tại đang có vai trò là master:

[root@server02 redis-stable]# redis-cli -p 26379
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
1) "192.168.10.186"
2) "6379"

Tham khảo thêm về redis sentinel tại: https://redis.io/topics/sentinel.