部署一个3主3从3分片的redis集群。
1.创建目录结构
mkdir -p /data/redis-cluster
cd /data/redis-cluster
for port in 7001 7002 7003 7004 7005 7006; do
mkdir -p ${port}/data
mkdir -p ${port}/logs
done
2.为每个端口创建配置文件
language
cat > /data/redis-cluster/7001/redis.conf << 'EOF'
port 7001
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/7001/redis.pid
logfile "/data/redis-cluster/7001/logs/redis.log"
dir /data/redis-cluster/7001/data
dbfilename dump-7001.rdb
appendonly yes
appendfilename "appendonly-7001.aof"
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
EOF
# 7002
cat > /data/redis-cluster/7002/redis.conf << 'EOF'
port 7002
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/7002/redis.pid
logfile "/data/redis-cluster/7002/logs/redis.log"
dir /data/redis-cluster/7002/data
dbfilename dump-7002.rdb
appendonly yes
appendfilename "appendonly-7002.aof"
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
EOF
# 7003
cat > /data/redis-cluster/7003/redis.conf << 'EOF'
port 7003
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/7003/redis.pid
logfile "/data/redis-cluster/7003/logs/redis.log"
dir /data/redis-cluster/7003/data
dbfilename dump-7003.rdb
appendonly yes
appendfilename "appendonly-7003.aof"
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
EOF
# 7004
cat > /data/redis-cluster/7004/redis.conf << 'EOF'
port 7004
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/7004/redis.pid
logfile "/data/redis-cluster/7004/logs/redis.log"
dir /data/redis-cluster/7004/data
dbfilename dump-7004.rdb
appendonly yes
appendfilename "appendonly-7004.aof"
cluster-enabled yes
cluster-config-file nodes-7004.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
EOF
# 7005
cat > /data/redis-cluster/7005/redis.conf << 'EOF'
port 7005
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/7005/redis.pid
logfile "/data/redis-cluster/7005/logs/redis.log"
dir /data/redis-cluster/7005/data
dbfilename dump-7005.rdb
appendonly yes
appendfilename "appendonly-7005.aof"
cluster-enabled yes
cluster-config-file nodes-7005.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
EOF
# 7006
cat > /data/redis-cluster/7006/redis.conf << 'EOF'
port 7006
bind 0.0.0.0
daemonize yes
pidfile /data/redis-cluster/7006/redis.pid
logfile "/data/redis-cluster/7006/logs/redis.log"
dir /data/redis-cluster/7006/data
dbfilename dump-7006.rdb
appendonly yes
appendfilename "appendonly-7006.aof"
cluster-enabled yes
cluster-config-file nodes-7006.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
EOF
3.启动所有Redis节点
cd /data/redis-cluster
redis-server 7001/redis.conf
redis-server 7002/redis.conf
redis-server 7003/redis.conf
redis-server 7004/redis.conf
redis-server 7005/redis.conf
redis-server 7006/redis.conf
4.检查是否启动成功
测试每个端口是否响应
for port in 7001 7002 7003 7004 7005 7006; do
echo -n "Port ${port}: "
redis-cli -p ${port} ping
done
5.创建集群
redis-cli --cluster create \
127.0.0.1:7001 \
127.0.0.1:7002 \
127.0.0.1:7003 \
127.0.0.1:7004 \
127.0.0.1:7005 \
127.0.0.1:7006 \
--cluster-replicas 1
6.查看集群节点信息
查看集群节点信息
redis-cli -p 7001 cluster nodes
查看集群信息
redis-cli -p 7001 cluster info
7.模拟集群高可用
1.这个实验,写一条数据,显示写入到7001分片中,将7001分片宕机,集群将7005升级为主库,且数据未丢失。
2.将7001库重启后,7001作为7005的从库重新加入到集群,执行cluster failover 可以将7001重新升级未主库。
language
6dfec6857f4903125e79103d2cdb03d9677c23e9 127.0.0.1:7006@17006 slave 3cc972bca5ba316ba186fce0d00e403b7786b8d5 0 1768890474417 2 connected
925ba9e7cdb8c1919e89872e60f8597594831ffa 127.0.0.1:7004@17004 slave 58320d54773f0a5b54666f932d0fb37d745e1212 0 1768890476000 3 connected
3cc972bca5ba316ba186fce0d00e403b7786b8d5 127.0.0.1:7002@17002 myself,master - 0 0 2 connected 5461-10922
58320d54773f0a5b54666f932d0fb37d745e1212 127.0.0.1:7003@17003 master - 0 1768890476425 3 connected 10923-16383
6745c9aa35c4ce24fa2475c000078800d2771e0d 127.0.0.1:7001@17001 master - 0 1768890476000 1 connected 0-5460
54f8b28b9e3719ec27099094df4fdc1a12f44183 127.0.0.1:7005@17005 slave 6745c9aa35c4ce24fa2475c000078800d2771e0d 0 1768890477428 1 connected
#插入一条值
redis-cli -p 7002 -c
127.0.0.1:7002>
127.0.0.1:7002> set test1 123
-> Redirected to slot [4768] located at 127.0.0.1:7001
OK
#数据插入到7001的分片中,将7001 shutdown
redis-cli -p 7001 shutdown
#查看集群信息
redis-cli -p 7002 cluster nodes
6dfec6857f4903125e79103d2cdb03d9677c23e9 127.0.0.1:7006@17006 slave 3cc972bca5ba316ba186fce0d00e403b7786b8d5 0 1768891024515 2 connected
925ba9e7cdb8c1919e89872e60f8597594831ffa 127.0.0.1:7004@17004 slave 58320d54773f0a5b54666f932d0fb37d745e1212 0 1768891023000 3 connected
3cc972bca5ba316ba186fce0d00e403b7786b8d5 127.0.0.1:7002@17002 myself,master - 0 0 2 connected 5461-10922
58320d54773f0a5b54666f932d0fb37d745e1212 127.0.0.1:7003@17003 master - 0 1768891024000 3 connected 10923-16383
6745c9aa35c4ce24fa2475c000078800d2771e0d 127.0.0.1:7001@17001 master,fail - 1768890943144 1768890937121 1 disconnected
54f8b28b9e3719ec27099094df4fdc1a12f44183 127.0.0.1:7005@17005 master - 0 1768891025519 7 connected 0-5460
#显示7001宕机,7005作为7001的从库,升为主库
[root@iv-ye4xdz3ncwwh2ypb2dr5 ~]# redis-cli -p 7002
127.0.0.1:7002> keys *
1) "name"
2) "counter"
3) "test"
127.0.0.1:7002> exit
[root@iv-ye4xdz3ncwwh2ypb2dr5 ~]# redis-cli -p 7005
127.0.0.1:7005> keys *
1) "test1"
127.0.0.1:7005>
#test1在7005存在
#将7001库拉起来,redis-server 7001/redis.conf ,可以看到7001又作为7005的从库加入到集群中
[root@iv-ye4xdz3ncwwh2ypb2dr5 redis-cluster]# redis-cli -p 7002 cluster nodes
6dfec6857f4903125e79103d2cdb03d9677c23e9 127.0.0.1:7006@17006 slave 3cc972bca5ba316ba186fce0d00e403b7786b8d5 0 1768891151035 2 connected
925ba9e7cdb8c1919e89872e60f8597594831ffa 127.0.0.1:7004@17004 slave 58320d54773f0a5b54666f932d0fb37d745e1212 0 1768891153000 3 connected
3cc972bca5ba316ba186fce0d00e403b7786b8d5 127.0.0.1:7002@17002 myself,master - 0 0 2 connected 5461-10922
58320d54773f0a5b54666f932d0fb37d745e1212 127.0.0.1:7003@17003 master - 0 1768891152039 3 connected 10923-16383
6745c9aa35c4ce24fa2475c000078800d2771e0d 127.0.0.1:7001@17001 slave 54f8b28b9e3719ec27099094df4fdc1a12f44183 0 1768891153042 7 connected
54f8b28b9e3719ec27099094df4fdc1a12f44183 127.0.0.1:7005@17005 master - 0 1768891154046 7 connected 0-5460
[root@iv-ye4xdz3ncwwh2ypb2dr5 redis-cluster]# redis-cli -p 7001
#执行cluster failover 重新将7001升为主库。
127.0.0.1:7001> cluster failover
OK
127.0.0.1:7001> exit
[root@iv-ye4xdz3ncwwh2ypb2dr5 redis-cluster]# redis-cli -p 7002 cluster nodes
6dfec6857f4903125e79103d2cdb03d9677c23e9 127.0.0.1:7006@17006 slave 3cc972bca5ba316ba186fce0d00e403b7786b8d5 0 1768891295000 2 connected
925ba9e7cdb8c1919e89872e60f8597594831ffa 127.0.0.1:7004@17004 slave 58320d54773f0a5b54666f932d0fb37d745e1212 0 1768891297560 3 connected
3cc972bca5ba316ba186fce0d00e403b7786b8d5 127.0.0.1:7002@17002 myself,master - 0 0 2 connected 5461-10922
58320d54773f0a5b54666f932d0fb37d745e1212 127.0.0.1:7003@17003 master - 0 1768891298564 3 connected 10923-16383
6745c9aa35c4ce24fa2475c000078800d2771e0d 127.0.0.1:7001@17001 master - 0 1768891297000 8 connected 0-5460
54f8b28b9e3719ec27099094df4fdc1a12f44183 127.0.0.1:7005@17005 slave 6745c9aa35c4ce24fa2475c000078800d2771e0d 0 1768891296000 8 connected