关于主从复制
和MySQL的主从一样,这种结构主要是为了数据冗余和提示性能。Redis的主从同步是异步进行的,所以并不会影响主的处理性能。在数据持久化方面,可以把这个任务交给从服务器来做,这样可以减小主服务器的负担。
在主从结构中,一般把从服务器设置为只读模式,这样也是为了更好的保持数据一致性。
Redis主从同步有两种方式,一种是全同步和部分同步,从服务器第一次(之前从来没有过)和主服务器建立连接的时候是进行全同步的,以后会进行部分同步,只有当部分同步不成功时才会进行全同步。不过任何时候从服务器都可以直接请求全同步。
一般情况下主从都是高频的部分同步(也称增量同步),也就是第一次全同步后,不出其他意外的话下,主服务器会把缓冲区的内容同步到从服务器上。请注意,并不是把数据直接给从服务器,而是主服务器把数据先放到自己的内存缓冲区,然后从缓冲区给从服务器。那么如果主从直接的增量同步不成功,将会执行全同步,也就是复制dump.rdb文件和缓冲区增量数据给从服务器。
过程是:主服务器发现数据有写操作,那么就把变更记录写入缓冲区和所有已连接的从服务器。
下面来说一下全同步过程:
从服务器会定期向主服务器发送PSYNC命令,从服务器提供master_runnid(希望获取数据的MASTER的ID信息)和offset(偏移量信息)信息,主服务器接收信息后会进行验证,如果两者都验证通过就会进行部分同步,如果offset验证未通过则会进行全同步。
半同步:主服务器使用从服务器发来的偏移量offset,定位到自己的缓冲区内,然后将增量数据同步到从服务器上。
全同步:半同步失败后主服务器会向从服务器发送全同步返回信息,然后调用BGSAVE(Backgroundsave,其实就是执行save命令)指令来创建一个子进程,用于保存内存中的数据到磁盘,也就是将数据写入RDB文件中。在开始写入RDB文件的那一刻之后的内存数据库变化会继续在内存中发生。
RDB写入完成后,主服务器会将RDB文件传送给从服务器,从服务器把该文件保存到磁盘中,然后再加载到从服务器的内存中。加载完成之后,主服务器会将RDB写入到从数据库加载完成这段时间发生的数据变化再通过redis协议的格式发送给从服务器。
如果有多个从服务器给主服务器发送SYNC指令,对于主服务器来说只会执行一次BGSAVE操作,然后把这个保存的RDB文件发给多个从服务器。
如果同步过程中出现网络中断,那么在2.8版本以后的处理方式是并不会像之前版本那样重新同步所有,而是会进行增量同步。
从服务器为什么会有master_runid和offset呢?因为从服务器与主服务器断开前会暂存这些信息,目的也是为了后面的数据同步需要。
环境说明
按照之前的步骤安装2台服务器:
Redis01 | 172.16.100.10 |
Redis02 | 172.16.100.20 |
开启防火墙端口和关闭seLinux
打开6379端口
关闭selinux
然后重启iptables服务。
修改配置文件
修改主服务器配置文件,如果不需要密码验证则无需修改此文件,修改后请重新启动Redis服务
修改从服务器配置文件,
找到slaveof字段,如果主服务器有密码验证,则要配置相同的密码,如下如:
验证主从复制
在主上设置一个键值数据
在从上获取一个键值数据
通过info查看连接信息,在主上执行下面的命令:
不停机切换
Redis的主从模式中的主与从没有什么区别,唯一的区别就是在这个模式下从服务器是不允许被写入数据的,看下图:
我在从服务器上做一个SET操作,提示如下
其实主从切换就是把从变成主,主变成从。基本步骤如下:
设置从服务器可写:
修改配置文件,如下图:
修改完成后,重启从服务器。
修改和重启从服务器后,从服务器依然可以从主服务器去同步数据,这一点不用担心。
把应用访问的IP更换成从服务器的IP:
这一步忽略,实际上就是业务对数据库访问IP的变更。
把从服务器设置为主服务器:
在从上执行这个命令
上面这个命令是将从服务器关闭复制功能,将从服务器作为独立的主服务器运行。这个很好理解,就是它不去同步其他的数据库服务器了,自己单独运行,那么自然就是主服务器。
上面的命令还有其他用法就是动态切换主服务器,比如如果我们要临时让从服务器去其他主服务器去同步数据,可以这样运行,如下图:
slaveof MasterIP MasterPort |
注意:假如当前服务器已经是A服务器的从服务器,而你又使用该命令让当前服务器成为B服务器的从服务器,也就是从B同步数据,那么当前服务器将丢弃之前同步的就数据,开始对新的主服务器进行同步。 这个命令只是临时生效,临时覆盖配置文件中的slaveof设置,重启后恢复。 |
验证一下复制是否停止:
在原来的主服务器上运行info命令,如下显示:
虽然角色是主,但是SLAVE的连接已经没有了
我们做一个SET操作,然后在原来的从服务器(Redis02)上执行一下GET操作,看看是否还可以获取数值:
可以看到无法获取。
在Redis02上执行info命令看看结果:
显示它自己已经变成主了。
通过上述的操作我们就可以替换原来的主服务器或者在主服务器失败的时候可以手动切换
本文出自 “小恶魔的家” 博客,请务必保留此出处http://littledevil.blog.51cto.com/9445436/1793091
原文地址:http://littledevil.blog.51cto.com/9445436/1793091