Redis6 主从复制及哨兵机制的实现

目录
  • Redis 主从复制
    • 什么是主从复制
  • 主从配置
    • 主Redis配置
    • 从Redis配置
    • 实现原理
  • Redis 哨兵机制
    • 简介
    • 哨兵进程的作用
    • 故障判定原理分析
    • 自动故障迁移
    • 案例演示

Redis 主从复制

什么是主从复制

如果单机情况下,机器重启,内存数据丢失,如何保证数据的高可用呢?持久化方案
如果机器硬盘坏掉,如何保证数据的高可用呢?主从复制
Redis的主从机制:主负责读写,从一般只读不能写(客户端)。

持久化保证了即使 Redis 服务重启也不会丢失数据,因为 Redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 Redis 服务器的硬盘损坏了可能会导致数据丢失,不过通过 Redis 的主从复制
机制就可以避免这种单点故障,如下图:

说明:

主 Redis 中的数据有两个副本( replication )即从 redis1 和从 redis2 ,即使一台 Redis 服务器宕机其它两台 Redis 服务也可以继续提供服务。
主 Redis 中的数据和从 Redis 上的数据保持实时同步,当主 Redis 写入数据时通过主从复制机制会复制到两个从 Redis 服务上。
只有一个主 Redis ,可以有多个从 Redis 。
主从复制不会阻塞 master ,在同步数据时, master 可以继续处理 client 请求。
一个 Redis 可以即是主又是从,如下图:

主从配置

主Redis配置

无需特殊配置

从Redis配置

修改从服务器上的 redis.conf 文件:

# slaveof <masterip> <masterport>
# 表示当前【从服务器】对应的【主服务器】的IP是192.168.10.135,端口是6379。
slaveof 192.168.10.135 6379
replicaof 192.168.19.135 6379

实现原理

  • Redis 的主从同步,分为全量同步和增量同步。
  • 只有从机第一次连接上主机是全量同步。
  • 断线重连有可能触发全量同步也有可能是增量同步( master 判断 runid 是否一致)。
  • 除此之外的情况都是增量同步。

全量同步

Redis 的全量同步过程主要分三个阶段:

  • 同步快照阶段: Master 创建并发送快照给 Slave , Slave 载入并解析快照。 Master 同时将此阶段所产生的新的写命令存储到缓冲区。
  • 同步写缓冲阶段: Master 向 Slave 同步存储在缓冲区的写操作命令。
  • 同步增量阶段: Master 向 Slave 同步写操作命令。

增量同步

  • Redis 增量同步主要指 Slave 完成初始化后开始正常工作时, Master 发生的写操作同步到 Slave 的过程。
  • 通常情况下, Master 每执行一个写命令就会向 Slave 发送相同的写命令,然后 Slave 接收并执行。

Redis 哨兵机制

Redis 主从复制的缺点:没有办法对 master 进行动态选举,需要使用 Sentinel 机制完成动态选举。

简介

  • Sentinel (哨兵)进程是用于监控 Redis 集群中 Master 主服务器工作的状态
  • 在 Master 主服务器发生故障的时候,可以实现 Master 和 Slave 服务器的切换,保证系统的高可用( HA )
  • 其已经被集成在 redis2.6+ 的版本中, Redis 的哨兵模式到了 2.8 版本之后就稳定了下来。

哨兵进程的作用

  • 监控( Monitoring ): 哨兵( sentinel ) 会不断地检查你的 Master 和 Slave 是否运作正常。
  • 提醒( Notification ): 当被监控的某个 Redis 节点出现问题时, 哨兵( sentinel ) 可以通过API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移( Automatic failover ):当一个 Master 不能正常工作时,哨兵( sentinel )会开始一次自动故障迁移操作

故障判定原理分析

  • 每个 Sentinel (哨兵)进程以每秒钟一次的频率向整个集群中的 Master 主服务器, Slave 从服务器以及其他 Sentinel (哨兵)进程发送一个 PING 命令。
  • 如果一个实例( instance )距离最后一次有效回复 PING 命令的时间超过 down-after- milliseconds 选项所指定的值, 则这个实例会被 Sentinel (哨兵)进程标记为主观下线 ( SDOWN )。
  • 如果一个 Master 主服务器被标记为主观下线( SDOWN ),则正在监视这个 Master 主服务器的所有 Sentinel (哨兵)进程要以每秒一次的频率确认 Master 主服务器的确进入了主观下线状态。
  • 当有足够数量的 Sentinel (哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认 Master 主服务器进入了主观下线状态( SDOWN ), 则 Master 主服务器会被标记为客观下线 ( ODOWN )。
  • 在一般情况下, 每个 Sentinel (哨兵)进程会以每 10 秒一次的频率向集群中的所有Master 主服务器、 Slave 从服务器发送 INFO 命令。
  • 当 Master 主服务器被 Sentinel (哨兵)进程标记为客观下线( ODOWN )时, Sentinel (哨兵)进程向下线的 Master 主服务器的所有 Slave 从服务器发送 INFO 命令的频率会从 10秒一次改为每秒一次。
  • 若没有足够数量的 Sentinel (哨兵)进程同意 Master 主服务器下线, Master 主服务器的客观下线状态就会被移除。若 Master 主服务器重新向 Sentinel (哨兵)进程发送 PING 命令返回有效回复, Master 主服务器的主观下线状态就会被移除。

自动故障迁移

  • 它会将失效 Master 的其中一个 Slave 升级为新的 Master , 并让失效 Master 的其他 Slave 改为复制新的 Master ;
  • 当客户端试图连接失效的 Master 时,集群也会向客户端返回新 Master 的地址,使得集群可以使用现在的 Master 替换失效 Master 。
  • Master 和 Slave 服务器切换后, Master 的 redis.conf 、 Slave 的 redis.conf 和 sentinel.conf 的配置文件的内容都会发生相应的改变,即, Master 主服务器的 redis.conf配置文件中会多一行 slaveof 的配置, sentinel.conf 的监控目标会随之调换。

案例演示

修改从机的 sentinel.conf :

# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".- _"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节 点失联了
# sentinel monitor <master-name> <master ip> <master port> <quorum>
sentinel monitor mymaster 192.168.10.133 6379 1

其他配置项说明sentinel.conf

# 哨兵sentinel实例运行的端口 默认26379
port 26379
# 哨兵sentinel的工作目录
dir /tmp
# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组 成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点 失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都 要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步
# 这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。
# 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1

# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的 master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超 时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000

# SCRIPTS EXECUTION
# 配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮 件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执 行。

#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等 等),将会去调用这个脚本,
#这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正 常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。
#如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且 是可执行的,否则sentinel无法正常启动成功。

#通知脚本
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh

# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master 地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的 slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

通过 redis-sentinel 启动哨兵服务

./redis-sentinel sentinel.conf

到此这篇关于Redis6 主从复制及哨兵机制的实现的文章就介绍到这了,更多相关Redis6 主从复制及哨兵机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Redis之windows下主从复制案例讲解

    一般的主从复制功能最少是一主二从,我这里就以最低要求进行配置. 1.首先下去官网下载并安装redis 若安装成功点击redis-server  如此是成功 2.点击客户端redis-cli 连接客户端即可使用 3.新建7000.7001两个从redis  4.修改redis-windows.conf   (1)把端口修改成7000 (2)修改cluster-config-file的名字 以免和6379端口的名字重复其他配置默认即可,我个人认为我们都重新建了一个文件夹也不可能出现和6379重复的错

  • Redis主从复制详解

    单机Redis存在的问题 无法故障转移 ,无法避免单点故障 磁盘空间的瓶颈 QPS瓶颈 Redis主从复制的作用 提供数据副本 扩展读性能 配置方法 通过命令 通过配置文件 演示 为方便演示,在一台服务器上搭建redis主从(生产上不会这样做),根据端口区分. 主库 6379 从库 6380 编辑配置文件 vi  redis-6379.conf #后台进程启动 daemonize yes #端口 port 6379 #日志文件名称 logfile "6379.log" #Redis工作

  • Redis持久化与主从复制的实践

    为什么需要持久化 Redis是基于内存的NoSQL数据库,读写速度自然快,但内存是瞬时的,在redis服务关闭或重启之后,redis存放在内存的数据就会丢失,为了解决这个问题,redis提供了两种持久化方式,以便在发生故障后恢复数据. 持久化选项 redis提供了两种不同的持久化方式来将数据存储到硬盘中.一种是快照方式(也叫RDB方式),它可以将莫一时刻存在于redis中的所有数据存储到硬盘:另一种叫只追加文件(AOF)方式,它会定时的复制redis执行的所有写命令到硬盘.这两种持久化方式各有千

  • 详解Redis主从复制实践

    复制简介 Redis 作为一门非关系型数据库,其复制功能和关系型数据库(MySQL)来说,功能其实都是差不多,无外乎就是实现的原理不同.Redis 的复制功能也是相对于其他的内存性数据库(memcached)所具备特有的功能. Redis 复制功能主要的作用,是集群.分片功能实现的基础:同时也是 Redis 实现高可用的一种策略,例如解决单机并发问题.数据安全性等等问题. 服务介绍 在本文环境演示中,有一台主机,启动了两个 Redis 示例. 实现方式 Redis 复制实现方式分为下面三种方式:

  • Redis主从复制问题和扩容问题的解决思路

    一.解决主从复制问题 当使用Redis作为存储引擎的时候,并且使用Redis读写分离,从机作为读的情况,从机宕机或者和主机断开连接都需要重新连接主机,重新连接主机都会触发全量的主从复制,这时候主机会生成内存快照,主机依然可以对外提供服务,但是作为读的从机,就无法提供对外服务了,如果数据量大,恢复的时间会相当的长.为了解决Redis主从Copy的问题,有如下两个解决方案: 主动复制所谓主动复制,就是业务层双写多个Redis,避开Redis自带的主从复制.但是自己干同步,就会产生一致性问题,为了保证

  • 浅谈Redis主从复制以及主从复制原理

    面临问题 1. 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的.而数据是最重要的,如果你不在乎,基本上也就不会使用 Redis 了. 2. 容量瓶颈.当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了.当然,你可以重新买个 128G 的新机器. 解决办法 要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上.Redis 为了解决这个

  • Redis实现主从复制方式(Master&Slave)

    目录 主从复制方式(Master&Slave) 一.Master&Slave是什么? 二.它能干嘛? 三.怎么玩? 四.复制原理 五.哨兵模式(sentinel) 六.复制的缺点 Redis master, slave节点部署详解 主从复制方式(Master&Slave) 由于前段时间公司项目比较赶,一直抽不出时间写博客,今天偷空写一篇吧.前面给大家讲解了单机版redis的基本操作,现在继续给大家讲解一下Redis的进阶部分,主从复制和读写分离. 一.Master&Slav

  • Redis6 主从复制及哨兵机制的实现

    目录 Redis 主从复制 什么是主从复制 主从配置 主Redis配置 从Redis配置 实现原理 Redis 哨兵机制 简介 哨兵进程的作用 故障判定原理分析 自动故障迁移 案例演示 Redis 主从复制 什么是主从复制 如果单机情况下,机器重启,内存数据丢失,如何保证数据的高可用呢?持久化方案如果机器硬盘坏掉,如何保证数据的高可用呢?主从复制Redis的主从机制:主负责读写,从一般只读不能写(客户端). 持久化保证了即使 Redis 服务重启也不会丢失数据,因为 Redis 服务重启后会将硬

  • Redis 哨兵机制及配置实现

    目录 一.为什么 Redis 集群中要有哨兵机制 二.模拟主机挂掉之后,人工切换 三.哨兵机制的原理 四.哨兵机制的实现 一.为什么 Redis 集群中要有哨兵机制 Redis 主从复制有一个缺点,当 master 宕机以后,整个集群的写就会挂掉.因为 redis 本身是不会自动从 slave 中选举出新的 master 的. 我们理想的情况是:当 master 挂掉之后,可以有 slave 迅速补上,自动切换为 master,不影响整个服务. 基于此,引入了 Redis Sentinel(Re

  • 关于Redis的主从复制及哨兵问题

    目录 服务器配置 主从复制 哨兵 服务器配置 到这里关于redis的一些基本操作就学习完了,接下来我们就来看看redis中更加高级的部分,首先是配置文件中的配置信息. 配置项 说明 daemonize yes no bind 127.0.0.1 绑定主机地址 port 6379 设置服务器端口号 databases 16 设置数据库数量 loglevel debug verbose logfile 端口号.log 设置日志文件名 maxclients 0 设置同一时间最大客户端连接数,默认无限制

  • Redis哨兵模式实现一主二从三哨兵

    目录 一.redis环境: 二.哨兵介绍: 三.安装redis: 四.使用Redis主从复制的作用: 五.配置redis一主二从: 六.配置redis三哨兵: 一.redis环境: 环境:redis6.2.6linux虚拟机一台,contos7: 二.哨兵介绍: 1.一主二从三哨兵理论图: 一主两从三哨兵集群,当master节点宕机时,通过哨兵(sentinel)重新推选出新的master节点,保证集群的可用性. 2.哨兵的主要功能:1.集群监控:负责监控 Redis master 和 slav

  • 基于Docker搭建Redis一主两从三哨兵的实现

    这段时间正在学习Redis和容器相关的内容,因此想通过docker搭建一套redis主从系统来加深理解.看这篇文章可能你需要一定的docker基础,以及对redis主从和哨兵机制有所了解. 这次实验准备了三台云主机,系统为Debian,ip分别为: 35.236.172.131 , 35.201.200.251, 34.80.172.42. 首先分别在这三台主机上安装docker,然后每台主机上启动一个redis容器,运行redis-server服务,其中35.236.172.131作为mast

  • 硬核 Redis 高频面试题解析

    目录 1.Redis 是单线程还是多线程? 2.为什么 Redis 是单线程? 3.Redis 为什么使用单进程.单线程也很快 4.Redis 在项目中的使用场景 5.Redis 常见的数据结构 6.Redis 的字符串(SDS)和C语言的字符串区别 7.Sorted Set底层数据结构 8.Sorted Set 为什么同时使用字典和跳跃表? 9.Sorted Set 为什么使用跳跃表,而不是红黑树? 10.Hash 对象底层结构 11.Hash 对象的扩容流程 12.渐进式 rehash 的优

  • Redis集群的关闭与重启操作

    Redis集群关闭与重启 1.注意 [root@master bin]# ./redis-cli --cluster create 192.168.230.21:7001 192.168.230.21:7002 192.168.230.21:7003 192.168.230.21:8001 192.168.230.21:8002 192.168.230.21:8003 --cluster-replicas 1 -a 123456 上面的命令只能在新创健集群的时候执行一次,目的是为了建立内部各个节

  • 2021年最新Redis面试题汇总(3)

    目录 1.Redis 怎么保证高可用.有哪些集群模式 2.主从复制 ​3.哨兵 1)哨兵故障检测 2)哨兵故障转移流程 4.集群模式 ​5.集群选举 6.如何保证集群在线扩容的安全性?(Redis 集群要增加分片,槽的迁移怎么保证无损) 7.Redis 事务的实现 8.Redis 的 Java 客户端有哪些?官方推荐哪个? 9.Redis 里面有1亿个 key,其中有 10 个 key 是包含 java,如何将它们全部找出来? 10.使用过 Redis 做消息队列么? 11.Redis 和 Me

  • Redis 分片集群的实现

    目录 1 搭建分片集群 1.1 集群结构 1.2 准备实例和配置 1.3 启动 1.4 创建集群 1.5 测试 2 散列插槽 3 集群伸缩 3.1 创建节点并添加到集群 3.2 转移插槽 4 故障转移 4.1.自动故障转移 4.2 手动故障转移 5 RedisTemplate访问分片集群 1 搭建分片集群 主从和哨兵可以解决高可用.高并发读的问题.但是依然有两个问题没有解决: 海量数据存储问题,单个Redis节点对于数据的存储量是有上限的 高并发写的问题,高并发读的问题我们可以用主从集群来解决,

随机推荐