redis sharding方案
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
http://my.oschina.net/xinxingegeya/blog/391740?p=1
http://m.blog.csdn.net/blog/wenzhibinbin_pt/22808939
http://blog.csdn.net/lang_man_xing/article/details/38405269
http://m.blog.csdn.net/blog/hjx_1000/38304081
相关推荐
当然其服务器C 代码主体并不涉及任何sharding方案,必须由用户自己在Config.lua里自己实现sharding函数 (当然,也可以从网上找现成的,譬如lua版的一致性hash lua-consistent-hash)感谢一定程度上借鉴了redis-...
### JAVA程序员培训(系列四)-REDIS集群、分片Sharding及使用场景介绍 #### REDIS集群方案介绍 ##### CODIS集群方案 - **特点**:CODIS是一种基于Redis的高性能分布式缓存系统,它利用代理层实现了Redis的水平...
3. **Redis集群高可用**:Redis集群通过分片(Sharding)和槽区(Slot)分配,将数据分散到多个节点上,这样即使部分节点故障,其他节点仍能提供服务。Docker Compose配置中,我们需要定义多个集群节点,每个节点都...
Redis Cluster是Redis的分布式解决方案,它通过分片(Sharding)技术将数据分散到多个节点,实现了数据的自动均衡和故障转移。每个节点负责一部分数据,当某个节点出现问题时,系统可以自动切换到其他节点,确保服务...
- Redis Cluster提供分布式解决方案,自动分区(Sharding)数据,支持多个主节点,每个主节点都有一个或多个从节点。 - 集群设置相对复杂,需要配置节点间的通信和槽(slot)分配。 9. **Redis与Windows的兼容性*...
Redis Cluster是Redis的分布式解决方案,通过分片(sharding)技术将数据分散在多个节点上,实现水平扩展。每个节点负责一部分数据,当数据量过大时,可以添加新的节点来扩展容量。 6. **lua脚本** Redis支持使用...
Sentinel则是Redis的高可用解决方案,它可以监控Redis主从服务器,当主服务器出现问题时,Sentinel可以将从服务器提升为新的主服务器,保证服务的高可用性。此外,文档还提到了Sharding架构,包括Redis 3.0 Cluster...
Redis集群通过分片(Sharding)技术将数据分散到多个节点上,实现数据的冗余和负载均衡,从而提高系统的可扩展性和可用性。每个节点负责一部分数据,当某个节点故障时,其他节点可以接管其责任,确保服务的连续性。 ...
Redis 集群采用了分片(Sharding)策略,将数据分散存储在多个节点上,以实现数据的水平扩展。每个节点负责一部分数据,节点之间通过网络进行通信。Redis 集群的核心组件包括主节点、从节点、槽(Slots)和客户端。 ...
Redis Cluster是Redis的分布式解决方案,它允许你在多个节点之间分发数据,从而实现高可用性和可扩展性。在本压缩包“redis-cluster-5.0.7.tar.gz”中,我们将探讨Redis Cluster的配置和使用。 首先,`redis-...
Redis集群通过分片(Sharding)技术将数据分割成多个部分,并将这些部分分配到不同的节点上。每个节点负责一部分数据的读写操作。在这种三主三从的配置中,每个主节点都有一个对应的从节点,用于数据备份和故障转移...
Redis Cluster是官方提供的分布式解决方案,通过分片(Sharding)技术将数据分散到多个节点,实现了数据的水平扩展。每个节点负责一部分键,当写入或查询操作时,客户端会根据键的哈希值定位到正确的节点。集群中的...
Redis Cluster是官方提供的分布式解决方案,通过分片(Sharding)实现数据分散和高可用性,而哨兵则用于监控、故障检测和自动故障迁移,确保服务的稳定性。 在实战部分,书中的案例将涵盖缓存策略、计数器、排行榜...
Redis 集群是分布式数据存储的一个重要解决方案,它提供了高可用性和数据持久化功能,广泛应用于缓存、消息队列等场景。本压缩包包含了搭建 Redis 集群所需的三个关键组件:Ruby 安装器(RubyInstaller)、Redis 的 ...
Redis Cluster是Redis官方提供的分布式解决方案,它允许用户在多个节点之间分发数据,从而实现高可用性和水平扩展。本文将详细介绍Redis Cluster的工作原理、配置、使用以及与MySQL数据库的配合。 **一、Redis ...
1. **自动分片(Sharding)**:Redis Cluster会自动将键空间分成多个槽(Slots),并分配到各个节点,确保数据分散均匀。 2. **容错机制**:如果一个节点宕机,其上的槽和数据可以被其他节点接管,保证服务连续性。 ...
7. **Redis Cluster**:Redis Cluster是Redis的分布式解决方案,通过分片(Sharding)技术将数据分散到多个节点上,实现水平扩展。 8. **内存管理**:了解如何设置Redis的最大内存大小,以及在内存不足时的淘汰策略...
Redis Cluster 的主要用途是实现数据分片(Data Sharding),同时也可以实现高可用(HA)。与 Redis Sentinel 模式相比,Redis Cluster 模式可以减少冗余,提高内存利用率。 1. Redis Cluster 概念 Redis Cluster ...
Redis Cluster是Redis官方提供的分布式解决方案,通过数据分片(Sharding)实现水平扩展。在Redis Cluster中,数据被分割成多个槽(Slots),每个节点负责一部分槽的存储。当客户端进行操作时,根据哈希算法确定数据...
Redis Cluster是官方提供的分布式解决方案,通过数据分区(Sharding)来分散存储负载。AFK(Auto Failure Detection and Recovery)是集群中节点故障检测的关键,当节点出现异常时,能够自动进行主从切换,保证服务...