Redis 的主从复制

Redis主从复制


概述

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:

  1. 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
  2. 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内容容量为256G,也不能将所有内容用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G

本文先讨论第一点的解决方案:Redis主从复制,第二点可以使用Redis集群解决,下一篇文章将介绍Redis集群。

主从复制

考虑如下一种场景:

电子商务网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是”多读少写”。

对于这种场景,我们可以使如下这种架构:
Redis主从复制结构图

如图中所示,我们将一台Redis服务器作主库(Matser),其他三台作为从库(Slave),主库只负责写数据,每次有数据更新都将更新的数据同步到它所有的从库,而从库只负责读数据。这样一来,就有了两个好处:

  1. 读写分离,不仅可以提高服务器的负载能力,并且可以根据读请求的规模自由增加或者减少从库的数量,棒极了;
  2. 数据被复制成了了好几份,就算有一台机器出现故障,也可以使用其他机器的数据快速恢复。

需要注意的是:在Redis主从模式中,一台主库可以拥有多个从库,但是一个从库只能隶属于一个主库。

配置

在Redis中,要实现主从复制架构非常简单,只需要在从数据库的配置文件中加上如下命令即可:

1
slaveof 主数据库地址  主数据库端口

主数据库不需要任何配置。

示例

下面将演示怎么实现一个简单的复制系统。我们在一台机器上起两个Redis实例,监听不同的端口,其中一个作为主库,另外一个作为从库。首先不加任何参数来启动一个Redis实例作为主数据库:

可以看到,主库监听的是6379端口。

然后加上slaveof参数启动另一个Redis实例作为从库,并且监听6380端口:

从控制台输出中可以看到,从库已经连接到主库:126.0.0.1:6379了,看样子主从复制系统配置成功。我们可以分别在主库和从库中使用如下命令看一看当前实例在复制系统中的相关信息:

接下来验证一把。

首先在主库中设置一个键值:

1
2
3
4
[qifuguang@Mac~]$ /opt/soft/redis-3.0.4/src/redis-cli -p 6379
127.0.0.1:6379> set test-sync winwill2012
OK
127.0.0.1:6379>

现在到从库中检查该值是否已经自动同步到了从库:

1
2
3
4
[qifuguang@Mac~]$ /opt/soft/redis-3.0.4/src/redis-cli -p 6380
127.0.0.1:6380> get test-sync
"winwill2012"
127.0.0.1:6380>

可以看到,数据确实从主库同步到了从库.

在默认情况下,从库是只读的,如果在从库中写数据将会报错:

1
2
3
4
[qifuguang@Mac~]$ /opt/soft/redis-3.0.4/src/redis-cli -p 6380
127.0.0.1:6380> set x y
(error) READONLY You can't write against a read only slave.
127.0.0.1:6380>

但是可以在从库的配置文件中加上如下的配置项允许从库写数据:

1
slave-read-only no

但是,因为从库中修改的数据不会被同步到任何其他数据库,并且一旦主库修改了数据,从库的数据就会因为自动同步被覆盖,所以一般情况下,不建议将从库设置为可写。

相同的道理,配置多台从库也使用相同的方法,都在从库的配置文件中加上slaveof参数即可。

此外,我们可以在客户端使用命令

1
SLAVEOF 新主库地址  新主库端口

来修改当前数据库的主库,如果当前数据库已经是其他库的从库, 则当前数据库会停止和原来的数据库的同步而和新的数据库同步。

最后,从数据库还可以通过运行命令:

1
SLAVEOF NO ONE

来停止接受来自其他数据库的同步而升级成为主库。

原理

上面说了配置主从复制系统的方法,并且举例例子详细说明,本节将介绍Redis主从复制的实现原理。

当一个从数据库启动时,会向主数据库发送SYNC命令,主数据库收到命令后会开始在后台保存快照(即RDB持久化过程),并将保存快照期间接收到的命令缓存起来。当快照完成后,Redis会将快照文件和缓存的命令发给从数据库,从数据库收到数据后,会载入快照文件并执行缓存的命令。以上过程称为复制初始化。复制初始化之结束后,主数据库每收到写命令时就会将命令同步给从数据库,从而保证主从数据库数据一致,这一过程称为复制同步阶段

有两点需要注意:

  1. 当主从数据库之间的连接断开后,Redis2.8之前的版本会重新进行复制初始化过程,这样就使得主从数据库断开连接后数据恢复的过程的效率很低下。Redis2.8版本的一个重要改进就是断线支持有条件的增量数据传输,当从数据库再次连接到主数据库时,主数据库只需要将断线期间执行的命令发给从数据库即可,大大提高了Redis主从复制的实用性。
  2. 复制同步阶段贯穿整个主从同步过程的始终,直到主从关系终止为止。在复制过程中,即使关闭了RDB方式的持久化(删除所有save参数),依旧会执行快照操作。

乐观复制

Redis采用了复制的策略。容忍在一定时间内主从数据库的内容是不同的,但是两者的数据最终会保持一致。具体来说,Redis主从数据库之间的复制数据的过程本身是异步的,这意味着,主数据库执行完客户端的写请求后会立即将命令在主数据库的执行结果返回给客户端,而不会等待从数据库收到该命令后再返回给客户端。这一特性保证了复制后主从数据库的性能不会受到影响,但另一方面也会产生一个主从数据库数据不一致的时间窗口,当主数据库执行一条写命令之后,主数据库的数据已经发生变动,然而在主数据库将该命令传送给从数据库之前,如果两个数据库之间的连接断开了,此时二者间的数据就不一致了。从这个角度看,主数据库无法得知命令最终同步给了几个从数据库,不过Redis提供了两个配置选项来限制只有至少同步给指定数量的数据库时,主数据库才是可写的:

1
2
min-slaves-to-write 3
min-slave2-max-lag 10

第一个参数表示只有当3个或3个以上的从数据库连接到主库时,主数据库才是可写的,否则返回错误。
第二个参数表示允许从数据库失去连接的最长时间,该选项默认是关闭的,在分布式系统中,打开并合理配置该选项可以降低主从架构因为网络分区导致的数据不一致问题。

图结构

从数据库不仅可以接收主数据库的数据,同时也可以作为主数据库存在,形成类似图的结构,如下图:

A中的数据会同步到B,C中,C中的数据会同步到D,E中。

u013043341
  • u013043341
    2017-08-31 21:30 4楼
  • 学习到了,谢谢博主分享,多多加油!

zyt425916200
Y8806662681
  • Y8806662681
    2017-07-28 16:37 2楼
  • 你好,那客户端读取数据是怎么读取的呢?
    1 主机与从机读写分离,那么如果主机数据修改了还没同步到从机,这个时候去从机读到的数据不就有问题了么?

    2 如果有多台从机,主机往从机写数据也会有先后顺序吧。比如A,B,C三台从机,当主机把数据写到从机A时,客户端读到了从机C的数据怎么办?

u013034640

Redis主从复制和集群配置

  • u011204847
  • u011204847
  • 2016年05月03日 19:58
  • 38665
Redis主从复制和集群配置    redis主从复制概述1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave)...

Redis源码解析:17Resis主从复制之主节点的部分重同步流程及其他

本文主要讲解主节点部分重同步的实现,以及主从复制中的其他功能。本文是Redis主从复制机制的最后一篇文章。          主节点在收到从节点发来的PSYNC命令之前,主节点的部分重同步流程,与...
  • gqtcgq
  • gqtcgq
  • 2016年04月30日 17:31
  • 3025

Redis主从复制实现

  • why_2012_gogo
  • why_2012_gogo
  • 2016年05月17日 15:36
  • 1321
Redis中的主从复制,也就是Master-Slave模型,其实现相对比较简单,一般使用在多个Redis实例间的数据同步以及Redis集群中用的比较多。• 工作原理• 特征说明• 如何配置•...

redis的主从复制配置

  • yangzhenzhen
  • yangzhenzhen
  • 2013年01月17日 10:29
  • 39915
redis的主从复制配置一、     原理Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务...

Redis实现主从复制(Master&Slave)

  • zhangguanghui002
  • zhangguanghui002
  • 2017年11月13日 21:06
  • 537
由于前段时间公司项目比较赶,一直抽不出时间写博客,今天偷空写一篇吧。前面给大家讲解了单机版redis的基本操作,现在继续给大家讲解一下Redis的进阶部分,主从复制和读写分离。一、Master&S...

Redis集群之主从复制,读写分离(上)(五)

  • cuipeng0916
  • cuipeng0916
  • 2016年12月17日 10:18
  • 4642
前言:随着web2.0的进一步发展,网民的生产力进一步提升,存储总量开始增加。 此时虽然仍然是读多写少的模式,但写入量已经大大提升。 原有的缓存技术不能缓解写入压力,而且原有的空间也受硬盘限制,因此开...

Redis学习笔记五:redis主从复制

  • lijunxian1013
  • lijunxian1013
  • 2016年07月22日 13:59
  • 3130
1: 主从备份 防止主机宕机2: 读写分离,分担master的任务3: 任务分离,如从服分别分担备份工作与计算工作1、 系统:centos 6.5 2、服务器数量:采用单台服务器,以多实例的方...

Redis主从复制

  • zouyujie1127
  • zouyujie1127
  • 2014年11月23日 15:18
  • 6726
Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构.实现步骤如下:1.在Windows...

Redis 主从复制

  • qq_19558705
  • qq_19558705
  • 2017年11月30日 22:14
  • 314
本章介绍Redis的一个强大功能--主从复制。一台master主机可以拥有多台slave从机,而一台slave从机又可以拥有多个slave从机。如此下去,形成强大的多级服务器集群架构(高扩展)。可以避...

Redis研究(十二)—主从复制

  • wtyvhreal
  • wtyvhreal
  • 2015年01月21日 21:25
  • 2913
在上一节中我们写了Redis的数据持久化http://blog.csdn.net/wtyvhreal/article/details/42916503     通过持久化功能,Redis保证了...

Redis主从复制总结整理

  • imxiangzi
  • imxiangzi
  • 2016年09月01日 16:25
  • 420
Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中。让从服务器(slave s...

redis主从复制和集群实现原理

  • nuli888
  • nuli888
  • 2016年08月06日 16:17
  • 12235
redis主从复制redis主从配置比较简单,基本就是在从节点配置文件加上:slaveof 192.168.33.130 6379主要是通过master server持久化的rdb文件实现的。ma...

Redis源码解析:15Resis主从复制之从节点流程

  • gqtcgq
  • gqtcgq
  • 2016年04月17日 10:43
  • 3397
Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡。 一:主从复制过程         Redis的复制功能分为同步(sync)...

redis主从复制及切换

  • xiaoyu_0217
  • xiaoyu_0217
  • 2017年07月17日 18:39
  • 403
现在我的系统用redis做缓存服务器,redis是一个单点,当一台机器岩机的时候,redis的服务完全停止,这时就会影响其他服务的正常运行,所以我们要做的是redis主从复制及主动切换,这就是redi...

redis的主从复制(读写分离)/哨兵(主从切换)配置

  • zmx729618
  • zmx729618
  • 2017年08月04日 14:04
  • 1229
当数据量变得庞大的时候,读写分离还是很有必要的。同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能。redis提供了一个master,多个sl...

Redis主从架构和主从从架构集群搭建详细步骤

  • RobertoHuang
  • RobertoHuang
  • 2017年04月25日 20:08
  • 2164
Redis主从复制的功能非常强大,它有以下好处:1.避免Redis单点故障2.构建读写分离架构,满足读多写少的应用场景1.主从架构1.1 Redis主从架构拓扑图结构 1.2 主从结构搭建Redi...

Redis集群 - 配置最简单的Redis主从

  • github_26672553
  • github_26672553
  • 2017年04月08日 10:57
  • 987
要求: 1、你已经知道redis是什么 2、熟悉Linux基本操作(CentOS 6.5) 3、有单机redis开发相关经验 4、有主观能动性,至少熟练百度的使用redis主从...

redis主从配置及主从切换

  • zfl092005
  • zfl092005
  • 2013年12月24日 10:00
  • 61936
环境描述:主redis:192.168.10.1 6379从redis:192.168.10.2 6380一、主从配置1、将主从redis配置文件redis.conf中的aemon...

Redis 主从配置心得及其高可用方案

  • Quiet_boy
  • Quiet_boy
  • 2016年12月26日 13:29
  • 4601
redis主从复制过程:当配置好slave后,slave与master建立连接,然后发送sync命令。无论是第一次连接还是重新连接,master都会启动一个后台进程,将 数据库快照保存到文件中,同...

Redis学习笔记(三) Redis主从架构和主从从架构 (1)

Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构. 可以避免Redis单点故障,构建读写分离...
  • a67474506
  • a67474506
  • 2015年12月30日 16:12
  • 6927
等级:
访问量: 43万+
积分: 3501
排名: 1万+

文章分类

展开




加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值