- vừa được xem lúc

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

0 0 20

Người đăng: Dương Anh Tuấn

Theo Viblo Asia

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. 

Bình luận

Bài viết tương tự

- vừa được xem lúc

Caching đại pháp 2: Cache thế nào cho hợp lý?

Caching rất dễ. Mình không nói đùa đâu, caching rất là dễ. Ai cũng có thể làm được chỉ sau 10 phút đọc tutorial. Nó cũng giống như việc đứa trẻ lên 3 đã có thể cầm bút để vẽ vậy.

0 0 126

- vừa được xem lúc

Caching đại pháp 1: Nấc thang lên level của developer

Bí quyết thành công trong việc đáp ứng hệ thống triệu user của những công ty lớn (và cả công ty nhỏ). Tại sao caching lại là kỹ thuật tối quan trọng để phù phép ứng dụng rùa bò của chúng ta thành siêu phẩm vạn người mê.

0 0 82

- vừa được xem lúc

Cache dữ liệu Nodejs với Redis

Một tí gọi là lý thuyết để anh em tham khảo. Cache là gì. Lợi ích của việc cache data. .

0 0 111

- vừa được xem lúc

Nguyên tắc hoạt động của redis server

Sự ra đời của Redis. . Câu chuyện bắt đầu khi tác giả của Redis, Salvatore Sanfilippo. (nickname: antirez), cố gắng làm những công việc gần như là không.

0 0 97

- vừa được xem lúc

Viết ứng dụng chat realtime với Laravel, VueJS, Redis và Socket.IO, Laravel Echo

Xin chào tất cả các bạn, đây là một trong những bài post đầu tiên của mình. Sau bao năm toàn đi đọc các blog tích luỹ được chút kiến thức của các cao nhân trên mạng.

0 0 918

- vừa được xem lúc

Tìm hiểu tổng quan về Redis

1. Lời mở đầu.

0 0 368