1.环境
该部分主要为实现redis搭建集群测试,环境为
在m1上装vmware Fusion ,装 centos-7, 跑docker,在docker基础上跑6个redis容器,也就是单服务器跑redis集群。
但这说来也有风险,容器挂了,从机redis可以升为主机,但是要是运行该服务器的docker或者该服务器也挂了,那集群的意义也就不大了。本次先测试在同一台虚拟机上跑6-8个redis容器
2.集群环境搭建
6381 6382 6383 为redis主服务器
6385 6386 6384 为redis从服务器,且1-5 、2-5、 3-4 分别为主从
docker run -d --name redis-node-1 --net host --privileged=true -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 --privileged=true -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 --privileged=true -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 --privileged=true -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 --privileged=true -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 --privileged=true -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
redis-cli --cluster create 172.16.48.132:6381 172.16.48.132:6382 172.16.48.132:6383 172.16.48.132:6384 172.16.48.132:6385 172.16.48.132:6386 --cluster-replicas 1
毕竟都在同一个机子上跑,ip地址都一样,172.16.48.132是虚拟机的内网地址
3.集群测试
进入容器
查看节点的主从关系,因为我这是后面截的图,这个图仅供参考,主从顺序可能因为容器的启停而改变,但是左边的那一栏是正确的,三主三从
我们以集群的方式启动,可以进行存取键和值
redis集群会根据不同的键选取对应的插槽(slot),如果hash 后比如落在了主6382的服务器插槽范围内,则将该键值放入该redis中,注意,从机没有插槽
加了参数 -c,会根据不同的键的落位,重定向到那个redis容器上
4.集群扩容
假如现在要新加入两台redis服务器到该集群,应该怎么做
① 这两台应该先活着吧,run redis 容器
②将一台机器加入master 行列 (add-node)
③ 加入但没有槽位,所以要重新分槽位给新加入的这台主机器 (reshard)
④把从机器加到主机器,作为从机存在
由上述的4个步骤,依次执行如下
第一步:
#主
docker run -d --name redis-node-7 --net host --privileged=true -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-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
我们查询redis-node-2 (master)的集群情况 如下图,master变为4台,但是6287现在还是空槽
因为以前做过集群缩容,所以slot数量每台机子分配的可能不太一样,容易看到,6385上面的slots有8192个,那这次就从这台机子上重新分配
我们不是现在有4台主机吗,16384让其均分,除以4,刚好是4096,分给29c1axxxx
后面问你是否支持这种分配,选择yes即可
结果分配如下,注意,虽然我是在6385上面reshard,但是,结果还是拥有slots的主机大家 匀一点给这个新来的,注意这个词,匀,很关键。不是我多我就给你多一点!而是大家凑一凑,给你4096
正确加入 ,至此,集群扩容完成!!!
5.集群缩容
由扩容,我们容易反推,缩容的操作,就是逆着来
①先把从机删了(del-node)
②把主机的槽位清空(reshard)
③把主机删了
④注意,上述的”删了“我们只是把它们从集群中移除出去,但它们都还活着,就像只是被开除了,并没有死,所以容器都还在,后续就看个人了,如果日后可能有扩容的需要,就关了就好。
具体如下
左边的主从只剩7台了,继续继续
然后重新分配插槽,这一次我不全部给某一台了,当然你全部给某一台也行,,总的4096,我们拿出2000给这个6382,剩下的2096给这个6383,(这里我感觉还是给2的整数次方个值会更好,如果1024,2048这类的数,当然,给2000也行)
如上图,这个我们的主机6387还有2096个插槽,反正都要被薅光的,我们再来一次,把这个6387的都给6383,这样余留下的三个主机的插槽数量都差不太多
不错不错,这一个薅的干干净净,最后一个,把这个主机6387干掉即可
这下大功告成 完结