redis集群的部署

发布于:2025-07-16 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一、概述

1.1、集群模式

1.2、集群特点

1.3、集群工作方式

1.3.1、数据存取工作方式

1.3.2、集群工作方式

二、7001-7006 端口 Redis 集群(伪分布式redis集群)

2.1、节点规划

2.2、核心配置(redis.conf)

2.3、集群初始化

2.4、数据存储逻辑(哈希槽)

2.5、集群部署

2.5.1、创建redis集群节点

2.5.2、 启动集群节点

2.5.3、 查看是否启动成功

2.5.4、 创建集群

2.5.5、 查看集群

三、分布式redis集群

3.1、redis主从复制

3.2、redis集群 

3.3、redis哨兵模式


一、概述

1.1、集群模式

Redis 的哨兵和主从模式基本已经可以实现高可用和读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,浪费内存空间,所以在redis上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说Redis 节点上存储不同的内容

1.2、集群特点

多个redis节点网络互联,数据共享

所有的节点都是一主一从(也可以是一主多从),其中从节点不提供服务,仅作为备用

不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为

支持在线增加、删除节点

客户端可以连接任何一个主节点进行读写

1.3、集群工作方式

1.3.1、数据存取工作方式

在 Redis 的每一个节点上,都有这么两个东西,一个是插槽(slot),一个是cluster。

插槽的取值范围是:0-16383。cluster,可以理解为是一个集群管理的插件。

当我们的存取 Key的时候,Redis 会根据算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

1.3.2、集群工作方式

为了保证高可用,redis集群模式引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。

那么如何发现主节点宕机?当其它主节点ping一个主节点C时,如果半数以上的主节点与C通信超时,那么认为主节点C宕机了。如果主节点C和它的从节点C1都宕机了,那么该集群就无法再提供服务了。

二、7001-7006 端口 Redis 集群(伪分布式redis集群)

2.1、节点规划


伪分布式:6 个节点全部署在 192.168.56.101/103 单台机器,用不同端口(7000 - 7005)区分,生产建议至少 3 台机器(每台 1 主 1 从,避免单机故障全挂)。
角色分工:3 主(7000、7001、7002)+ 3 从(7003、7004、7005),从节点是主节点的 “备胎”,主挂了从顶上。


2.2、核心配置(redis.conf)


cluster-enabled yes:开启集群模式,节点间会自动发现、通信。
cluster-config-file nodes-7000.conf:记录集群拓扑(主从关系、槽位分配),自动生成,别手动改。
cluster-node-timeout 5000:节点超时检测时间,主节点故障后,超过此时间从节点会尝试切换为主。


2.3、集群初始化


Redis 4.x 及以前:依赖 Ruby 环境 + redis-trib.rb 脚本,手动装 Ruby、解决依赖(如 openssl-devel)后,执行创建命令分配槽位、主从关系。
Redis 5.x 及以后:内置 redis-cli --cluster 命令,无需 Ruby,直接初始化,更简单。

2.4、数据存储逻辑(哈希槽)


Redis Cluster 用 16384 个哈希槽(slot) 分散数据:

存数据时,Redis 对 key 做哈希运算 → 算出对应槽位。
槽位关联到具体主节点,数据就存到该节点。
示例:
7000 主节点:存 0 - 5460 号槽
7001 主节点:存 5461 - 10922 号槽
7002 主节点:存 10923 - 16383 号槽

2.5、集群部署

2.5.1、创建redis集群节点

进入opt目录,创建redis集群
cd /opt

创建集群目录
mkdir redis_cluster
cd redis_cluster

下载redis
wget http://download.redis.io/releases/redis-5.0.9.tar.gz

解压
tar -zxvf redis-5.0.9.tar.gz
cd redis-5.0.9

编译
make && make install
cd ..
cp -r redis-5.0.9 7001
cp -r redis-5.0.9 7002
cp -r redis-5.0.9 7003
cp -r redis-5.0.9 7004
cp -r redis-5.0.9 7005
cp -r redis-5.0.9 7006

修改redis配置文件
修改成对应的7001,7002,7003,7004,7005,7006
cd 7001
//清空redis.conf配置文件
cat /dev/null > redis.conf
vim redis.conf

添加以下内容:

# 如果是本地创建redis集群,可以使用127.0.0.1。如果是公网访问,需要注释掉bind选项
#bind 127.0.0.1
#端口,修改成对应的7001,7002,7003,7004,7005,7006
port 7001
# redis后台运行
daemonize yes
# 关闭保护模式
protected-mode no
# pidfile文件,修改成对应的7001,7002,7003,7004,7005,7006
pidfile /var/run/redis_7001.pid
# 开启集群
cluster-enabled  yes
# 集群的配置,修改成对应的7001,7002,7003,7004,7005,7006
cluster-config-file  nodes_7001.conf
# redis集群节点通信超时时间,默认15秒,可自行设置
cluster-node-timeout  15000
# aof日志开启  有需要就开启,它会每次写操作都记录一条日志
appendonly  yes
#数据目录,修改成对应的7001,7002,7003,7004,7005,7006
dir /opt/redis_cluster/7001/dataStore/
# 错误日志文件
logfile redis_log.log


创建所有节点目录
for i in {7001..7006}; do
  mkdir -p /opt/redis_cluster/$i/dataStore/
done

2.5.2、 启动集群节点

[root@host1 redis_cluster]# /opt/redis_cluster/7001/src/redis-server /opt/redis_cluster/7001/redis.conf

[root@host1 redis_cluster]# /opt/redis_cluster/7002/src/redis-server /opt/redis_cluster/7002/redis.conf

[root@host1 redis_cluster]# /opt/redis_cluster/7003/src/redis-server /opt/redis_cluster/7003/redis.conf

[root@host1 redis_cluster]# /opt/redis_cluster/7004/src/redis-server /opt/redis_cluster/7004/redis.conf

[root@host1 redis_cluster]# /opt/redis_cluster/7005/src/redis-server /opt/redis_cluster/7005/redis.conf

[root@host1 redis_cluster]# /opt/redis_cluster/7006/src/redis-server /opt/redis_cluster/7006/redis.conf

2.5.3、 查看是否启动成功

看见以下输出,说明6个节点全部启动成功

[root@host1 redis_cluster]# ps -ef|grep redis
root      22939      1  0 17:56 ?        00:00:00 /opt/redis_cluster/7001/src/redis-server *:7001 [cluster]
root      22945      1  0 17:56 ?        00:00:00 /opt/redis_cluster/7002/src/redis-server *:7002 [cluster]
root      22958      1  0 17:56 ?        00:00:00 /opt/redis_cluster/7003/src/redis-server *:7003 [cluster]
root      22963      1  0 17:56 ?        00:00:00 /opt/redis_cluster/7004/src/redis-server *:7004 [cluster]
root      22968      1  0 17:56 ?        00:00:00 /opt/redis_cluster/7005/src/redis-server *:7005 [cluster]
root      22974      1  0 17:56 ?        00:00:00 /opt/redis_cluster/7006/src/redis-server *:7006 [cluster]
root      22979  18421  0 17:57 pts/0    00:00:00 grep --color=auto redis

2.5.4、 创建集群

1.仅本地访问(如服务器内部使用)
用 127.0.0.1:
此时集群节点间通信和客户端访问都限制在本机,外部无法通过网络访问,适合测试或单机内部使用。
命令示例:
bash
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


2. 公网访问(如跨服务器、外部客户端访问)
必须用公网 IP:
若集群需要被外部机器(非本机)访问,初始化时必须指定 节点的公网 IP(而非 127.0.0.1 或内网 IP)。
原因是:Redis 集群会将初始化时使用的 IP 写入节点配置(nodes-xxxx.conf),客户端连接时会从集群获取节点 IP,如果是内网 IP,外部客户端无法识别,导致访问失败
redis-cli --cluster create 公网ip:7001 公网ip:7002 公网ip:7003 公网ip:7004 公网ip:7005 公网ip:7006 --cluster-replicas 1

2.5.5、 查看集群

# 连接任意节点(如 7001)
redis-cli -c -h 127.0.0.1 -p 7001
# 查看集群节点信息
cluster nodes

三、分布式redis集群

3.1、redis主从复制

#主和备:
下载redis源码包
# 安装依赖,编译所需要的环境和编译器
yum install -y gcc gcc-c++ make
#拉取相应的包
wget https://download.redis.io/releases/redis-6.2.1.tar.gz
tar xzf redis-6.2.1.tar.gz  -C  /opt
cd /opt/redis-6.2.1
#创建安装目录
mkdir /usr/local/redis
#编译并安装到指定目录
make && make PREFIX=/usr/local/redis install
#执行服务安装脚本
cd /opt/redis-6.2.1/utils
vim  install_server.sh

#找到并注释下面的代码即可
#bail if this system is managed by systemd
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
#       echo "This systems seems to use systemd."
#       echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
#       exit 1
#fi

#启动
./install_server.sh

3.2、redis集群 

#回车四次,下一步需要手动输入
Please select the redis executable path   []   /usr/local/redis/bin/redis-server    
#创建软连接
ln -s /usr/local/redis/bin/* /usr/local/bin/

#修改配置文件,搭建redis主从同步
#修改Master节点Redis配置文件
# vim /etc/redis/6379.conf
bind 0.0.0.0                         # 修改bind 项,0.0.0.0监听所有网段
port:6379                           # 工作端口
protected-mode:no                   # 关闭保护模式
daemonize yes                       # 开启守护进程
logfile /var/log/redis_6379.log     # 指定日志文件目录
dir /var/lib/redis/6379             # 指定本地数据存放位置
appendonly yes                      # 开启AOF持久化功能
requirepass:root           # 设置 redis 连接密码
masterauth:root            # 设置slave 服务连接 master 的密码

/etc/init.d/redis_6379 restart  # 重启redis

#修改Slave节点Redis配置文件
# vim /etc/redis/6379.conf
bind 0.0.0.0                         # 修改bind 项,0.0.0.0监听所有网卡
port:6379                           # 工作端口
protected-mode:no                   # 关闭保护模式
daemonize yes                       # 开启守护进程
logfile /var/log/redis_6379.log     # 指定日志文件目录
dir /var/lib/redis/6379             # 指定本地数据存放位置
appendonly yes                      # 开启AOF持久化功能
requirepass:root           # 设置 redis 连接密码
masterauth:root            # 设置slave 服务连接 master 的密码
replicaof 192.168.157.19 6379            # 指定要同步的Master节点IP和端口

/etc/init.d/redis_6379 restart  # 重启redis
#在Master节点上验证从节点
redis-cli -a root

主节点: 

备节点:

3.3、redis哨兵模式

#修改 sentinel.conf 配置文件(所有节点操作)
vim /opt/redis-6.2.1/sentinel.conf           
# 最好复制一份到/etc/redis/sentinel.conf与redis主配置文件一起,方便管理
cp /opt/redis-6.2.1/sentinel.conf /etc/redis/sentinel.conf

pidfile /var/run/redis-sentinel.pid             #运行时PID文件
protected-mode no                               # 关闭保护模式
port 26379                                      # Redis哨兵默认的监听端口
daemonize yes                                   # 指定sentinel为后台启动
logfile "/var/log/sentinel.log"                 # 指定日志存放路径
dir "/var/lib/redis/6379"                       # 指定数据库存放路径

#监控的节点名字可以自定义,后边的2代表的:如果有俩个哨兵判断这个主节点挂了那这个主节点就挂了,通常设置为哨兵个数一半加一
# 指定该哨兵节点监控10.0.0.11:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 192.168.157.19 6379 2      
# 当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster root
#哨兵连接主节点多长时间没有响应就代表主节点挂了,单位毫秒。默认30000毫秒,30秒。
sentinel down-after-milliseconds mymaster 30000 
#在故障转移时,最多有多少从节点对新的主节点进行同步。这个值越小完成故障转移的时间就越长,这个值越大就意味着越多的从节点因为同步数据而暂时阻塞不可用
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间,这里设置为三分钟180000(180秒)
sentinel failover-timeout mymaster 180000   
#禁止使用SENTINEL SET设置notification-script和client-reconfig-script
sentinel deny-scripts-reconfig yes

#先主后从
redis-sentinel /etc/redis/sentinel.conf &

#主服务查看哨兵日志
tail -f /var/log/sentinel.log

#主服务查看哨兵信息
redis-cli -p 26379   info sentinel


网站公告

今日签到

点亮在社区的每一天
去签到