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.
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
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
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"
- 01 redis master: 192.168.10.111
-
02 redis slave: 192.168.10.112 và 192.168.10.186
- Tạo thư mục chứa cấu hình redis
- Copy tệp mẫu redis.conf
- Sửa đổi tệp /etc/redis/redis.conf với thay đổi sau
- Tạo cập key để kiểm tra
- 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.
- Kiểm tra log redis-sentinel
- Kiểm tra redis nào hiện tại đang là master
- Stop redis master và check log trên redis slave
- Stop redis master và check log trên redis slave
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.
Mô hình thực hiện gồm 03 redis server. Trong đó:
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
sudo mkdir /etc/redis
sudo cp /opt/redis-stable/redis.conf /etc/redis
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
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.
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:
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
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.
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"
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
Trên Server 192.168.10.186
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.
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
Trên Server 192.168.10.186
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.