首页 > 数据库 >Redis-多机数据库-集群

Redis-多机数据库-集群

时间:2023-01-12 15:56:12浏览次数:36  
标签:数据库 Redis 命令 集群 多机 下线 节点 客户端

集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。

Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式。

CLUSTER MEET <ip> <port> 命令使当前节点与ip和port所指定的节点进行握手,握手成功后,节点就会将ip和port所指定的节点添加到当前节点当前所在的集群中。

节点(运行在集群模式下的Redis服务器)会继续使用所有在单机模式中使用的服务器组件。

每个节点都会使用一个clusterNode结构来记录自己的状态,并为集群中的所有其他节点(包括主节点和从节点)都创建一个相应的clusterNode结构,以此来记录其他节点的状态。


槽指派

Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。

当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。

通过向节点发送CLUSTER ADDSLOTS命令,我们可以将一个或多个槽指派(assign)给节点负责。

clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽,slots属性是一个长度为16384/8=2048个字节的数组,如果slots数组在索引i上的二进制位的值为1,那么表示节点负责处理槽i。

一个节点除了会将自己负责处理的槽记录在clusterNode结构的slots属性和numslots属性之外,它还会将自己的slots数组通过消息发送给集群中的其他节点,以此来告知其他节点自己目前负责处理哪些槽。

clusterState结构中的slots数组记录了集群中所有16384个槽的指派信息,slots数组包含16384个项,每个数组项都是一个指向clusterNode结构的指针,如果slots[i]指针指向NULL,那么表示槽i尚未指派给任何节点。


在集群中执行命令

在对数据库中的16384个槽都进行了指派之后,集群就会进入上线状态,这时客户端就可以向集群中的节点发送数据命令了。

当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己,如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令;如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向(redirect)至正确的节点,并再次发送之前想要执行的命令。

一个集群客户端通常会与集群中的多个节点创建套接字连接,而所谓的节点转向实际上就是换一个套接字来发送命令。

如果客户端尚未与想要转向的节点创建套接字连接,那么客户端会先根据MOVED错误提供的IP地址和端口号来连接节点,然后再进行转向。

节点和单机服务器在数据库方面的一个区别是,节点只能使用0号数据库,而单机Redis服务器则没有这一限制。

节点还会用clusterState结构中的slots_to_keys跳跃表来保存槽和键之间的关系,slots_to_keys跳跃表每个节点的分值(score)都是一个槽号,而每个节点的成员(member)都是一个数据库键。


重新分片

Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。

重新分片操作可以在线(online)进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。

当客户端向源节点发送一个与数据库键有关的命令,并且命令要处理的数据库键恰好就属于正在被迁移的槽时,源节点会先在自己的数据库里面查找指定的键,如果找到的话,就直接执行客户端发送的命令;如果源节点没能在自己的数据库里面找到指定的键,那么这个键有可能已经被迁移到了目标节点,源节点将向客户端返回一个ASK错误,指引客户端转向正在导入槽的目标节点,并再次发送之前想要执行的命令。

ASK错误和MOVED错误都会导致客户端转向,它们的区别在于:

  • MOVED错误代表槽的负责权已经从一个节点转移到了另一个节点:在客户端收到关于槽i的MOVED错误之后,客户端每次遇到关于槽i的命令请求时,都可以直接将命令请求发送至MOVED错误所指向的节点,因为该节点就是目前负责槽i的节点。
  • 与此相反,ASK错误只是两个节点在迁移槽的过程中使用的一种临时措施:在客户端收到关于槽i的ASK错误之后,客户端只会在接下来的一次命令请求中将关于槽i的命令请求发送至ASK错误所指示的节点,但这种转向不会对客户端今后发送关于槽i的命令请求产生任何影响,客户端仍然会将关于槽i的命令请求发送至目前负责处理槽i的节点,除非ASK错误再次出现。

复制与故障转移

集群中的各个节点会通过互相发送消息的方式来交换集群中各个节点的状态信息,例如某个节点是处于在线状态、疑似下线状态(PFAIL),还是已下线状态(FAIL)。

集群中的每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果接收PING消息的节点没有在规定的时间内,向发送PING消息的节点返回PONG消息,那么发送PING消息的节点就会将接收PING消息的节点标记为疑似下线(probable fail,PFAIL)。

如果在一个集群里面,半数以上负责处理槽的主节点都将某个主节点x报告为疑似下线,那么这个主节点x将被标记为已下线(FAIL),将主节点x标记为已下线的节点会向集群广播一条关于主节点x的FAIL消息,所有收到这条FAIL消息的节点都会立即将主节点x标记为已下线。

当一个从节点发现自己正在复制的主节点进入了已下线状态时,从节点将开始对下线主节点进行故障转移,以下是故障转移的执行步骤:

  1. 复制下线主节点的所有从节点里面,会有一个从节点被选中。
  2. 被选中的从节点会执行SLAVEOF no one命令,成为新的主节点。
  3. 新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部指派给自己。
  4. 新的主节点向集群广播一条PONG消息,这条PONG消息可以让集群中的其他节点立即知道这个节点已经由从节点变成了主节点,并且这个主节点已经接管了原本由已下线节点负责处理的槽。
  5. 新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移完成。

集群中的节点通过发送和接收消息来进行通信,常见的消息包括MEET、PING、PONG、PUBLISH、FAIL五种。

 

标签:数据库,Redis,命令,集群,多机,下线,节点,客户端
From: https://www.cnblogs.com/gcr277/p/17046911.html

相关文章

  • Zabbix 5.0 使用TimescaleDB数据库
    Zabbix5.0版本支持TimescaleDB作为后端数据库,可提供数据自动分区、自动数据清理、数据压缩等特性。概念:hypertable(超表):用于创建表和索引,更改表,插入数据,选择数据的数据......
  • 透视华为云云原生数据库的前世今生及未来演进,能给行业带来哪些启发?
    摘要:通过云服务形式提供数据库功能的云数据库应运而生,但这还仅仅是数据库变革的开端。本文分享自华为云社区《透视华为云云原生数据库的前世今生及未来演进,能给行业带来哪......
  • 使用SQL4Automation让CodeSYS连接数据库
      摘要:本文旨在说明面向CodeSYS的数据库连接方案SQL4Automation的使用方法。1.SQL4Automation简介1.1.什么是SQL4Automation  SQL4Automation是一套工业用途的软件......
  • redis命令清理key
    ###手动清除单个key:redis-cli-h'ipaddr'-p6379-a'passwd'-n0keys'keyName'|xargsredis-cli-h'ipaddr'-p6379-a'passwd'-n0del;或者手动清除单个k......
  • 2022年中国数据库排行榜年终盘点-墨天轮
    深山虎啸雄风在,绿野兔奔好景来。 崭新的2023年已经到来,在2022年里,国产数据库行业发生了翻天覆地的变化,投融资此起彼伏,国产化替代进程加速,国产数据库行业发展的如火如荼。......
  • RedisUtil以及可放入Map和List格式的配置
    RedisUtilpackagecom.diit.onemap.common.utils;importorg.springframework.data.redis.core.*;importorg.springframework.stereotype.Service;importjavax.ann......
  • redis 中的 set
    set是String中的无序集合 底层是是value为null的hash表 时间复杂化是o(1);sadd k1v1v2v3 set中添加数据smembersk1取出set中全部的数据sismemberk1v1 ......
  • 读取Excel插入数据库POI
    前言经常遇到给张Excel表,要求数据导入数据库,NavicatforMySQL可以做这个事,手闲写个POI调用通用Mapper插入,之前文章有反向操作,将数据写入Excel,Excel格式报表生成(POI技术)......
  • Redis安装使用
    在开发网页的时候我们难免要发送短信做页面判断Redis就是一个外置存储仓库使用安装Redis安装百度云链接:https://pan.baidu.com/s/1Mvfaxw3J5SOg39V0aZOrHA提取码:n7......
  • Oracle通过数据库链连接KingbaseES
    测试环境:ip数据库版本192.168.254.135oracle11g192.168.254.137V008R006C005B0023通过oracle官网得知,Oracle使用DG4ODBC作为连接到其他非Oracle数据库......