码迷,mamicode.com
首页 > 其他好文 > 详细

Redis主从复制

时间:2019-10-04 16:55:39      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:获取   完全   优先   get   _id   完成   mamicode   运行   查看   

一、什么是主从复制?

  为当主机性能更新后,根据配置和策略,自动同步到备份机的机制。其中主机处理写操作,从机处理读操作。

  技术图片

  这样做使得读写分离,大大提高了性能,也有容灾快速恢复的优点。

  此时开启了多个Redis服务器,但是相对于主机来说,从机的配置文件是不完全相同的,因此需要拷贝多个redis.conf文件,并且修改其中的配置。

  我们坚持配从不配主的原则,根据不同的需求对从机对应的配置文件做相应的修改。

二、配从不配主

  1)拷贝多个redis.conf 文件include

  2)开启daemonize yes

  3)Pid文件名字pidfile

  4)指定端口号port。不能相同

  5)Log日志文件名字不能相同

  6)dump.rdb的名字不能相同dbfilename

  7)Appendonly,关掉AOF或者换AOF备份文件的名字。

  建议主机的配置文件设置: appendonly yes,从机设置为no,当然也可以根据情况而定。


   简单的“一主二仆”模式

  首先:我启动了三个窗口用于测试:

  技术图片

  由启动Redis服务的命令:redis-server 配置文件路径  可以知道:redis服务是根据配置文件的内容进行启动的,也就是说,配置文件不同,启动的redis服务也不同。

  可以通过执行表多个: redis-server 配置文件路径1  redis-server 配置文件路径2  redis-server 配置文件路径3.......启动多个redis服务。

  并且配置文件可以使用include来进行依赖,不相同的配置单独制定进行覆盖,没必要将初始redis.conf完全拷贝。但实际建议作为主机的配置文件可以选择完全拷贝。

  我这里选择了拷贝一份作为主机的配置文件:

  技术图片

  修改了作为主机的配置文件的内容

  技术图片

  技术图片

  技术图片

  创建从机的配置文件并修改对应配置:

  技术图片

  顺带一提:如果将appendonly设置为no ,那么对应的APPendfilename  文件就不会创建,你不妨测试一下。

 

   配置完成后,启动三台Redis服务器,注意启动前先关闭所有redis-Server进程,我这里设置了redisMaster和初始redis占用统一端口号,更加需要检查并且关闭原来那个redis-server。

  技术图片

  info replication:查看主从关系

  slaveof   ip  port:建立主从关系 

  技术图片

  值得注意的是:当一台Redis服务器被设置为从机后,他就不能使用set命令了,但是被设置成主机,他不仅可以set,亦可以get。

  当把主机shutdown以后,从机依旧认之前设置的主机为老大,并且可以获取到主机设置的值:实际上,这些值并不是从主机获取的,而是在本机获取的,主机设值以后给从机备份了一份。但是当小弟shutdown以后,再次重启就不会认之前的主子了,这也好理解,毕竟上次认主子的时候,是在上次主机开启后的命令,和这次没有关系。

  技术图片

  如果想设置永久的主从关系,就得在配置文件中进行配置:

  技术图片

  配置以后重启,从机就默认配置锁指向的进程为自己的主机。

  顺带一提:几台服务器没有建立主从关系之前,一台机器set了key-value对,当他成为主机后,这部分值依旧会被复制到从机中。

 


三、复制原理

  每次从机连通后,都会给主机发送sync指令,主机收到指令后进行持久化操作,将数据存入RDB文件,持久化完成以后,主机把此RDB文件发送给从机。从机接收到RDB文件后,进行全盘加载。再此之后每次的主机写操作,都会立刻把指令发送给从机,从机执行相同的命令。

  以上面一主二仆的模式为例,如果一台主机的从机过多,势必会给主机造成IO压力。你可能已经想到了,那能不能给从机再设置从机呢?问题就是这么解决的。

  Master  --->  Slave1 --> Slave2

  当然,如果节点太多,你也可以设计成树状结构。

  同样,你可以在命令行中临时指定,也可以在配置文件中永久指定。这里不再赘述。

  这样做很多好处:

    1)当主机宕机后,其直接从机可以通过指令:slaveof  no  one,成为主机,之前提过,作为主机时,不能使用set,但是他大哥死了,他做了老大就可以set了。如果此时他的大哥复活了,就会发现老虎不在山猴子称大王,他曾经的小弟已经接替他掌管门派了,除非小弟重启,或在再次通过命令称他他哥,否则它是做不会大哥的。

    2)上面是认为的在主机宕机后制定从机为主机,但是在日常生产中,通常都是有后台监控主机是否发生故障,如果发生故障就根据投票数自动的将从机转换为主机。我们称这种机制为哨兵模式。

      技术图片

      

    3)哨兵模式

      测试模板:一主二仆模式

      问:在配置哨兵的情况下主机挂掉以后,两个同级的从机谁做老大?----指定优先级

     配置哨兵模式:

      ①、在主机配置文件同级目录下创建文件sentinel.conf

        文件内容为:sentinel monitor mymaster 192.168.188.100 6379  1      ,mymaster是给主机气的别名。这个1 的意思为,当有一台从机ping主机时没有返回PONG就

                                                                                                                                               认为主机宕机了,需要根据规则提升某一从机为主机

              daemonize yes                   指定后台运行,其这里没有指定,因为要做测试看他把谁提升为主机的细节。

      技术图片

      ②、不指定优先级:由该进程早主机中的run_id决定,由于每次启动run_id不同,所以可以算是随机提升一个从机当主机。

      技术图片

      技术图片

      并且让之前的同级变成了他的从机

      技术图片

      这种改变时永久性的,你可以打开他们的配置文件看一看,已经被改写:

      技术图片

      并且此时哨兵的配置文件也发生了改动

      你可以手动的改回去。

      ③、指定优先级:有两种方式

        测试前提,把哨兵模式工作时改动的配置文件改为之前的一主二仆模式

        a)选择偏移量大的做主机:就是说谁那里存有原来主机的数据最多,谁就被提升为主机,这基本决定于那一台主机最早做主机的从机

          参与赋值的主从机都会维护吱声赋值偏移量。主机在处理完写入命令后,命令的字节长度做leijiajil,tongji在信息info replication的master_erpl_offset指标中。

          从机每秒钟上报自身的赋值偏移量给主机,因此主机也会保存从机的赋值偏移量。从机再接收主机发送的命令后,也会累加记录自身的偏移量,统计在info

          replication中的slave_repl_offset指标中。

        b)选择优先级最靠前的做主机:在从机的配置文件中可以指定 slave-priorty  n,n越小,优先级越高。

      

 

Redis主从复制

标签:获取   完全   优先   get   _id   完成   mamicode   运行   查看   

原文地址:https://www.cnblogs.com/superlsj/p/11621960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!