一、Cluster集群
-
背景
- Sentinel解决了主从架构故障自动迁移的问题
- 但是Master主节点的写能力和存储能力依旧受限
- 使用Redis的集群cluster就是为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器
-
什么是集群Cluster
- 是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理
- 容易和分布式弄混,分布式系统简单的可以认为就一个庞大的系统,进行拆分度多个小系统
- Cluster模式是Redis3.0开始推出
- 采用无中心结构,每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接
- 官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用
- 各个节点会互相通信,采用gossip协议交换节点元数据信息
- 数据分散存储到各个节点上
Cluster集群模式图解(三主三从)
二、Cluster数据分片和虚拟哈希槽介绍
- 主节点的写能力和存储能力受限
- 单台机器无法满足需求,因此把数据分散存储到多个机器
- 类似案例:mysql分库分表
常见的数据分区算法
哈希取模
- 对选择的 partitioning key 计算其哈希值,得到的哈希值就是对应的分区
范围分片
- 通过确定分区键是否在某个范围内来选择分区
一致性Hash分区
redis cluster集群没有采用一致性哈希方案,而是采用【数据分片】中的 哈希槽 来进行数据存储与读取的
Redis的哈希槽 slot
Redis集群预分好16384个槽,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个槽中
数据分区大体流程
假设主节点的数量为3,将16384个槽位按照【用户自己的规则】去分配这3个节点,每个节点复制一部分槽位
- 节点1的槽位区间范围为0-5460
- 节点2的槽位区间范围为5461-10922
- 节点3的槽位区间范围为10923-16383
- 注意:从节点是没有槽位的,只有主节点才有
存储查找
- 对要存储查找的键进行crc16哈希运算,得到一个值,并取模16384,判断这个值在哪个节点的范围区间
- 假设crc16("test_key")%16384=3000,就是节点一
- crc16算法不是简单的hash算法,是一种校验算法
使用哈希槽的好处就在于可以方便的添加或移除节点
- 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
- 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了
三、Cluster集群环境准备
-
说明
- 旧版本的需要使用ruby语言进行构建,新版5之后直接用redis-cli即可
- 6个节点,三主双从,主从节点会自动分配,不是人工指定
- 主节点故障后,从节点会替换主节点
配置文件设置
我这里是在 /usr/local/redis/ 目录下面创建了clusterConfig 目录,在该目录下新建redis.conf文件,配置文件内容如下:
bind 0.0.0.0
port 6379
daemonize yes
requirepass "1qazXSW@"
logfile "/usr/local/redis/log/redis.log"
dbfilename "xdclass.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
masterauth "1qazXSW@"
#是否开启集群
cluster-enabled yes
# 生成的node文件,记录集群节点信息,默认为nodes.conf
cluster-config-file nodes.conf
#节点连接超时时间
cluster-node-timeout 20000
#集群节点的ip,当前节点的ip
cluster-announce-ip 192.168.75.147
#集群节点映射端口
cluster-announce-port 6379
#集群节点总线端口,节点之间互相通信,常规端口+1万
cluster-announce-bus-port 16379
四、启动6个Cluster节点
进入 bin 目录 cd /usr/local/redis/bin/
启动命令 x6
./redis-server ../cluserConf/redis.conf
将6个节点加入集群,进入任意节点,执行命令
./redis-cli -a 1qazXSW@ --cluster create 192.168.75.147:6379 192.168.75.149:6379 192.168.75.150:6379 192.168.75.151:6379 192.168.75.152:6379 192.168.75.153:6379 --cluster-replicas 1
其中
- --cluster 表示构建集群全部节点信息
- --cluster-replicas 1 表示主从节点的比例,1表示1主1从的方式
键入命令后,输个yes,会输出集群构建结果
检查状态信息(其中一个节点执行即可)
./redis-cli -a 1qazXSW@ --cluster check 192.168.75.149:6379
五、Cluster集群读写命令
5.1、cluster模式查看集群状态
cluster模式进入任意redis节点客户端
./redis-cli -c -a 1qazXSW@
集群信息查看
127.0.0.1:6379> cluster info
节点信息查看
127.0.0.1:6379> cluster nodes
5.2、测试集群读写命令set/get
- key哈希运算计算槽位置
- 槽在当前节点的话直接插入/读取,否则自动转向到对应的节点
- 操作都是主节点操作,从节点只是备份
5.3、启动流程总结
启动应用 6个redis节点,用cluster的配置文件启动
加入集群 任意节点输入命令
从节点请求复制主节点(主从复制一样)
- 先全量
- 再增量
六、Cluster集群整合SpringBoot
6.1、修改配置文件
pom文件 添加连接池
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
application.yml配置文件
cluster:
#命令的最多转发次数 6也可以
max-redirects: 3
nodes: 192.168.75.147:6379,192.168.75.149:6379,192.168.75.150:6379,192.168.75.151:6379,192.168.75.152:6379,192.168.75.153:6379
6.2、不在同个网络,所以集群改为公网ip地址才可以访问 (需要的话)
修改 clusterConf/redis.conf 配置文件
#对外的ip
cluster-announce-ip 192.168.75.147
#对外端口
cluster-announce-port
#集群桥接端口
cluster-announce-bus-por
动态修改配置
config set cluster-announce-ip 192.168.75.147
六、 Cluster集群故障自动转移
147、149、150 三个节点,是主节点,151,152,153 是从节点,kill掉149(149的从节点是153,可以查看节点信息),看log
147 或 150 (主节点的log)
153 (被关闭的149的从节点)
其他从节点的log
查看集群信息
127.0.0.1:6379> cluster nodes
可以看到6个节点,149 master是fail状态,下线了, 而他的从节点 153 变为了 master