引子
主从复制以及哨兵,他们可以提高读的并发,但是单个master容量有限,数据达到一定程度会有瓶颈,这个时候可以通过水平扩展为多master-slave成为集群。
使用redis-cluster: 他可以支撑多个master-slave,支持海量数据,实现高可用与高并发。
哨兵模式其实也是一种集群,他能够提高读请求的并发,但是容错方面可能会有一些问题, 比如master同步数据给slave的时候,这其实是异步复制吧,这个时候master挂了,那么slave.上的数据就没有master新,数据同步需要时间的,1-2秒的数据会丢失。master恢复 并转换成slave后,新数据则丢失。
特点:
- 1.每个节点知道彼此之间的关系,也会知道自己的角色,当然他们也会知道自己存在与-个集群环境中,他们彼此之间可以交互和通信,比如ping pong。那么这些关系都会保存到某个配置文件中,每个节点都有,这个我们在搭建的时候会做配置的。
- 2.客户端要和集群建立连接的话,只需要和其中一个建立关系就行。
- 3.某个节点挂了,也是通过超过半数的节点来进行的检测,客观下线后主从切换,和我们之前在哨兵模式中提到的是一个道理。
- 4 . Redis中存在很多的插槽,可以称之为槽节点吁存储数据,这个先不管,后面再说。
集群容错
构建Redis集群,需要至少3个节点作为master,以此组成一个高可用的集群,此外每个master都需要配备1个slave, 所以整个集群需要6个节点,这也是最经典的Redis集群,也可以称之为三主三从,容错性更佳。所以在搭建的时候需要有6台虚拟机。
●集群也可以在单服务器构建,称之为伪集群,但是生产环境肯定是真的,所以建议用6台(最少是6台,少了不行)。
6个节点的配置文件:(不能有主从的配置:replicaof 需要注释掉,并且所有的Redis必须是空的,把RDB和AOF文件也删除掉,如果默认端口是6379,则需要开启16379端口,不然就会一直卡在:等待节点加入)
# 开启集群模式
cluster-enabled yes
# 每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由redis自己维护,我们不用管。如果你要重新创建集群,那么把这个文件删了就行
cluster-config-file nodes-201.conf
# 超时时间,超时则认为master宕机,随后主备切换
cluster-node-timeout 5000
# 开启AOF
appendonly yes
如果报错:
Not all 16384 slots are covered by nodes:这个错误也是没有吧Redis数据或者RDB,AOF文件清理干净
所有的节点都启动后开始构建集群,如果是老版本的Redis比如3.X,需要使用redis-trib.rb来构建集群,我使用的5.X,使用命令构建:
# 在任意一台节点输入命令
# -a imooc是密码,后边的1:标识,主从比例是1,(三主三从)
redis-cli -a imooc --cluster create 192.168.3.70:6379 192.168.3.80:6379 192.168.3.81:6379 192.168.3.82:6379 192.168.3.80:6380 192.168.3.81:6380 --cluster-replicas 1
查看集群的状态
redis-cli -a imooc --cluster check 192.168.3.70:6379
redis集群是槽的概念,数据是存在槽中,槽是平均分配,这个槽是在mater中有,从节点是没有的
存数据是对key求hash然后对槽数取模,得到具体的槽值,然后在存入
命令登陆集群模式的Redis
# -c:就是登陆集群模式
# -a imooc :密码
# -h -p :IP,端口
redis-cli -c -a imooc -h 192.168.3.70 -p 6379
登陆Redis后:查看master和slave信息
cluster info
# 节点信息
cluster nodes
springboot连接Redis集群的配置
spring:
datasource: # 数据源的相关配置
# type: com.zaxxer.hikari.HikariDataSource # 数据源类型:HikariCP
# driver-class-name: com.mysql.jdbc.Driver # mysql驱动
url: jdbc:mysql://localhost:3306/test-db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
username: root
password: 111111
redis:
# 集群模式(三主三从)
password: testaaaa
cluster:
nodes:
# 节点的IP和端口
192.168.3.70:6379,192.168.3.80:6379,192.168.3.81:6379,192.168.3.82:6379,192.168.3.80:6380,192.168.3.81:6380