Redis集群(docker版)——从原理到实战超详细

Redis集群(docker版)——从原理到实战超详细

一、问题:1~2亿数据如何缓存?

  分布式存储,Redis实现方案常见有三种:

哈希取余分区

原理:
	在一个Redis集群中,用户每次读写操作都根据公式:hash(key)/ n ,决定数据映射到哪一个节点上;

优点:
	简单有效,只需要预估好数据,规划好节点,就能保证一段时间的数据支撑
	使用Hash算法让固定的一部分请求落到同一台服务器上,起到负载均衡、分而治之的作用。

缺点:
	扩缩容比较麻烦,每次数据变动导致节点有变动,映射关系就需要重新进行计算
	某台机器宕机,机器数量就发生了变化,公式计算结果全部改变

一致性哈希算法分区

原理:
	首先,将0~2^32看做一个首位相接的环

	然后有一个hash函数,根据各个节点的ip,将集群中各个节点映射到环上的某一个位置:hash(ip)% 2^32

	当我们要存储一个k-v时,首先计算k的哈希值(hash(k)),然后从环上的这个哈希值位置开始顺时针行走,
	遇到的第一个节点就是应该存储的节点。

优点:
	容错性:某节点宕机,只会影响环上本节点顺时针前后节点之间的数据,并将这些数据保存到了本节点的下一个节点,其他数据无影响
	扩展性:如果在A、B节点之间增加一台节点C,只有A到C之间的数据收到影响,把A到C的数据从B转移到C即可

缺点:
	节点太少时,容易因为节点分布不均匀而造成数据倾斜

哈希槽分区

原理:
	Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
	当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,
	这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。

优点:
	解决了均匀分配的问题
	在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系

二、Redis集群搭建(3主3从)

1. 关闭防火墙,启动docker后台服务

systemctl stop firewalld
#永久关闭
systemctl disable firewalld
#查看防火墙状态
systemctl status firewalld

systemctl start docker

在这里插入图片描述

2. 新建6个docker容器redis实例

#命令解释:
#docker run --> 创建并运行docker容器实例
#--name redis-node-1 --> 容器名
#--net host --> 默认使用宿主机的ip和端口
#--privileged=true --> 获取root权限
#-v /data/redis/share/redis-node-1:/data --> 容器卷:宿主机地址:docker内部地址
#--cluster-enabled yes --> 开启redis集群
#--appendonly yes --> 开启持久化
#--port 6381 --> redis端口号

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

在这里插入图片描述

3. 构建集群关系

#进入redis-node-1容器
docker exec -it redis-node-1 /bin/bash

#构建关系,ip地址改为自己的
redis-cli --cluster create 192.168.189.131:6381 192.168.189.131:6382 192.168.189.131:6383 192.168.189.131:6384 192.168.189.131:6385 192.168.189.131:6386 --cluster-replicas 1

在这里插入图片描述

进入6381,查看节点状态

redis-cli -p 6381

cluster info

cluster nodes

在这里插入图片描述
节点关系

主: 6381   -----从: 6385

主: 6383   -----从: 6384

主: 6382   -----从: 6386

三、主从容错切换迁移

1. 数据读写存储

在这里插入图片描述

2. 容错切换迁移

停止主机6381,从机6385自动顶上
在这里插入图片描述
主机6381恢复,主从关系恢复
在这里插入图片描述
查看集群状态

#redis-cli --cluster check 自己ip:6381
redis-cli --cluster check 192.168.189.131:6381

在这里插入图片描述

四、主从扩容

1. 新建 6387、6388节点

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

在这里插入图片描述

2. 进入6387,将6387作为master加入原集群

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

# redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
redis-cli --cluster add-node 192.168.189.131:6387 192.168.189.131:6381

在这里插入图片描述

3. 第一次检查集群情况

redis-cli --cluster check 192.168.189.131:6381

在这里插入图片描述

4. 重新分配槽位

#命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.189.131:6381

在这里插入图片描述

5. 第二次检查集群情况

redis-cli --cluster check 192.168.189.131:6381

在这里插入图片描述

6. 为6387主节点添加从节点6388

#命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

redis-cli --cluster add-node 192.168.189.131:6388 192.168.189.131:6387 --cluster-slave --cluster-master-id 077ab949c96a5c46ee6fbc65302a7644e7e2b131

在这里插入图片描述

五、主从缩容:将6387和6388下线

1. 从集群中删除6388节点

#redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.189.131:6388 f100e9268cfb4672c1a533e01beaf917ce35cba6

在这里插入图片描述

2. 情况1387节点槽位,重新分配,清理出的槽位都给6381

redis-cli --cluster reshard 192.168.189.131:6381

在这里插入图片描述

#检查集群情况
redis-cli --cluster check 192.168.189.131:6381

在这里插入图片描述

3. 删除6387节点

#命令:redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 192.168.189.131:6387 077ab949c96a5c46ee6fbc65302a7644e7e2b131

在这里插入图片描述

OVER(∩_∩)O~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Anton丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值