Redis-集群槽位重分片Key迁移实现
Redis提供了辅助脚本redis-trib.rb,以”reshard”参数调用该脚本就可以实现重新分片的操作。但是本质上,该脚本就是通过向迁入节点和迁出节点发送一些命令实现的。 假设要从A节点迁移slot槽位到B节点 设置迁入节点 向迁入节点B发送” CLUSTER SETSLOT IMPORTING ”命令,其中是要迁入的槽位号,是当前负责该槽位的节点。在函数clusterCommand中,处理该命令的代码如下。...
Redis-集群故障检测与选新主实现
Redis Cluster集群中是如何进行故障检测的,故障检测到后如何进行新主选举的,选举完之后又发生了什么? 如下,ClusterState、ClusterNode中的currentEpoch、configEpoch、fail_reports都是很重的属性,和故障检测与故障后选主有关。 #cluster.h /* This structure represent elements of...
Linux-fork()/vfork()/clone()
Redis中通过fork子进程来进行RDB备份,为什么使用fork()呢. Linux中除了fork函数,其实还有vfork()以及clone(),出于好奇心,往深处了解下. Fork() 如下图所示,调用fork()的进程会创建一个子进程,返回的pid是0即为子进程(子进程进程ID不是0),子进程与父进程并发执行,子进程与父进程共享地址空间,内存空间——即子进程能访问到父进程的数据,最初的fork()实现,fork()后子进程会完全拷贝父进程的内存数据,由于很多数据不做修改导致拷贝浪费很多系统资源,后面fork()的实现底层是Copy on write,即子进程修改或者父进程修改数据后,底层操作系统会将数据拷贝一份,让子进程与父进程互不影响. Vfork() vfork()是由于最初fork()底层未实现Copy...
Redis-Jedis的MOVED_ASK实现
Jedis-2.9.0版本,最近在看Redis Cluster的槽位(Slot)迁移,其中涉及MOVED、ASK命令 MOVED:key已被迁移到目标节点node上(已迁移完成),则返回MOVED命令并携带目标节点的node,刷新客户端的槽缓存,Redis客户端收到后再次请求新目标节点 ASK:为什么需要ASK命令,为什么不能仅用MOVED解决?MOVED命令表示后续该key都由新节点处理,ASK命令仅仅表示单个这次的key处理由新节点尝试解决,后面的该key还是继续会发到之前的节点 Jedis客户端实现如下, 通过CRC16计算出槽位对应的目标节点,之后请求目标节点 如果请求出错,则Jedis会重试maxAttemps次,重试完抛出Too many Cluster redirections...
Redis-Dict字典实现
如下是dict字典的数据结构 ht[2]对应俩个hash,主要使用ht[0]存储数据,ht[1]用于进行扩容 rehashidx一般是-1表示当前没有在进行扩容,rehashidx如果是2,则表示当前在进行ht[0]到ht[1]的数据迁移,正在迁移 ht[0]中下标是2的槽位对应的链表 Ht[0]中的used表示ht[0]的一位数组槽位上多少个是有值的,即不为null的槽位个数 #dict.h //字典 typedef struct dict { dictType...