Redis6.x学习笔记(四)复制
复制概述
Redis支持复制的功能,以实现当一台服务器的数据更新后,自动将新的数据异步同步到其它数据库。
Redis复制实现中,把数据库分为主数据库master和从数据库slave,主数据库可以进行读写操作,从数据库一般是只读的,当主数据库数据变化的时候,会自动同步给从数据库。
复制带来的好处
1:可以实现读写分离
2:利于在主数据库崩溃时的数据恢复
3:水平扩容支撑高并发
复制基本配置
主数据库不做配置;
从数据库需要在配置中设置“replicaof 主数据库ip 主数据库端口”
复制的基本操作命令
1:info replication :可以查看复制节点的相关信息
2:slaveof:可在运行期间修改slave节点的信息,如果该数据库已经是
某个主数据库的从数据库,那么会停止和原主数据库的同步关系,转而
和新的主数据库同步
3:slaveof no one:使当前数据库停止与其他数据库的同步,转成主数据库
复制部分的配置详解
1:replicaof :指定某一个redis作为另一个redis的从服务器,通过指定IP
和端口来设置主redis
2:masterauth:如果主redis设置了验证密码的话(使用requirepass来设置),
则在从redis的配置中要使用masterauth来设置校验密码,否则的话,主redis
会拒绝从redis的访问请求
3:replica-read-only:设置从Redis为只读
4:repl-ping-replica-period:设置从redis会向主redis发出PING包的周期,
默认是10秒
5:replica-serve-stale-data:设置当从redis失去了与主redis的连接,
或者主从同步正在进行中时,redis该如何处理外部发来的访问请求 。
如果设置为yes(默认),则从redis仍会继续响应客户端的请求。
如果设置为no,则从redis会对客户端的请求返回“SYNC with master in progress”,
当然也有例外,当客户端发来INFO请求和SLAVEOF请求,从redis还是会进行处理。
6:repl-timeout:设置主从同步的超时时间,要确保这个时限比
repl-ping-replica-period的值要大,否则每次主redis都会认为从redis超时。
7:repl-disable-tcp-nodelay:设置在主从同步时是否禁用TCP_NODELAY,
如果开启,那么主redis会使用更少的TCP包和更少的带宽来向从redis传输数据。
但是这可能会增加一些同步的延迟,大概会达到40毫秒左右。如果关闭,
那么数据同步的延迟时间会降低,但是会消耗更多的带宽。
8:repl-backlog-size:设置同步队列长度。队列长度(backlog)是主redis中的
一个缓冲区,在与从redis断开连接期间,主redis会用这个缓冲区来缓存应该发给
从redis的数据。这样的话,当从redis重新连接上之后,就不必重新全量同步数据,
只需要同步这部分增量数据即可
9:repl-backlog-ttl:设置主redis要等待的时间长度,如果主redis等了这么
长时间之后,还是无法连接到从redis,那么缓冲队列中的数据将被清理掉。
设置为0,则表示永远不清理。默认是1个小时。
10:replica-priority:设置从redis优先级,在主redis持续工作不正常的情况,
优先级高的从redis将会升级为主redis。而编号越小,优先级越高。当优先级
被设置为0时,这个从redis将永远也不会被选中。默认的优先级为100
11:min-replicas-to-write:设置执行写操作所需的最少从服务器数量,如果
至少有这么多个从服务器, 并且这些服务器的延迟值都少于 min-replicas-max-lag
秒, 那么主服务器就会执行客户端请求的写操作
12:min-replicas-max-lag:设置最大连接延迟的时间, min-replicas-to-write和
min-replicas-max-lag中有一个被置为0,则这个特性将被关闭。默认情况下
min-replicas-to-write为0,而min-replicas-max-lag为10
13: repl-diskless-sync:是否开启无盘复制,默认是no
14:repl-diskless-sync-delay:设置无盘复制延时开始秒数,默认是5秒,
意思是当PSYNC触发的时候,master延时多少秒开始向slave传送数据流,
以便等待更多的slave连接可以同时传送数据流,因为一旦PSYNC开始后,
如果有新的slave连接master,只能等待下次PSYNC。可以配置为0取消等待,立即开始
15:repl-diskless-load:是否使用无磁盘加载,这是个实验性的功能,目前
有三个选项:disabled:不要使用无磁盘加载,先将rdb文件存储到磁盘
on-empty-db:只有在完全安全的情况下才使用无磁盘加载swapdb:
解析时在RAM中保留当前DB内容的副本,直接从套接字获取数据。
复制的基本原理
1: slave启动时,会向master发送psync请求,如果这是slave重新连接master,那么master仅仅会复制给slave缺少的数据; 如果是第一次连接master,那么会触发一次全量复制
2:主数据库接到psync请求后,如果是全量复制,会在后台保存快照,就是实现RDB持久化,并将保存快照期间接收到的命令缓存起来
3:快照完成后,主数据库会将快照文件和所有缓存的命令发送给从数据库
4:从数据库接收后,会载入快照文件并执行缓存的命令,从而完成复制的初始化
5:如果是重新连接,Master会检查backlog里面的offset, master和slave都会保存一个复制的offset还有一个master id,offset是保存在backlog中的。Master只会把已经复制的offset后面的数据复制给Slave,类似断点续传。
6:在数据库使用阶段,主数据库会自动把每次收到的写命令同步到从服务器
7:Slave在复制的时候,不会阻塞Master的正常工作;也不会阻塞对自己的查询操作,它会用旧的数据集来提供服务; 但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
8:强烈建议:Master一定要持久化
乐观复制策略
Redis采用乐观复制的策略,容忍在一定时间内主从数据库的内容不同,当然最终的数据会是一样的。这个策略保证了性能,在复制的时候,主数据库并不阻塞,照样处理客户端的请求。
Redis提供了配置来限制只有当数据库至少同步给指定数量的从数据库时,主数据库才可写,否则返回错误。配置是:min-replicas-to-write、min-replicas-max-lag
无硬盘复制
Master直接创建一个子进程,来生成RDB文件的内容,并通过网络直接传送给Slave,也就是RDB文件不保存到磁盘上。
以前:当复制发生时,主数据库会在后台保存RDB快照,即使你关闭了RDB,它也会这么做,这样就会导致:
1:如果主数据库关闭了RDB,现在强行生成了RDB,那么下次主数据库启动的
时候,可能会从RDB来恢复数据,这可能是旧的数据。
2:由于要生成RDB文件,如果硬盘性能不高的时候,会对性能造成一定影响
因此从2.8.18版本,引入了无硬盘复制的功能。
异步复制导致的数据丢失
在主备切换的过程中,可能会导致数据丢失。因为数据复制是异步的,可能有部分数据还没复制到slave,master就宕机了,此时这些部分数据就丢失了
脑裂导致的数据丢失
脑裂:当某个master所在机器突然脱离了集群的网络,跟其他slave机器不能连接,
但是实际上master还运行着,此时哨兵可能会认为master宕机了,然后开启选举,
将其它slave切换成了master,这个时候,集群里就会有两个master,也就是所谓的脑裂。
这种情况下可能会产生数据丢失:
1:此时虽然某个slave被切换成了master,但是客户端可能还没来得及切换到
新的master,还继续向旧master写数据,这些数据可能就丢失了
2:当旧master再次恢复的时候,会被作为一个slave挂到新的master上去,
那么旧master原来的数据就会清空,重新从新的master复制数据
解决数据丢失的方式
配置min-replicas-to-write和min-replicas-max-lag两个参数,比如:
min-replicas-to-write 1
min-replicas-max-lag 10
要求至少有1个slave,数据复制和同步的延迟不能超过10秒
如果说一旦所有的slave,数据复制和同步的延迟都超过了10秒钟,
那么这个时候,master就不会再接收任何请求了
如果出现了脑裂,一个master跟其它slave丢了连接,那么上面两个配置可以确保说,如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己应答消息,那么就直接拒绝客户端的写请求
后记
我会持续的把我学习Redis6.x过程的笔记记录下来,跟大家一起学习。希望能坚持下去!
Redis6.x学习笔记(四)复制的更多相关文章
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Linux学习笔记(四) vi编辑器
一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- OGG学习笔记04-OGG复制部署快速参考
OGG学习笔记04-OGG复制部署快速参考 源端:Oracle 10.2.0.5 RAC + ASM 节点1 Public IP地址:192.168.1.27 目标端:Oracle 10.2.0.5 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
随机推荐
- 开源的 Switch 模拟器——GitHub 热点速览 v.21.12
作者:HelloGitHub-小鱼干 脸滚键盘操作选手小鱼干这里要推荐一个超酷 Switch 模拟器,不能埋没你的游戏天赋.Ryujinx 是一个 C# 写的 Switch 模拟器,1700+ 游戏可 ...
- Android Studio 报错:你的主机中的软件中止了一个已建立的连接
•解决方案 关闭电脑的移动热点 关闭后,build 就不会报错了. 等 build 好了后,重新打开移动热点,再次 build 一就不会报错.
- 用Python优雅的写出送给女儿的藏头诗
2016年迎来了我的小土匪,忙活了一年,在17年的4月加班的夜里因思念以小土匪的名字写了一首藏头发了朋友圈,不温不火,最近在看python,那么如何用python优雅的用写出这首诗了? 执行 代码 i ...
- Elasticsearch中最重要的文档CRUD要牢记
Elasticsearch文档CRUD要牢记 转载参考:https://juejin.im/post/5ddbf298e51d4523053c42e7 在Elasticsearch中,文档(docum ...
- 201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求链接 这个作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在哪些方面 ...
- MySQL数据库高级二:索引优化
索引优化非常的重要 1.预热 java开发 DBA培训很少,需要经验磨练 索引优化的效果非常好 左外连接 MySQL没有全连接 7种join一定要会写 具体见武林的例子 union的字段顺序要相同 6 ...
- Window下Python+CUDA+PyTorch安装
1 概述 Windows下Python+CUDA+PyTorch安装,步骤都很详细,特此记录下来,帮助读者少走弯路. 2 Python Python的安装还是比较简单的,从官网下载exe安装包即可: ...
- ssh+scp基本使用
1 ssh ssh一般用于连接服务器,可以使用密码认证与密钥认证的方式. 1.1 密码认证 直接使用ssh即可: ssh username@xxx.xxx.xxx.xxx username为用户名,后 ...
- SpringBoot开发秘籍 - 集成Graphql Query
概述 REST作为一种现代网络应用非常流行的软件架构风格受到广大WEB开发者的喜爱,在目前软件架构设计模式中随处可见REST的身影,但是随着REST的流行与发展,它的一个最大的缺点开始暴露出来: 在很 ...
- 2021年IT行业八大趋势预测
在新冠疫情的影响下,过去一年的IT行业产生着或多或少的变化.而今,2020年已走过一个季度,本文根据国内外一些调研机构的数据,整合了以下八条更适合国内的2021年IT行业趋势分析,希望能为相关决策者提 ...