哈希槽分布式缓存实战--redis(三主三从)保姆级教程

        序言:

三主三从设计架构:本次是再一台机器上模拟操作的,需要开启六个docker容器分别作为六个服务器,并且负载有主从关系,如下图:

698eb0e2fa444932aae8c1cb1b758719.png

主从关系图片来源@尚硅谷

需要注意的是:上面的主从关系是随机的,可能真实的情况从属关系,是另外一种也是对的!

一、三主三从redis集群搭建(框架)

1.确认自己的docker服务已经开启,没开启的使用systemctl start docker开启服务

2.执行指令:

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-1:表示要运行redis以redis-node-1为名称运行模拟redis结点!

--net host :表示docker网络,让容器之间可以联系,使用宿主机的ip端口这个不必深究,后续会出一个docker网络的知识作品!

--privileged=true:开启权限获取宿主机的root权限

-v /data/redis/share/redis-node-1:/data:容器数据卷挂载

--cluster-enabled yes --appendonly yes --port 6381:表示开启集群,并且持久化端口为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容器是否确定运行了):

4899f077bf2940e8acd1a9b9af3f281c.png


3.进入容器redis-node-1(这里可以是任意容器)为六台服务器分配主从关系:

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

4.执行指令:

redis-cli --cluster create

192.168.40.144:6381

192.168.40.144:6382

192.168.40.144:6383

192.168.40.144:6384

192.168.40.144:6385

192.168.40.144:6386

 --cluster-replicas 1

注意自己的IP使用自己的真是IP

指令解析:

 --cluster create:表示创建一个集群;

 --cluster-replicas 1:表示为每个master创建一个slave结点

执行结果(主从关系可能不一样都是正确的,自己记住就行):

873487e615da49a3b1224c8dac77110e.png

打出yes执行结果(主:6381,6382,6383从:6384,6385,6386):

291e1d755476437daedefa79bd9175e3.png

f7c4c98866974fa9880e2be82a06bd2d.png


5.以6381作为切入点进入,查看集群状态:

指令:redis-cli -p 6381默认是6379,此时是6381注意更改,接下来执行指令:

cluster info查看集群所有信息:

发现cluster_slots_ok是16384已经全部分配

还有cluster_know_nodes是6一致的服务器是6台

0ee04b7cbd794c688c1debdd7d234d4d.png


6.主从容错切换迁移:

读写数据):我们进入到6381之后查看数据为空,我们执行set k1 v1命令插入一条数据发现报错?

ee7387cdf17b483aab1181900d47adb8.png

并且给出了信息是槽位是12706不在6381而是在6383,这不就完犊子了吗?存不上去数据还必须开启每一个结点?分开存储吗?当然不用!我们在进入6381时使用命令:redis-cli -p 6381 -c

c9089288e57b49a4bc3cb4f1d91d003c.png

这样就可以存进去了?因为redis-cli -p 6381命令时单机版的,槽位不在肯定存不进去,使用redis-cli -p 6381 -c(防止路由失效)表示集群进入那么存数据的时候就会在整个集群中找槽位存进去!

我们我能看到:Redirected to slot [12706] located at 192.168.40.144:6383重定向到6383也正是重定向存储才存储成功的;那么可以在集群中任意节点获取数据吗?

当然可以:

f45b88d41b9846188e5a2337a07c54c5.png

354f4914e94b402c981e9b12c790a397.png

我们看到无论主从服务器都能获取数据并且是Redirected to slot [12706] located at 192.168.40.144:6383重定向获取数据:12706在6383服务器上!

补充集群检查指令:redis-cli --cluster check 192.168.40.144:6381只是以6381为切入点其他的结点也可以(有很多信息可以看到):

a9a71e873cd14c949abe706bbb813ccb.png

[OK] 1 keys in 3 masters.有一个数据在三个主机的集群中

M: 942dedd54ba1ec6c6e502ca89d9982189f927f69 192.168.40.144:6381

   slots:[0-5460] (5461 slots) master

   1 additional replica(s)

注意:看好槽位的范围0-5460后面会用到,并且注意查看主从关系


7.容错切换:

4a32892b5fba430da76638edcc447d3b.png

假如主服务器6381宕机,从服务器6384是否能够顶替其上位主服务器的位置?

我们把redis-node-1停止:docker stop redis-node-1

a88b4656f334436b90736d13882427ee.png

发现已经没有6381了,接下来我们以6383为切入点进入集群:

注意这里是6382跳转到了6383都是一样的效果:

我们看到:942dedd54ba1ec6c6e502ca89d9982189f927f69 192.168.40.144:6381@16381 master,fail - 1717211109662 1717211107000 1 disconnected

表示6381已经宕机了,此时我们再看:cb604d2d60a9a2d21f877b0f7705c1158578cb06 192.168.40.144:6384@16384 master - 0 1717211148000 7 connected 0-5460发现6384已经变成了master顶替了6381

4e82561155aa4e43851e22dc03265998.png

死了一台服务器集群也能正常使用(这就是证据):

9547380c05e345ed96c1d5f5af497a57.png

如果6381有复活了,那么是怎么设计的呢?是6384继续当大哥还是6384讲人情世故主动退位给6381继续上位呢?

答案是:6384继续当大哥!

我们把6381复活:docker start redis-node-1

11b409b0afdf452c80ecdcc80a368d26.png

发现6381变成slave了:

942dedd54ba1ec6c6e502ca89d9982189f927f69 192.168.40.144:6381@16381 slave cb604d2d60a9a2d21f877b0f7705c1158578cb06 0 1717211792000 7 connected并且从属于6384!

一般我们会依据架构设计主从关系:我们再把6381恢复到主服务器的位置:docker stop redis-node-4:

a180698f99ae4e8ba65158c0143e09d0.png

发现6381又变成master了(稍等一会在查看,要有一个心跳检测时间)最后在恢复6384就行了!

如果不放心在执行:redis-cli --cluster check 192.168.40.144:6381

查看集群信息:

3f5586ed451242fc90c4e168bac5c3e0.png


8.主从扩容:

扩容架构主6387和从6388见图:

4d7a78349d69466f993dce90bf7248a3.png

目标就是达到四主四从(注意槽位的分配规则):

b4fdd148ddd141519bf5059c4b5eb694.png

步骤:

  1. 新建6387和6388两个结点新建后启动并查看是否是8个结点存在;
  2. 指令:
    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-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

        执行结果如图:一共又加了两个结点6387和6388,现在并没有分配主从关系和加入集群中

bbdabc003ec344a9954d9d289ae5398d.png

  • 进入6387容器:
  • docker exec -it redis-node-7 /bin/bash
    

  • 将新增的6387结点(空槽位)作为master加入集群
  • 指令:

    redis-cli --cluster add-node 192.168.40.144:6387 192.168.40.144:6381

    通过6381这个老大找到组织并成功假如集群:

485f55a591cc4f5d9e87ee8158a06878.png

  • 检查集群情况1

指令:

redis-cli --cluster check 192.168.40.144:6381

发现已经多出了一个master并且

8ba153adc690c387120274344860a4ceb189b465 192.168.40.144:6387

slots: (0 slots) master

发现6387的槽位是0空槽位!

7ebc47b01fac4428bfbba27d836961cb.png

  • 重新分配槽号

怎么分配槽位呢?是重新打乱分?还是每一个原来的结点云一点出来给6387呢?

很明显:不可能是第一种,不然打乱了再分,使用哈希槽的意义又在何处呢?

他会每一个原来的结点匀出一些槽位出来给6387!那么指令:

redis-cli --cluster reshard 192.168.40.144:6381

他会让你填一些信息:

一个是4096,是通过计算得来的:16384/4=4096,也即是16384

个槽位分配给四台服务器一台服务器约为4096个槽位:

接下来是ID这个ID填的是新加入的节点的ID也就是6387的ID

最后是一个all表示原来的所有结点都匀出来一点槽位,如果你的是done要给出这些槽位的来源结点ID

510758cacfee4bbf8b390bb3af984441.png


  • 检查集群情况2

发现已经为6387分配了槽位,每个节点都是4096个槽位;

7d25550ab58b43e9b42ebec1fcb6085f.png

我们还发现:原来的节点槽位的范围变化了都是从前面范围拿出一部分给6387,因为重新分配的成本太高了!

7.为主节点6387分配从节点6388

af51d1f9516248cb9a1c622fde2e2419.png

redis-cli --cluster add-node 192.168.40.144:6388 192.168.40.144:6387 --cluster-slave --cluster-master-id 8ba153adc690c387120274344860a4ceb189b465

一定要注意6387的ID是你自己的!

1167b3e403e2443cac0ceab180e5b458.png

  • 检查集群情况3

执行指令:redis-cli --cluster check 192.168.40.144:6381

我们看到:

S: b0abf128bde6e8003bfe25cb56db5b7102f71d96 192.168.40.144:6388

   slots: (0 slots) slave

   replicates 8ba153adc690c387120274344860a4ceb189b465从属于6387!

d2ed5bb53a94442e8e876288c851ab76.png

测试6387和6388是否可以在集群中拿到数据和存入数据:

8e7f9be98cea46c2b597087fc27670cc.png

271de6e36a60487b92a14194db6ad5db.png

发现没问题,搞定了!!!


  • 主从缩容:

恢复至三主三从:

c452d348cacd4f4894ff67bbc6acd353.png

注意:一定要先清除从结点6388,清除出来的曹号从新分配在删除6387即可!


  • 删除6388从属服务器:redis-cli --cluster del-done 192.168.40.144:6388+6388的ID

0b0c63374dd5470794898a822ad1419d.png

删除之后就只剩下四主三从了

重新分配6387的槽号:

本次重新分配都给6381,简化操作!

在下面填写6387的槽号数4096;接下来会输入6381的ID作为接收槽号的一方!

48233f397c0c4d76a1327759fa2a10ab.png

注意ID的填写容易出错:

7cf49961ac454836a9c7778bfcca4932.png

执行之后再次查看:

发现6387的槽号已经为空了而6381的槽号多了很多恰好是4096*2

0f399adefc7d417498ba17ad4cd8e6b8.png

在执行:redis-cli --cluster del-node 192.168.40.144:6387 8ba153adc690c387120274344860a4ceb189b465

注意是6387的ID

8ab7db40cddc45fbb27fd8bfb91166ef.png

重新检查:

又恢复到了三主三从:

b68f677b0ee44a2cba473e7222474f92.png

总结:一定要操作,多练!如果遇到任何问题欢迎在评论区留言!

910addcfa50d47a8b3d645a4eb317f01.png

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值