PSync

面试官:请讲一下Redis主从复制的功能及实现原理

你离开我真会死。 提交于 2021-02-04 16:11:20
摘要:Redis在主从模式下会有许多问题需要考虑,这里写了一些关于redis在多服务器下的一些问题分析和总结。 Redis单节点存在单点故障问题,为了解决单点问题,一般都需要对redis配置从节点,然后使用哨兵来监听主节点的存活状态,如果主节点挂掉,从节点能继续提供缓存功能。主从配置结合哨兵模式能解决单点故障问题,提高redis可用性。从节点仅提供读操作,主节点提供写操作。对于读多写少的状况,可给主节点配置多个从节点,从而提高响应效率。 主从复制过程: 从节点执行slaveof[masterIP][masterPort],保存主节点信息 从节点中的定时任务发现主节点信息,建立和主节点的socket连接 从节点发送Ping信号,主节点返回Pong,两边能互相通信 连接建立后,主节点将所有数据发送给从节点(数据同步) 主节点把当前的数据同步给从节点后,便完成了复制的建立过程。接下来,主节点就会持续的把写命令发送给从节点,保证主从数据一致性。 Redis的数据同步过程: redis2.8之前使用sync[runId][offset]同步命令,redis2.8之后使用psync[runId][offset]命令。 两者不同在于,sync命令仅支持全量复制过程,psync支持全量和部分复制。 介绍同步之前,先介绍几个概念: runId: 每个redis节点启动都会生成唯一的uuid

redis系统学习之主从复制的原理与注意事项

早过忘川 提交于 2020-12-09 16:43:25
前言 在前面的两篇文章中,分别介绍了 Redis的内存模型 和 Redis的持久化 。 在Redis的持久化中曾提到,Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。 这篇文章中,将详细介绍Redis主从复制的方方面面,包括:如何使用主从复制、主从复制的原理(重点是全量复制和部分复制、以及心跳机制)、实际应用中需要注意的问题(如数据不一致问题、复制超时问题、复制缓冲区溢出问题)、主从复制相关的配置(重点是repl-timeout、client-output-buffer-limit slave)等。 目录 一、主从复制概述 二、如何使用主从复制 1. 建立复制 2. 实例 3. 断开复制 三、主从复制的实现原理 1. 连接建立阶段 2. 数据同步阶段 3. 命令传播阶段 四、【数据同步阶段】全量复制和部分复制 1. 全量复制 2. 部分复制 3. psync命令的执行 4. 部分复制演示 五、【命令传播阶段】心跳机制 1. 主->从:PING 2. 从->主:REPLCONF ACK 六、应用中的问题 1. 读写分离及其中的问题 2. 复制超时问题 3. 复制中断问题 4. 各场景下复制的选择及优化技巧 5.

Redis主从复制的原理

隐身守侯 提交于 2020-12-08 03:56:12
更多内容,欢迎关注微信公众号:全菜工程师小辉。公众号回复关键词,领取免费学习资料。 在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,我们定义被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),这种模式叫做主从复制模式。 > 数据流向是单向的,只能是从master到slave > 一个slave只能有一个master 主从复制的作用 为数据提供多个副本,实现高可用 实现读写分离(主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性) 主从复制的方式 命令slaveof。 优点:无需重启。缺点:不便于管理 // 命令行使用 slaveof ip port // 使用命令后自身数据会被清空,但取消slave只是停止复制,并不清空 修改配置。 优点:统一配置。缺点:需要重启 // 配置文件中配置 slaveof ip port slave-read-only yes //只允许从节点进行读操作 全量复制 用于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作,当数据量较大时,会对主从节点和网络造成很大的开销 全量复制过程: Redis内部会发出一个同步命令,刚开始是Psync命令,Psync ? -1表示要求master主机同步数据

redis系统学习之主从复制的原理与注意事项

假装没事ソ 提交于 2020-12-08 00:56:55
前言 在前面的两篇文章中,分别介绍了 Redis的内存模型 和 Redis的持久化 。 在Redis的持久化中曾提到,Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。 这篇文章中,将详细介绍Redis主从复制的方方面面,包括:如何使用主从复制、主从复制的原理(重点是全量复制和部分复制、以及心跳机制)、实际应用中需要注意的问题(如数据不一致问题、复制超时问题、复制缓冲区溢出问题)、主从复制相关的配置(重点是repl-timeout、client-output-buffer-limit slave)等。 目录 一、主从复制概述 二、如何使用主从复制 1. 建立复制 2. 实例 3. 断开复制 三、主从复制的实现原理 1. 连接建立阶段 2. 数据同步阶段 3. 命令传播阶段 四、【数据同步阶段】全量复制和部分复制 1. 全量复制 2. 部分复制 3. psync命令的执行 4. 部分复制演示 五、【命令传播阶段】心跳机制 1. 主->从:PING 2. 从->主:REPLCONF ACK 六、应用中的问题 1. 读写分离及其中的问题 2. 复制超时问题 3. 复制中断问题 4. 各场景下复制的选择及优化技巧 5.

跟随杠精的视角一起来了解Redis的主从复制

回眸只為那壹抹淺笑 提交于 2020-12-01 11:26:38
不想弹好吉他的撸铁狗,都不是好的程序猿 虽然说单机的Redis性能很好,也有完备的持久化机制,那如果你的业务体量真的很大,超过了单机能够承载的上限了怎么办?不做任何处理的话Redis挂了怎么办?带着这个问题开始我们今天的主题- Redis高可用 ,由于篇幅原因,本章就只聊聊主从复制。 为啥要先从主从复制开始聊,是因为 主从复制 可以说是整个Redis高可用实现的基石,你可以先有这么一个概念,至于具体为什么是基石,这个后面聊到Sentinel和Redis集群的时候会说到。 首先我们需要知道,对于我们开发人员来说,为什么需要 主从架构 ?一个Redis实例难道不行吗? 其实除了开篇提到的负载超过了Redis单机能够处理的上限,还有一种情况Redis也无法保证自身的高可用性。那就是即便Redis能够扛住所有流量,但是如果这个Redis进程所在的机器挂了呢?请求会直接调转枪口,大量的流量会瞬间把你的DB打挂,然后你就可以背个P0,打包回家了。 而且,假设你对Redis的需求真的超过了单机的容量,你怎么办?搞多台独立的Redis实例吗?那如果用户缓存的数据这一次存在了实例一,下一次如果用户又访问到了实例二,难道又要去走一遍DB吗?除非你能够维护好用户和Redis实例的对应关系(但是通常这样的逻辑比较复杂),否则部署多个Redis实例也就失去了它的意义,没有办法做到横向扩展了。

REdis主从复制之repl_backlog

久未见 提交于 2020-10-28 19:24:41
目录 目录 1 1. 前言 1 2. 配置项 1 3. redisServer 2 4. feedReplicationBacklog- 写 repl_backlog 3 5. addReplyReplicationBacklog- 读 repl_backlog 4 1. 前言 注意, repl_backlog 只针对 部分复制( Partial Replication ),而非全量复制。 本文内容基于 redis-5.0.5 (截至 2019/6/6 的最新版本),本文深入介绍 REdis 主从复制的部分复制核心要素 repl_backlog ,与其相关的配置直接影响主从间的稳定性,对提升集群的稳定性十分重要。 注意 REdis 的主节点把所有从节点也当作一个 Client 看待,正常的数据同步并不涉及 repl_backlog 。当从节点断开重连,这个时候 repl_backlog 的作用就体现出来了。截至到 5.0.5 版本,从节点重启用不上 repl_backlog ,原因是从节点没有保存 repl_backlog 的信息,无法实现部分同步,但可少量改动 REdis 源代码,实现从节点重启后的部分复制。 正常情况下,主节点会往从节点连接缓冲区写一份数据,同时往 repl_backlog 也写一份数据,所有从节点共享同一份 repl_backlog ,因此可以考虑 repl

搞懂这些Redis知识点,吊打面试官!

北城以北 提交于 2020-10-07 18:57:03
  “   今天,我不自量力的面试了某大厂的 Java 开发岗位,迎面走来一位风尘仆仆的中年男子,手里拿着屏幕还亮着的 Mac。      图片来自 Pexels   他冲着我礼貌的笑了笑,然后说了句“不好意思,让你久等了”,然后示意我坐下,说:“我们开始吧,看了你的简历,觉得你对 Redis 应该掌握的不错,我们今天就来讨论下 Redis……”。我想:“来就来,兵来将挡水来土掩”。   Redis 是什么    面试官: 你先来说下 Redis 是什么吧!    我: (这不就是总结下 Redis 的定义和特点嘛)Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。   它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。   我顿了一下,接着说,Redis 作为一个内存数据库:   性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。   单进程单线程,是线程安全的,采用 IO 多路复用机制。   丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。   支持数据持久化。   可以将内存中数据保存在磁盘中,重启时加载。   主从复制,哨兵,高可用。  

Redis全量复制

青春壹個敷衍的年華 提交于 2020-08-14 17:59:45
1. 从节点 连接 主节点 ,发送psync?-1命令; 2.主节点发现从节点是第一次复制,返回 FULLRESYNC {runId} {offset} 3. 从节点接收主节点信息后,保存到 info 中。 4. 主节点在发送 FULLRESYNC 后,启动 bgsave 命令,生成 RDB 文件(数据持久化)。 5.并使用缓冲区记录此后执行的所有写命令; 6. 从节点 收到快照文件后丢弃所有旧数据,载入收到的快照; 7.主节点 快照发送完毕后开始向从 节点 发送缓冲区中的写命令; 8. 从节点 完 成对快照的载入,开始接收命令请求,并执行来自主节点缓冲区的写命令; 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/4492362

redis的三种部署方式和数据读取方式

怎甘沉沦 提交于 2020-08-13 01:51:19
redis redis的三种部署方式 1:主从复制,就是每台机器都是一样的,这种部署方式每台服务器都会向主服务器同步自己的数据,所以其中的数据内容是相同的 工作机制:从服务器连接到主服务器发送SYNC命令,主服务器接收命令,开始执行BGSAVEE命令申城RDB文件并使用缓冲区域记录伺候执行的所有写命令,主服务器的BGSAVE命令执行完成后,向所有服务器发送快照文件,并继续记录执行的写命令,从服务器收到快照文件后丢弃所有的旧数据,载入收到的快照,主服务器发送完毕后开始向服务器发送缓冲区的写命令,从服务器完成对快照的载入,开始接受命令请求,并执行来自主服务器缓冲区的写命令,完成初始化,最后主服务器接收到写命令后就向从服务器发送这个写命令,从服务器接收并执行 slaver将master中的信息读取出来放入磁盘中,然后加载进内存,客户端直接从内存中读取信息,从这一点也可以看出,redis其实就是一个内存数据库 只有一个master,可以有n个slaver,每个slaver也可以有自己的slaver,master只负责写和同步数据给slaver,所以如果我们要提高读取效率只需要扩容slaver就可以了 SYNC命令是非常消耗资源的,因为每次执行SYNC命令,主从服务器需要执行以下操作: 主服务器需要执行BGSAVE命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU、内存和磁盘I

centos7用fio测试磁盘io

冷暖自知 提交于 2020-08-12 16:56:44
我在centos7系统里,直接执行yum install -y fio就能把工具装上。 测写入的时候-filename=绝对不能写/dev/sdX,否则盘上数据损坏!随便一搜,很多文章都是filename=/dev/开头的,我觉得这些人不是无脑搬运工就是故意害人的! 下面这命令测试写入效果,将生成单个文件在/tmp/中 fio -filename=/tmp/fio_randwrite -name=ihatefio -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=1G -numjobs=20 -runtime=3 -group_reporting 下面这命令将在指定目录下,生成20个1G文件,是多线程并发执行的。 fio -directory=/tmp/fio/ -name=readtest -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=1G -numjobs=20 -runtime=3 -group_reporting 其中 numjobs=20表示20个并发 -rw=可供选择的有read单测读write单测写rw读写同时测randrw随机读写同时测randread单测随机读randwrite单测随机写