聊聊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中.让从服务 ...
随机推荐
- Jpa 自定义@Query查询总结
第一种方式 能够请求,,返回数据为 不带字段 第二种方式 报错 第三种方式 正确 总结:如果返回 List<TbRegionDO> 不能 有as存在 ,,只能查询所有 select s ...
- 说说has a与is a的区别?
is a是典型的"一般到特殊"的关系,也就是典型的继承关系.例如Apple is a Fruit.那么Apple是一种特殊的Fruit,也就是说Apple继承了Fruit. has ...
- 如何在 Mac 上强制退出 App
同时按住三个按键:Option.Command 和 Esc (Escape) 键.或者,从屏幕左上角的苹果菜单 中选取"强制退出".(这类似于在 PC 上按下 Control- ...
- 用TLS/SSL保证EMQ的网络传输安全
作为基于现代密码学公钥算法的安全协议,TLS/SSL能在计算机通讯网络上保证传输安全,EMQ的MQTT broker支持TLS,也可以用这种方式来确保传输安全. 参考官网:https://www.em ...
- JS字符串格式化
//字符串格式化String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+) ...
- elasticsearch 的倒排索引是什么 ?
面试官:想了解你对基础概念的认知. 解答:通俗解释一下就可以. 传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置. 而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表 即 ...
- LVS 工作图
一.工作模式 1.NAT模式 -----主要是修改目标IP地址为RS的IP地址.即请求进入负载均衡器时做DNAT,响应出负载均衡器时做SNAT. 工作方式: 1)客户端请求网站,经过路由器到达负载均衡 ...
- 顺利通过EMC实验(12)
- 我的python学习记_03
数据类型 python中的数据类型包括:1.数字类型number:整型int(即整数) 浮点型float(小数形式,整数的话后面加".0") 布尔型(判断正确与否) 复数型(com ...
- python-计算素数和
本题要求计算输入两个正整数x,y(x<=y,包括x,y)素数和.函数isPrime用以判断一个数是否素数,primeSum函数返回素数和. 输入格式: 输入两个整数. 输出格式: [m-n]间的 ...