Redis Cluster原理初步

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis Cluster原理初步.pdf 目录 目录 1 1. 前言 1 2. 槽(slots) 1 3. 路由配置(node.

img_e25d4fb2f8de1caf41a735ec53088516.pngRedis Cluster原理初步.pdf

目录

目录 1

1. 前言 1

2. 槽(slots 1

3. 路由配置(node.conf 1

4. 总slots数(cluster.h:16384 2

5. key的路由 2

6. 将key转成整数值(crc16.c:crc16 2

7. 计算key所在slotcluster.c:keyHashSlot 2

8. Redis Cluster Client实现 3

 

1. 前言

截至2016/5/16最新版本的redis-3.2.0仍然非强一致性,基于性能考虑master和它的slaves间数据是异步复制的。另外,一个确定的key总是只会落到确定的master,除非使用redis-trib.rb等工具修改slotsmaster间的绑定关系,目前的redis cluste不支持自动从一个master迁移一个slot到另一个masterslavesslots来说,可以认为和对应的master相同)。

2. 槽(slots

Redis cluster将所有存储在其上的key通过一个hash算法划分成若干slots,当前为16384个slots,值在cluster.h文件中由宏CLUSTER_SLOSTS指定。

3. 路由配置(node.conf

存储的内容和redis命令“cluster nodes”的输出相同,即存储了masterslave信息,以及各master存储的slots,亦即slots的路由信息存储在node.conf

同一Redis cluster中的所有节点的node.conf文件内容最终是一致的。

4. 总slots数(cluster.h:16384

#define CLUSTER_SLOTS 16384 // 等于(0x3FFF + 1)

 

CLUSTER_SLOTS定义了redis clusterslots数,理论上这个值应当可以修改重编译。其值越大,相对更容易均衡,可支撑更多节点数的集群(实际受限于无中心节点,当然架构的redis cluster节点数不宜过大,否则可能引起网络风暴)。

5. key的路由

-> key转成整数值

-> 计算key所在的slot

-> 找到slot所在的masterslavesredis cluster可配置允许slaves提供读)

-> 转成直接对masterslaves的请求。

 

由于任何一个redis cluster节点都存储了相同内容的node.conf,所以client可以请求任一节点获得slots的路由数据。

而且由于node.conf中包含了masterslaves信息,因此读写操作可以完美的路由到相应的节点。

6. 将key转成整数值(crc16.c:crc16

Redis使用crc算法将一个字符串转成整数,CLUSTER_SLOTS的值是不能超过CRC返回的最大值。

uint16_t crc16(const char *buf, int len) {

    int counter;

    uint16_t crc = 0;

    for (counter = 0; counter 

            crc = (crc>8) ^ *buf++)&0x00FF];

    return crc;

}

7. 计算key所在slotcluster.c:keyHashSlot

对于一个redis KEY它归属于哪一个slot,这个可以通过函数keyHashSlot()调用计算出来:

unsigned int keyHashSlot(char *key, int keylen) {

    int s, e; /* start-end indexes of { and } */

 

    for (s = 0; s 

        if (key[s] == '{') break;

 

    /* No '{' ? Hash the whole key. This is the base case. */

    if (s == keylen) return crc16(key,keylen) & 0x3FFF;

 

    /* '{' found? Check if we have the corresponding '}'. */

    for (e = s+1; e 

        if (key[e] == '}') break;

 

    /* No '}' or nothing betweeen {} ? Hash the whole key. */

    if (e == keylen || e == s+1) return crc16(key,keylen) & 0x3FFF;

 

    /* If we are here there is both a { and a } on its right. Hash

     * what is in the middle between { and }. */

    return crc16(key+s+1,e-s-1) & 0x3FFF// 3FFF即为16383

}

8. Redis Cluster Client实现

通过上面的信息,不然发现,Redis Cluster Client只是在原来单机版client基础上多了一层薄的路由逻辑。因此可以基于现有的hiredis等实现支持redis clusterclient库。大致过程如下:

class CRedisClusterClient

{

public:

    // nodes Redis集群中的单个或多个节点,格式为:ip1:port1,ip2:port2,如:127.0.0.1:6379,127.0.0.1:6380,192.168.31.11:6379

    CRedisClusterClient(const std::string& nodes);

    void set(const std::string& key, const std::string& value) const;

    void get(const std::string& key, std::string* value);

 

private:

    redisContext* _redis_context; // hiredis

};

 

set()函数实现:

1) CRedisClusterClient从nodes取任一nodeA,如:127.0.0.1:6380

2) 建立与nodeA的连接

3) 从nodeA取得slots路由数据(实现时可缓存这部分数据,以提升性能)

4) 构造slots路由数据表(由于slots总数有限,可以以slot为下标数组方式组织路由表)

5) 计算key所在的slot

6) 找到slot所在的nodeB(对于写操作,要求nodeBmaster,有可能碰巧就是nodeA

7) 使用hiredis访问nodeB(从这步开始和原使用hiredis相同)

8) 取得hiredis返回的结果

 

如果使用hiredis发生网络异常,对于写操作从第3步开始重执行,对于读操作从第6步重选一个node重执行。

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
14天前
|
缓存 NoSQL Apache
【Redis】布隆过滤器原理与应用
【Redis】布隆过滤器原理与应用
20 1
|
3月前
|
存储 缓存 NoSQL
蚂蚁金服P7私藏的Redis原理与实践内部笔记
Redis 是完全开源免费的,是一个高性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
61 1
|
2月前
|
存储 缓存 Java
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
|
9天前
|
监控 NoSQL 算法
深入剖析Redis哨兵模式的原理和应用
Redis的哨兵模式是实现高可用性和自动故障转移的机制,当主服务器故障时,哨兵能自动检测并进行故障转移,确保服务连续和稳定性。哨兵模式通过监控主从服务器状态、自动故障转移、防止数据不一致,提高容错能力和负载均衡,降低运维成本,实现高可用性。哨兵通过检测主观下线和客观下线状态,以及选举Leader Sentinel来协调故障转移。Raft算法在其中用于领导者选举和状态一致性。哨兵模式通过综合考虑多种因素选举新主服务器并执行故障转移,保障集群稳定运行。
34 0
深入剖析Redis哨兵模式的原理和应用
|
13天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
25 0
|
13天前
|
存储 NoSQL Redis
Redis入门到通关之Redission原理
Redis入门到通关之Redission原理
19 0
|
13天前
|
缓存 NoSQL 算法
【redis】布隆过滤器(Bloom Filter)原理解析与应用
【redis】布隆过滤器(Bloom Filter)原理解析与应用
22 1
|
15天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
140 10
|
16天前
|
运维 监控 NoSQL
|
28天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
18 0