聊聊redis的主从复制吧
- 聊聊基础概念
主从复制与主从替换
主从复制不同于主从替换,主从复制是正常情况下主节点同步数据到从节点;主从替换是主节点挂了之后,把从节点替换为主节点;
从节点存在的意义:备份主节点数据+负载均衡(对外提供可读操作)
从节点配置主节点的信息(两种方式):
1、临时配置:启动从节点的redis-cli执行命令【slaveof host port】,host是主节点的ip,port是主节点的端口号,结果总是返回ok
2、永久配置:进入redis.conf,添加【slaveof host port】到文件中
runid和offset
runid:每个redis在启动或重启时都会生成一个唯一的runid;
offset:主从节点都有自己的主从复制偏移量,主节点复制数据到从节点时,从节点的偏移量的offset=原始offset+命令数据长度,同时从节点会把'从offset'发给主节点,所以主节点会同时保存'主offset'和'从offset',主节点可以通过判断'主offset'是否等于'从offset'来判断主从是否一致
backlog:是一个复制积压缓冲区,最大1M,主从同步的整个过程中主节点还会被外界写入数据,所以在主从同步进行时,主节点会把这些外部写入的'命令数据'保存一份备份到backlog,在主从同步完rdb文件后,主节点还需要同步缓存中的这些'命令数据'给到从节点(或者在'命令数据'因网络问题丢失后,主节点也可以从backlog中复制备份的数据重新同步到从节点)
主从复制的过程
主从复制默认使用rdb文件的原因?
(1)rdb文件是二进制文件比较小,所以主节点向磁盘写入rdb的I/O效率以及主节点传输rdb文件给从节点的效率都比aof文件高
(2)rdb文件是二进制文件比较小,所以从节点写入rdb文件恢复数据的效率也比aof文件高全量复制的过程?
(1) 一开始从节点执行【slaveof host port】命令,查找网络上的主节点,找到后发送ping给主节点,主节点返回pong,这样双方就建立了连接关系,建立了连接关系后就可以进行数据的复制了
(2) 从节点发送【psync ? -1】给主节点,'?'是因为从节点第一次不知道主节点的runid所以用?代替,-1表示从节点自己的偏移量(首次主从复制固定为-1)
(3) 主节点收到-1后知道这是第一次主从复制,返回【funllresync 主runid 主offset】给从节点,从节点收到后保存在自己的信息中
(4) 主节点发完fullresync命令后马上执行bgsave命令生成rdb文件(rdb保存在磁盘中、由redis主线程分出一个子线程执行bgsave),然后把rdb文件传送给从节点
(5) 主节点在执行bgsave命令和发送rdb文件给从节点的时候,还会被外界写入数据(简称'命令数据'),主节点会将这些'命令数据'保存一份到backlog缓冲区中,同步完rdb文件后就会继续同步缓冲区中的这些'命令数据'
(6) 从节点收到rdb文件后会先清空本地内存数据再加载rdb文件数据到本节点,加载完后再执行主节点推过来的'命令数据'相应的命令('命令数据'其实就是一些写命令)
- 增量复制的过程?
- 什么时候才会需要增量复制:在主从同步的整个过程中,所有的命令都可能发生网络中断的情况,这时候就需要增量同步。
- 过程:
不管在什么时候主节点都会将'写命令'记录在一个叫 repl_backlog_buffer的缓冲区中,该缓冲区是一个环形数组【在执行bgsave的时候写命令也会写入全量复制中的backlog,故此时会同时将写命令记录在这两个缓冲区】
-->
主节点在repl_backlog_buffer上用偏移量'主offerset'记录写命令的偏移量(上面全量复制中的'主offerset'就是这个值,理论上应为repl_backlog_buffer中最新的数据位置)
-->
从节点也有自己主从同步过程中最新数据的位置偏移'从offerset',理论上这两个偏移值是相同的,但是在网络中断时,可能'主offerset'>'从offerset'
-->
此时进行增量复制:从节点先发送【psync 主runid 从offset】给主节点,主节点收到后先判断该'主runid'是否是自身,若是则再去"repl_backlog_buffer缓冲区"中判断'从offset'偏移量之后的'写命令'数据是否存在,存在则先发送【continue】命令给从节点,然后发送 '从offset'~'主offset' 之间的写命令数据同步给从节点
聊聊redis的主从复制吧的更多相关文章
- 聊聊redis实际运用及骚操作
前言 聊起 redis 咱们大部分后端猿应该都不陌生,或多或少都用过.甚至大部分前端猿都知道. 数据结构: string. hash. list. set (无序集合). setsorted(有序集合 ...
- 跟随杠精的视角一起来了解Redis的主从复制
不想弹好吉他的撸铁狗,都不是好的程序猿 虽然说单机的Redis性能很好,也有完备的持久化机制,那如果你的业务体量真的很大,超过了单机能够承载的上限了怎么办?不做任何处理的话Redis挂了怎么办?带着这 ...
- redis的主从复制配置
redis的主从复制配置 一. 原理 Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架 ...
- Redis总结(三)Redis 的主从复制
接着上一篇,前面两篇我总结了<Redis总结(一)Redis安装>和<Redis总结(二)C#中如何使用redis> 所以这一篇,会讲讲Redis 的主从复制以及C#中如何调用 ...
- 实现Redis的主从复制配置
实现Redis的主从复制配置比较简单,而且容易明白. 下图是要配置的主从复制结构图: 1.说明 Redis主从复制中一个主服务可以有多个从服务,一个从服务可以有多个从服务. 配置比较简单,只需要更改r ...
- redis的主从复制部署和使用
reids一种key-value的缓存数据库目前非常流行的被使用在很多场景,比如在数据库读写遇到瓶颈时缓存且读写分离会大大提升这块的性能,下面我就说说redis的主从复制 首先需要启动多个redis实 ...
- redis实现主从复制-单机测试
一.redis实现主从复制-单机测试1.安装redis tar -zxvf redis-2.8.4.tar.gzcd redis-2.8.4make && make install2. ...
- 8. redis的主从复制和sentinal
一. redis主从复制(读写分离) redis的主从复制分为两类节点:1个master和多个slave,master进行读写操作,slav进行只读操作 启动步骤: 主节点照常启动,slave节点启动 ...
- Redis基础学习(五)—Redis的主从复制
一.概述 Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中.让从服务 ...
随机推荐
- 网络编程-Python的netaddr库
In [1]: from netaddr import * In [2]: ip = IPAddress('172.16.100.39') ip.format()ip地址的格式化 '172.16. ...
- 什么是GUI?
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面.图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠 ...
- 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
对. 因为equals()方法可以用开发者重写,hashCode()方法也可以由开发者来重写,因此它们是否相等并没有必然的关系. 如果对象要保存在HashSet或HashMap中,它们的equals( ...
- AOP 有哪些实现方式?
实现 AOP 的技术,主要分为两大类: 静态代理 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类, 因此也称为编译时增强: 编译时编织(特殊编译器实现) 类加载时编织( ...
- Redis 如何设置密码及验证密码?
设置密码:config set requirepass 123456 授权密码:auth 123456
- Effective Java —— 消除过期的对象引用
本文参考 本篇文章参考自<Effective Java>第三版第七条"Eliminate obsolete object references" Memory leak ...
- Day 19: EmberJS 入门指南
编者注:我们发现了有趣的系列文章<30天学习30种新技术>,正在翻译,一天一篇更新,年终礼包.下面是第19天的内容. 到目前为止,我们这一系列文章涉及了Bower.AngularJS.Gr ...
- HTML5标签速查
HTML5标签速查,助你快速了解HTML 5. HTML 5新加入的标签以黑体标识,HTML 5不支持的以斜体标识. 标签 描述 <!--...--> 评论 <!DOCTYPE> ...
- C#编写程序,用 while 循环语句实现下列功能
编写程序,用 while 循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这篮鸡蛋至少有多少个. 代码: using Sys ...
- 【Android开发】APP桌面角标问题
Demo:https://github.com/baitutang1221/BadgeNumberManager 参考:https://juejin.im/post/59f2e59751882578c ...