redis常用知识汇总( 七 )


5、读取数据时 , 当客户端操作的key没有分配在该节点上时 , redis会返回转向指令 , 指向正确的节点
6、扩容时时需要需要把旧节点的数据迁移一部分到新节点
在 redis cluster 架构下 , 每个 redis 要放开两个端口号 , 比如一个是 6379 , 另外一个就是 加1w 的端口号 , 比如 16379 。
16379 端口号是用来进行节点间通信的 , 也就是 cluster bus 的东西 , cluster bus 的通信 , 用来进行故障检测、配置更新、故障转移授权 。cluster bus 用了另外一种二进制的协议 , gossip 协议 , 用于节点间进行高效的数据交换 , 占用更少的网络带宽和处理时间 。
 
节点间的内部通信机制
基本通信原理
集群元数据的维护有两种方式:集中式、Gossip 协议 。redis cluster 节点间采用 gossip 协议进行通信 。
分布式寻址算法
1、hash 算法(大量缓存重建)
2、一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)
3、redis cluster 的 hash slot 算法
优点
1、无中心架构 , 支持动态扩容 , 对业务透明
2、具备Sentinel的监控和自动Failover(故障转移)能力
3、客户端不需要连接集群所有节点 , 连接集群中任何一个可用节点即可
4、高性能 , 客户端直连redis服务 , 免去了proxy代理的损耗
缺点
1、运维也很复杂 , 数据迁移需要人工干预
2、只能使用0号数据库
3、不支持批量操作(pipeline管道操作)
4、分布式逻辑和存储模块耦合等
 
基于客户端分配

redis常用知识汇总

文章插图
客户端分配
简介
Redis Sharding是Redis Cluster出来之前 , 业界普遍使用的多Redis实例集群方法 。其主要思想是采用哈希算法将Redis数据的key进行散列 , 通过hash函数 , 特定的key会映射到特定的Redis节点上 。Java redis客户端驱动jedis , 支持Redis Sharding功能 , 即ShardedJedis以及结合缓存池的ShardedJedisPool
优点
优势在于非常简单 , 服务端的Redis实例彼此独立 , 相互无关联 , 每个Redis实例像单服务器一样运行 , 非常容易线性扩展 , 系统的灵活性很强
缺点
1、由于sharding处理放到客户端 , 规模进一步扩大时给运维带来挑战 。
2、客户端sharding不支持动态增删节点 。服务端Redis实例群拓扑结构有变化时 , 每个客户端都需要更新调整 。连接不能共享 , 当应用规模增大时 , 资源浪费制约优化
 
基于代理服务器分片
redis常用知识汇总

文章插图
基于代理服务器分片
简介
客户端发送请求到一个代理组件 , 代理解析客户端的数据 , 并将请求转发至正确的节点 , 最后将结果回复给客户端
特征
1、透明接入 , 业务程序不用关心后端Redis实例 , 切换成本低
2、Proxy 的逻辑和存储的逻辑是隔离的
3、代理层多了一次转发 , 性能有所损耗
业界开源方案
1、Twtter开源的Twemproxy
2、豌豆荚开源的Codis
Redis 主从架构
redis常用知识汇总

文章插图
主从架构
单机的 redis , 能够承载的 QPS 大概就在上万到几万不等 。对于缓存来说 , 一般都是用来支撑读高并发的 。因此架构做成主从(master-slave)架构 , 一主多从 , 主负责写 , 并且将数据复制到其它的 slave 节点 , 从节点负责读 。所有的读请求全部走从节点 。这样也可以很轻松实现水平扩容 , 支撑读高并发 。
redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发
redis replication 的核心机制
1、redis 采用异步方式复制数据到 slave 节点 , 不过 redis2.8 开始 , slave node 会周期性地确认自己每次复制的数据量;
2、一个 master node 是可以配置多个 slave node 的;
3、slave node 也可以连接其他的 slave node;
4、slave node 做复制的时候 , 不会 block master node 的正常工作;
5、slave node 在做复制的时候 , 也不会 block 对自己的查询操作 , 它会用旧的数据集来提供服务;但是复制完成的时候 , 需要删除旧数据集 , 加载新数据集 , 这个时候就会暂停对外服务了;


推荐阅读