Redis主从复制

来源:互联网 发布:读诗书明德知礼下联 编辑:程序博客网 时间:2024/05/20 02:23
一、是什么?
通俗的讲,就是将写入主机的数据复制到其他地方(备机)。官方称:主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
二、能干嘛?
1、读写分离:一般实际项目中对数据库的读操作(查询)要比写操作(插值)多的多,利用Redis的master/slaver机制,可以使主机负责写入操作,读的时候从备机中读取。
2、容灾恢复:若写入数据的主机发生故障时,先前写入的所有数据可以通过备机全部获得,下面

三、模拟准备工作

1、因为需要备机,所以至少需要开启两台服务器。为安全起见,先将redis安装目录下的redis.conf文件分别复制3分,加以区分为redis6380.conf、redis6381.conf、redis6382.conf。

2、同时将每个文件的port分别改为6380、6381和6382启动的时候只需要分别启动该三台服务器。
开启服务端:./redis-server redisXXXX.conf
开启客户端:./redis-cli -p XXXX

3、开启三个终端,这里默认将端口号为6380的终端设为主机,专门负责写入操作。三台终端通过执行info replication命令可以查看当前机器的角色以及该机器下是否存在备机的状态:




可以看到三台机器处于平级状态

四、常用的3种master/slaver机制的模式
1、一主多仆(这里是一主二仆):这里是将6080端口的终端作为主机,其他两台作为备机。以下列举了关于redis主从复制在“一主多仆”模式下的几种情况:

1)开始三台机器平级,先在6080主机设值set key1 v1,set key2 v2;此时在当前终端get两个key值是无任何问题的。这时候6081和6082分别执行salveOf 127.0.0.1 6380命令,此时6080再次设值set key3 v3;这时候在6081和6082执行get key3命令是可以拿到v3的。同样81和82也可以拿到之前的v1和v2

2)主机设值后备机不能再设,读写分离,只有主机可写,备机只能读

3)主机80shutdown后,81和82两台机器slave角色不变,数据也都还在,两台机器原地待命等待

4)主机80恢复正常之后,通过info replication命令查看其角色依然是master并且其下依然跟着两台备机。此时80再设值,81和82都能拿到。

5)若备机81shutdown,80依然是主机地位,82还是能正常取值。若81恢复过来,其角色就变成了master,与80无任何关系。81需要再一次执行slaveOf 127.0.0.0 6380命令才能再次成为80的备机。

2、新火相传:salve可以成为另一个slave的master
1)81还是跟着主机80,让82成为81的备机。这时候81既是80的备机同时又是82的主机。但是通过命令查看其依然是slave角色。此时80设的值在81和82都能拿到。

3、反客为主


1)先回到“一主二仆”,主机80shutdown之后,两备机本来是原地待命。但是两备机需要选出老大,我们手动的让81执行slave no one成为主机,此时82改跟81,成为81的备机。81设值set key4 v4后82能拿到v4。81和82的数据都还在

2)这时候原主机80恢复过来了。执行get key4,返回的是niu,再查看角色可见是master,而且没有任何备机在他名下。说明此时80和81已经完全不相干

五、复制原理
1)slave启动成功连接到master后会发送一个sync命令

2)Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步

3)全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中(上述“一主二仆”的第一种情况)

4)增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

5)只要是重新连接master,一次完全同步(全量复制)将被自动执行

六、哨兵模式(sentinel):反客为主的自动版(略不同),能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

1)再次回到“一主二仆”,备机81和82都跟着主机80 。

2)自定义的安装目录下(本次模拟就新建在redis的安装目录)新建sentinel.conf文件,名字绝不能错。
(touch sentinel.conf)
 
3)配置哨兵:sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6380 1。
  上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数至少多有1票后成为主机

4)启动哨兵:redis-sentinel sentinel.conf

5)原有主机80挂了,由哨兵主持两台备机81和82投票(若平票则会再次选取,直到选出老大)成为新主机。假设投票结果是81票数获胜,通过info replication命令可查看到81由salve上位为主机,82自动改为81门下成为81的备机。此时81设值set key5 v5,82能拿到v5

6)这时候原主机80回来了,被哨兵监控到了。并不会向上面手动“反客为主的”那样与现主机81无任何关系。而是变成了现主机81的备机,因此执行get key5可以拿到v5

7)一组sentinel能同时监控多个Master

七、以上就是关于redis主从复制可能出现的情况。
原创粉丝点击