文章目录
- 前言
- 一、Redis 分片集群介绍
- 1.1 介绍:
- 1.2 工作机制:
- 1.2.1 节点:
- 1.2.2 槽 slot:
- 1.2.3 故障转移:
- 二、Redis 分片集群搭建:
- 2.1 配置文件:
- 2.2 redis 部署:
- 2.3 redis 集群创建:
- 2.4 redis 集群连接:
- 总结
- 参考:
前言
对于平常的业务往往使用redis 的哨兵模式就可以了,虽然redis 单台服务可以提供10W 的并发,但是对于并发量非常大的服务来说可能还不够,所以此时就需要对redis 进行分片集群;
一、Redis 分片集群介绍
1.1 介绍:
如果说依靠哨兵可以实现redis的高可用,如果还想在支持高并发同时容纳海量的数据,那就需要 redis 集群。redis 集群是 redis 提供的分布式数据存储方案,集群通过数据分片sharding来进行数据的共享,同时提供复制和故障转移的功能。
1.2 工作机制:
1.2.1 节点:
一个 redis 集群由多个节点 node 组成,而多个 node 之间通过 cluster meet 命令来进行连接,节点的握手过程:
- 节点 A 收到客户端的 cluster meet 命令
- 节点 A 根据收到的 IP 地址和端口号,向 B 发送一条 meet 消息
- 节点 B 收到 meet 消息返回 pong
- 节点 A 知道 B 收到了 meet 消息,返回一条 ping 消息,握手成功
- 最后,节点 A 将会通过 gossip 协议把节点 B 的信息传播给集群中的其他节点,其他节点也将和 B 进行握手
1.2.2 槽 slot:
redis 通过集群分片的形式来保存数据,整个集群数据库被分为 16384 个 slot,集群中的每个节点可以处理 0-16383 个slot,当数据库 16384 个 slot 都有节点在处理时,集群处于上线状态,反之只要有一个 slot 没有得到处理都会处理下线状态。通过 cluster addslots 命令可以将 slot 指派给对应节点处理。
slot 是一个位数组,数组的长度是 16384/8=2048,而数组的每一位用 1 表示被节点处理,0 表示不处理,如图所示的话表示 A 节点处理 0-7 的slot。
当客户端向节点发送命令,如果刚好找到 slot 属于当前节点,那么节点就执行命令,反之,则会返回一个MOVED命令到客户端指引客户端转向正确的节点。(MOVED过程是自动的)
如果增加或者移出节点,对于 slot 的重新分配也是非常方便的,Redis 提供了工具帮助实现 slot 的迁移,整个过程是完全在线的,不需要停止服务。
1.2.3 故障转移:
如果节点 A 向节点 B 发送 ping 消息,节点 B 没有在规定的时间内响应 pong,那么节点 A 会标记节点 B 为 pfail 疑似下线状态,同时把 B 的状态通过消息的形式发送给其他节点,如果超过半数以上的节点都标记 B 为 pfail 状态,B 就会被标记为 fail 下线状态,此时将会发生故障转移,优先从复制数据较多的从节点选择一个成为主节点,并且接管下线节点的 slot,整个过程和哨兵非常类似,都是基于 Raft 协议做选举。
二、Redis 分片集群搭建:
2.1 配置文件:
对每个redis实例的 redis.conf,进行修改:
protected-mode no
# 打开 AOF每次 Redis收到更改数据集的命令
appendonly yes
# 设置访问密码
requirepass 123456
#redis监听的端口号。
port 8579
# masterauth就是用来配置master的密码
masterauth
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
完整的 redis.conf 参数
可以在 集群部署篇–Redis 主从模式 搜索“redis.conf 可以参考如下” 获取;
2.2 redis 部署:
docker run -d \
--name fpredis-8379 \
-p 8379:8379 \
-p 18379:18379 \
--privileged=true \
-v /root/fp/redis1/redis.conf:/etc/redis/redis.conf \
-v /root/fp/redis1/data:/data \
redis \
redis-server /etc/redis/redis.conf
这里开通了两个端口,一个用来访问redis ,一个+10000 用来分片集群 通信使用端口
;
重复 2.1 和 2.2 可以 部署多个redis 服务(如果是在同一台服务注意对 redis.conf port 端口进行修改);
博主是在3台虚拟机上,分别在没台服务上搭建了3个redis 实例;
2.3 redis 集群创建:
用redis-cli --cluster create命令创建集群:
docker exec -it fpredis-8379 redis-cli -p 8379 -a 123456 --cluster create 192.168.75.129:8379 192.168.75.130:8379 192.168.75.131:8379 192.168.75.129:8479 192.168.75.129:8579 192.168.75.130:8479 192.168.75.130:8579 192.168.75.131:8479 192.168.75.131:8579 --cluster-replicas 2
参数解释:
- fpredis-8379 为某个redis 实例(任选一个 节点上的redis 实例即可);
- -p 是这个实例redis 访问的端口;
- -a 如果在redis.conf 使用 requirepass 设置了访问密码,可以使用-a 后跟上 访问密码;
- –cluster create 为创建集群命令;
- –cluster-replicas 为副本和主节点的比值 ,如果是1个主节点一个从节点则为 1 ;1个主节点两个从节点 则为2 ,依次类推;
可以看到集群搭建的情况:
执行过程中会提示是否同意上面的配置 :会询问是否按照上面的主从节点进行集群创建,输入 yes 即可
可以看到集群创建的情况 对16384 个slot 进行了分配
2.4 redis 集群连接:
使用 redis-cli 连接集群:
docker exec -it fpredis-8379 redis-cli -p 8379 -c
查看集群信息:如果设置了密码 则输入 auth 密码
cluster info
一共有9个节点,3个主节点;进行set 存储数据时,可以看到如果当前的key 不在当前的redis 主节点实例,则会将命令发送到对应的机器上去
总结
通过–cluster create 命令我们可以为已经存在的redis 实例创建分片集群,然后进行数据访问时 又会通过key 计算hash 然后对应到落到具体的slot 槽,如果当前节点不包含这个槽点,则将请求转发到对应的节点完成命令的执行;
参考:
Redis系列:Redis主从、哨兵、集群介绍