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à

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.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ