Redis学习笔记—Redis的分区的意义与方式
- 分区是将数据分布在多个Redis实例(Redis主机)上,以至于每个实例只包含一部分数据。
1.官方cluster分区
- Redis3.0之后,Redis官方提供了完整的集群解决方案。
- 方案采用去中心化的方式,包括:sharding(分区)、replication(复制)、failover(故障转移)。称为RedisCluster。
- Redis5.0前采用redis-trib进行集群的创建和管理,需要ruby支持
- Redis5.0可以直接使用Redis-cli进行集群的创建和管理
- 由上图可知有三部分的交互,Redis master和Redis master,Redis Master和 RedisClient,Redis Master和Redis Slaver的交互
2.去中心化
- RedisCluster由多个Redis节点组构成,是一个P2P(点对点)无中心节点的集群架构,各个节点的通信
依靠Gossip协议
传播的集群。
3.Gossip协议
Gossip协议
是一个通信协议,一种传播消息的方式,起源于:病毒传播。Gossip协议
基本思想就是:- 一个节点周期性(每秒)随机选择一些节点,并把信息传递给这些节点。
- 这些收到信息的节点接下来会做同样的事情,即把这些信息传递给其他一些随机选择的节点。
- 信息会周期性的传递给N个目标节点。这个N被称为fanout(扇出)
gossip
协议包含多种消息,包括meet
、ping
、pong
、fail
、publish
等等。 - 通过
gossip
协议,cluster
可以提供集群间状态同步更新、选举自助failover
等重要的集群功能。
4.slot(hash槽,Redis存储用的就是slot的概念)
redis-cluster
把所有的物理节点映射到[0-16383]
个slot
上,基本上采用平均分配和连续分配的方式。- 比如上图中有
5个主节点
,这样在RedisCluster
创建时,slot
槽可按下表分配:
cluster
负责维护节点和slot槽的对应关系value------>slot-------->节点
- 当需要在
Redis
集群中放置一个key-value
时,redis
先对key
使用crc16算法(一种hash算法)
算出一个结果,然后把结果对16384
求余数,这样每个key
都会对应一个编号在0-16383
之间的哈希槽,redis
会根据节点数量大致均等的将哈希槽映射到不同的节点。 比如
:set name zhaoyun
hash("name")
采用crc16
算法,得到值:1324203551%16384=15903- 根据上表15903在
13088-16383
之间,所以name
被存储在Redis5
节点。 slot
槽必须在节点上连续分配,如果出现不连续的情况,则RedisCluster
不能工作,详见容错。
5.RedisCluster的优势
高性能
- Redis Cluster 的性能与单节点部署是同级别的。
- 多主节点、负载均衡、读写分离
高可用
- Redis Cluster 支持标准的 主从复制配置来保障高可用和高可靠。
- failover(故障转移)
- Redis Cluster 也实现了一个类似 Raft 的共识方式,来保障整个集群的可用性。
易扩展
- 向 Redis Cluster 中添加新节点,或者移除节点,都是透明的,不需要停机。
- 水平、垂直方向都非常容易扩展。
- 由于数据分区,所以可以存储海量数据,数据存储
原生
- 部署 Redis Cluster 不需要其他的代理或者工具,而且 Redis Cluster 和单机 Redis 几乎完全兼容。
6.集群搭建
-
三主带三从
-
搭建集群,解压redis压缩包,进入src目录中进行install操作,可以在install的命令中规定路径
cd src && make install PREFIX=/.../.../redis/7001 make install PREFIX=/.../.../redis/7001
-
修改配置文件,改端口,改bind属性,保护节点改成no,cluster-enable改成yes
-
创建启动脚本,start.sh
cd 7001/bin ./redis-server redis.conf cd .. cd .. cd 7002/bin ./redis-server redis.conf cd .. cd ..
-
给启动脚本赋予权限,
chmod u+x start.sh (赋写和执行的权限)
-
创建redis集群,其中
cluster-replicas 1
表示一个从机,创建集群写在前面的一定是主机./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
-
创建完集群后会显示如下:
-
使用命令客户端连接集群
- 连接集群方式
./redis-cli -h 127.0.0.1 -p 7001 -c
- 存数据
name:001
和name:002
计算hash值
,会将计算出的hash值
放到对应的hash槽
内,所以会出现从7001定向到7002的现象
127.0.0.1:7001> set name:001 zhaoyun OK 127.0.0.1:7001> set name:002 zhaoyun2 -> Redirected to slot [8545] located at 127.0.0.1:7002 OK
-
查看集群状态的命令:
cluster info
127.0.0.1:7002> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:2 cluster_stats_messages_ping_sent:11243 cluster_stats_messages_pong_sent:10937 cluster_stats_messages_meet_sent:4 cluster_stats_messages_sent:22184 cluster_stats_messages_ping_received:10935 cluster_stats_messages_pong_received:11247 cluster_stats_messages_meet_received:2 cluster_stats_messages_received:22184
-
查看节点的状态命令:
cluster nodes
127.0.0.1:7002> cluster nodes 1506f98e3c8dac9586531b4e02e475ee7af4572f 127.0.0.1:7004@17004 slave 910b50994c3fcd7e1f92738681c4db70c2aa3bfd 0 1612695884000 4 connected 95eded2b53e955597818e9fa93b3c00efa80e118 127.0.0.1:7005@17005 slave 75b011a8ea54060b6e078ddd5cd844f0d36129ae 0 1612695883000 5 connected 3d7576fd14f406958d488b8538b8bc2af29f2341 127.0.0.1:7001@17001 master - 0 1612695883000 1 connected 0-5460 910b50994c3fcd7e1f92738681c4db70c2aa3bfd 127.0.0.1:7002@17002 myself,master - 0 1612695884000 2 connected 5461-10922 4a7a3cf2b14f172599e26c26b63151826a992e61 127.0.0.1:7006@17006 slave 3d7576fd14f406958d488b8538b8bc2af29f2341 0 1612695884000 6 connected 75b011a8ea54060b6e078ddd5cd844f0d36129ae 127.0.0.1:7003@17003 master - 0 1612695884971 3 connected 10923-16383