一、作用

  • slave会通过被复制同步master上面的数据,形成数据副本

  • 当master节点宕机时,slave可以升级为master节点承担写操作。

  • 允许有一主多从,slave可以承担读操作,提高读性能,master承担写操作。即达到读写分离

二、简单性质

  • 一个master可以有多个slave

  • 每个slave只能有一个master

  • 每个slave也可以有自己的多个slave

  • 数据流是单向的,从master到slave

三、创建主从的方式

1.slaveof命令

#在希望成为slave的节点中执行以下命令
slaveof ${masterIP} ${masterPort}

此过程会异步地将master节点中的数据全量地复制到当前节点中

2.通过配置实现

配置项 含义
salveof ${masterIP} ${masterPort} 设置当前节点作为其他节点的slave节点
slave-read-only yes 设置当前slave节点是只读的,不会执行写操作

3.取消主从的方式

#在不希望作为slave的节点中执行以下命令
salveof no one

执行完成之后,该节点的数据不会被清除。而是不会再同步master中的数据

4.查看当前节点是否主从

info replication

run_id与偏移量

1.run_id

run_id是Redis 服务器的随机标识符,用于 Sentinel 和集群,服务重启后就会改变;

当slave节点复制时发现和之前的 run_id 不同时,将会对数据进行全量同步。

查看runid

redis-cli -p 6379 info server | grep run
run_id:345dda992e5064bc80e01f96ea90f729b722b2ea

2.偏移量

通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

  • 参与复制的主从节点都会维护自身的复制偏移量。主节点(master)在处理完写命令后,会把命令的字节长度做累加记录,统计信息在info replication中的master_repl_offset指标中。

  • 从节点每秒上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量

  • 从节点在接收到主节点发送的命令后,也会累加记录自身的偏移量。统计在info replication中的slave_repl_offset指标中

全量复制

一、全量复制流程

1.slave -> master : psync ? -1

  • ? 代表当前slave节点不知道master节点的runid

  • -1代表当前slave节点的偏移量为-1

2.master -> slave : +FULLRESYNC runId offset

  • master通知slave节点需要进行全量复制

  • runId:master发送自身节点的runId给slave节点

  • offset:master发送自身节点的offset给slave节点

3.slave : save masterInfo

  • slave节点保存master节点的相关信息(runId与偏移量)

4.master : bgsave

  • master节点通过bgsave命令进行RDB操作

###5.master -> slave : send RDB

  • master将bgsave完的RDB结果发送给slave节点

6.master -> slave : send buffer

  • master在执行写操作时,会将写命令写入repl_back_buffer中

  • 为了维护bgsave过程中执行的写操作命令,并同步给slave,master将期间的buffer发送给slave。

7.slave : flush old data

  • slave节点将之前的数据全部清空

8.load RDB

  • slave节点加载RDB

二、全量复制的开销

  • bgsave时间

  • RDB文件网络传输时间

  • slave节点清空数据时间

  • slave节点加载RDB的时间

  • 可能的AOF重写时间,当加载完RDB之后,如果开启了AOF重写,需要重写AOF,以保证AOF最新

三、全量复制的高版本优化

在redis4.0中,优化了psync,简称psync2,实现了即使redis实例重启的情况下也能实现部分同步

部分复制

一、部分复制流程

1.slave -> master : Connection lost

  • 由于网络抖动等原因,slave对master的网络连接发生中断

2.slave -> master : Connection to master

  • slave重新建立与master节点的连接

3.slave -> master : psync runId offset

  • slave节点发送master节点的runId以及自身的offset

4.master -> slave :CONTINUE

  • 在第③步中,master节点校验offset,在当前buffer的范围中,则将反馈从节点CONTINUE表示部分复制。

  • 如果offset不在当前buffer的范围中,则将反馈从节点FULLRESYNC表示需要全量复制

  • buffer的大小默认为1MB,由repl_back_buffer维护

5.master -> slave : send partial data

  • 发送部分数据给slave节点让slave节点完成部分复制

故障处理

一、slave宕机故障

  • 会影响redis服务的整体读性能,对系统可用性没有影响,将slave节点重新启动并执行slaveof即可。

二、master宕机故障

  • redis将无法执行写请求,只有slave节点能执行读请求,影响了系统的可用性

  • 方法1:

    • 随机找一个节点,执行slaveof no one,使其成为master节点

    • 然后对其他slave节点执行slaveof newMatserIp newMasterPort

  • 方法2:

    • 马上重启master节点,它将会重新成为master

开发与运维中的问题

一、读写分离

  • 含义:master只承担写请求,读请求分摊到slave节点执行

  • 可能遇到的问题

    • 复制数据延迟

      • 当写操作从master同步到slave的时候,会有很短的延迟

      • 当网络原因或者slave阻塞时,会有比较长的延迟

      • 在这种情况下,可以通过配置一个事务中的读写都在主库得已实现

      • 可以通过偏移量对这类问题进行监控

    • 读到过期数据(在v3.2中已经解决)

      • 删除过期数据的策略1:操作key的时候校验该key是否过期,如果已经过期,则删除

      • 删除过期数据的策略2:redis内部有一个定时任务定时检查key有没有过期,如果采样的速度比不上过期数据的产生速度,会导致很多过期数据没有被删除。

      • 在redis集群中,有一个约定,slave节点只能读取数据,而不能操作数据

    • 从节点故障

二、配置不一致

  • maxmemory不一致:可能会丢失数据

    • 例如master配置为4G,从节点配置为2G。

  • 数据结构优化参数(例如hash-max-ziplist-entries):导致内存不一致

三、规避全量复制

  • 第一次全量复制

    • 第一次不可避免

    • 小主节点(数据分片),低峰处理(夜间)

  • 节点运行ID不匹配

    • 主节点重启(运行ID变化)

    • 可以使用故障转移进行处理,例如哨兵或集群。

  • 复制积压缓冲区不足

    • 如果offset在缓冲区之内,则可以完成部分复制,否则需要全量复制

    • 可以增大复制缓冲区的大小:rel_backlog_size,默认1M,可以提升为10MB

四、规避复制风暴

1.单主节点复制风暴

  • 问题:主节点重启,多从节点复制

  • 解决:更换复制拓扑,由(m-s1,s2,s3)的模式改成(m-s1-s1a,s1b)的模式,可以减轻master的压力

2.单机器复制风暴

  • 如下图:机器宕机后,大量全量复制

  • 解决:主节点分散多机器

redis主从复制初识的更多相关文章

  1. [原]Redis主从复制各种环境下测试

    Redis 主从复制各种环境下测试 测试环境: Linux ubuntu 3.11.0-12-generic 2GB Mem 1 core of Intel(R) Core(TM) i5-3470 C ...

  2. NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索

    一.主从复制架构简介 通过前面几篇的介绍中,我们都是在单机上使用Redis进行相关的实践操作,从本篇起,我们将初步探索一下Redis的集群,而集群中最经典的架构便是主从复制架构.那么,我们首先来了解一 ...

  3. 【转】 NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索

    一.主从复制架构简介 通过前面几篇的介绍中,我们都是在单机上使用Redis进行相关的实践操作,从本篇起,我们将初步探索一下Redis的集群,而集群中最经典的架构便是主从复制架构.那么,我们首先来了解一 ...

  4. redis+Keepalived实现Redis主从复制

    redis+Keepalived实现Redis主从复制: 环境:CentOs6.5Master: 10.10.10.203Slave:   10.10.10.204Virtural IP Addres ...

  5. 深入剖析 redis 主从复制

    主从概述 redis 支持 master-slave(主从)模式,redis server 可以设置为另一个 redis server 的主机(从机),从机定期从主机拿数据.特殊的,一个 从机同样可以 ...

  6. 谈谈redis主从复制的重点

    Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝.下面是关于Redis主从复制的几点重要内容: Redis使用异步复制.但从Redis 2.8开始,从服务器会周期性的应答从复制流 ...

  7. 配置Redis主从复制

    [构建高性能数据库缓存之redis主从复制][http://database.51cto.com/art/201407/444555.htm] 一.什么是redis主从复制? 主从复制,当用户往Mas ...

  8. Redis主从复制及状态监测

    参考链接:http://www.cnblogs.com/morvenhuang/p/4184262.html #配置redis主从复制: #安装redis- master slave #修改slave ...

  9. Redis主从复制(Master/Slave)

    Redis主从复制(Master/Slave) 修改配置文件 拷贝多个redis.conf文件分别配置如下参数: 开启daemonize yes pidfile port logfile dbfile ...

随机推荐

  1. psexec局域网执行远程命令

    执行远程命令的工具psexec.exe 下载 一.首先,被控制机器必须开启ipc$,以及admin$,否则无法执行 开启ipc$ net share IPC$ 开启admin$ net share A ...

  2. saltstack运维工具

    salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会进行大量的重复性操作,例如安装软 ...

  3. Python学习日记(七)——装饰器

    1.必备知识 #### 一 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 二 #### def foo(): print ' ...

  4. JavaScript Call函数原理

    call原理分析,一定要看最后的例子. 1.call使用例子 function add(c, d) { return this.a + this.b + c + d; } , b: }; consol ...

  5. 分布式系统的应用程序性能监视工具,专为微服务、云本机架构和基于容器(Docker、K8s、Mesos)架构而设计。 SkyWalking

    Apache SkyWalking™ | SkyWalking Teamhttp://skywalking.apache.org/zh/ Application performance monitor ...

  6. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_13.RabbitMQ研究-工作模式-header和rpc工作模式

    header模式 header模式与routing不同的地方在于,header模式取消routingkey,使用header中的 key/value(键值对)匹配 队列. 案例: 根据用户的通知设置去 ...

  7. 升级系统中的java到1.8版本

    (1).安装或升级java,并配置环境变量 注意:此处分为yum安装与rpm安装,区别在于yum安装省事但配置麻烦,rpm安装麻烦但配置省事. 1)yum安装 在安装前可以使用yum list ins ...

  8. tomcat 8.xxx ssl使用websocket Failed to close the ServletOutputStream connection cleanly

    报错: 2019-09-17 10:30:17.277 default [https-jsse-nio-8110-exec-20] INFO o.a.t.w.s.WsRemoteEndpointImp ...

  9. 灵活配置tomcat根目录网站

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...

  10. LODOP设置纸张无效问题

    有的打印机不支持自定义纸张,或不支持当前设置的纸张尺寸,会造成纸张尺寸和代码里设置的尺寸不一致的情况.现象:1.代码一样,纸张语句设置正确,有的打印机纸张正常,有的打印机不正常.2.代码一样,纸张语句 ...