Docker系列5 - 在Docker中测试Redis集群

系列文章
Docker系列1 - CentOS7 安装Docker
Docker系列2 - Docker常用命令
Docker系列3 - Docker文件系统及搭建Docker私服
Docker系列4 - 在Docker中测试MySQL主从数据库


分布式存储概念

哈希取余分区:hash(key) % N个机器台数;缺点:扩容或者缩容取余运算的数据变化大
一致性哈希算法分区:当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系

  1. 算法构建一致性哈希环
  2. 服务器IP节点映射
  3. key落到服务器的落键规则
    Redis哈希槽分区:0,2^14 - 1 (16384个槽)halt slot

搭建3主3从Redis集群

#启动6个Redis容器
docker run -d --name redis-node-1 --net host -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

docker exec -it redis-node-1 /bin/bash

#cluster-replicas 1 表示为每个master创建一个slave节点
redis-cli --cluster create 192.168.99.200:6381 192.168.99.200:6382 192.168.99.200:6383 192.168.99.200:6384 192.168.99.200:6385 192.168.99.200:6386 --cluster-replicas 1
yes

redis-cli -p 6381
cluster info
cluster nodes
exit

#以集群的方式连接,优化路由;如果以单机的方式连接,计算key值的槽位不在当前机器会报错 
redis-cli -c -p 6381
set k1 v1
set k2 v2
set k3 v3
set k4 v4

#查看集群信息
redis-cli --cluster check 192.168.99.200:6381

Redis集群主从切换

#查看集群信息
redis-cli --cluster check 192.168.99.200:6381
M: 0d6ebb39a243d7a95dc4a9b1e784e6f77ae4b5e6 192.168.99.200:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 76af5f3d7f16d05ef0e0416adb85fa449d09c4c3 192.168.99.200:6386
   slots: (0 slots) slave
   replicates 0d6ebb39a243d7a95dc4a9b1e784e6f77ae4b5e6
M: 7b2d7ca7fbf3baf65adce9f4206b75ba6d6ce75f 192.168.99.200:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: caccc7cf782a2352859da72e9a9809250578a8ba 192.168.99.200:6385
   slots: (0 slots) slave
   replicates c6ee2d617ed0e7ba055ff6476de71cc8162dfdbb
S: 0bdba07bbe94475836373f6a5b98c09a0d7d04a7 192.168.99.200:6384
   slots: (0 slots) slave
   replicates 7b2d7ca7fbf3baf65adce9f4206b75ba6d6ce75f
M: c6ee2d617ed0e7ba055ff6476de71cc8162dfdbb 192.168.99.200:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)

#主从随机配对的,本次的主从对应关系是
master  slave
6381     6386
6382     6384
6383     6385

#关停一台主机
docker stop redis-node-1

docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
#主机挂了之后,经过一段时间的心跳检测,从机会自动变更成主机
cluster nodes

#之前的数据还是能正常获取
get k1
get k2
get k3
get k4
exit
exit


#恢复启动
docker start redis-node-1

#redis-node-1自动成了从机
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
cluster nodes
exit


#如果要恢复redis-node-1成主机,需要把之前上位的那台先停掉,让redis-node-1上位,之后再次启动
redis-cli --cluster check 192.168.99.200:6381

Redis扩容

#增加2个节点,1主1从
docker run -d --name redis-node-7 --net host -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

docker exec -it redis-node-7 /bin/bash

#将新增的redis-node-7(空槽位)作为master节点加入原集群
redis-cli --cluster add-node 192.168.99.200:6387 192.168.99.200:6381

#新节点是Master(空槽位)
redis-cli --cluster check 192.168.99.200:6381

#重新分配槽号(16384/master台数)
redis-cli --cluster reshard 192.168.99.200:6381
4096
node ID填写新加入的机器
all
yes

#每个master把开头一部分槽位匀了一部分给新节点
#重新分配成本太高,所有前3台各自匀出来一部分,分别匀出1364个槽位给新节点
redis-cli --cluster check 192.168.99.200:6381

#添加从节点
redis-cli --cluster add-node 192.168.99.200:6388 192.168.99.200:6387 --cluster-slave --cluster-master-id  6387的node ID

#查看主从信息
redis-cli --cluster check 192.168.99.200:6381


Redis缩容

#查看从机的node ID
redis-cli --cluster check 192.168.99.200:6381

#先删除从机6388
redis-cli --cluster del-node 192.168.99.200:6388 6388的node ID
redis-cli --cluster check 192.168.99.200:6381

#重新分配槽号
redis-cli --cluster reshard 192.168.99.200:6381
4096					#回收槽号的数量
node ID填写6381的机器   #使6381接受分配出来的槽号
node ID填写6387的机器	#把6387的槽号释放
done
yes

#查看状态
redis-cli --cluster check 192.168.99.200:6381

#删除主机6387
redis-cli --cluster del-node 192.168.99.200:6387 6387的node ID
exit

redis-cli --cluster check 192.168.99.200:6381

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GalenZhang888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值