redis学习redisRedis

第九章:Redis replication 主从复制

2018-01-31  本文已影响56人  FantJ

什么是主从复制

  1. 一个master可以有多个slave
  2. 一个slave只能有一个master
  3. 数据流是单向的,master到slave

全量复制和部分复制

run id 查看复制偏移量(用来比对两边数据同步问题,相差不能太大)
  1. 插一个命令redis-cli -p 6379 info server | grep run查看redis运行id
    image.png
  2. 查看复制偏移量


    image.png
全量复制

在Redis复制的基础上,使用和配置主从复制非常简单,它允许从属Redis服务器成为主服务器的精确副本。每次链路断开时,从设备将自动重新连接到主设备,无论主设备发生什么情况,都将试图成为主设备的精确副本。

这个系统使用三个主要机制:

  1. 当主和从实例连接良好时,主设备通过发送命令流来保持从设备更新,以便复制对主数据集中发生的数据集的影响:客户机写入,密钥过期或被驱逐等等。
  2. 当主站和从站之间的链路断开时,对于网络问题或者由于在主站或从站中感测到超时,从站重新连接并尝试进行部分重新同步:这意味着它将尝试只获取部分在断开连接时错过的命令流。
  3. 当部分重新同步不可能时,从机将要求完全重新同步。这将涉及一个更复杂的过程,在这个过程中,主机需要创建所有数据的快照,将数据发送给从机,然后在数据集更改时继续发送命令流。

Redis默认使用异步复制,这是高延迟和高性能,是绝大多数Redis用例的自然复制模式。 但是,Redis从站会异步确认主站定期收到的数据量。

某些数据的同步复制可以由客户端使用WAIT命令来请求。 但WAIT只能确保在其他Redis实例中具有指定数量的已确认副本:在故障转移期间出于不同原因的故障转移期间,确认写入仍可能丢失,或取决于Redis持久性的确切配置。 您可以检查Sentinel或Redis群集文档以获取有关高可用性和故障转移的更多信息。 本文的其余部分主要描述了Redis基本复制的基本特征。

以下是关于Redis复制的一些非常重要的事实:

当master宕机的复制安全

在使用Redis复制的设置中,强烈建议在主服务器和从服务器中启用持久性。如果这种情况不可行,例如由于磁盘速度非常慢导致的延迟问题,则应配置实例以避免重新启动后自动重新启动。

为了更好地理解关闭配置为自动重启的主设备是否危险的原因,请检查以下故障模式,其中数据从主设备及其所有从设备擦除:

  1. 我们有一个设置,节点A作为主节点,持久性关闭,节点B和C从节点A复制。
  2. 节点A崩溃,但它有一些自动重新启动系统,重新启动过程。但是由于持久性被关闭,节点将重新启动一个空的数据集。
  3. 节点B和C将从节点A复制,节点A是空的,所以它们将有效地销毁它们的数据副本。
    当Redis Sentinel用于高可用性时,关闭主服务器上的持久性以及进程的自动重启也是危险的。例如,主机可以很快重启,Sentinel不会检测到故障,以便发生上述故障模式。

每次数据安全很重要,复制与配置为无持久性的主站一起使用时,应禁用实例的自动重启。

当Redis Sentinel用于高可用性时,关闭主服务器上的持久性以及进程的自动重启也是危险的。 例如,主机可以很快重启,Sentinel不会检测到故障,以便发生上述故障模式。

每次数据安全很重要,复制与配置为无持久性的主站一起使用时,应禁用实例的自动重启。

Redis复制如何工作

每个Redis master都有一个复制ID:它是一个大的伪随机字符串,标记数据集的给定故事。 每个主设备也会获得一个偏移量,该设置为生成的每个复制流字节增加以发送到从设备,以便使用修改数据集的新更改更新从设备的状态。 即使没有从机连接,复制偏移量也会增加,所以基本上每一对给定的:
识别主数据集的确切版本。

当从站连接到主站时,它们使用PSYNC命令来发送它们的旧主站复制ID以及到目前为止处理的偏移量。这样主人可以发送所需的增量部分。但是,如果主缓冲区中没有足够的积压,或者从服务器引用了不再知道的历史记录(复制标识),则会发生完全重新同步:在这种情况下,从服务器将获得数据集的完整副本, 从头开始​​。

这是完全同步如何更详细地工作:

无盘复制

通常情况下,完全重新同步需要在磁盘上创建一个RDB文件,然后从磁盘重新加载相同的RDB,以便向从属设备提供数据。

对于较慢的磁盘,对于主设备来说这可能是一个非常紧张的操作。 Redis 2.8.18版是第一个支持无盘复制的版本。 在此设置中,子进程直接通过线将RDB发送到从服务器,而不使用磁盘作为中间存储。

全量复制开销

部分复制

连接断开时,master会写一个复制缓冲区的命令,slave再连接master时候会把自己的偏量值offset和runid告诉master,如果丢失数据在buffer缓存的一个范围内,则master把缓冲区队列的数据给slave。然后再把部分数据同步给slave

复制的配置

slaveof命令
  1. 复制命令
slaveof 127.0.0.1 6380

丢弃旧数据集,转而开始对新主服务器进行同步。

  1. 取消复制
slaveof no one

将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

配置

主要修改4个参数:

  1. port;
  2. logfile;
  3. slaveof;
  4. pidfile;
  5. daemonize(是否在后台执行)
然后再添加配置
slaveof ip port
slave-read-only yes #设置只读
两种方式比较
方式 命令 配置
优点 无需重启 统一配置
缺点 不便于管理 需要重启
实战
  1. 我配置了一个端口为6379,和端口为6380的服务,并在后台启动
#6379配置
port 6379
pidfile /var/run/redis_6379.pid
# slaveof <masterip> <masterport>
logfile "6379.log"
daemonize yes


#6380配置
port 6380
pidfile /var/run/redis_6380.pid
slaveof 127.0.0.1 6379
logfile "6380.log"
daemonize yes
  1. 对6379执行命令 info replication
    对6380执行命令 info replication
  2. 然后我在主机上set一个东西,在slave上获取


    image.png
上一篇 下一篇

猜你喜欢

热点阅读