redis集群方案
所属分类 redis
浏览量 1476
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树 索引