Redis 集群模式
- 他是redis 3.0开始引入的分布式存储方案,由多个节点组成,redis的数据分布在这些节点中
- 集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护,从节点只进行主节点数据和状态信息的复制
作用
(1) 数据分区
数据分区(或称数据分片)是集群最核心的功能 集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力 Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及 例如,如果单机内存太大,bgsave 和 bgrewriteaof 的 fork 操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出
(2) 高可用
集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务
数据分片
Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383) 集群的每个节点负责一部分哈希槽,每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作 以 3 个节点组成的集群为例: 节点 A 包含 0~5469 号的哈希槽 节点 B 包含 5461~10922 号的哈希槽 节点 C 包含 10923~16383 号的哈希槽
部署
环境 Node1节点 node 192.168.3.11 主端口6001 从6004 Node2节点 node 192.168.3.11 主端口6002 从6005 Node3节点 node 192.168.3.11 主端口6003 从6006 安装好redis(前面有一件执行脚本博客)
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
搭建Cluster集群
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号:6001/6002/6003, 对应的从节点端口号:6004/ 6005/ 6006。
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
ln -s /usr/local/redis/bin/* /usr/local/bin/
cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
开启群集功能
仅以redis6001为例,其他5个文件夹的配置文件以此类推修改,特别注意端口号的修改。
[root@localhost redis]
[root@localhost redis6001]
bind 127.0.0.1
protected-mode no
port 6001
daemonize yes
cluster-enabled yes
cluster-config-file nodes-6001.conf
cluster-node-timeout 15000
appendonly yes
。
。
。
6002-6006同样配置
启动集群
分别进入那六个文件夹,执行命令:“redis-server redis.conf”,来启动redis节点
[root@localhost redis6006]
> do
> cd /etc/redis/redis-cluster/redis600$s
> redis-server redis.conf
> done
[root@localhost redis6006]
root 78255 1 0 19:19 ? 00:00:13 /usr/local/redis/bin/redis-server 0.0.0.0:6379
root 87931 1 0 21:20 ? 00:00:00 redis-server 127.0.0.1:6001 [cluster]
root 87933 1 0 21:20 ? 00:00:00 redis-server 127.0.0.1:6002 [cluster]
root 87935 1 0 21:20 ? 00:00:00 redis-server 127.0.0.1:6003 [cluster]
root 87943 1 0 21:20 ? 00:00:00 redis-server 127.0.0.1:6004 [cluster]
root 87945 1 0 21:20 ? 00:00:00 redis-server 127.0.0.1:6005 [cluster]
root 87947 1 0 21:20 ? 00:00:00 redis-server 127.0.0.1:6006 [cluster]
root 88663 10549 0 21:21 pts/1 00:00:00 grep --color=auto redis
- 六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点。下面交互的时候需要输入yes才可以成功创建。
–replicas 1表示每个主节点有1个从节点。
测试集群
[root@localhost redis6006]
127.0.0.1:6001> cluster slots
1) 1) (integer) 5461
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 6002
3) "5c7b5aeb7176cec662062c70be5dbbad51ec0fcc"
4) 1) "127.0.0.1"
2) (integer) 6006
3) "baa3db68e50976528d87ad3f9a26a9e31c9f514d"
2) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 6003
3) "77936d91222960730e5a20b2d9ef46c458857d5b"
4) 1) "127.0.0.1"
2) (integer) 6004
3) "fbd24590da776d08fb7a604c76f0e5fe6cf4f54b"
3) 1) (integer) 0
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 6001
3) "4cc03641967f0bb1bb70b1e372a5b76e1c6bb249"
4) 1) "127.0.0.1"
2) (integer) 6005
3) "088e361b7af17e6ec7f971512edeb494cda158d6"
127.0.0.1:6001> set num 1
OK
127.0.0.1:6001> get num
"1"
127.0.0.1:6001> keys *
1) "num"
127.0.0.1:6001> quit
[root@localhost redis6006]
127.0.0.1:6002> keys *
(empty list or set)
127.0.0.1:6002> get num
-> Redirected to slot [2765] located at 127.0.0.1:6001
"1"
127.0.0.1:6001> set key1 11111
-> Redirected to slot [9189] located at 127.0.0.1:6002
OK
127.0.0.1:6002>
|