Redis分片集群学习总结
- 为什么要使用分片集群?
- 分片集群搭建
- Redis集群怎么写入读取数据呢?
- 集群写入数据和读取数据怎么定位到对应的节点呢?
- 怎么让多个数据写入同一个节点?
- 故障转移
- 主从集群和分片集群使用场景
为什么要使用分片集群?
在上篇文章中,我们学会了主从集群,其结构是一个主节点和多个从节点,由主节点负责写数据,从节点负责读数据,提高了Redis的数据读取性能,并且提高了Redis的可用性。但是也存在一些缺点,由于主从集群是单个主节点,因此其大量写性能较差,我们今天来学习分片集群,采用多主多从的架构,多个主节点存储Redis不同部分的数据,并且负责写入数据,其从节点负责读取数据,大大提高了并发写操作的性能。
分片集群搭建
为了实现简单,我在一个服务器上搭建。
创建六个Redis实例后,随机进入一个容器:
创建三个主节点,每一个主节点都有一个从节点:
# 进入任意节点容器
docker exec -it r1 bash
# 创建集群,1为设置每个主节点的从节点个数,而后根据该值和主节点个数搭建分片集群
redis-cli --cluster create --cluster-replicas 1 \
127.0.0.1:7001 127.0.0.1:7002 127.0.0.11:7003 \
127.0.0.1:7004 127.0.0.1.101:7005 127.0.0.1:7006
运行结果:
搭建完成后我们发现r1、r2、r3分别对应r3、r4、r5三个从节点,请求每一个主节点都对应了一个slots的参数,这个参数是Redis分片集群读取并写入数据的关键。
Redis集群怎么写入读取数据呢?
我们尝试写入数据并且读取数据
我们发现写入user时数据被定位到5474的slot中,读取student定位到5249的slot中,正好对应到上面集群运行时每个主节点对应的slot中。
集群写入数据和读取数据怎么定位到对应的节点呢?
通过散列插槽即slot的方式,redis集群一共有16386的插槽,在创建集群时会将这些插槽分配给每个主节点,当进行数据的写入和读取时,会基于CRC16 算法对key做hash运算,然后与16384求余,得到数据写入或读取的slot,然后到相应的主节点中进行写入或者读取
怎么让多个数据写入同一个节点?
不过hash slot的计算也分两种情况:
- 当key中包含{}时,根据{}之间的字符串计算hash slot
- 当key中不包含{}时,则根据整个key字符串计算hash slot
如上,我们存入{user}:student,发现定位到了存入user对应的相同的slot5747
故障转移
如果存在主节点发生故障,集群是怎么发现并处理的呢?
Redis多个主节点之间会通过心跳机制,它们每秒之间相互ping对方,如果对方在一定时间内没有相应,就会认为对方下线,会将下线的某个从节点提升为主节点。
主从集群和分片集群使用场景
分片集群可以应对高并发写和高并发读的场景,但是其结构略显复杂。
主从集群可以应对高并发读的场景,其结构更加简单。
我们需要根据项目的使用场景,即其并发写和并发读的强度