Redis Cluster Goal:
1. 最大支持1000个节点的高性能、可线性扩展集群;集群架构中无Proxy层,主从间采用异步同步机制(replication),无merge层(不支持跨节点操做)
2. 可接受的写入安全性(存在数据丢失的可能)
3. 可用性:当集群中大部分主节点可用,且失效的主节点至少有一个Slave可达时,集群可用;支持主节点失效从节点自动升级为主节点,支持从节点迁移以保证每一个主节点至少有一个从节点。node
Redis集群Key相关:
1. 不支持须要跨节点的命令,这些命令当须要操做的Key在单个节点上时仍旧可用
2. 支持指定某些特定Key存储于同一节点
3. 集群再也不支持多databases
redis
单个Redis实例单进程运行,只能利用到单个CPU,若要利用服务器全部性能,可在单台服务器运行多个实例,以最大化利用CPU性能。但要考虑到机器可用性,若机器不可用,则会致使多个实例失效。安全
Redis集群数据一致性保证:
Redis集群不提供强一致性保证。默认状况下,主节点接收到写入命令后返回客户端,而后与从节点进行同步。
命令WAIT提供了集群近似强一致性保证。服务器
Redis集群TCP端口:
每一个节点须要开通两个TCP端口
1. 接收来自客户端的链接,如6379,可称之为命令端口。该端口需像集群其余节点及客户端节点开放。
2. 数据端口(data port),为链接端口+10000,如16379,用于集群总线(cluster bus)通讯,主要功能有:failure检测,配置更新,failover认证等。该端口需向集群其余节点开放。
3. 集群若要正常工做,上述两端口均需按要求开放。
架构
Redis集群数据分片(Sharding):
Redis集群未采用一致性Hash,而是将每一个key映射到slot。一个Redis集群拥有16384个Hash slot,这些slot被平均分配到集群中的每一个节点上。每一个key对应的slot为:key的CRC16码对16384取模。
这种数据分片方案使得在集群中添加或者删除节点变得很是方便,在添加或者删除节点时,集群无需中止。
Redis集群配置参数:
cluster-enabled <yes/no>: 集群模式开关
cluster-config-file <filename>: 集群配置文件,用于存储集群内节点的信息及集群配置信息。该文件由节点维护,每次集群有变化时重写,用户不能对该文件进行编辑。
cluster-node-timeout <milliseconds> 集群内节点不可用的最大时间,超过该时间节点将被认为无效。
cluster-slave-validity-factor <factor>: 设为0时集群内Slave将会持续询问Master的可用性。当设为其余值时,例如10,而cluster-node-timeout设为5 seconds,当Slave与Master间超过50 seconds没有通讯时,Slave不会尝试再去使主节点失效,这有可能致使集群不可用。
cluster-migration-barrier <count>: 当某些主节点再也不具备从节点而须要migration时,其余主节点应保留的最小Slave个数
cluster-require-full-coverage <yes/no>: 默认为yes,当集群内必定比例的Key没有被节点Cover的时候,集群再也不可用。设为no,则这种状况下集群仍旧可用异步
Redis集群节点ID(Node ID):
集群内每一个节点具备一个惟一的ID,该ID在该节点全生命周期中不变,集群经过ID惟一标识节点,而不是可能发生变化的IP 和Port。
Redis集群在线操做:
Resharding:
当集群内某些节点负载太高时,能够经过在线Resharding来均衡负载。Resharding操做期间,集群仍旧可用。
Resharding须要借助redis-trib.rb 脚本完成,须要自定Resharding的Slots数量,目标节点,源节点等信息。
手动故障切换(Manually Failover):
当集群内某些节点须要进行升级等操做时,Redis集群支持手动故障切换操做,而同时不影响集群的可用性。性能
动态添加节点:
经过借助redis-trib脚本能够添加节点做为Master或者Slave。
redis-trib.rb add-node
动态删除节点:
redis-trib.rb del-node 能够删除空Master或者Slaveui
集群升级:
当集群须要升级时能够经过动态启停实现。
a. 对于Slave: 经过1. 停机 2. 升级版本 3. 重启 便可实现
b. 对于Master:
1. 对Master实施Manually Failover
2. 等待Master转变为Slave
3. 实施Slave升级步骤
4. 对新Master实施Manually Failover以使原节点从新成为Master
c. 能够对集群内全部节点逐个实施上述步骤以达到升级整个集群的目的
spa