Redis 的主从复制配置非常容易,但我们先来了解一下它的一些特性。

  1. redis 使用异步复制。从 redis 2.8 开始,slave 也会周期性的告诉 master 现在的数据量。可能只是个机制,用途应该不大。
  2. 一个 master 可以拥有多个 slave,废话,这也是业界的标配吧。

  3. slave 可以接收来自其他 slave 的连接。意思是不是就是说 slave 在接收其他的slave的连接之后成为 master ?等下我们来验证。

  4. redis 复制在 master 这一端是非阻塞的,也就是说在和 slave 同步数据的时候,master 仍然可以执行客户端的操作命令而不受其影响。这点都不能保证,要你干嘛?
  5. redis 复制在 slave 这一端也是非阻塞的。在配置文件里面有 slave-serve-stale-data 这一项,如果它为 yes ,slave 在执行同步时,它可以使用老版本的数据来处理查询请求,如果是 no ,slave 将返回一个错误。在完成同步后,slave 需要删除老数据,加载新数据,在这个阶段,slave 会阻止连接进来。
  6. Replication can be used both for scalability, in order to have multiple slaves for read-only queries (for example, heavy SORT operations can be offloaded to slaves), or simply for data redundancy.这句话我也没理解什么意思。

  7. 使用复制可以避免 master 因为需要把全部的数据集写入磁盘而造成的开销,因此可以把 master 中 save 配置项全部注释掉,不让它进行保存,然后配置 slave ,让 slave 保存。虽然有这个特性,但是我们好像一般不这么做。

好吧,我们做几个例子练习一下。

先打开三个终端,然后起三个实例,分别用三个 client 去连接它们:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10000 --daemonize yes

zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10000

端口10000的做 master。

slave 01:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10001 --daemonize yes

zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10001

slave 02:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10002 --daemonize yes

zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10002

上面只是让它们的实例启动了并用客户端去连接它,并没有设置主从关系。在 slave 01 和 slave 02 上执行下面的命令:

127.0.0.1:10001> slaveof 127.0.0.1 10000

OK

127.0.0.1:10001>

这样就设置好了主从关系。我们来试试有没有效果。

127.0.0.1:10001> get testkey001

(nil)

127.0.0.1:10001>

这个时候是没有值的。

master 上执行:

127.0.0.1:10000> set testkey001 testvalue001

OK

127.0.0.1:10000>

然后看看 slave 上有没有:

127.0.0.1:10001> get testkey001

"testvalue001"

127.0.0.1:10001>

127.0.0.1:10002> get testkey001

"testvalue001"

127.0.0.1:10002>

有了,是不是比***点读机还 easy ?已经有了感性的认识,我们来介绍一下它的原理吧。

当你设置了主从关系后,slave 在第一次连接或者重新连接 master 时,slave 都会发送一条同步指令给 master ;

master 接到指令后,开始启动后台保存进程保存数据,接着收集所有的数据修改指令。后台保存完了,master 就把这份数据发送给 slave,slave 先把数据保存到磁盘,然后把它加载到内存中,master 接着就把收集的数据修改指令一行一行的发给 slave,slave 接收到之后重新执行该指令,这样就实现了数据同步。

slave 在与 master 失去联系后,自动的重新连接。如果 master 收到了多个 slave 的同步请求,它会执行单个后台保存来为所有的 slave 服务。

一旦 master 和 slave 在失去联系并重新连接上,总是会重新进行一次完整的同步。不过从 redis 2.8 开始,只是部分重新同步也是可以的。具体请大家参考官方文档。

祝大家端午节快乐。

下一篇,redis 的集群配置,敬请期待。

高性能网站架构设计之缓存篇(4)- Redis 主从复制的更多相关文章

  1. 高性能网站架构设计之缓存篇(5)- Redis 集群(上)

    集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节 ...

  2. 高性能网站架构设计之缓存篇(1)- Redis C#客户端

    一.什么 RedisREmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包括 ...

  3. 高性能网站架构设计之缓存篇(6)- Redis 集群(中)

    昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势. 我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我 ...

  4. 高性能网站架构设计之缓存篇(2)- Redis C#客户端

    在上一篇中我简单的介绍了如何利用redis自带的客户端连接server并执行命令来操作它,但是如何在我们做的项目或产品中操作这个强大的内存数据库呢?首先我们来了解一下redis的原理吧. 官方文档上是 ...

  5. 高性能网站架构设计之缓存篇(1)- Redis的安装与使用

    一.什么 Redis REmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包 ...

  6. 高性能网站架构设计之缓存篇(3)- Redis 的配置

    我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题: 1.redis server 启动后,独占进程,能不能修改为后台服务呢? 2.redis server 服务是单线 ...

  7. ASP.NET 构建高性能网站 架构设计

    Web前端系统 为了达到不同应用的服务器共享.避免单点故障.集中管理.统一配置等目的,不以应用划分服 务器,而是将所有服务器做统一使用,每台服务器都可以对多个应用提供服务,当某些应用访问量升高时,通过 ...

  8. (转)高性能网站架构之缓存篇—Redis集群搭建

    看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...

  9. 【HELLO WAKA】WAKA iOS客户端 之二 架构设计与实现篇

    上一篇主要做了MAKA APP的需求分析,功能结构分解,架构分析,API分析,API数据结构分析. 这篇主要讲如何从零做iOS应用架构. 全系列 [HELLO WAKA]WAKA iOS客户端 之一 ...

随机推荐

  1. php单独编译扩展模块

    以pdo_mysql为例: 1.下载 文件 或者 进入 在PHP源码包中进入ext/pdo_mysql http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 2.解压 ...

  2. css3新特性@rgba

    1.rgba也经常在实际应用中使用,它主要是在原来rgb的基础上添加了一透明度.但是他又和opacity又有一些差别,主要体现在对子元素的透明度的影响上. 例如:使用opacity和backgroun ...

  3. 哈哈,修改PHP5.4.44语法成功

    作为一个脚本语言,面向对象的继承基本上不想用到,强类型比较也想使用==直接比较.作为专业程序员不想让PHP解释器代劳过多. 修改了这个MOD版本,效果杠杠的.

  4. POJ 3281 Dining 最大流

    饮料->牛->食物. 牛拆成两点. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include ...

  5. JAVA网络编程

    网络技术基础  OSI模型 应用层-表示层-会话层-传输层-网络层-数据链路层-物理层  TCP/IP分层模型 应用层-传输层-网络互联层-网络接口层Socket(套接字) TCP套接字编程 Serv ...

  6. mysql行列调换方法

    行变列,列变行 财务样式模板: CREATE TABLE `grade` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR ...

  7. android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别

    android Activity类中的finish().onDestory()和System.exit(0) 三者的区别 Activity.finish() Call this when your a ...

  8. Nginx禁止ip访问或IP网段访问方法

    Nginx禁止ip访问可以防止指定IP访问我们的网站,本例子可以实现是防止单IP访问或IP网段访问了,非常的有用我们一起来看看吧. 常用的linux做法 iptables参考规则  代码如下 复制代码 ...

  9. SVN强制解锁操作

    如果是其他人锁定文件,而你期望对此文件操作,可进行偷锁操作: 1,将被锁定文件SVN Check out-到本机硬盘. 2,点击文件右键,选择get lock 3,勾上steal the locks ...

  10. nodejs研究笔记

    首先呢,安装 1:安装mongodb-win32-x86_64-3.2.5-signed.msi 2:手动创建目录 如 C:\data\db 及 C:\data\dbConf 3:管理员身份运行 cm ...