当前位置: 首页 > news >正文

(分布式缓存)Redis分片集群

对应的教程视频:

高级篇Day3-04-Redis分片集群_哔哩哔哩_bilibili

一.搭建分片集群

1.集群结构

分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-If9nMNjR-1662083428136)(assets/image-20210702164116027.png)]

这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:

IPPORT角色
192.168.150.1017001master
192.168.150.1017002master
192.168.150.1017003master
192.168.150.1018001slave
192.168.150.1018002slave
192.168.150.1018003slave

2.准备实例和配置

删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:

# 进入/tmp目录
cd /tmp
# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003

在/tmp下准备一个新的redis.conf文件,内容如下:

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.150.101
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log

将这个文件拷贝到每个目录下:

# 进入/tmp目录
cd /tmp
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:

# 进入/tmp目录
cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

3.启动

因为已经配置了后台启动模式,所以可以直接启动服务:

# 进入/tmp目录
cd /tmp
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

通过ps查看状态:

ps -ef | grep redis

发现服务都已经正常启动:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSycAyBD-1662083428139)(assets/image-20210702174255799.png)]

如果要关闭所有进程,可以执行命令:

ps -ef | grep redis | awk '{print $2}' | xargs kill

或者(推荐这种方式):

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

4.创建集群

虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。

我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。

1)Redis5.0之前

Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。

# 安装依赖
yum -y install zlib ruby rubygems
gem install redis

然后通过命令来管理集群:

# 进入redis的src目录
cd /tmp/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

2)Redis5.0以后

我们使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:

redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

命令说明:

  • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
  • create:代表是创建集群
  • --replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

运行后的样子:

在这里插入图片描述

这里输入yes,则集群开始创建:

在这里插入图片描述

通过命令可以查看集群状态:

redis-cli -p 7001 cluster nodes

在这里插入图片描述

5.测试

尝试连接7001节点,存储一个数据:

# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1

结果悲剧了

集群操作时,需要给redis-cli加上-c参数才可以:

redis-cli -c -p 7001

 这次可以了

二.散列插槽

 总结:

Redis如何判断某个key应该在哪个实例?

16384 个插槽分配到不同的实例
根据  key  的有效部分计算哈希值,对 16384 取余
余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

这一类数据使用相同的有效部分,例如 key 都以 { typeId } 为前缀. 如:

 

三.集群伸缩

 

 

 四.故障转移

 

 

五.RedisTemplate访问分片集群 

 上面的第1和第3步和哨兵模式的1和3是一样的,主要差别是第2步

相关文章:

  • 线性DP问题
  • ORA-28000: the account is locked
  • LeetCode220902_93、搜索二维矩阵 II
  • SpringBoot关闭Tomcat容器,SpringBoot使用Jetty容器
  • 记录angular使用codemirror的过程和遇到的问题
  • 猿创征文|当我在追光 我与光同航--我与Java的技术成长之路
  • python基础专栏12-python基础篇-复合数据类型-字典
  • 投入不到一万,月赚十万+的海外平台搬运项目
  • 赚钱副业项目:steam搬砖的一点经验
  • Go 1.18 版本新特性详解!
  • 共码未来 | 多维提升开发技能,玩转各大开发者平台活动
  • html5新增特性之画布canvas的使用
  • 查题校园题库系统 授权即可使用
  • 弹性力学的简单学习
  • 青云霍秉杰:一文读懂Prometheus长期存储主流方案
  • [译]如何构建服务器端web组件,为何要构建?
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • CEF与代理
  • Elasticsearch 参考指南(升级前重新索引)
  • Github访问慢解决办法
  • JavaScript标准库系列——Math对象和Date对象(二)
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Terraform入门 - 1. 安装Terraform
  • Wamp集成环境 添加PHP的新版本
  • Xmanager 远程桌面 CentOS 7
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #《AI中文版》V3 第 1 章 概述
  • #大学#套接字
  • #微信小程序:微信小程序常见的配置传旨
  • $GOPATH/go.mod exists but should not goland
  • (0)Nginx 功能特性
  • (2)(2.10) LTM telemetry
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Forward) Music Player: From UI Proposal to Code
  • (function(){})()的分步解析
  • (八)c52学习之旅-中断实验
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转) Android中ViewStub组件使用
  • .net web项目 调用webService
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @Autowired 与@Resource的区别
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [20150904]exp slow.txt
  • [Asp.net MVC]Bundle合并,压缩js、css文件