Thứ Năm, 26 tháng 1, 2023

Phần 9: Thêm và xóa node redis cluster, di chuyển data đơn sang cluster và ngược lại

 Seri Redis của chúng ta gồm những phần sau:

Phần 1: Cài đặt redis cơ bản + Turning redis.
Phần 2: Lệnh quản trị redis cơ bản
Phần 3: Bảo mật cho redis. (redis security)
Phần 4: Access List Redis (tính năng mới từ bản 6)
Phần 5: Các mô hình Redis replication, Ưu và nhược điểm
Phần 6: Redis Master-Salve sử dụng ACL
Phần 7: Redis Sentinel sử dụng ACL
Phần 8: Cài đặt Redis Cluster + kiểm tra cluster hoạt động.
Phần 9: Thêm và xóa node redis cluster, di chuyển data đơn sang cluster và ngược lại
Phần ??: Redis RDB và AOF nên chọn cái nào?
Continue...

Phần 9:

9.1 Thêm node cho cluster redis

Bước 1: Setup cụm cluster như bài 8.

Bước 2: Insert dữ liệu test cho cluster.

# vim insert_redis.sh

#!/bin/bash
a=0
while [ $a -lt 5000 ]
do
 #echo $a
 redis-cli -a komatkhau -c -h 127.0.0.1 -p 7001 SET $a $a
 a=`expr $a + 1`
done
echo "===========DA CHAY XONG======================"
redis-cli -a komatkhau --cluster check 127.0.0.1:7001

Ta thực hiện chạy
# bash insert_redis.sh
===========DA CHAY XONG======================
127.0.0.1:7001 (21bc4d23...) -> 1687 keys | 5461 slots | 1 slaves.
127.0.0.1:7005 (829ae8b6...) -> 1665 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (68f6d96f...) -> 1648 keys | 5462 slots | 1 slaves.

Bước 3: Cài đặt 2 node trắng port 7007_master, 7008_slave mới (mục đích join vào cluster đang có).

# vim /opt/redis_cluster_config2.sh
CUR_DIR="/opt"
cd $CUR_DIR
mkdir -p ${CUR_DIR}/redis-cluster
cd ${CUR_DIR}/redis-cluster

for port in 7007 7008; do
  mkdir -p ${CUR_DIR}/redis-cluster/${port}
  cat > ${CUR_DIR}/redis-cluster/${port}/redis_${port}.conf <<EOF
port $port
appendonly no
cluster-enabled yes
cluster-node-timeout 5000
dir ${CUR_DIR}/redis-cluster/${port}/
cluster-config-file ${CUR_DIR}/redis-cluster/${port}/nodes_${port}.conf
logfile ${CUR_DIR}/redis-cluster/${port}/nodes_${port}.log
requirepass "komatkhau"
masterauth "komatkhau"
EOF
chown -R redis.redis /opt/redis-cluster
done


=========
Thực hiện chạy
# bash /opt/redis_cluster_config2.sh

2.2 Chuẩn bị 2 file systemd 7007 và 7008

# vim /opt/redis_cluster_systemd2.sh
CUR_DIR="/opt"
cd $CUR_DIR
for port in 7007 7008; do
  cat > /etc/systemd/system/redis_${port}.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target


[Service]
ExecStart=$(which redis-server) ${CUR_DIR}/redis-cluster/${port}/redis_${port}.conf --supervised systemd
ExecStop=/bin/redis-cli -h 127.0.0.1 -p ${port} -a komatkhau shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
done

Thực hiện chạy
# bash /opt/redis_cluster_systemd2.sh
systemctl daemon-reload
systemctl restart redis_7007
systemctl restart redis_7008

ps aux | grep redis
redis      6649  0.6  0.2 198760  9800 ?        Ssl  16:06   0:01 /usr/local/bin/redis-server *:7001 [cluster]
redis      6660  0.1  0.2 198760  9704 ?        Ssl  16:06   0:00 /usr/local/bin/redis-server *:7002 [cluster]
redis      6671  0.3  0.2 198760  9804 ?        Ssl  16:06   0:00 /usr/local/bin/redis-server *:7003 [cluster]
redis      6682  0.1  0.2 198760  9724 ?        Ssl  16:06   0:00 /usr/local/bin/redis-server *:7004 [cluster]
redis      6693  0.3  0.2 198760  9864 ?        Ssl  16:06   0:00 /usr/local/bin/redis-server *:7005 [cluster]
redis      6704  0.2  0.2 198760  9836 ?        Ssl  16:06   0:00 /usr/local/bin/redis-server *:7006 [cluster]
redis     16768  0.0  0.2 196200  9276 ?        Ssl  16:10   0:00 /usr/local/bin/redis-server *:7007 [cluster]
redis     16779  0.0  0.2 196200  9276 ?        Ssl  16:10   0:00 /usr/local/bin/redis-server *:7008 [cluster]

Bước 4: Join node 7007 vào cluster

LỆNH MẪU ADD MASTER: redis-cli -a MAT_KHAU --cluster add-node <IP_Mới_Muốn_Add:Port> <IP_cluster_Redis đang có:Port>
LỆNH MẪU ADD SLAVE : redis-cli -a MAT_KHAU --cluster add-node <IP_Node_Mới:Port> <IP_cluster_Redis đang có:Port> --cluster-slave --cluster-master-id <Mã_ID_Của_Master>

1. ADD MASTER
redis-cli -a komatkhau --cluster check 127.0.0.1:7001   #(kiểm tra TRƯỚC khi chạy join)
redis-cli -a komatkhau --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
redis-cli -a komatkhau --cluster check 127.0.0.1:7001   #(kiểm tra SAU khi chạy join)
Ta có kết quả:
127.0.0.1:7001 (21bc4d23...) -> 1687 keys | 5461 slots | 1 slaves.
127.0.0.1:7005 (829ae8b6...) -> 1665 keys | 5461 slots | 1 slaves.
127.0.0.1:7007 (1f74b291...) -> 0 keys | 0 slots | 0 slaves. (Đây là Master 7007 vừa add)
127.0.0.1:7003 (68f6d96f...) -> 1648 keys | 5462 slots | 1 slaves.

2. ADD SLAVE
redis-cli -a komatkhau --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 --cluster-slave --cluster-master-id 1f74b291d52be3fe0f83ec3da84de9223c8ea298  #(Mã ID là của Master 7007)
redis-cli -a komatkhau --cluster check 127.0.0.1:7001   #(kiểm tra SAU khi chạy join)

Bước 5: Re-balance hoặc re-shard data từ 3 node hiện có sang node mới.

Cách 1: Re-balance (chia đều 16383 thành 4 node)

Trước:
# redis-cli -a komatkhau --cluster check 127.0.0.1:7001 
127.0.0.1:7001 (21bc4d23...) -> 1687 keys | 5461 slots | 1 slaves.
127.0.0.1:7005 (829ae8b6...) -> 1665 keys | 5461 slots | 1 slaves.
127.0.0.1:7007 (1f74b291...) -> 0 keys | 0 slots | 1 slaves.
127.0.0.1:7003 (68f6d96f...) -> 1648 keys | 5462 slots | 1 slaves.

Sau:
redis-cli -a komatkhau --cluster rebalance 127.0.0.1:7001 --cluster-use-empty-masters
redis-cli -a komatkhau --cluster check 127.0.0.1:7001
127.0.0.1:7001 (21bc4d23...) -> 1250 keys | 4096 slots | 1 slaves.
127.0.0.1:7005 (829ae8b6...) -> 1250 keys | 4096 slots | 1 slaves.
127.0.0.1:7007 (1f74b291...) -> 1269 keys | 4096 slots | 1 slaves.
127.0.0.1:7003 (68f6d96f...) -> 1231 keys | 4096 slots | 1 slaves.

Kết luận: 5000 key đã được chia đều

Cách 2: Re-shard (chia shard của 1 node nào đó, chia cho node mới join)

redis-cli -a MAT_KHAU --cluster reshard 127.0.0.1:7001 \
--cluster-from <Mã_ID_Của_Source1> \
--cluster-to <Mã_ID_Của_Destination2> \
--cluster-slots 1365 \
--cluster-yes

Ta hiểu lệnh trên là di chuyển 1365 slot của redis mã_id_1 sang redis master với mã_id2. Tổng 1365*3=4096 slot trên 4 node master

Nguồn tham khảo: https://severalnines.com/blog/hash-slot-resharding-and-rebalancing-redis-cluster/

9.2 Xóa node trong cluster redis

Xóa node master

Để remove an toàn, thì ta nên cần move toàn bộ dữ liệu node master định xóa đi (set --cluster-weight=0). Rồi sau đó mới delete.

redis-cli -a komatkhau --cluster rebalance 127.0.0.1:7001 --cluster-weight 1f74b291d52be3fe0f83ec3da84de9223c8ea298=0

Thực hiện xóa node sau khi đã move dữ liệu xong

redis-cli -a komatkhau --cluster del-node <IP_Cụm_Redis:Port> <Mã_ID của node cần xóa>
redis-cli -a komatkhau --cluster del-node 127.0.0.1:7001 1f74b291d52be3fe0f83ec3da84de9223c8ea298

Xóa node slave

Để xóa redis slave cluster khỏi cụm. Ta gọi lệnh xóa như bình thường, ko cần move dữ liệu

redis-cli -a komatkhau --cluster del-node <IP_Cụm_Redis:Port> <Mã_ID của node cần xóa>
redis-cli -a komatkhau --cluster del-node 127.0.0.1:7001 077f9cc08371ed9006a799e48f6ad78dc523478e

9.3 Di chuyển cluster sang đơn node

Cách thực hiện:

1. move toàn bộ slot về 1 node
2. Cài đặt redis đơn (ở bài 1)
3. copy dump file cluster > sang redis đơn đang stop và start lên

Bước 1: Move toàn bộ slot về 1 node

Lệnh thực hiện (move về master1_21bc4d23d274b760867ff49ca44cb29db706b03d):

redis-cli -a komatkhau --cluster reshard 127.0.0.1:7001 \
--cluster-from 829ae8b6cc2dd64e902b3ed69327251786cb923a \
--cluster-to 21bc4d23d274b760867ff49ca44cb29db706b03d \
--cluster-slots 5461 \
--cluster-yes

redis-cli -a komatkhau --cluster reshard 127.0.0.1:7001 \
--cluster-from 68f6d96f19337e1017f0a1c07adcb7f8f21da9cf \
--cluster-to 21bc4d23d274b760867ff49ca44cb29db706b03d \
--cluster-slots 5461 \
--cluster-yes

Kết quả: 
redis-cli -a komatkhau --cluster check 127.0.0.1:7001
127.0.0.1:7001 (21bc4d23...) -> 5000 keys | 16384 slots | 5 slaves.
(16383 slot đã move về redis_1, 5000 key test cũng đã tập trung tại node 1)

Bước 2: Cài đặt redis đơn (ở bài 1)

https://viblo.asia/p/phan-1-cai-dat-redis-co-ban-turning-redis-bWrZnADYKxw

Bước 3: copy dump file cluster > sang redis đơn đang stop và start lên

/bin/cp -f /opt/redis-cluster/7001/dump.rdb /opt/redis/data/dump.rdb
/etc/init.d/redis_6379 start
redis-cli -h 127.0.0.1 -p 6379 info
# Keyspace
db0:keys=5000,expires=0,avg_ttl=0
Đủ 5000 key, đã di chuyển thành công.

9.5 Di chuyển đơn node sang cluster

1. Move toàn bộ slot cluster về 1 node, stop toàn bộ cụm
2. Copy dump file từ redis đơn, đè vào redis cluster vừa move
3. Thực hiện re-balance hoặc re-shard

Bước 1: Dồn toàn bộ slot cluster về 1 node, stop toàn bộ cụm. Chú ý: Cụm cluster này đang trống (0 keys, 16383 slot trống)

redis-cli -a komatkhau --cluster reshard 127.0.0.1:7001 \
--cluster-from f59f4084991805490da49edb409ee8c99935389c \
--cluster-to f4edce1c5cbb829123c858405e9b4dd473e62ba6 \
--cluster-slots 5462 \
--cluster-yes

redis-cli -a komatkhau --cluster reshard 127.0.0.1:7001 \
--cluster-from baf0e601ca6ce0d9027af34a0a719fa4d082498b \
--cluster-to f4edce1c5cbb829123c858405e9b4dd473e62ba6 \
--cluster-slots 5461 \
--cluster-yes

# redis-cli -a komatkhau --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f4edce1c...) -> 0 keys | 16384 slots | 5 slaves.
Note: 1 master (node 1) và 5 slave sau khi dồn slot

systemctl stop redis_7001
systemctl stop redis_7002
systemctl stop redis_7003
systemctl stop redis_7004
systemctl stop redis_7005
systemctl stop redis_7006

Bước 2: Copy dump file từ redis đơn, đè vào redis cluster vừa move.

/bin/cp -f /opt/redis/data/dump.rdb /opt/redis-cluster/7001/dump.rdb

systemctl start redis_7001
systemctl start redis_7002
systemctl start redis_7003
systemctl start redis_7004
systemctl start redis_7005
systemctl start redis_7006


# redis-cli -a komatkhau --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f4edce1c...) -> 5000 keys | 16384 slots | 5 slaves.
Note: 5000 key đã được import từ node đơn vào cluster

Bước 3: Xóa 2 node slave, add lại sau đó re-balance.

redis-cli -a komatkhau --cluster del-node 127.0.0.1:7001 f59f4084991805490da49edb409ee8c99935389c #(xóa node3)
redis-cli -a komatkhau --cluster del-node 127.0.0.1:7001 baf0e601ca6ce0d9027af34a0a719fa4d082498b #(xóa node5)
redis-cli -a komatkhau --cluster add-node 127.0.0.1:7003 127.0.0.1:7001
redis-cli -a komatkhau --cluster add-node 127.0.0.1:7005 127.0.0.1:7001
redis-cli -a komatkhau --cluster check 127.0.0.1:7001
redis-cli -a komatkhau --cluster rebalance 127.0.0.1:7001 --cluster-use-empty-masters
redis-cli -a komatkhau --cluster check 127.0.0.1:7001
127.0.0.1:7001 (f4edce1c...) -> 1665 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (f59f4084...) -> 1687 keys | 5462 slots | 1 slaves.
127.0.0.1:7005 (baf0e601...) -> 1648 keys | 5461 slots | 1 slaves.


Phần 8: Cài đặt Redis Cluster + kiểm tra cluster

 Seri Redis của chúng ta gồm những phần sau:

Phần 1: Cài đặt redis cơ bản + Turning redis.
Phần 2: Lệnh quản trị redis cơ bản
Phần 3: Bảo mật cho redis. (redis security)
Phần 4: Access List Redis (tính năng mới từ bản 6)
Phần 5: Các mô hình Redis replication, Ưu và nhược điểm
Phần 6: Redis Master-Salve sử dụng ACL
Phần 7: Redis Sentinel sử dụng ACL
Phần 8: Cài đặt Redis Cluster + kiểm tra cluster hoạt động.
Phần 9: Thêm và xóa node redis cluster, di chuyển data đơn sang cluster và ngược lại
Phần ??: Redis RDB và AOF nên chọn cái nào?
Continue...

Phần 8: Cài đặt Redis Cluster + kiểm tra cluster.

8.1 Question & Answer:

Q1: Redis cluster chia dữ liệu như nào?
A1: Toàn bộ KEY của redis sẽ được chia là 16384 slot. VD ta có 3 node master (16384 / 3 =~ 5461 slot).

8.2. Mô hình cluster hay gặp

6 node cluster - 3 server (production)



Mô tả - 1 server chết > OK. Vẫn còn (33%_node2) + (33%_node3) + (33% Slave của server_1 đặt trên server 3) = Tổng 100% data - 2 server chết > FAIL . Không thể load đc 100% data mà chỉ có 66% có thể gọi ra đc. - 3 server chết > FAIL - 3 slave ta có thể đặt trên 3 server khác, trường hợp 3 master chết, ta vẫn có đủ 100% data sharding.

6 node cluster - 1 server (lab/test env) 


8.3 Cài đặt

Bài này tôi sẽ cài cả 6 redis trên 1 server. Bao gồm 3 master (33% dữ liệu * 3) và 3 slave dùng để backup cho master.

  • 7001(M)-7002(S)
  • 7003(M)-7004(S)
  • 7005(M)-7006(S)

Bước 1: Cài đặt redis basic

Truy cập https://redis.io/download/ tải bản mới nhất (2023-01-18)
# yum install gcc wget systemd-devel -y
# mkdir -p /opt/setup
# cd /opt/setup
# wget https://github.com/redis/redis/archive/7.0.8.tar.gz
# tar -xvzf 7.0.8.tar.gz
# cd redis-7.0.8
# make
Khi make install, các file chạy bin execute sẽ được copy sang thư mục /usr/local/bin/
# make install

Bước 2: Chuẩn bị config cho Cluster

2.1 Chuẩn bị 6 file config

# adduser redis

# vim /opt/redis_cluster_config.sh
CUR_DIR="/opt"
cd $CUR_DIR
mkdir -p ${CUR_DIR}/redis-cluster
cd ${CUR_DIR}/redis-cluster

for port in 7001 7002 7003 7004 7005 7006; do
  mkdir -p ${CUR_DIR}/redis-cluster/${port}
  cat > ${CUR_DIR}/redis-cluster/${port}/redis_${port}.conf <<EOF
port $port
appendonly no
cluster-enabled yes
cluster-node-timeout 5000
dir ${CUR_DIR}/redis-cluster/${port}/
cluster-config-file ${CUR_DIR}/redis-cluster/${port}/nodes_${port}.conf
logfile ${CUR_DIR}/redis-cluster/${port}/nodes_${port}.log
requirepass "komatkhau"
masterauth "komatkhau"
EOF
chown -R redis.redis /opt/redis-cluster
done

Thực hiện chạy
# bash /opt/redis_cluster_config.sh

2.2 Chuẩn bị 6 file systemd

# vim /opt/redis_cluster_systemd.sh
CUR_DIR="/opt"
cd $CUR_DIR
for port in 7001 7002 7003 7004 7005 7006; do
  cat > /etc/systemd/system/redis_${port}.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target


[Service]
ExecStart=$(which redis-server) ${CUR_DIR}/redis-cluster/${port}/redis_${port}.conf --supervised systemd
ExecStop=/bin/redis-cli -h 127.0.0.1 -p ${port} -a komatkhau shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
done

Thực hiện chạy
# bash /opt/redis_cluster_systemd.sh
systemctl daemon-reload
systemctl restart redis_7001
systemctl restart redis_7002
systemctl restart redis_7003
systemctl restart redis_7004
systemctl restart redis_7005
systemctl restart redis_7006

[root@localhost redis-7.0.8]# ps aux | grep redis
redis      6230  0.0  0.4 199272  9300 ?        Ssl  02:31   0:00 /usr/local/bin/redis-server *:7001 [cluster]
redis      6241  0.1  0.4 196200  9276 ?        Ssl  02:31   0:00 /usr/local/bin/redis-server *:7002 [cluster]
redis      6252  0.1  0.4 196200  9276 ?        Ssl  02:31   0:00 /usr/local/bin/redis-server *:7003 [cluster]
redis      6263  0.5  0.4 196200  9276 ?        Ssl  02:31   0:00 /usr/local/bin/redis-server *:7004 [cluster]
redis      6274  0.5  0.4 196200  9276 ?        Ssl  02:31   0:00 /usr/local/bin/redis-server *:7005 [cluster]
redis      6285  0.5  0.4 196200  9272 ?        Ssl  02:31   0:00 /usr/local/bin/redis-server *:7006 [cluster]

Bước 3: Join 6 node vào cluster

Lệnh join 6 node vào cluster. 3 node đầu sẽ là Master, 3 node tiếp theo sẽ là slave
# redis-cli -a komatkhau --cluster create 127.0.0.1:7001 127.0.0.1:7003 127.0.0.1:7005 127.0.0.1:7002 127.0.0.1:7004 127.0.0.1:7006 --cluster-replicas 1

(Ví dụ ta cài trên 3 server 88.11-22-33, tương ứng với lệnh mới như sau redis-cli --cluster create 192.168.88.11:7001 192.168.88.22:7003 192.168.88.33:7005 192.168.88.11:7002 192.168.88.22:7004 192.168.88.33:7006 --cluster-replicas 1

8.4 Các lệnh kiểm tra cluster

Note: Option -c luôn phải có khi chạy trong cluster.

Lệnh 1: Kiểm tra nodes

redis-cli -a komatkhau -c -h 127.0.0.1 -p 7001 CLUSTER NODES

Ta để ý trên ảnh, 1-3-5 là master, 2-4-6 là slave. Ngoài ra đặc biệt quan tâm đến số SLOTS của redis

Tất cả mọi redis cluster sẽ chia làm 16384 slot. Mỗi slot được chia đều cho cả 3 node (chia bánh, xếp bài)

  • 0 đến 5460 cho master1
  • 5461 đến 10922 cho master2
  • 10923 đến 16383 cho master 3

Lệnh 2: Kiểm tra cluster/ số slot /số keys toàn cụm

redis-cli -a komatkhau --cluster check 127.0.0.1:7001

Lệnh 3: Kiểm tra write/read của cluster

redis-cli -a komatkhau -c -h 127.0.0.1 -p 7001 SET TEST_KEY VALUE_123
redis-cli -a komatkhau -c -h 127.0.0.1 -p 7002 GET TEST_KEY
redis-cli -a komatkhau -c -h 127.0.0.1 -p 7003 GET TEST_KEY
redis-cli -a komatkhau -c -h 127.0.0.1 -p 7004 GET TEST_KEY
redis-cli -a komatkhau -c -h 127.0.0.1 -p 7005 GET TEST_KEY
redis-cli -a komatkhau -c -h 127.0.0.1 -p 7006 GET TEST_KEY

Ta có 1 cách khác để kiểm tra GET key
[root@localhost opt]# redis-cli -a komatkhau -c -h 127.0.0.1 -p 7002
127.0.0.1:7002> GET TEST_KEY
-> Redirected to slot [14190] located at 127.0.0.1:7005
"VALUE_123"
Chú ý đến đoạn redirect, tức là khi SET ở 7001, nhưng thực chất data redirect write ở node 5005. Nên khi đọc, redis hiển thị sang 7005 đọc Redirected to slot [14190] located at 127.0.0.1:7005

Lệnh 4: Hoán đổi Slave thành Master trong cluster

Ta vào 1 node slave, sau đó chạy lệnh

redis-cli -a komatkhau -c -h 127.0.0.1 -p 7002
> cluster failover

Ứng cứu khi chown -R user1:user1 /etc

1. Bài toán Gõ nhầm: chown -R user1:user1 /etc 2. Giải: Cách 1: Tìm bản backup /etc cũ (tỉ lệ phục hồi gần như ~100%) Cách 2: Tìm tạm 1 thư ...