Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5119268
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: NOSQL

2017-01-12 19:46:19

原文地址:redis cluster介绍和proxy实现 作者:byrcc

redis cluster介绍和proxy实现

转载自:http://blog.heycc.net/go-redis-cluster-proxy/


Redis Cluster Solutions

 是 Redis 官方的集群解决方案,解决了单机 Redis 的QPS、内存和带宽容量的限制。理论上 Redis Cluster 支持最多16384个后端 Redis master 节点,slave 节点数不受限制。后端 Redis 节点实例可以部署在独立的主机上,独立配置最大内存。Redis Cluster 还是无 proxy 设计,client 与后端 Redis 节点直接通信,不经过转发,避免 proxy 层带来的网络延迟。

Redis Cluster 的特性

分片

Redis Cluster 按 key 做 hash 分片(slot)。计算规则为 HASH_SLOT = CRC16(key) mod 16384。每个 key 都映射到一个 HASH_SLOT 里。总计16384个 HASH_SLOT。Cluster 后端的每个 Redis 存储一部分 HASH_SLOT,存储规则是可配置的。例如后端有16个 Redis 实例,每个 Redis 实例存1024个 HASH_SLOT,1024*16 = 16384。每个 Redis 实例配置最大内存为64G,那么整个 Redis Cluster 的容量就是 64G*16 = 1024G。这个容量远超常见服务器的最大内存。

高可用

Redis Cluster 可以配置多个 Redis 作 slave。在有 master 不可用时,自动提升故障 master 的一个 slave 为 master,并把其他 slave 配置为新 master 的 slave。还能自动调整各 master 的 slave 的数目,确保每个 master 都有一个slave。如果 Redis Cluster 配置了 n 个 master,为了保证任意 master 都有 slave 可切换,则需要 n 个 slave。为了满足任意一个 Redis 实例(master 或 slave)故障后,所有 master 都有至少一个 slave,确保 master 都没有单点故障,则需要额外 1 个 Redis 实例。更通用的,如果配置了 N 个 master,且要求 x 个 redis 故障后 Redis Cluster 也没有单点隐患,则需要总计 2*N+x 个 Redis 实例。

Key Redirection

MOVED redirection

Cluster 里的 key,不支持内部路由(forwarding),而是 redirect 机制。当 client 访问一个 node 时,如果这个 key 存储在这个 node 上,则返回结果;如果不存储在这个 node 上,则返回一个 -MOVED redirection 错误,内容包括这个 key 存储在哪个 node 上。如 127.0.0.1:6371> get aa 返回 (error) MOVED 1180 127.0.0.1:6372,指 aa 这个 key 对应的 slot id 为 1180,而这个 slot 存储在节点127.0.0.1:6372。此时要求 client 连接 127.0.0.1:6372,才能访问到 key aa。

ASK redirection

迁移 key 时,slot 会有迁移状态。比如 slot 1 从 node A 迁移到 node B,则在 node A 上 slot 1 是 migrating 状态,同时在 node B 上 slot 1 是 importing 状态。当来自 client 请求的 key 属于 slot 1 时:

  • 如果 node A (migrating) 收到请求,则判断:如果 key 存在于自己 node 里,则返回 client;如果 key 不存在于自己 node 里,则返回 client 一个 -ASKredirection 错误。
  • 如果 node B (importing) 收到请求,则判断:如果此请求的上一个请求是 ASKING 指令,则处理此次请求;否则,返回 client 一个 -MOVED redirection 错误。

Cluster Client

要想使用 Redis Cluster,client 端要支持 key redirection。具体就是当 cluster 返回一个 -MOVED 或 -ASK 时要能识别 redirection,并连接指定的 node。如果是 -ASK还需要在给新 node 发送指令前,先发送 ASKING 指令。

目前已知 java 的 jedis 支持 Redis Cluster。其他语言需要等待官方支持。

Proxy Solution

本项目即实现了一个 redis proxy,支持 Redis Cluster 的 key redirection。而实现原理也很简单:解析 client 的指令,计算 key 的 slot id,内部维护一份 slot id 到 node 的映射,定向 forward 到对应的 redis node。解析返回结果,如果结果是 -MOVED或 -ASK redirection 错误,则再次 forward 到新的 redis node,(如果是-ASK,需要先发送 ASKING 指令);如果结果是别的错误或者是正常结果,则 forward 给 client。

阅读(3537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~