Redis学习笔记(二) - 主从复制
概述
指将一台redis服务器上的数据,复制到其他redis服务器上,前者称为主服务器(master),后者称为从服务器(slave)。
- 默认情况下主从关系为一对多关系。
- 数据复制是单向的,只能从主服务器到从服务器。
作用
1、数据备份:是持久化之外的一种数据备份手段。
2、负载均衡:配合主从读写分离分担单点服务器负载压力,提高redis服务器并发量。
3、高可用基础:是哨兵和集群实施的基础。
开启主从复制
1、配置文件:从服务器配置中加入 slaveof <masterip> <masterport>
2、启动命令:从服务器启动命令 redis-server 后追加 --slaveof <masterip> <masterport>
3、直接使用命令:slaveof <masterip> <masterport>,则该redis实例变为从节点
命令 info replication 可查看复制相关状态。
关闭复制
从节点执行 slaveof no one ,则会断开与主节点复制关系。
其他配置
- 安全性:
安全性考虑,可以为主节点配置requirepass密码。从节点配置masterauth与主节点密码一致
- 从节点只读性
数据复制是单向的,为避免从节点写数据导致主从数据不一致,从节点设置为只读模式slave-read-only yes
- 数据传输延迟
repl-disable-tcp-nodelay no ,默认关闭传输延迟。关闭时,延迟小,但相对耗带宽,适用网络环境良好情况。开启时,主节点合并较小的数据包而节省带宽,但主从延迟增大,适用网络环境复杂带宽紧张情况。
主从复制流程
1、主从连接准备,包括socket连接,socket检查,身份校验等
2、数据同步,从节点发送复制命令psync,主节点接受命令执行bgsave,将RDB文件发送给从节点
3、命令传播,主节点将执行的写命令持续传播给从节点,保持数据一致
数据同步:
1、全量复制:
- 主节点数据一次性全部发送给从节点。
- 从节点发起命令 psync ? -1。
- 复制过程中,主节点会将新的写命令追加到复制缓冲区,待RDB文件传输完毕后,继续传输该缓冲区的写命令,最后从服务器执行这些写命令,保证主从数据一致。
- 全量复制主节点需要进行RDB持久化,该过程比较耗cpu、内从、硬盘资源。
- 主从传输RDB文件,耗宽带。
- 从节点清空旧数据,载入新RDB的过程是阻塞的,此间无法响应客户端命令。
2、部分复制
- 从服务器发起命令psync <runid 服务器运行ID> <offse 复制偏移量>
- 一般用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销。
部分复制要素
1、服务器运行ID
- 每台redis服务器在启动时都会随机生成一个ID作为标识,可通过info server查看run_id。
- 建立主从关系时,主节点会将自己的run_id发送给从节点,从节点保存该ID,在断线重连时从节点将该ID发送给主节点。
- 主节点根据从节点发来的run_id判断复制方式,如果run_id与自己的run_id相同,说明之同步过,主节点会尝试用部分复制(具体能否部分复制还要看offset和复制积压缓冲区情况)。如果不同,说明之前没有同步过,这时只能进行全量复制。
2、复制偏移量
- 主送双方分别保存自己的复制偏移量,主节点每发送/送节点接受N个字节,自己的偏移量加N。通过主从偏移量比较就可以确定双方数据是否一致。
- 主节点发现从节点发来的offset与自身的不一致,会从自己的复制积压缓冲区查找是否有该偏移量之后的数据,若有就给从节点发送+CONTINUE表示可以进行部分复制。
3、复制积压缓冲区
- 复制积压缓冲区是一个固定长度的FIFO(先进先出的存储器),当主从关系建立时被创建,之后主节点的响应命令时,额外会将命令写入该缓冲区。
- 缓冲区大小repl-backlog-size可配置,正确的估算和配置该缓冲区大小,可避免主节点执行全量复制
- repl-backlog-size = 服务断开重连时间 * 每秒写入数据量
命令传播
- 该阶段主节点除了向从节点发送写命令,主从之间还维持心跳机制
- 主节点向从节点发送ping命令,判断从节点连接状态,可配置发送频率 repl-ping-slave-period,默认每10秒
- 从节点每1秒向主节点发送 replconf ack{offset} 命令,发送自身偏移量,检查数据完整性,如果从节点丢数据,再从主节点复制积压缓冲区拉去糗事的数据。replconf ack命令还起到检测主从网络装态作用,主节点可通过 info replaction 命令查看延迟lag值,表示距离上次接受命令的时间间隔。
- 主节点通过min-slaves-to-write、min-slaves-max-lag 保证主节点在不安全的情况下不执行写命令。如果从节点数量小于min-slaves-to-write,或所有从节点延迟指都大于min-slaves-max-lag,则主节点拒绝所有写命令
- 配置repl-timeout,超时判断阈值,应明显大于repl-ping-slave-period,否则很容易判断为超时
Redis学习笔记(二) - 主从复制的更多相关文章
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
- Redis学习笔记二
学习Redis添加Object时,由于Redis只能存取字符串String,对于其它数据类型形容:Int,long,double,Date等不提供支持,因而需要设计到对象的序列化和反序列化.java序 ...
- redis 学习笔记二 (简单动态字符串)
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...
- Redis学习笔记10--Redis主从复制
redis主从复制配置和使用都非常简单.通过主从复制可以允许多个slave server拥有和master server相同的数据库副本.下面是关于redis主从复制的一些特点: 1.ma ...
- StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...
- redis 学习笔记二
redis启动: 直接 redis-server.exe 启动服务,是按照redis默认配置启动的,如果想按照自己的配置文件启动,要加上 redis-server.exe redis.windows ...
- redis学习笔记(二)——java中jedis的简单使用
redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...
- Redis学习笔记二:单机数据库的实现
1. 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个r ...
- 2019/1/10 redis学习笔记(二)
本文不涉及集群搭建操作 关于在lua脚本中操作redis的应用场景 大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们jav ...
随机推荐
- 微信小程序的小问题(2)
1.在小程序中,有时需要用到背景图片,但是如果使用background-image的话,就无法控制图片的大小,background-image一般用于将图片压缩为1像素的背景图片,然后自动填充铺满.使 ...
- POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的鸟瞰图 推断这些矩形框的堆叠顺序 每一个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像 仅仅是这个要打印全部的可行 ...
- 十分钟学会canvas
一句话描述:canvas是HTML5加入的用来绘制2D图像与文字的元素. 基础 简单步骤: var c = document.getElementById("mycanvas"); ...
- OST
爱情的条件 http://music.163.com/#/album?id=531414 kill me heal me http://music.163.com/#/album?id=3104890
- android service--delphixe 10.3
开发中的陷阱: 1. 别放什么 *.wav文件,这个 服务窗口不能随便放东西,不然铁定出现意想不到的结果,比如 无法运行,因为没 ui界面,随意都不知是啥问题. 2. 不能加载 datamodule ...
- git上
## 建立本地版本库 ## 本地版本库与远程关联 ## 修改文件并提交 ## 创建分支,修改文件合并至master 1. git的由来 linux系统是很多开发者贡献代码不断完善的,linux的创始人 ...
- Hadoop Hive概念学习系列之Hive里的2维坐标系统(第一步定位行键 -> 第二步定位字段)(二十三)
HBase里的4维坐标系统(第一步定位行键 -> 第二步定位列簇 -> 第三步定位列修饰符 -> 第四步定位时间戳) HBase里的4维坐标系统(第一步定位行键 ...
- nginx单机1w并发设置
关闭keep-live,提高链接回收 keeplive_timeout 0; events{ worker_connections 1024; } more /proc/sys/net/core/so ...
- Django学习案例一(blog):三. 模型生成数据
1. 什么是模型models Django中以创建类的形式来创建数据表. 在编写代码的过程中,所有对数据库的操作,都是对类和类的对象进行操作. ORM对象关系映射(Object relation ma ...
- (转)Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. ...