redis之集群理论及部署

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#回车,直到出现以下选项,手动修改为“/usr/local/redis/bin/redis-server”
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/
#创建redis 6个端口的工作目录
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]# cd redis-cluster/redis6001
[root@localhost redis6001]# vim redis.conf 

bind 127.0.0.1  #69行,注释掉bind项,默认监听所有网卡

protected-mode no  #88行,修改,关闭保护模式

port 6001   #92行,修改,redis监听端口

daemonize yes  #136行,开启守护进程,以独立进程启动

cluster-enabled yes  #832行,取消注释,开启群集功能

cluster-config-file nodes-6001.conf   #840行,注销注释,群集名称文件设置

cluster-node-timeout 15000   #846行,注销注释,群集超时时间设置

appendonly yes   #699行,修改,开启AOF持久化
。
。
。
6002-6006同样配置

启动集群

分别进入那六个文件夹,执行命令:“redis-server redis.conf”,来启动redis节点

[root@localhost redis6006]# for s in {1..6}
> do
> cd /etc/redis/redis-cluster/redis600$s
> redis-server redis.conf 
> done

[root@localhost redis6006]# ps -ef |grep redis
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]# redis-cli -p 6001 -c
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]# redis-cli -p 6002 -c
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> 

おすすめ

転載: blog.csdn.net/xiaobai316/article/details/121287073