一、分布式
Redis集群是一个由多个Redis服务器组成的分布式网络服务器群,集群中的各个服务器被称为节点(node),这些节点会相互连接并进行通信。分布式的Redis集群没有中心节点,所以用户不必担心某个节点会成为整个集群的性能瓶颈。
二、复制
Redis 集群的每个节点都有两种角色可选,一个是主节点(master node),另一个是从节点(slavenode),其中主节点用于储存数据,而从节点则是某个主节点的复制品。当用户需要处理更多读请求的时候,可以添加从节点以扩展系统的读性能。因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的。
三、节点故障检测和自动故障转移
Redis 集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel 。
四、分片
集群使用分片来扩展数据库的容量,并将命令请求的负载交给不同的节点来分担。
集群将整个数据库分为 16384 个槽(slot),所有键都属于这 16384 个槽的其中一个,计算键 key属于哪个槽的公式为 slot_number = crc16(key) % 16384 ,其中 crc16 为 16 位的循环冗余校验和函数。集群中的每个主节点都可以处理 0 个至 16384 个槽,当 16384 个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
例如,我们有三个主节点7000、7001 和 7002,那么我们可以:
将槽0至5460指派给节点7000负责处理;
将槽 5461至 10922 指派给节点 7001 负责处理;
将槽 10923至 16383指派给节点 7002 负责处理;
这样就可以将16384个槽平均地指派给三个节点负责处理。
五、转向
对于一个被指派了槽的主节点来说,这个主节点只会处理属于指派给自己的槽的命令请求。如果一个节点接收到了与自己处理的槽无关的命令请求,那么节点会向客户端返回一个转向错误(redirection error),告诉客户端,哪个节点负责处理这条命令,之后客户端需要根据错误中包含的地址和端口号重新向正确的节点发送命令请求。
六、Redis集群客户端
因为集群功能比起单机功能要复杂得多,所以不同语言的 Redis 客户端通常需要为集群添加特别的支持,或者专门开发一个集群客户端。
目前主要的 Redis 集群客户端(或者说,支持集群功能的 Redis 客户端)有以下这些:
- redis-rb-cluster:antirez 使用 Ruby 编写的 Redis 集群客户端,集群客户端的官方实现。
- predis:Redis 的 PHP 客户端,支持集群功能。
- jedis:Redis 的 JAVA 客户端,支持集群功能。
- StackExchange.Redis:Redis 的 C# 客户端,支持集群功能。
-内置的 redis-cli :在启动时给定 -c 参数即可进入集群模式,支持部分集群功能。
集群搭建:
1、集群搭建至少三个主节点(选举)。
2、安装ruby环境
3、./redis-trib.rb 创建集群
./redis-trib.rb creat IP:prot...
redis自动分片
4、虚拟分片
slots
5、选举机制