精华内容
下载资源
问答
  • redis复制原理

    2018-08-29 14:14:31
    redis的复制是在主节点(master)和从节点(slave)间...redis复制是单向数据流,即复制只能由主节点复制给从节点。 一、配置 1、建立复制  redis提供了三种配置方式:  1)在配置文件中加入slaveof{master...

            redis的复制是在主节点(master)和从节点(slave)间进行的。默认情况下,redis都是主节点,每一个主节点可以同时具有多个从节点,而每个从节点只能有一个主节点。redis复制是单向数据流,即复制只能由主节点复制给从节点。

    一、配置

    1、建立复制

             redis提供了三种配置方式:

             1)在配置文件中加入slaveof{masterHost}{masterPort}随Redis启动生效。
             2)在redis-server启动命令后加入--slaveof{masterHost}{masterPort}生效。
             3)直接使用命令:slaveof{masterHost}{masterPort}生效。

             主从节点复制成功建立后,可以使用info replication命令查看复制相关状态。默认情况下,从节点使用slave-read-only=yes配置为只读模式,因为数据只能由主节点复制给从节点,修改从节点数据会导致主从数据不一致,所以一般不建议修改slave-read-only这个参数。

    2、断开复制

            在从节点上执行slaveof no one命令将会断开复制,同时从节点晋升为主节点。

    二、拓扑

         redis复制图谱图大致可以分为以下三种:一主一从、一主多从、树状主从结构

    1、一主一从

                                                         

           作用:1)用于主节点出现宕机时从节点提供故障转移支持。

                      2)高并发场景下,需要持久化时,可以只在从节点上开启AOF,避免主节点AOF对性能的影响。

           当主节点关闭持久化功能时,需要避免自动重启操作。由于主节点上的数据集为空,重启后从节点也会清空自身数据集。因此,安全的做法是首先在从节点上执行slaveof no one命令,再重启主节点。

    2、一主多从

                             

           优点:1)在读占比比较大的场景下,可以把读命令发送到从节点执行,降低主节点的压力。

                      2)一些比较耗时的读命令可以在从节点上执行,避免线上主节点阻塞。

           缺点:在写占比比较大的场景下,多个从节点会导致主节点写命令多次发送而过度消耗网络带宽,影响主节点性能。

    3、树状主从结构

                                            

              树状主从结构中,从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。该结构可以有效

    降低主节点负载和需要传送给从节点的数据量。因此当需要挂载多个从节点时,为了避免对主节点的性能干扰,可以使用树状主从结构。

    三、原理

    1、复制过程

            复制过程大致可分为6个步骤:保存主节点信息 、主从建立socket连接、发送ping命令、权限验证、同步数据集、命令持续复制。具体流程如下:

    1)从节点执行slaveof命令,只保存主节点的地址信息便直接返回。

    2)从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立

    网络连接

    3)连接建立成功后从节点发送ping请求进行首次通信,如果此时从节点没有收到返回消息,则会断开连接待下次定时任务会发起重连。

    4)如果主节点设置了requirepass参数,则需要密码验证。

    5)主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点。

    6)命令持续复制。当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给

    从节点,保证主从数据一致性。

    2、数据同步

           全量复制:一般用于初次复制场景,主节点将全部数据一次性的发给从节点,数据量较大时会对主从节点和网络造成很大开销。

           部分复制:用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主

    节点会补发丢失数据给从节点。

    redis从2.8版本之后使用psync命令进行复制,该命令主要依靠主从节点复制偏移量、主节点积压缓冲区、主节点id来完成。

    psync{runId}{offset}

    主从节点复制偏移量:参与主从复制的节点都会维护自身的复制偏移量,如下图所示主节点通过info replication可以查看主从节点的复制偏移量offset。通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

     复制积压缓冲区:复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1MB,当主节点有连接的从节点

    (slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区。

    主节点id:主节点唯一表示id,重启后会,ID会随之改变。(debug reload命令重启可以保证id不变)

    全量复制过程:

    部分复制过程:

     

     

    展开全文
  • Redis复制原理

    2020-04-02 19:00:20
    复制原理:无非就是从节点复制主节点数据,从节点只能够响应读操作 复制过程:... 复制方式 - 全量复制:从节点将主节点的所有数据复制到本地(第一次复制的时候) - 部分复制:主节点持续响应用户请求操作,然后...
    复制原理:无非就是从节点复制主节点数据,从节点只能够响应读操作
    
    复制过程:... 
    
    复制方式
        - 全量复制:从节点将主节点的所有数据复制到本地(第一次复制的时候)
        - 部分复制:主节点持续响应用户请求操作,然后同步到本地去执行
    
    主从复制: 
        - 优点:备份 读写分离
        - 缺点:
            1. 如果主节点down掉之后,我们需要人工切换slave节点的新主节点信息(slaveof)
            2. 单机存储容量受限(数据只会存储在master节点上),master节点读操作负载容易变高
    
    哨兵架构:
        - 优点:备份 读写分离 + 可以自动切换主节点
        - 缺点:
            1. 单机存储容量受限 
            2. 主节点写负载会变高
            3. 扩展性比较差
    
    集群架构: 是一种分布式解决方案
        - 优点:每个节点都可以存储数据,每个节点都可以响应读写操作,更容易扩容
        - 缺点:部署复杂;redis部分cli命令受限,比如:批量操作等等
        
        - 每个节点如何去存储数据呢?
            hash一致性算法去做 --> 虚拟槽技术
            
    
    

    复制过程

    在这里插入图片描述

    全量复制

    在这里插入图片描述

    部分复制

    在这里插入图片描述

    展开全文
  • Redis 复制原理

    2016-07-27 15:58:57
    一、什么是redis主从复制? 主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致;且实现Redis的主从复制非常简单。 二、redis主从复制...

    一、什么是redis主从复制?

    主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致;且实现Redis的主从复制非常简单。

    二、redis主从复制特点

    1、同一个Master可以拥有多个Slaves。

    2、Master下的Slave还可以接受同一架构中其它slave的链接与同步请求,实现数据的级联复制,即Master->Slave->Slave模式;

    3、Master以非阻塞的方式同步数据至slave,这将意味着Master会继续处理一个或多个slave的读写请求;

    4、Slave端同步数据也可以修改为非阻塞是的方式,当slave在执行新的同步时,它仍可以用旧的数据信息来提供查询;否则,当slave与master失去联系时,slave会返回一个错误给客户端;

    5、主从复制具有可扩展性,即多个slave专门提供只读查询与数据的冗余,Master端专门提供写操作;

    6、通过配置禁用Master数据持久化机制,将其数据持久化操作交给Slaves完成,避免在Master中要有独立的进程来完成此操作。

    三、redis主从复制原理

    wKiom1Ozz5OThc6NAAGUIzDDlQs366.jpg

    当启动一个Slave进程后,它会向Master发送一个SYNC Command,请求同步连接。无论是第一次连接还是重新连接,Master都会启动一个后台进程,将数据快照保存到数据文件中,同时Master会记录所有修改数据的命令并缓存在数据文件中。后台进程完成缓存操作后,Master就发送数据文件给Slave,Slave端将数据文件保存到硬盘上,然后将其在加载到内存中,接着Master就会所有修改数据的操作,将其发送给Slave端。若Slave出现故障导致宕机,恢复正常后会自动重新连接,Master收到Slave的连接后,将其完整的数据文件发送给Slave,如果Mater同时收到多个Slave发来的同步请求,Master只会在后台启动一个进程保存数据文件,然后将其发送给所有的Slave,确保Slave正常。

    四、服务器资源列表

    wKiom1Ozz7PilaRGAAD2EbEmDy4850.jpg
     

    五、配置过程

    关于Redis的安装与配置这里便不操作,想了解的朋友请阅读:高性能数据库缓存之redis(一)http://cfwlxf.blog.51cto.com/3966339/1423106
     

    3、1 Master端操作如下:

    运行redis服务

    1. [root@redis_master sh]# redis-server/etc/redis/redis.conf 

    查询redis运行日志

    wKioL1Ozz6bw05VBAAJdwyDX2eg504.jpg

    ##通过阅读日志文件输出的一些信息,可以看出MasterSlave建立连接时,需要执行的会话机制:加载数据文件至硬盘,用时0.012秒,可想而知速度是多么的快,当然得依据数据的大小去评测;服务连接至6379端口,收到Slave同步连接请求,开启“BGSAVE”同步等;
     

    清除Master端数据库中所有Key

    1. [root@redis_master sh]# redis-cli   
    2. 127.0.0.1:6379> FLUSHALL   
    3. OK   
    4. 127.0.0.1:6379> keys *   
    5. (empty list or set

    3、2 Slave端操作如下:

    [root@redis_slave ~]# vim/etc/redis/redis.conf

    #添加Master端的IP与端口

    1. # slaveof <masterip><masterport>   
    2. slaveof 192.168.8.8 6379 

    运行redis

    1. [root@redis_slave ~]# redis-server/etc/redis/redis.conf 

    查询Slave运行日志

    wKioL1Ozz7vRolYwAAOCbyhb-MU029.jpg

    ##分析redis日志,可以看出Slave与Master建立连接,数据同步的过程;如:发送SYNC命令,与Master端192.168.8.8:6379建立连接,然后Slave sync started;随后Master发送PING命令检查Slave的存活状态,复制被继续….

    查询数据库中的所有key

    1. [root@redis_slave ~]# redis-cli                   
    2. 127.0.0.1:6379> keys *   
    3. (empty list or set

    3、3 slave2端操作如下:

    [root@redis_slave2 ~]# vim/etc/redis/redis.conf

    #添加Slave端的IP与端口,实现级联复制;

    1. # slaveof <masterip><masterport>   
    2. slaveof 192.168.8.10 6379 

    #运行redis服务

    1. [root@redis_slave2 ~]# redis-server/etc/redis/redis.conf 

    查询redis运行日志

    wKiom1Oz0AGRPpzyAAOAB3zsl1Q226.jpg

    ##结果与Slave1类似,只不过Slave2与Slave1(192.168.8.10:6379)建立连接,同步数据;MySQL的级联复制便是这样,Master->Slave1->Slave2;

    #查询数据库的所有key

    [root@redis_slave2 ~]# redis-cli

    127.0.0.1:6379> keys *

    (empty list or set)

    3、4 master端操作如下:

    1. [root@redis_master sh]# redis-cli   
    2. 127.0.0.1:6379> MSET ID 1005 NAMEMariaDB City BeiJing   
    3. OK   
    4. 127.0.0.1:6379> MGET ID NAME City   
    5. 1) "1005" 
    6. 2) "MariaDB" 
    7. 3) "BeiJing" 
    8. 127.0.0.1:6379> keys *   
    9. 1) "NAME" 
    10. 2) "ID" 
    11. 3) "City" 

    3、5 客户端验证同步结果

    slave1端验证

    1. [root@redis_slave ~]# redis-cli   
    2. 127.0.0.1:6379> auth !@#aedf   
    3. 127.0.0.1:6379> keys *   
    4. 1) "City" 
    5. 2) "NAME" 
    6. 3) "ID" 
    7. 127.0.0.1:6379> MGET ID NAME City   
    8. 1) "1005" 
    9. 2) "MariaDB" 
    10. 3) "BeiJing" 

    slave2端验证

    1. [root@redis_slave2 ~]# redis-cli   
    2. 127.0.0.1:6379> keys *   
    3. 1) "ID" 
    4. 2) "NAME" 
    5. 3) "City" 
    6. 127.0.0.1:6379> MGET ID NAME City   
    7. 1) "1005" 
    8. 2) "MariaDB" 
    9. 3) "BeiJing" 

    四、Master write,Slave read机制

    Redis的主从复制,通过程序实现数据的读写分离,让Master负责处理写请求,Slave负责处理读请求;通过扩展Slave处理更多的并发请求,减轻Master端的负载,如下图:

    wKioL1Ozz-3yEjbBAAEZvvETcp8136.jpg

    此图画得比较简易,展示了实现Redis读写分离的过程,通过判断用户读写请求,将write请求发送给Redis Master处理,Read请求发送给Redis Slave处理,文章中的不足之处,欢迎大家指点。

    展开全文
  • REDIS复制原理

    2017-09-05 15:03:00
    主从复制简单来说就是把一台redis数据库中的数据同步到另一台redis数据库,并且按照数据流向,数据的发送者我们称作master,数据的接受者我们称作slave(master/slave的划分并不是那么一定的,譬如B可以作为A的slave...
    主从复制简单来说就是把一台redis数据库中的数据同步到另一台redis数据库,并且按照数据流向,数据的发送者我们称作master,数据的接受者我们称作slave(master/slave的划分并不是那么一定的,譬如B可以作为A的slave,但同时也可以作为C的master),下面就从slave和master的角度分别说明主从复制流程。

    首先是slave端,对于slave端来说,主从复制主要经历四个阶段:

    第一阶段:与master建立连接
    第二阶段:向master发起同步请求(SYNC)
    第三阶段:接受master发来的RDB数据
    第四阶段:载入RDB文件

    下面我们就通过一个图来概述在每一个阶段中,slave究竟做了些什么:



    关于上图,有一点说明下:redis接收到slaveof master_host master_port命令后并没有马上与master建立连接,而是当执行服务器例行任务serverCron,发现自己正处于REDIS_REPL_CONNECT状态,这时才真正的向maser发起连接,伪代码:
    Python代码  收藏代码
    1. def serverCron():  
    2.     # 服务器处于REDIS_REPL_CONNECT状态  
    3.     if redisServer.repl_state == REDIS_REPL_CONNECT:  
    4.         # 向master发起连接  
    5.         connectWithMaster()  
    6.     # 其他例行任务(省略)...  


    接着我们来看下主从复制过程中,master这边的流程是如何,在具体看细节之前,我们先综合来看master这边主要做的几件事情:



    看完这个图,你也许会有以下几个疑问:

    1. 为什么在master发送完RDB文件后,还要定期的向slave发送PING命令?
    2. 在发送完RDB文件之后,master发送的“变更”命令又是什么,有什么用?

    在回答问题之前1,我们先回答问题2:
    master保存RDB文件是通过一个子进程进行的,所以master依然可以处理客户端请求而不被阻塞,但这也导致了在保存RDB文件期间,“键空间”可能发生变化(譬如接收到一个客户端请求,执行"set name diaocow"命令),因此为了保证数据同步的一致性,master会在保存RDB文件期间,把接受到的这些可能变更数据库“键空间”的命令保存下来,然后放到每个slave的回复列表中,当RDB文件发送完master会发送这些回复列表中的内容,并且在这之后,如果数据库发生变更,master依然会把变更的命令追加到回复列表发送给slave,这样就可以保证master和slave数据的一致性!相关伪代码:

    Python代码  收藏代码
    1. def processCommand(cmd, argc, argv):  
    2.     # 处理命令  
    3.     call(cmd, argc, argv)  
    4.     # 如果该命令造成数据库键空间变化and当前redis是一个master,则同步变更命令  
    5.     if redisServer.update_key_space and len(redisServer.slaves) > 0:  
    6.         replicationFeedSlaves(cmd, argc, argv)  
    7.   
    8. def replicationFeedSlaves(cmd, argc, argv):   
    9.     # 把变更命令发送给每一个处于:REDIS_REPL_WAIT_BGSAVE_END状态的slave节点  
    10.     for slave in redisServer.slaves:  
    11.         if slave.replstate == REDIS_REPL_WAIT_BGSAVE_START:  
    12.             continue  
    13.         slave.updateNotify(cmd, argc, argv)  

    由于在发送完RDB文件之后,master会不定时的给slave发送“变更”命令,可能过1s,也可能过1小时,所以为了防止slave无意义等待(譬如master已经挂掉的情况),master需要定时发送“保活”命令PING,以此告诉slave:我还活着,不要中断与我的连接

    现在我们就看下,当master接受到slave发送的sync同步命令后究竟发生了哪些事:


    上图看似分支复杂,但我们抓住以下几点即可:

    1.保存RDB文件是在一个子进程中进行的;
    2.如果master已经在保存RDB文件,但是没有客户端正在等待这次BGSAVE,新添加的slave需要等到下次BGSAVE,而不能直接使用这次生成的RDB文件(原因图中已经说明)
    3.master会定期检查RDB文件是否保存完毕(时间事件serverCron);

    接下来我们看下,master是如何给每一个slave发送RDB文件的:



    好了,至此我们已经分析完在主从复制过程中,master和slave两边分别是怎么一个处理流程;最后,我绘制了一个图,综述了主从复制这一过程(我们可以边看图,边回忆其中的具体细节):



    PS:在主从复制过程中,任何一步发生错误,都会导致整个过程重头开始,所以若RDB文件很大又或是此时正处在业务高峰期,对系统性能将会有非常大的影响!

    总结:
    1. 了解主从复制master和slave的概念;
    2. 了解主从复制执行过程,特别是其中关键的几步;
    3. 了解目前主从复制过程中尚存的不足之处;
    展开全文
  • Redis系列】Redis 复制原理的实现
  • Redis复制原理解析

    2021-04-21 14:35:41
    这篇文章主要说一下redis复制原理,以及redis复制需要注意的问题,还有就是业务方应该避免的坑。 2.核心点 建立主从命令slaveof slaveof no one: 取消现有的主从关系,使slave变成master slaveof host port:将当前...
  • 深入理解redis复制原理 原文:深入理解redis复制原理 1.复制过程 2.数据间的同步 3.全量复制 4.部分复制 5.心跳 6.异步复制 1.复制过程 从节点执行 slaveof 命令。 从节点只是保存了 ...
  • Redis 复制原理与优化

    2019-04-19 20:27:43
    Redis下一小节:7-2什么是主从复制 Redis 复制原理与优化 1、什么是主从复制 2、复制的配置 3、全量复制和部分复制 4、故障处理 5、开发运维常见的问题 ...
  • Redis 复制原理及分析

    2016-07-22 17:47:55
    Redis 复制原理及分析
  • 墨墨导读:本文在依托Redis主从环境下,针对访问的数据一致性进行分析,解开Redis复制原理的神秘面纱。‍ Redis作为一个非结构化的内存数据库,在某些应用场景具备相应优势,在实际的场景设计中也得到广泛的关注和...
  • 深入理解redis复制原理1.复制过程2.数据间的同步3.全量复制4.部分复制5.心跳6.异步复制1.复制过程从节点执行 slaveof 命令。 从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制。 从节点内部的定时...
  • Redis 复制原理及特性

    2019-03-25 15:33:00
    摘要 早期的RDBMS被设计为运行在单个CPU之上,读写操作都由经单个数据库实例完成,复制技术使得数据库的读写操作可以分散...Redis复制概论 数据库复制指的是发生在不同数据库实例之间,单向的信息传播的行为,通常...
  • 搞懂Redis复制原理

    2019-05-07 00:04:00
    前言 与大多数db一样,Redis也提供了复制机制,以满足故障恢复和负载均衡等需求。复制也是Redis高可用的基础,哨兵和集群都是建立在复制基础上实现高可用...本文主要介绍Redis复制机制 一.配置与实践 配置 Redis实...
  • 一、redis主从概念 1.1 redis主从基础 1.redis主从本身是异步的,从库不会阻塞主库的任何操作 2.redis一个主库可以有多个从库。...1.2主从同步原理 从服务器向主服务器发送PSYNC命令(redis2.8以前只有syn..
  • Redis复制 Redis的持久化选项之深入理解AOF和RDB 上一篇文章末尾我们提到了复制,本文将深入理解复制在Redis中的使用 复制可以让其他服务器拥有一个不断地更新的数据副本,从而使得拥有数据副本的服务器可以用于处理...
  • Redis主从复制 什么是主从复制 主从复制配置 全量复制和部分复制 故障处理 开发运维常见问题 主从复制作用; 解决单点故障 容量瓶颈 QPS瓶颈,读写分离 主从复制配置 命令:(动态生效) slaveof ip ...
  • redis复制原理和应用

    2017-11-08 16:03:00
    说到分布式高可用,必然少不了复制,一来是为了做个冗余备份防止数据丢失,二来还可以达到分流来提高性能的目的。基本架构: 下面用M表示Master(主服务器),S表示Slave(从服务器),话不多说,先敲代码 2....
  • 全是干货的技术号:本文已收录在github,欢迎 star/fork:在Redis复制的基础上(不包括Redis Cluster或Redis Sentinel作为附加层提供的高可用功能),使用和配置主从复制非常简单,能使得从 Redis 服务器(下文称 slave...
  • 作者:JingQhttps://www.sevenyuan.cn/Redis的单机模式不难,配置文件参数了解具体含义,设定业务上符合自己的就好了。之前记录了关于Redis的数据结构和对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,270
精华内容 908
关键字:

redis复制原理

redis 订阅