后端开发之Redis篇----Redis集群进阶

多主多备Redis集群

原理

在上几篇博文中,我们已经介绍了主从同步和哨兵模式,这些模式都是对读操作的高并发量有一定提升。但是,如果如何都是在单master节点下操作的,当我们的写操作的并发量异常地多的时候横向扩展master节点就很有必要了。
哨兵模式其实也是一种集群,他能狗提高读请求的并发,但是容错方面可能会有一些问题,如:master同步数据给slave的时候,这其实是异步复制的,这个时候如果master挂掉了,那么slave上的数据就没有master新,数据同步也是需要时间的,一般1-2秒的数据会丢失,而原master恢复并换成slave后,新数据则丢失了,所有我们需要对master进行横向地扩展,这样一个master挂了,还能有其他master能继续执行写操作。

  1. 在Redis集群中,每一个节点(无论是主还是备),都知道自己的角色,也知道集群其他节点的存在,就是每个节点都是可见的。彼此之间他们可以进行通信,相互ping数据,这些关系都是保存在一个配置文件当中(每一个节点上都有一份),在搭建前的预备工作上就需要在redis.conf上配置好的。
  2. 客户端要和集群建立连接的话,只需要和其中一个建立关系就行了。
  3. 某个节点挂了,也是通过超过半数的节点进行检测(这里就不需要单独的sentinel节点进程来选举了,只要是这个集群里的还存活的节点不会尝试去检测其他节点的存在),客观下限后主从切换,和我们之前的哨兵模式中提到的是一个道理。
  4. Redis中存在很多的槽(只是一种存储数据的单位概念)

相对经典的Redis集群模式为3个master和3个slave,每个master都会和一个slave组成一个主从小组。

搭建

直接搭建前的准备工作,先在每一台节点上修改其redis.conf配置文件,现在假设我们有:
192.168.0.201,192.168.0.202,192.168.0.203,192.168.0.204,192.168.0.205,192.168.0.206这六个节点
这些节点的redis.conf添加或者修改属性如下:

# 开启集群模式
cluster-enabled yes
# 每个节点需要有一个配置文件,整个集群就需要6份了。每个节点处于汲取你的角色都需要告知其他所有节点
# 彼此知道,这个文件用户存储集群模式下的集群状态等信息,这个文件是由redis自己管理的
cluster-config-file node-6379.conf
# 超时时间,超时了则认为master宕机了,随后主备切换
cluster-node-timeout 5000
# 开启AOF
appendonly yes

随后启动6台redis实例,如果这个时候rdb和旧的aof文件还存在要先删除了,否则在启动的时候会报错

创建集群

#####
# 如果你是redis3.x版本的,需要使用redis-trib.rb来构建集群
# 以下为新版的redis构建方式
#####

# 创建集群,主节点和从节点比例为1:1,在任意一台机器上输入下面的命令
redis-cli -a 123456 --cluster create \
192.168.0.201:6379 192.168.0.202:6379 192.168.0.203:6379 \
192.168.0.204:6379 192.168.0.205:6379 192.168.0.206:6379 \
--cluster-replicas 1 # 这个参数用来控制master和slave的比例

检查集群信息

redis-cli --cluster check 192.168.0.202:6379 #输入任意节点都能获取整个集群的信息

槽节点

在使用了Redis集群后就没有database的概念了,只有槽节点。一般会有16384个槽单位平均地分配在每台机器上,当一个key被设置进来后,首先会计算这个key的hash值,然后根据一致hash算法来决定将这个key放在哪台机器上的哪个槽上(注意这里只有master节点有槽,slave没有,所以我们这里的情况就是在3个master节点上平均分16384个槽节点)。
你在使用redis-cli --cluster check这个命令时可以看到这么一段描述

Master[0] -> Slot 0 - 5460
Master[2] -> Slot 5461 - 10922
Master[3] -> Slot 10923 - 16383

具体操作

使用命令进入redis内查看集群和key的情况

redis-cli -c -a 123456 -h 192.168.0.202 -p 6379
192.168.0.201:6379> cluster info # 查看集群信息
192.168.0.201:6379> set age 18 # 设置key会根据其hash值来保存在哪台几点上
-> Redirected to Slot[741] located at 192.168.0.201:6379 
# 会重定向到保存这个key的机器上
192.168.0.201:6379> keys * # 如果这台机器上没有保存这个key的话,是看不到的,这个命令只能看这台机器上保存的key
"age"

SpringBoot整合Redis集群

只需要修改application.yml就可以了

spring:
  redis:
    password: 123456
    # database 这个参数就不需要了
    cluster:
      node: 192.168.0.201:6379,192.168.0.202:6379,192.168.0.203:6379,192.168.0.204:6379,192.168.0.205:6379,192.168.0.206:6379

你可能感兴趣的:(后端,redis,java)