转载:http://www.open-open.com/lib/view/open1427337394074.html

Redis集群的目的是实现数据的横向伸缩,把一块数据分片保存到多个机器,可以横向扩展数据库大小,扩展带宽,计算能力等。

实现数据分片(集群)方式大致有三种:

(1)客户端实现数据分片

即客户端自己计算数据的key应该在哪个机器上存储和查找,此方法的好处是降低了服务器集群的复杂度,客户端实现数据分片时,服务器是独立的,服务器之前没有任何关联。多数redis客户端库实现了此功能,也叫sharding,这种方式的缺点是客户端需要实时知道当前集群节点的联系信息,同时,当添加一个新的节点时,客户端要支持动态sharding.,多数客户端实现不支持此功能,需要重启redis。另一个弊端是redis的HA需要额外考虑。

(2)服务器实现数据分片

其理论是,客户端随意与集群中的任何节点通信,服务器端负责计算某个key在哪个机器上,当客户端访问某台机器时,服务器计算对应的key应该存储在哪个机器,然后把结果返回给客户端,客户端再去对应的节点操作key,是一个重定向的过程,此方式是redis3.0正在实现,目前处于beta版本, Redis 3.0的集群同时支持HA功能,某个master节点挂了后,其slave会自动接管。

服务器端实现集群需要客户端语言实现服务器集群的协议,目前java,php,ruby语言多数有redis-cluster客户端实现版本。

Redis Cluster原理http://www.cnblogs.com/foxmailed/p/3630875.html

Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。

关于负载均衡,集群的Redis Instance之间可以迁移数据,以Slot为单位,但不是自动的,需要外部命令触发。

关于集群成员管理,集群的节点(Redis Instance)和节点之间两两定期交换集群内节点信息并且更新,从发送节点的角度看,这些信息包括:集群内有哪些节点,IP和PORT是什么,节点名字是什么,节点的状态(比如OK,PFAIL,FAIL,后面详述)是什么,包括节点角色(master 或者 slave)等。

关于可用性,集群由N组主从Redis Instance组成。主可以没有从,但是没有从 意味着主宕机后主负责的Slot读写服务不可用。

一个主可以有多个从,主宕机时,某个从会被提升为主,具体哪个从被提升为主,协议类似于Raft,参见这里。如何检测主宕机?Redis Cluster采用quorum+心跳的机制。从节点的角度看,节点会定期给其他所有的节点发送Ping,cluster-node-timeout(可配置,秒级)时间内没有收到对方的回复,则单方面认为对端节点宕机,将该节点标为PFAIL状态。通过节点之间交换信息收集到quorum个节点都认为这个节点为PFAIL,则将该节点标记为FAIL,并且将其发送给其他所有节点,其他所有节点收到后立即认为该节点宕机。从这里可以看出,主宕机后,至少cluster-node-timeout时间内该主所负责的Slot的读写服务不可用。

Redis Cluster Slots是什么?http://www.zhizhihu.com/html/y2014/4590.html

举个栗子,Redis Cluster下,三个master,三个slave,即每个master有一个slave,那么slots是如何划分的呢?

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

127.0.0.1:7000

127.0.0.1:7001

127.0.0.1:7002

Adding replica 127.0.0.1:7003 to 127.0.0.1:7000

Adding replica 127.0.0.1:7004 to 127.0.0.1:7001

Adding replica 127.0.0.1:7005 to 127.0.0.1:7002

M: 09a89f7e08b7c00707e3507bea8016e9b4719d78 127.0.0.1:7000

slots:0-5460 (5461 slots) master

M: ddb8a2bc9b93b56a84d8e4c964af24e317767028 127.0.0.1:7001

slots:5461-10922 (5462 slots) master

M: 77335ea34c3d9fcff3a9bf55c1a73490a7153c29 127.0.0.1:7002

slots:10923-16383 (5461 slots) master

S: 67ebdad9de818b13267c1779a941553e88798525 127.0.0.1:7003

replicates 09a89f7e08b7c00707e3507bea8016e9b4719d78

S: a3f6c70725c25f92c35816966aee9ee7248e4a33 127.0.0.1:7004

replicates ddb8a2bc9b93b56a84d8e4c964af24e317767028

S: 2a58a4ca50e0ad733e83be3eb4cbbc8d9103fbbe 127.0.0.1:7005

注意这里,

M: 09a89f7e08b7c00707e3507bea8016e9b4719d78 127.0.0.1:7000

slots:0-5460 (5461 slots) master

M: ddb8a2bc9b93b56a84d8e4c964af24e317767028 127.0.0.1:7001

slots:5461-10922 (5462 slots) master

M: 77335ea34c3d9fcff3a9bf55c1a73490a7153c29 127.0.0.1:7002

slots:10923-16383 (5461 slots) master

好了,可以看到slots就是这样分配的。

如果一个key经过crc16后,如果他的slot为16381,那么他就在id为77335ea34c3d9fcff3a9bf55c1a73490a7153c29 的master上。

(3)通过代理服务器实现数据分片

此方式是借助一个代理服务器实现数据分片,客户端直接与proxy联系,proxy计算集群节点信息,并把请求发送到对应的集群节点。降低了客户端的复杂度,需要proxy收集集群节点信息。Twemproxy是twitter开源的,实现这一功能的proxy。这个实现方式在客户端和服务器之间加了一个proxy,但这是在redis 3.0稳定版本出来之前官方推荐的方式。结合redis-sentinel的HA方案,是个不错的组合。

参考:http://www.zhizhihu.com/html/y2014/4590.html

http://www.cnblogs.com/foxmailed/p/3630875.html

http://itindex.net/detail/51037-redis-%E9%9B%86%E7%BE%A4

redis sharding方案相关推荐

  1. 公司的实战Replica Sets+Sharding方案

    公司的实战Replica Sets+Sharding方案 公司mongo集群分片实战 准备九台服务器, 分片1: 172.16.0.124:11731 主 172.16.0.127.11731 备 1 ...

  2. Redis集群:redis cluster方案

    redis集群原理之官方的Redis Cluster方案 redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了. 官方的一个简单测试: 测试完成了50个并发执行10 ...

  3. (转)淘淘商城系列——Redis持久化方案

    http://blog.csdn.net/yerenyuan_pku/article/details/72858975 Redis中设置key的过期时间 Redis中的expire命令用于设置key的 ...

  4. 淘淘商城——Redis持久化方案

    Redis中设置key的过期时间 Redis中的expire命令用于设置key的过期时间,以毫秒计.key过期后将不再可用.Redis中的expire命令基本语法如下: expire key seco ...

  5. redis持久化方案

    说到redis的持久化,可以先说redis的高可用,而保证其高可用的手段有------持久化.复制.哨兵.集群. 持久化:数据的备份,将数据存入硬盘保证数据不会因进程退出而丢失. 复制:是哨兵和集群的 ...

  6. redis持久化方案比较

    redis持久化包括rdb和aof两种方案 1.rdb持久化方案 持久化过程:按照redis.conf文件配置,如 save 900 1 save 300 10 save 60 10000 ,在指定时 ...

  7. Redis 分布式方案

    如果要实现Redis 数据的分片,我们有三种方案.第一种是在客户端实现相关的逻辑,例如用取模或者一致性哈希对key 进行分片,查询和修改都先判断key 的路由. 第二种是把做分片处理的逻辑抽取出来,运 ...

  8. 分布式系统概念 | 分布式ID:数据库、号段模式、雪花算法(Snowflake)、Redis实现方案

    文章目录 分布式ID 数据库 自增ID 多主模式 号段模式 雪花算法 Redis 总结 分布式ID ID是数据的唯一标识,传统的做法是使用数据库的自增ID,但是随着业务规模的不断发展,数据量将越来越大 ...

  9. redis php方案,Redis三种部署方案图文详解

    standaloan(单机模式) standaloan 是redis单机模式,及所有服务连接一台redis服务,该模式不适用生产.如果发生宕机,内存爆炸,就可能导致所有连接改redis的服务发生缓存失 ...

最新文章

  1. 史上最全开源中文 NLP 数据集:包括10大类、142条数据源,总有你钟意的那一款!...
  2. 大数据和高并发的解决方案汇总
  3. 白话Elasticsearch42-深入聚合数据分析之案例实战__bucket filter:统计牌品最近一个月的平均价格(Filter Aggregation)
  4. Synchronize对象改变
  5. matlab emf 读取,20140219-Emf_Demo EMF 矢量图 可以读取和保存EMF 的封闭类 非常实用 matlab 238万源代码下载- www.pudn.com...
  6. Android之基于xmpp openfire smack开发之smack类库介绍和使用[2]
  7. springboot md5加密_实在!基于Springboot和WebScoket,写了一个在线聊天小程序
  8. VMware发布虚拟云网络创新技术,连接和保护分布式多云企业
  9. keepalived+LVS实现高可用的Web负载均衡
  10. 排序归并连接Merge Sort Join
  11. 黄金矿工swf游戏修改
  12. IFIX组态软件WINCC INTOUCH数据库 日志SQL记录,时班日报神器
  13. 斗地主+三人+叫地主+作弊(可设置)+积分属性+记牌器(可设置)
  14. 网易互娱-后台开发(支付方向)二面
  15. 10个容易被接受的辞职理由
  16. 超维空间鸿蒙大宇,高维空间的存在不仅能够统一基本力,还为时空穿越提供了可能!...
  17. [强网杯 2019]随便注 —— 堆叠注入
  18. c语言双目运算和单目运算符,单目运算符 双目运算符 三目运算符
  19. java中的空指针异常处理
  20. 俄美研制出新型太阳能电池 成本低转换效率高

热门文章

  1. linux c int16进制转10进制,[编程题] 进制转换(16进制转10进制)
  2. Java项目:JSP民宿预订网站信息管理平台
  3. 小米要卖汽车了!价格屠夫雷军会让汽车大降价吗?
  4. 斯纳克PACS医学影像云平台产品宣传片
  5. 2021年春节档票房排名
  6. ipv4: inet初始化过程
  7. Censor KMP算法
  8. 购买掌上电脑的三大理由[转贴]
  9. 宇视科技在线笔试c语言,宇视科技软件笔试面试.doc
  10. 携程滑块,点选文字识别