主从集群的缺点
- 所有的写操作都是在 Master 上完成,然后同步到 Slaver 上,所以一定会有一些延迟,当系统很繁忙或网络不通畅的时候,延迟问题会更加严重,Slaver 机器数量的增加也会加重这个问题
- 海量数据存储时主从集群无法分片储存数据,单机数据量过大会导致内存不足
- 高并发写的情况中单个 Master 可能无法承受导致宕机
分片集群介绍
- redis3.0 后采用了无中心化集群配置
- 分片集群是结合主从集群使用的,每个分片都是一个主从集群
- 各个 Master 之间通过 ping 监测彼此的健康状态
分片集群环境搭建
- 删除 /myredis 中所有的 rdb 文件
- 修改 redis.conf 文件中的 bind 为本机真实 ip 地址
- 修改 redis6379.conf 文件
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
-
按照上面的格式创建出 redis6380.conf 、redis6381.conf 、redis6389.conf 、redis6390.conf 、redis6391.conf
-
根据上面的六个配置文件启动六个 redis 服务
-
执行 redis-cli --cluster create --cluster-replicas 1 192.168.255.128:6379 192.168.255.128:6380 192.168.255.128:6381 192.168.255.128:6389 192.168.255.128:6390 192.168.255.128:6391 命令构建集群(–cluster-replicas 1 表示使用 1 模式,即最简单的模式构建集群,一台主机、一台从机,正好三组)
-
连接到集群中任意一个 redis-server :redis-cli -c -h 192.168.255.128 -p 6379 ( -c 表示进入集群节点,而不是单独的 redis-server )
-
执行 cluster nodes 命令查看节点间的关系,能查看到即代表集群环境搭建成功
集群节点分配原则
- 一个集群至少要有三个主节点
- –cluster-replicas 表示我们希望为集群中的每个主节点分配一个从节点
- 分配原则上尽量保证每个主节点分别运行在不同的 ip 地址上,每组从节点和主节点也运行在不同的 ip 地址上
什么是 slots
- 集群构建完毕后,提示信息中有这样一行:[OK] All 16384 slots covered
- slots 表示插槽,一个 redis 集群中包含 0-16383 共 16384 个插槽,每个主节点都会分配到一个插槽范围。当我们向集群中插入 key-value 时,会自动根据 key 计算出一个值,结合主节点的插槽范围确定该 key-value 应该插入到哪个主节点中。这样就完成了负载均衡
向集群中插入和获取数据
- 每次向任意节点插入、查询 key-value 时,redis 都会根据 key 计算出该命令应该送往的插槽,如果不在当前连接的 redis-server 插槽范围中,redis 会给出提示,并自动连接到对应的节点执行命令
- 一次插入多个 key-value 时,直接插入是不行的,因为多个 key 计算出的插槽大概率不会在一个插槽范围内,如下
192.168.255.128:6381> mset name lucy age 19 address beijing
(error) CROSSSLOT Keys in request don't hash to the same slot
- 所以在插入多个 key-value 时需要借助组的概念
192.168.255.128:6381> mset name{user} lucy age{user} 19 address{user} beijing
-> Redirected to slot [5474] located at 192.168.255.128:6380
OK
192.168.255.128:6380>
192.168.255.128:6380> get name{user}
"lucy"
故障恢复特点
- 如果主节点挂掉,从节点会自动升为主节点
- 主节点恢复后,成为从节点
- 如果某一组分片都挂掉,而 cluster-require-full-coverage 为 yes ,那么整个集群都会挂掉
- 如果某一组分片都挂掉,而 cluster-require-full-coverage 为 no ,那么集群中其他节点会正常工作,但归属于挂掉的主节点的插槽完全无法读写
RedisTemplate 的分片集群模式
spring:
redis:
cluster:
nodes: # 这里就直接配置节点 IP 和端口即可
- 192.168.255.128:6379
- 192.168.255.128:6380
- 192.168.255.128:6381
- 192.168.255.128:6389
- 192.168.255.128:6390
- 192.168.255.128:6391