集群
1、简介
集群即Redis Cluster,集群是有多个节点组成,Redis数据分布在这些节点中。集群的节点分为主节点和从节点,主节点负责读写请求和集群信息的维护,从节点维护主节点的数据和状态信息。
2、作用
- 数据分区(分片):集群将数据分散到多个节点,突破Redis单击内存问题,存储容量增加;每个主节点都可以提供读写服务,提升响应能力。
- 高可用:集群支持主从复制,可以故障自动转移;即使任一节点主从都故障了也可以对外提供服务。
3、集群搭建
我们启动六个节点,3主3从,为了方便所有节点在一台服务器上启动,以端口号区分,三个主节点端口号:6379/6380/6381,三个从节点端口号6389/6390/6391。
(1)在配置文件中通过参数cluster-enabled yes开启集群,cluster-config-file “”指定集群配置文件。
配置文件redis-6379.conf:
port 6379
cluster-enabled yes
cluster-config-file "node-6379.conf"
logfile "log-6379.log"
dbfilename "dump-6379.rdb"
daemonize yes
其他五个节点类似,然后启动Redis
redis-server redis-6379.conf
redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6389.conf
redis-server redis-6390.conf
redis-server redis-6391.conf
(2)节点启动后都是独立的,需要通过节点握手组成一个节点网络,使用cluster meet {ip} {port}命令组网。
用redis-cli info server查看单机模式redis_mode:standalone,集群下用redis-cli -p 6379 info server查看redis_mode:cluster。
节点握手:
cluster meet 192.168.1.1 6379
cluster meet 192.168.1.1 6380
cluster meet 192.168.1.1 6381
cluster meet 192.168.1.1 6389
cluster meet 192.168.1.1 6390
cluster meet 192.168.1.1 6391
执行完成后,可以用cluster node在任一节点查看所有节点。
(3)分配槽,槽用来实现分区,如果不分配槽,则集群处于下线状态(可通过cluster info命令查看cluster_state),集群的槽有16384个,使用cluster addslots命令分配槽。
redis-cli -p 6379 cluster addslots {0..5461}
redis-cli -p 6380 cluster addslots {5462..10922}
redis-cli -p 6381 cluster addslots {10923..16383}
(4)指定主从关系
集群中指定主从关系不用slaveof命令,而是用cluster replicate命令,参数是主节点id。通过cluster nodes获取3个主节点id。然后执行:
redis-cli -p 6389 cluster replicate be816eba968bc16c884b963d768c945e86ac51ae
redis-cli -p 6390 cluster replicate 788b361563acb175ce8232569347812a12f1fdb4
redis-cli -p 6391 cluster replicate a26f1624a3da3e5197dde267de683d61bb2dcbf1
此时执行cluster node查看节点状态,就可以看到主从节点已经建立。至此集群搭建完毕。
可以使用ruby脚本搭建集群代替上面(2)-(4)步:
Redis已经集成了ruby,用redis-cli --cluster create --cluster-replicas 1 [ip port]来搭建,-replicas 1意思采用一主一从的策略。
redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 192.168.11.101:6380 192.168.11.101:6381 192.168.11.101:6389 192.168.11.101:6390 192.168.11.101:6391
会自动组网握手、平均分配槽并且指定主从关系。
4、集群设计方案
- 高可用:根据故障转移原理,至少3个主节点才能完成故障转移,且2个主节点不应该在同一台物理机上,主节点和从节点也不应该在同一台物理机上,因此高可用集群至少6个节点。
- 数据量和访问量:估算应用所需的数据量和访问总量,结合每个主节点的容量和能承受的访问量来计算主节点个数。
- 节点数量限制:官方给出节点限制1000,主要考虑节点通信带来的消耗。
- 适度冗余:在不影响集群服务的情况下增加节点,不用太大。
5、集群原理
(1)数据分区:
是集群的核心功能,数据分区有顺序分区和哈希分区等,其中哈希分区由于其随机性使用广泛;集群的分区方案便是哈希分区的一种。
哈希分区:对数据的特征值(如key)进行哈希,然后根据哈希值决定数据落在哪个节点的槽。
(2)节点通信:
两个端口:在哨兵模式节点分为数据节点和哨兵节点;在集群中所有节点都存储数据也都参与集群状态维护,所有集群中的每个节点都提供了两个TCP端口:
- 普通端口:即前面指定的6379端口,为客户端提供服务,节点数据迁移也会使用。
- 集群端口:普通端口号+10000(10000值是固定的无法改变),如16379.集群端口用于搭建集群、增删节点、故障转移等操作时节点的通信,不要使用客户端连接集群接口。
集群中的节点采用固定频率(每10秒)的定时任务进行通信相关操作:判断是否需要发送消息及消息类型、确定接收节点、发消息等。集群中如果状态发生了变化,如增删节点、槽状态变更,通过节点的通信。