从零开始Redis(二十)之分布式

178 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

🍊作者简介:少年不想说话,努力长大

🍊往期回顾:从零开始Redis(十九)

🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩

还是回头看看Redis Cluster,redis的集群部分,如前面所说我们弄读写分离、主从复制只能解决读的问题,根本处理不了高并发的写问题, 所以我们当时说了分布式的方案,今天我们就来看看redis的分布式如何实现,redis如何支持的;

配置文件

首先普通Redis实例不是Redis集群的一部分;只有作为集群节点启动的节点才能。为了启动作为集群节点的Redis实例,我们需要放开相关配置项(下面这些我按配置文件逐一讲解);

  • cluster-enabled yes 表示开启集群 
  • cluster-config-file nodes-6379.conf,每个集群的节点都有一个节点配置文件,它由集群的节点创建和维护(不可更改),他维护节点的状态、配置、以及一些数据信息 
  • cluster-node-timeout 15000 节点从不可达到节点失效的最长时间 
  • cluster-replica-validity-factor 10, 为0, 表示无论与对应的主节点断开多长时间, 依然可以取代主节点成为新的主节点,如果是整数,那么在上面的timeout*该正整数时间内从节点依然可以取代主节点,之外的话就不会取代了 
  • cluster-migration-barrier 1,保证迁移后,主节点至少关联1个从节点,即原来未迁移时至少两个,大概这意思 
  • cluster-require-full-coverage yes 默认yes,集群必须对应所有散列槽,否则将停止写入,为No表示对于槽对应的主机依然可以写入 
  • cluster-replica-no-failover no 设为yes表示防止副本在主机故障期间尝试故障切换其主机,手动可以,为no表示对于故障不要升级 
  • cluster-allow-reads-when-down no这个就不说了,字面意思, 

然后还有一些docker的支持,有兴趣自行了解; 具体的搭建集群我们不说,--cluster,

集群通信

看下其他的一些,通常我们配置主机的话是需要三台以上机器的,每台机器后面都跟着一个或多个从机,每台主机之间会互相通信, 他们通过Gossip协议的meet消息获取相互的状态以及新加入节点的信息,随后通过ping、pong进行周期性的消息响应; 我们的redis通过哈希槽来进行主机间的存储,一个集群拥有16384 个哈希槽,我们的key会通过CRC16(key)%16384 来计算键key对应的槽,类似于hash,但不是;如果我们有三台主机,那么我们的三台主机按理说会对应这16384个槽位,由于槽位可以动态设置,所以对于添加删除节点也很好操作;

当我们需要删除某个节点的时候,会将该槽交给其他节点,与之对应的数据也会交给其他节点,然后将该节点移除,这个步骤对于其他节点业务一点影响没有,如果添加节点呢?同样的会拆除部分槽以及对应的数据交给新节点,对于扩容和缩容都涉及了迁移;

迁移

迁移过程中如果我们的数据去按对应的槽去请求对应主机肯定请求不到数据啊,咋办,通常我们的数据迁移、槽位变换其实我们的redis机器都是知道的,每台主机都会存储槽位对应的主机,但是有时我们的客户端缓存并不能实时知道,所以这次它去请求的时候如果是迁移的数据那么该主机会返回一个moved,通知客户端应该去新的Redis实例上去请求,然后更新客户端缓存,如果正在迁移,则会返回一个ask,然后去取对应的数据;

说到这,这目前只有一个不好的地方就是批量操作一下就打趴下了,他不能随意的批量插入了;好啦🥗🥗🥗;

结束结束,那就🛴🛴🛴

如果对你有所帮助

点个赞呗