手机端网站建设步骤,国内logo设计网站,上海住房和城乡建设厅网站,企业网站建设费用怎么入账文章目录 Redis分片集群搭建分片集群散列插槽插槽原理小结 集群伸缩需求分析创建新的redis实例添加新节点到redis转移插槽 故障转移自动故障转移手动故障转移 RedisTemplate访问分片集群 Redis分片集群
搭建分片集群
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两… 文章目录 Redis分片集群搭建分片集群散列插槽插槽原理小结 集群伸缩需求分析创建新的redis实例添加新节点到redis转移插槽 故障转移自动故障转移手动故障转移 RedisTemplate访问分片集群 Redis分片集群
搭建分片集群
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决 海量数据存储问题 高并发写的问题
使用分片集群可以解决上述问题如图: 分片集群特征 集群中有多个master每个master保存不同数据 每个master都可以有多个slave节点 master之间通过ping监测彼此健康状态 客户端请求可以访问集群任意节点最终都会被转发到正确节点
散列插槽
插槽原理
Redis会把每一个master节点映射到0~16383共16384个插槽hash slot上查看集群信息时就能看到 数据key不是与节点绑定而是与插槽绑定。redis会根据key的有效部分计算插槽值分两种情况
key中包含{}且“{}”中至少包含1个字符“{}”中的部分是有效部分key中不包含“{}”整个key都是有效部分
例如key是num那么就根据num计算如果是{itcast}num则根据itcast计算。计算方式是利用CRC16算法得到一个hash值然后对16384取余得到的结果就是slot值。
如图在7001这个节点执行set a 1时对a做hash运算对16384取余得到的结果是15495因此要存储到103节点。
到了7003后执行get num时对num做hash运算对16384取余得到的结果是2765因此需要切换到7001节点
小结
Redis如何判断某个key应该在哪个实例
将16384个插槽分配到不同的实例根据key的有效部分计算哈希值对16384取余余数作为插槽寻找插槽所在实例即可
如何将同一类数据固定的保存在同一个Redis实例
这一类数据使用相同的有效部分例如key都以{typeId}为前缀
集群伸缩
redis-cli --cluster提供了很多操作集群的命令可以通过下面方式查看 需求分析
需求向集群中添加一个新的master节点并向其中存储 num 10
启动一个新的redis实例端口为7004添加7004到之前的集群并作为一个master节点给7004节点分配插槽使得num这个key可以存储到7004实例
这里需要两个新的功能
添加一个节点到集群中将部分插槽分配到新插槽
创建新的redis实例
创建一个文件夹
mkdir 7004拷贝配置文件
cp redis.conf /7004修改配置文件
sed /s/6379/7004/g 7004/redis.conf启动
redis-server 7004/redis.conf添加新节点到redis
添加节点的语法如下 执行命令
redis-cli --cluster add-node 192.168.150.101:7004 192.168.150.101:7001通过命令查看集群状态
redis-cli -p 7001 cluster nodes如图7004加入了集群并且默认是一个master节点 但是可以看到7004节点的插槽数量为0因此没有任何数据可以存储到7004上
转移插槽
我们要将num存储到7004节点因此需要先看看num的插槽是多少
如上图所示num的插槽为2765. 我们可以将0~3000的插槽从7001转移到7004命令格式如下 具体命令如下
建立连接 得到下面的反馈 询问要移动多少个插槽我们计划是3000个
新的问题来了
那个node来接收这些插槽
显然是7004那么7004节点的id是多少呢 复制这个id然后拷贝到刚才的控制台后
这里询问你的插槽是从哪里移动过来的
all代表全部也就是三个节点各转移一部分具体的id目标节点的iddone没有了
这里我们要从7001获取因此填写7001的id 填完后点击done这样插槽转移就准备好了 确认要转移吗输入yes
然后通过命令查看结果 可以看到 目的达成。
故障转移
集群初识状态是这样的 其中7001、7002、7003都是master我们计划让7002宕机。
自动故障转移
当集群中有一个master宕机会发生什么呢
直接停止一个redis实例例如7002
redis-cli -p 7002 shutdown1首先是该实例与其它实例失去连接
2然后是疑似宕机 3最后是确定下线自动提升一个slave为新的master
4当7002再次启动就会变为一个slave节点了 手动故障转移
利用cluster failover命令可以手动让集群中的某个master宕机切换到执行cluster failover命令的这个slave节点实现无感知的数据迁移。其流程如下
这种failover命令可以指定三种模式
缺省默认的流程如图1~6歩force省略了对offset的一致性校验takeover直接执行第5歩忽略数据一致性、忽略master状态和其它master的意见
案例需求在7002这个slave节点执行手动故障转移重新夺回master地位
步骤如下
1利用redis-cli连接7002这个节点
2执行cluster failover命令
如图 效果 RedisTemplate访问分片集群
RedisTemplate底层同样基于lettuce实现了分片集群的支持而使用的步骤与哨兵模式基本一致
1引入redis的starter依赖
2配置分片集群地址
3配置读写分离
与哨兵模式相比其中只有分片集群的配置方式略有差异如下
spring:redis:cluster:nodes:- 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