redis主从
redis的主从实际是一种类似于mysql读写分离的操作。master一般只接收写入,slave只接收读取。
主从配置:
配置比较简单,只需要在从服务器redis.conf里边配置slaveof masterip port 即可。
配置完成后,分别启动主从redis,执行info replication,可以看到节点信息,例如:
从节点默认只读模式,因为如果允许从节点写数据,会造成主从数据不一致;
传输延迟问题,主从一般在不同机器上,复制存在网络延时,redis提供repl-disable-tcp-nodelay参数决定是否延时发送数据,默认为no,也就是立即发送;占用带宽多,适用于网络状况良好的情况;若设置为yes,则master合并所有数据组成tcp包以节省带宽,默认40ms发送一次,取决于操作系统内核,适用于网络环境复杂或者带宽紧张的情况,例如跨机房的情况等;
拓扑结构:
redis根据不同情况,可以搭建一主一从,一主多从,树状主从等结构;
A、一主一从:用于主节点故障转移从节点,当主节点的“写”命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免持久化对主节点的影响
B,、一主多从:针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的稳定
C、树状主从:一主多从的缺点(主节点推送次数多压力大)可用此方案解决,
主节点只推送一次数据到从节点1,再由从节点2推送到11,减轻主节点推送的压力(但复制到从节点的时间增加了)。
一些细节:
1、Redis主从复制不阻塞主服务器端。也就是说当若干个从服务器在进行初始同步时,主服务器仍然可以处理请求。
2、主从复制也不阻塞从服务器端。当从服务器进行初始同步时,它使用旧版本的数据来应对查询请求,redis.conf配置文件默认配置。
否则的话,你可以配置当复制流关闭时让从服务器给客户端返回一个错误。但是,当初始同步完成后,需要删除旧的数据集和加载新的数据集,在
这个短暂的时间内,从服务器会阻塞连接进来的请求。
3、主从复制可以用来增强扩展性,使用多个从服务器来处理只读的请求(比如,繁重的排序操作可以放到从服务器去做),也可以简单的用来做数据冗余。
4、使用主从复制可以为主服务器免除把数据写入磁盘的消耗:在主服务器的redis.conf文件中配置“避免保存”(注释掉所有“保存“命令),然后连接一个配置为“进行保存”的从服务器即可。但是这个配置要确保主服务器不会自动重启(否则可能从库从master同步数据,导致从库也清零了)
redis主从复制是如何工作的
1、如果设置了一个从服务器,在连接时它发送了一个SYNC命令,不管它是第一次连接还是再次连接都没有关系。
2、然后主服务器开始后台存储,并且开始缓存新连接进来的修改数据的命令。当后台存储完成后,主服务器把数据文件发送到从服务器,
3、从服务器将其保存在磁盘上,然后加载到内存中。然后主服务器把刚才缓存的命令发送到从服务器。这是作为命令流来完成的,并且和Redis协议本身格式相同。
你可以通过telnet自己尝试一下。在Redis服务器工作时连接到Redis端口,发送SYNC命令,会看到一个批量的传输,并且主服务器接收的每一个命令都会通过telnet会话重新发送一遍。
4、当主从服务器之间的连接由于某些原因断开时,从服务器可以自动进行重连接。当有多个从服务器同时请求同步时,主服务器只进行一个后台存储。
5、当连接断开又重新连上之后,一般都会进行一个完整的重新同步,但是从Redis2.8开始,只重新同步一部分也可以。
redis2.8以前,完全同步需要在磁盘创建一个rdb文件,然后加载这个文件再发送给从服务器,如果磁盘转速较低,这会给主服务器带来较大压力,所以从2.8以后,支持无磁盘复制,子进程直接将rdb通过网络发给从服务器,不再使用磁盘做中间存储。参数为repl-diskless-sync no,默认不用磁盘,但网络较差的情况下,建议使用磁盘;
部分同步的原理
从Redis 2.8开始,如果遭遇连接断开,重新连接之后可以从中断处继续进行复制,而不必重新同步。
它的工作原理是这样:
主服务器端为复制流维护一个内存缓冲区(in-memory backlog)。主从服务器都维护一个复制偏移量(replication offset)和master run id ,
当连接断开时,从服务器会重新连接上主服务器,然后请求继续复制,假如主从服务器的两个master run id相同,并且指定的偏移量在内存缓冲区中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步(在2.8版本之前就是直接进行完全重新同步)。因为主运行id不保存在磁盘中,如果从服务器重启了的话就只能进行完全同步了。
部分重新同步这个新特性内部使用PSYNC命令,旧的实现中使用SYNC命令。Redis2.8版本可以检测出它所连接的服务器是否支持PSYNC命令,不支持的话使用SYNC命令。
限制N个以上从服务器才允许写入
主从复制过程中,无法确认从机一定收到了要写入的数据,因此redis在判断没有足够数量的健康slave的时候,master就停止写入以避免数据丢失;设为0为关闭该功能;
min-slaves-to-write 3
min-slaves-max-lag 10 //延迟小于min-slaves-max-lag秒的slave才认为是健康的slave。
--------------------------------------------
redis的一些相关文章: