Hiển thị các bài đăng có nhãn redis. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn redis. Hiển thị tất cả bài đăng

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

Debug exec pod with no any command support

  Một ngày đẹp trời pod bị lỗi. Bạn thử ngay lệnh "kubectl exec -it ..." vào pod kiểm tra. Nhưng quãi đạn, pod không hỗ trợ bất kỳ...