当前位置:网站首页>Redis集群(docker版)——从原理到实战超详细
Redis集群(docker版)——从原理到实战超详细
2022-08-05 05:16:00 【呆比特】
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~
边栏推荐
- [Database and SQL study notes] 10. (T-SQL language) functions, stored procedures, triggers
- 基于STM32F407的WIFI通信(使用的是ESP8266模块)
- AWS 常用服务
- 【Multisim仿真】直流稳压电源设计报告
- You should write like this
- 【ts】typescript高阶:模版字面量类型
- flink yarn-session的两种使用方式
- 【数据库和SQL学习笔记】5.SELECT查询3:多表查询、连接查询
- 【ts】typescript高阶:联合类型与交叉类型
- [Kaggle project actual combat record] Steps and ideas sharing of a picture classification project - taking leaf classification as an example (using Pytorch)
猜你喜欢
CVPR2020 - 自校准卷积
CVPR 2022 | 70% memory savings, 2x faster training
【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
You should write like this
2022年中总结关键词:裁员、年终奖、晋升、涨薪、疫情
【数据库和SQL学习笔记】5.SELECT查询3:多表查询、连接查询
【Kaggle项目实战记录】一个图片分类项目的步骤和思路分享——以树叶分类为例(用Pytorch)
原来何恺明提出的MAE还是一种数据增强
IDEA 配置连接数据库报错 Server returns invalid timezone. Need to set ‘serverTimezone‘ property.
基于STM32F407的WIFI通信(使用的是ESP8266模块)
随机推荐
MaskDistill-不需要标注数据的语义分割
【数据库和SQL学习笔记】9.(T-SQL语言)定义变量、高级查询、流程控制(条件、循环等)
spark-DataFrame数据插入mysql性能优化
网络信息安全运营方法论 (中)
flink yarn-session的两种使用方式
SQL (2) - join window function view
5G中切片网络的核心技术FlexE
记我的第一篇CCF-A会议论文|在经历六次被拒之后,我的论文终于中啦,耶!
CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
IDEA 配置连接数据库报错 Server returns invalid timezone. Need to set ‘serverTimezone‘ property.
BroadCast Receiver(广播)详解
解决:Unknown column ‘id‘ in ‘where clause‘ 问题
[Pytorch study notes] 9. How to evaluate the classification results of the classifier - using confusion matrix, F1-score, ROC curve, PR curve, etc. (taking Softmax binary classification as an example)
CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
数控直流电源
It turns out that the MAE proposed by He Yuming is still a kind of data enhancement
SparkML-初探-文本分类
【数据库和SQL学习笔记】8.SQL中的视图(view)
如何跟踪网络路由链路&检测网络健康状况
Day1:用原生JS把你的设备变成一台架子鼓!