redis主从模式,redis哨兵模式,redis集群模式

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: redis主从模式,redis哨兵模式,redis集群模式

redis的安装

https://mp.csdn.net/console/editor/html/108639018

redis的四种模式  单机版、主从复制、哨兵、以及集群模式,其中单机版不用于生产环境。

主从模式(master-slaves)的作用

  • 做备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据 因为有备份,可以方便恢复。
  • 做负载均衡,所有客户端都访问一个节点肯定会影响 Redis 工作效率,有了主 从以后,查询操作就可以通过查询从节点来完成。

主从模式关于master的读写,和slaves的读:

  • 一个 Master 可以有多个 Slaves
  • 默认配置下,master 节点可以进行读和写,slave 节点只能进行读操作,写操作被禁止 不要修改配置让 slave 节点支持写操作,没有意义,原因如下
  • slave 写入的数据不会被同步到其 他节点
  • 当 master 节点修改同一条数据后,slave 节点的数据会被覆盖掉
  • slave 节点挂了不影响其他 slave 节点的读和 master 节点的读和写,重新启动后会将数 据从 master 节点同步过来
  • master 节点挂了以后,不影响 slave 节点的读,Redis 将不再提供写服务,master 节点 启动后 Redis 将重新对外提供写服务
  • master 节点挂了以后,不会从slave中重新选一个作为master

redis的主从配置

  • 创建一个目录存放主从配置的文件信息
mkdir master-slave
  • 做1个主机master,2个从机,总共3台机器
mkdir redis1 redis2 redis3
  • 此处使用的是redis-5.0.4版本, 将redis-5.0.4/src/redis-server 分别拷贝到 上述 redis1  redis2  redi3
cp redis-5.0.4/src/redis-server master-slave/redis1/
cp redis-5.0.4/src/redis-server master-slave/redis2/
cp redis-5.0.4/src/redis-server master-slave/redis3/
  • 分别在redis1  redis2   redis3 里面建立 redis.conf

redis.conf

#绑定任意ip地址
bind 0.0.0.0
#绑定端口 -- master port
port 8001
#log文件
logfile "8001.log"
#数据库
dbfilename "dump-8001.rdb"
#设置后台启动
daemonize yes
rdbcompression yes

将上述的redis.conf文件,分别放入 redis1  redis2  redi3 ,  其中redis1下的conf文件为 8001, redis2 下为8002,redis3下为8003

  • 将redis-cli 拷贝到 master-slave 下
root@qb:/usr/local/redis/master-slave# cp /usr/local/bin/redis-cli ../
  • 自己写一个start.sh脚本,放在master-slave下, 分别去启动 上述3个redis (一个是 master , 2个slave)

start.sh

#! /bin/bash
cd redis1
./redis-server redis.conf &
cd ../redis2
./redis-server redis.conf &
cd ../redis3
./redis-server redis.conf &
cd ../
  • 启动start.sh

验证效果,在redis1  master  所在8001的端口上设置一个key,如 set name xiaozhu,可以在8002,8003的slave中读取name的值

主从模式下,从机是不能写的,只能读

主从模式的缺点

  • master 节点挂了以后,redis 就不能对外提供写服务了,因为剩下的 slave 不能成为 master

这个缺点影响是很大的,尤其是对生产环境来说,是一刻都不能停止服务的,所以一般 的生产坏境是不会单单只有主从模式的,所以我们来看看哨兵模式

哨兵模式(redis sentinel)的作用

redis Sentinel 的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、 从切换。Redis 的 Sentinel 最小配置是一主一从。 Redis 的 Sentinel 系统可以用来管理多 Redis 服务器,该系统可以执行以下四个任务:

  • 监控

Sentinel 会不断的检查主服务器和从服务器是否正常运行

  • 通知

当被监控的某个 Redis 服务器出现问题,Sentinel 通过 API 脚本向管理员或者其他的应用 程序发送通知。

  • 自动故障转移

当主节点不能正常工作时,Sentinel 会开始一次自动的故障转移操作,它会将与失效主节点 是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。

  • 配置提供者

在 Redis Sentinel 模式下,客户端应用在初始化时连接的是 Sentinel 节点集合,从中获取主 节点的信息

 

redis sentinel工作流程

Sentinel 是 Redis 的高可用性解决方案:

由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及所有从 服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器 升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

  • Sentinel 负责监控集群中的所有主、从 Redis,当发现主故障时,Sentinel 会在所有选 一个成为新的主,。并且会把其余的从变为新主的从
  • 同时那台有问题的旧主也会变为新主的 从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从

redis的哨兵模式配置

  • 复制上述目录master-slave,命名为 sentinel
cp -rf master-slave sentinel
  • 进入sentinel目录,将 redis1   redis2   redis3 中的 redis.conf文件的端口分别改成 9001 , 9002 ,9003,如
cd sentinel/redis1
vim redis.conf

例如修改redis1 中的 redis.conf

bind 0.0.0.0
port 9001
logfile "9001.log"
dbfilename "dump-9001.rdb"
daemonize yes
rdbcompression yes
  • 将redis自带的 redis-sentinel 可执行程序拷贝到 redis1   redis2   redis3的目录下
root@qb:/usr/local/redis/sentinel#cp ../redis-5.0.4/src/redis-sentinel redis1/
root@qb:/usr/local/redis/sentinel#cp ../redis-5.0.4/src/redis-sentinel redis2/
root@qb:/usr/local/redis/sentinel#cp ../redis-5.0.4/src/redis-sentinel redis3/
  • 将redis的  sentinel.conf  配置文件 拷贝到 redis1   redis2   redis3的目录下
root@qb:/usr/local/redis/sentinel# cp ../redis-5.0.4/sentinel.conf redis1/
root@qb:/usr/local/redis/sentinel# cp ../redis-5.0.4/sentinel.conf redis2/
root@qb:/usr/local/redis/sentinel# cp ../redis-5.0.4/sentinel.conf redis3/
  • 修改redis1   redis2   redis3 下对应的 sentinel.conf ,设置 sentinel 的监控自身的端口为19001,且监控其他的master和slaves
root@qb:/usr/local/redis/sentinel# cd redis1/
root@qb:/usr/local/redis/sentinel/redis1# vim sentinel.conf
修改 sentinel.conf 内容如下
port 19001
sentinel monitor mymaster 192.168.1.8 9001 2
  • 修改start.sh启动脚本如下
#! /bin/bash
cd redis1
./redis-server redis.conf &
cd ../redis2
./redis-server redis.conf &
cd ../redis3
./redis-server redis.conf &
cd ../
cd redis1
./redis-sentinel sentinel.conf &
cd ../redis2
./redis-sentinel sentinel.conf &
cd ../redis3
./redis-sentinel sentinel.conf &
cd ..

启动脚本, ./start.sh

redis客户端程序 通过端口 19001 连接 :redis-cli -p 19001

连接后敲入 命令查看 当前master是哪一台:sentinel master mymaster

root@qb:/usr/local/redis/sentinel# redis-cli -p 19001
127.0.0.1:19001> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.1.8"
 5) "port"
 6) "9001"
 7) "runid"
 8) "56ae061d6377f8c6b97f2291cf56496f4e20bbc5"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "709"
19) "last-ping-reply"
20) "709"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "8640"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "28748"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "0"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:19001>

sentinel 模式基本可以满足一般生产的需求,具备高可用性。

在 Redis 高可用架构中,由于主和从切换角色这个过程比较复杂, 往往不是只有一个,而是有 3 个或者以上。目的是为让 其更加可靠,

当数据量过大到一 台服务器存放不下的情况时,主从模式或 sentinel 模式就不能满足需求了,这个时候需要 对存储的数据进行分片,将数据存储到多个 Redis 实例中,接下来我们看看集群

redis集群(cluster模式)

redis cluster 是 Redis 的分布式解决方案,在 3.0 版本推出后有效地解决了 redis 分布式 方面的需求。

自动将数据进行分片,每个 master 上放一部分数据。提供内置的高可用支持, 部分 master 不可用时,还是可以继续工作的支撑 N 个 redis master node,每个 master node 都可以挂载多个 slave node 高可用,因为每个 master 都有 salve 节点,

那么如果 mater 挂掉,redis cluster 这套机制,就会自动将某个 slave 切换成 master

redis集群模式配置

  • 创建目录redis-cluster
root@qb:/usr/local/redis# mkdir redis-cluster/
  • 创建 redis01 --- redis06
root@qb:/usr/local/redis/redis-cluster# mkdir redis01 redis02 redis03 redis04 redis05 redis06
  • 将redis-server  和 redis默认的 redis.conf 拷贝到 redis01 --- redis06
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis01/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis02/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis03/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis04/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis05/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis06/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis06/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis05/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis04/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis03/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis02/
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis01/
  • 修改   redis01 --- redis06 下的 redis.conf,分别修改端口为 7001 -- 7006,ip绑定程自己的ip(我的192.168.1.8),打开cluster 配置

例如,redis01下的redis.conf配置

bind 192.168.1.8
port 7001
cluster-enabled yes
  • 拷贝 redis-cli  和 start.sh 到 目录 redis-cluster
root@qb:/usr/local/redis/redis-cluster# cp ../master-slave/redis-cli ./
root@qb:/usr/local/redis/redis-cluster# cp ../master-slave/start.sh ./
  • 修改start.sh ,使用脚本启动redis01 --- redis06
#! /bin/bash
cd redis01
./redis-server redis.conf &
cd ../redis02
./redis-server redis.conf &
cd ../redis03
./redis-server redis.conf &
cd ../redis04
./redis-server redis.conf &
cd ../redis05
./redis-server redis.conf &
cd ../redis06
./redis-server redis.conf &
cd ../
  • 启动集群
redis-cli --cluster create 192.168.1.8:7001 192.168.1.8:7002 192.168.1.8:7003 192.168.1.8:7004 192.168.1.8:7005 192.168.1.8:7006 --cluster-replicas 1

操作后,可以看到如下效果,则说明集群建好了:

客户端连接进行测试

cluster 的出现是为了解决单机 Redis 容量有限的问题,将 Redis 的数据根据一定的规则 分配到多台机器。

对 cluster 的一些理解: cluster 可以说是 sentinel 和主从模式的结合体,通过 cluster 可以实现主从和 master 重选功能,所以如果配置两个副本三个分片的话,就需要六个 Redis 实例。 因为 Redis 的数据是根据一定规则分配到 cluster 的不同机器的,当数据量过大时,可以 新增机器进行扩容 这种模式适合数据量巨大的缓存要求,当数据量不是很大使用 sentinel 即可。

哨兵模式和redis集群模式的选型

1、使用哨兵模式的情况:如果数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个 G, 单机足够了 replication,一个 mater,多个 slave,要几个 slave 跟你的要求的读吞吐量有关系,然 后自己搭建一个 sentinal 集群,去保证 redis 主从架构的高可用性

2、使用redis cluster的情况:主要是针对海量数据+高并发+高可用的场景,海量数据,数据量很大。

 

 

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
21天前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
54 12
|
21天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
330 0
|
1月前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
275 2
|
2月前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
233 0
|
5天前
|
监控 NoSQL Redis
Redis的哨兵模式详解
Redis的哨兵模式详解
24 0
|
6天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
16 0
|
6天前
|
存储 NoSQL 算法
Redis 搭建分片集群
Redis 搭建分片集群
16 2
|
29天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
34 0
面试官:如何搭建Redis集群?
|
2月前
|
存储 NoSQL 前端开发
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—实战篇)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—实战篇)
11 0
|
2月前
|
存储 NoSQL 算法
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—上篇)(二)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—上篇)
30 0