首页   快速返回

redis集群方案     所属分类 redis
Redis支持的数据结构

字符串(String) 哈希(Hash) 列表(List) 集合(Set)
有序集合(Sorted Set)支持针对score作范围查询
HyperLogLog 做基数统计
Pipeline
事务支持不完整 , 不提供回滚命令。

Redis适用场景
KV存储
缓存(TTL LRU...)
消息中间件
分布式锁


集群实现方式

客户端分片  jedis 
代理分片  codis Twemproxy
路由查询 Redis-cluster  (这个类似aerospike ,不过功能太弱)
将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行。





客户端端分片优缺点

优点
简单,性能高。

缺点
业务逻辑与数据存储逻辑耦合
可运维性差
多业务各自使用redis,集群资源难以管理
不支持动态增删节点

代理分片特性

透明接入  
Proxy逻辑和存储逻辑隔离
业务程序不用关心后端Redis实例,切换成本低。

代理层多了一次转发,性能有损耗。


路由查询特性

涉及多个key的操作通常不被支持。涉及多个key的事务不能使用。
当两个set映射到不同的redis实例上时,不能对这两个set执行交集操作。

不能保证集群内的数据均衡。
分区的粒度是key,如果某个key的值是巨大的set、list,无法进行拆分。
增加或删除实例复杂,数据平衡迁移麻烦

官方集群方案
无中心架构
一致性哈希思想
客户端直连redis,避免proxy代理损耗

Redis-cluster原理

Hash slot
集群内的每个redis实例监听两个tcp端口,6379(默认)用于服务客户端查询,16379(默认服务端口 + 10000)用于集群内部通信。
key被分到16384个hash slot里;

计算key属于哪个slot,CRC16(key) & 16384。

节点间状态同步:gossip协议,最终一致性。节点间通信使用轻量的二进制协议,减少带宽占用。
 
Gossip 算法又被称为反熵(Anti-Entropy)

在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。

种子节点

Redis-Cluster借助客户端实现了混合形式的路由查询 , 借助客户端转发到正确的节点


Smart client可以在客户端缓存 slot 与 redis节点的映射关系,
当接收到 MOVED 响应时,会修改缓存中的映射关系。请求时会直接发送到正确的节点上,减少一次交互。


Redis Cluster 优点

高性能
支持动态扩容,对业务透明
具备Sentinel的监控和自动Failover能力

Redis Cluster不足

官方未提供图形管理工具,运维比较复杂
比如数据迁移,纯手动操作,先分配slot,再将slot中对应的key迁移至新的节点。

要求客户端必须支持cluster协议
Redis命令支持不完整
对于批量的指令,如mget支持不完整;不支持事务;不支持数据库切换,只能使用0号数据库

集群管理与数据存储耦合
如果集群管理有bug,需要升级整个redis。


Codis
豌豆荚开源的proxy-based的redis集群方案
支持透明的扩/缩容
运维友好
GUI监控界面和管理工具
同类产品中最全面的redis命令支持

Codis数据存储

数据根据key分布到1024个slot内
Key的slotid计算方法  crc32(key) % 1024
每个 codis-server 负责一部分数据
比如后端有3组codis-server,每个server负责的slot范围可以这样设置

group0 0-300
group1 301-600
group2 601-1023

上一篇     下一篇
大数据SQL引擎

git diff 命令

git reset 版本回退

Mysql innodb 为何建议使用自增列作为主键

redis使用zset保留最近的数据

B+树 与 B树 索引