Redis主从复制机制详解
Redis主从复制机制详解
Redis有
两种不同的持久化方式,Redis
服务器通过持久化,把Redis
内存中持久化到硬盘当中,当Redis
宕机时,我们重启Redis
服务器时,可以由RDB
文件或AOF
文件恢复内存中的数据。
不过持久化后的数据仍然只在一台机器上,因此当硬件发生故障时,比如主板或CPU
坏了,这时候无法重启服务器,有什么办法可以保证服务器发生故障时数据的安全性?或者可以快速恢复数据呢?想做到这一点,我们需要再了解Redis
另外一种机制:主从复制。
什么是主从复制
Redis
的主从复制机制是指可以让从服务器(slave
)能精确复制主服务器(master
)的数据,如下图所示:
上面的图表示的是一台master
服务器与slave
服务器的情况,其实一台master
服务器也可以对应多台slave
服务器,如下图所示:
另外,slave
服务器也可以有自己的slave
服务器,这样的服务器称为sub-slave
,而这些sub-slave
通过主从复制最终数据也能与master
保持一致,如下图所示:
主从复制的方式和工作原理
Redis
的主从复制是异步复制,异步分为两个方面,一个是master
服务器在将数据同步到slave
时是异步的,因此master服务器在这里仍然可以接收其他请求,一个是slave在接收同步数据也是异步的。
复制方式
Redis
主从复制分为以下三种方式:
一、当master
服务器与slave
服务器正常连接时,master
服务器会发送数据命令流给slave
服务器,将自身数据的改变复制到slave
服务器。
二、当因为各种原因master
服务器与slave
服务器断开后,slave
服务器在重新连上maste
r服务器时会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制。
三、如果无法部分同步(比如初次同步),则会请求进行全量同步,这时master
服务器会将自己的rdb
文件发送给slave
服务器进行数据同步,并记录同步期间的其他写入,再发送给slave
服务器,以达到完全同步的目的,这种方式称为全量复制。
工作原理
master
服务器会记录一个replicationId
的伪随机字符串,用于标识当前的数据集版本,还会记录一个当数据集的偏移量offset
,不管master
是否有配置slave
服务器,replication Id和offset会一直记录并成对存在,我们可以通过以下命令查看replication Id和offset:
> info repliaction
复制代码
通过redis-cli在master或slave服务器执行该命令会打印类似以下信息(不同服务器数据不同,打印信息不同):
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=9472,lag=1
master_replid:2cbd65f847c0acd608c69f93010dcaa6dd551cee
master_repl_offset:9472
复制代码
当master与slave正常连接时,slave使用PSYNC命令向master发送自己记录的旧master的replication id和offset,而master会计算与slave之间的数据偏移量,并将缓冲区中的偏移数量同步到slave,此时master和slave的数据一致。
而如果slave引用的replication太旧了,master与slave之间的数据差异太大,则master与slave之间会使用全量复制的进行数据同步。
配置主从复制
Redis
的主从配置非常简单,我们可以使用两种方式来配置主从服务器,在这时我们先假设Redis
的master
服务器地址为192.168.0.101
。
客户端发送同步命令
# 向客户端
saveof 192.168.1.101 6379
复制代码
slave服务器配置主服务器
在这里slave
服务器的redis.conf
通过saveof
选项,可以指定master
服务器,如下:
slaveof 192.168.1.101 6379
复制代码
通过上面两种方式的配置,master
服务器与slave
服务器便已经可以开始进行数据同步了。
master要求验证
上面配置的是master服务器没有设置密码的情况,如果master设置了密码,则可以在连接到slave服务器
的redis-cli
执行下面的命令:
# <password>指代实际的密码
config set masterauth <password>
复制代码
或者在slave服务器的redis.conf中配置下面的选项:
# <password>指代实际的密码
masterauth <password>
复制代码
避免slave被清空
slave会被清空?slave不用同步了master的数据吗?备份的数据怎么会清空了呢?
当master服务器关闭了持久化时,如果发生故障后自动重启时,由本地没有保存持久化的数据,重启的Redis内存数据为空,而slave会自动同步master的数据,这时候,slave服务器的数据也会被清空。
如何避免slave被清空呢?
如果条件允许(一般都可以的),master服务器还是要开启持久化,这样master故障重启时,可以快速恢复数据,而同步这台master的slave数据也不会被清空。
如果master不能开启持久化,则不应该设置让master发生故障后重启(有些机器会配置自动重启),而是将某个slave服务器升级为master服务器,对外继续提供服务。
slave默认为只读的
在Redis2.6
以后,slave
只读模式是默认开启的,我们可以通过配置文件中的slave-read-only
选项配置是否开启只读模式:
# 默认是yes
slave-read-only yes/no
复制代码
或者在客户端中通过config set
命令设置是否开启只读模式:
config set slave-read-only no
复制代码
上面将slave服务器设置为可以写入,但是要注意,如果slave也配置了自己的从服务器(sub-slave),那么sub-slave只会同步从master服务器同步到slave的数据,而并会同步我们直接写入slave服务器的数据。
主从复制中的key过期问题
我们都知道Redis
可以通过设置key
的过期时间来限制key
的生存时间,Redis处理key过期有惰性删除和定期删除两种机制,而在配置主从复制后,slave服务器就没有权限处理过期的key
,这样的话,对于在master上过期的key,在slave服务器就可能被读取,所以master会累积过期的key,积累一定的量之后,发送del命令到slave,删除slave上的key。
如果slave
服务器升级为master
服务器 ,则它将开始独立地计算key
过期时间,而不需要通过master
服务器的帮助。
主从复制的作用
保存Redis数据副本
当我们只是通过RDB
或AOF
把Redis
的内存数据持久化毕竟只是在本地,并不能保证绝对的安全,而通过将数据同步slave
服务器上,可以保留多一个数据备份,更好地保证数据的安全。
读写分离
在配置了主从复制之后,如果master
服务器的读写压力太大,可以进行读写分离,客户端向master
服务器写入数据,在读数据时,则访问slave
服务器,从而减轻master
服务器的访问压力。
高可用性与故障转移
服务器的高可用性是指服务器能提供7*24小时不间断的服务,Redis
可以通过Sentinel
系统管理多个Redis
服务器,当master
服务器发生故障时,Sentineal
系统会根据一定的规则将某台slave
服务器升级为master
服务器,继续提供服务,实现故障转移,保证Redis服务不间断。
小结
Redis
的主从复制可以让我们把Redis
中的数据同步到其他服务器上,为数据安全提供更加安全的保障,也可以让我们的服务器在发生故障时而无法重启时,可以更加快速地切换服务器,继续对外提供服务。
Redis主从复制机制详解的更多相关文章
- Redis 配置文件 redis.conf 项目详解
Redis.conf 配置文件详解 # [Redis](http://yijiebuyi.com/category/redis.html) 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, ...
- Redis 复制过程详解
Redis 的复制功能分为同步( sync )和命令传播( command propagate )两个步骤: 同步用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态. 命令传播则用于在主服务 ...
- 探索Redis设计与实现2:Redis内部数据结构详解——dict
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Redis常见配置文件详解
Redis常见配置文件详解 # vi redis.conf 1 2 3 daemonize yes #是否以后台进程运行 4 5 pidfile /var/run/redis/redis-server ...
- Redis AOF 持久化详解
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Redis 提供了 RDB 和 ...
- [转]Reids配置文件redis.conf中文详解
转自: Reids配置文件redis.conf中文详解 redis的各种配置都是在redis.conf文件中进行配置的. 有关其每项配置的中文详细解释如下: 对应的中文版解释redis.conf # ...
- 探索Redis设计与实现6:Redis内部数据结构详解——skiplist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现7:Redis内部数据结构详解——intset
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现5:Redis内部数据结构详解——quicklist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
随机推荐
- Docker 镜像与容器
镜像和容器的关系 容器提交 commint 作用: 根据容器生成一个新的镜像 命令格式: docker commit [OPTIONS] CONTAIN ...
- IIFE,回调函数
回调函数: 当函数A作为一个参数在函数B中被调用时,就称A为B的回调函数 IIFE:匿名函数自调用 (function(){})() 作用:防止污染全局命名空间 隐藏实现
- 【实习第一天】odoo开发基础(一)
管理权限 在项目中,有个security文件夹,其中的ir.model.access文件后面带4个参数.分别代表着读,写,创建,删除的操作 想要开启权限需要将其参数调成为1,反之为0.倘若不调整参数, ...
- adb 控制手机动作
下载adb工具包,解压即可 https://download.csdn.net/download/kai402458953/10784310 各种事件说明:https://blog.csdn.n ...
- Swift实战技巧
Swift实战技巧 从OC转战到Swift,差别还是蛮大的,本文记录了我再从OC转到Swift开发过程中遇到的一些问题,然后把我遇到的这些问题记录形成文章,大体上是一些Swift语言下面的一些技巧,希 ...
- dedecmsV5.7 arclist 如何调用副栏目的文章
问题:用arclist 调用某个栏目下的文章的时候,发现无法调用出副栏目是这个栏目的文章. 然后就上百度搜了一番,记录一下我搜到的解决方法: 1.打开/include/taglib/arclist.l ...
- CSAPP 3 程序的机器级表示
1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器.数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 -- 程序开发人员需要知道一个变 ...
- php对微信支付回调处理的方法(合集)
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答. 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽 ...
- LInux:网络连接的设置
主机名的配置 主机名的配置(配置文件/etc/hostname) 1.使用 hostname 命令临时设置主机名 命令格式:hostname [新主机名] 2.永久设置主机名 命令格式:hostnam ...
- 昨天周末晚上没有出去,码了一小段,先留着kangkang。
昨天周末晚上没有出去,码了一小段,先留着kangkang. import numpy as npimport matplotlibmatplotlib.use('Agg')import matplot ...