003-Reids cluster集群分析

目录

  • 集群模式
    • 架构图
    • 搭建主要配置
    • 创建主从命令
    • 访问
    • key的hash算法
    • Redis集群间通讯
      • 选举
      • 脑裂问题
      • 小集群挂掉
      • 批量操作
      • 集群扩容
        • 做主节点
        • 做从节点

集群模式

架构图

003-Reids cluster集群分析_第1张图片
客户端通过hash算法吧key均匀分配到各个master中
单个master还是主从架构

搭建主要配置

在这里插入图片描述
在这里插入图片描述
配置信息写入文件(自动写入),命名最好和实际端口一致
在这里插入图片描述
另外如果需要安全设置一下密码
在这里插入图片描述
foobared就是密码,可以改成需要的
在这里插入图片描述
如果集群机器配置了有密码则需要配置机器之间通讯所用密码

创建主从命令

修改了配置文件后启动的redis并没有联系起来
需要运行

redis-cli [-a password] --cluster create host1:prot1 … hostN:protN
–cluster -replicas

arg:是所有主节点几个从节点的意思
假设有6台机器,这里配置1,就会自动组成3主3从
配置2就会自动组成2主4从
主节点=总机器数/(arg+1)
执行完命令会出现
在这里插入图片描述
和大致的分槽策略
确认默认分槽策略ok(平均分配)就输入yes继续
在这里插入图片描述
注意:创建集群命令只需要执行一次,如果关闭集群,下次需要启用
只需要启动所有的redis实例,集群就会自动创建,因为创建好的配置信息已经写入文件中了,具体见配置项:cluster-config-file

访问

redis-cli -a password -c -h oneMasterIp -p oneMasterPort

进入集群
-c 代表集群模式
-a 集群密码

cluster info
cluster nodes

key的hash算法

在这里插入图片描述
先把key用高性能hash算法计算一个Hash CRC16(key)
然后把hash%16384 得到一个 0 ~ 16383之间的一个数作为 solt
每个机器存什么solt在创建的时候已经指定好了
直接根据solt找到机器存进去

Redis集群间通讯

集群之间通过 gossip 协议通讯

超时时间配置不能太短也是避免机器间通讯万一只是网络抖动问题,也不会立即重新选举,cluster-node-timeout

选举

  1. 从节点发现主节点FAIL
  2. 记录currentEpoch+1,广播FAILOVER_AUTH_REQUST信息
  3. 其他实例收到消息后,只有mater会判断是否合法并相应FAILOVER_AUTH_ACK
  4. 每收到一次ACK就计数+1
  5. 如果技术超过半数master ack 则slave成为master
  6. 广播Pong通知集群其他节点

为了避免同时发请求,同时收到ACK的情况
每个slave发送FAILOVER_AUTH_REQUST会延时随机时间
并且数据越新的slave随机时间越短

脑裂问题

如果一个master和集群断开连接且集群又重新选举成功
此时对应一些槽位可能不同客户端连接不同的master,如果此时2边都有命令写入

后续如果原master重新和集群连接应该作为从节点接入
则数据丢失

解决方案:
配置:min-slaves-to-write 1
主节点接收到消息后至少同步1个从节点成功才返回客户端成功
如果没有从节点则master也不能提供服务所以开启这个配置要慎重
会报错:
在这里插入图片描述

小集群挂掉

如果有槽位主备都挂了,默认是整个集群不再提供服务
在这里插入图片描述
如果仍希望集群可用则改为"no"

批量操作

失败,集群无法支持例如 MSET 多个key 的操作,只有在这些key算出来的槽位在一个的时候才能成功,所以如果实在有需求就需要使用{}key了。因为带有{}的key,计算时只会计算{}里边的内容,保持一致槽位就一致

集群扩容

启动新的redis实例作为游离节点

指定原节点邀请新节点加入集群,新加入做主节点,但是没有槽位

redis-cli -a password --cluster add-node newNodeIp:newNodePort srcNodeIp:srcNodePort

做主节点

进入任意原主节点,进行槽位迁移
注意这里的迁移时直接迁移所有节点的槽位和内容
假如原来有3主,迁移600个就各分200各迁移到新节点

redis-cli -a password --cluster reshard srcNodeIp:srcNodePort
询问要迁移多少槽位过去,指定多少‘
给谁(nodeID)

做从节点

进入
cluster replicate masterNodeId

你可能感兴趣的:(Redis,java,redis,数据库)