一.前言

  在分布式系统中,为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复合负载均衡等需求.Redis也是如此,它为我们提供了复制的功能,实现了相同数据的多个Redis副本.复制功能是Redis高可用的基础,后面的哨兵和集群都是在复制的基础上实现高可用的.

二.复制的配置

1.如何建立配置

  参与复制的Redis实例划分为master(主节点)和slave(从节点).在默认情况下,Redis都是master节点,每个节点只能有一个master节点,而master节点是可以同时具有多个slave节点的(如图一所示).复制数据的流是单向的,只能由master节点复制到slave节点.配置复制的方式有三种,如下:

  1. 在配置文件中加入slaveof {masterHost} {masterPort} 虽Redis启动生效.
  2. 在redis-server启动命令后加入--slaveof {mastaerHost} {masterPort} 生效.
  3. 直接使用命令:slaveof {mastaerHost} {masterPort}生效

2.如何断开复制

  slaveof命令不但可以建立复制,还可以在从节点执行 slaveof no one 来断开于主机节点的复制关系(如图二所示).从节点在断开复制后并不会抛弃原有的数据,只是无法获取主节点上的数据变化而已.其主要流程如下:

  1. 断开于主节点的复制关系
  2. 从节点晋升为主节点

  通过slaveof命令还可以实现切主操作,所谓的切主是指把当前的从节点对主节点的复制切换到另一个主节点.执行slaveof {newMastaerIp} {newMasterPort}命令即可,切主其流程如下:

  1. 断开与旧主节点复制关系
  2. 与新主节点建立复制关系
  3. 删除从节点当前所有数据
  4. 对新主节点进行复制操作

  

  图1:                                        

  图2:

注意:切主后从节点会清空之前所有的数据,线上人工操作时小心slaveof在错误的节点上之行或者指向错误的主节点

3.关于链接的安全性

  对于比较重要的节点,主节点会通过设置requeirepass参数进行密码验证,这时所有的客户端访问必须使用auth命令进行校验.从节点与主节点的复制连接是通过一个特殊的客户端来完成的,因此需要配置从节点的masterauth参数与主节点密码保持一致,这样从节点才可以正确的连接到主节点并发起复制流程.

4.只读

  默认情况下,从节点使用 alave-read-only=yes 配置为只读模式.由于复制只能从主节点到从节点,对于从节点的任何修改,主节点都是无法感知的,修改从节点会造成数据不一致.因此,建议不要修改这个配置.

5.传输延迟

  从节点一般部署到不同机器上,复制时的网络延迟就成为需要考虑的问题,Redis为我们提供了 repl-disable-tcp-nodelay 参数用于控制是否关闭TCP_NODELAY,默认关闭.

三.复制拓扑

  Redis的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性可以分为三种:一主一从、一主多从、树形主从结构.

1.一主一从

  一主一从是最简单的复制拓扑结构,用于主节点出现宕机时,从节点提供故障转移支持(如下图所示)。当应用写命令并发量较高且需要持久化时,可一只在从节点上开启AOF,这样既能保证数据安全性,也避免了持久化对主节点性能的影响.

注意:当主节点因为提高性能关闭了 AOF 持久化功能,如果主节点脱机要避免自动重启的操作,因为主节点之前并没有开启持久化功能,自动重启后数据集是为空的,如果从节点继续复制主节点的话,从节点的数据也会被清空!这样也就丧失了持久化的意义了.所以,如果想保留数据,正确的做法是先执行slaveof no one断开从节点和主节点的复制连接,然后再重启主节点来避免这一问题.

2.一主多从

  一主多从,又称星形拓扑结构,使得应用端可以利用多个从节点实现读写分离(如下图所示),对于读占比较大的场景,可以通过多个读节点分担主节点压力.同时,在日常开发中,一些耗时命,如:keys、sort等,可以在其中一台上执行,防止慢查询对主节点造成阻塞从而影响线上服务的稳定性.但是如果写并发量较高的话,多个从节点会导致主节点写命令的多次发送从而过度消耗网络带宽,同时也加重了主节点负载影响服务稳定性.

3.树形主从

  树形主从,又称:树状拓扑结构(如下图所示),使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制.通过引入复制中间层,可以有效的降低主节点负载均衡和需要传送给从节点的数据量但是当主节点需要挂载多个从节点时,为了对主节点的性能干扰,可以采用树状主从结构降低主节点压力.这样一主多从的缺点(多个从节点导致的消耗过多网络带宽)就解决了.

  但是,这样还会有新的问题出现,如果图中某个slave节点故障,那么后面的slave节点便将无法收到主节点的信息,因此对于运维来讲,增添了许多复杂度,需要手动将节点启动.

参考:《Redis开发与运维》

版权声明:尊重博主原创文章,转载请注明出处 https://www.cnblogs.com/hsdy

Redis 之复制-初入江湖的更多相关文章

  1. 14、Redis的复制

    写在前面的话:读书破万卷,编码如有神 --------------------------------------------------------------------------------- ...

  2. Redis的复制特性

    对于有扩展平台以适应更高负载经验的工程师和管理员来说,复制(replication)是不可或缺的.复制可以让其他服务器拥有一个不断更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读 ...

  3. Redis(八):Redis的复制(Master/Slave)

    Redis的复制(Master/Slave)目录导航: 是什么 能干嘛 怎么玩 复制原理 哨兵模式(sentinel) 复制的缺点 是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置 ...

  4. Redis的复制(Master/Slave)、主从复制、读写分离

    1.什么是Redis的复制 行话:也就是我们所说的主从复制,主数据更新后根据配置和策略自动同步到备用机的master/slave机制,Mater以写为主,slave以读为主. 2.能干什么 2.1.读 ...

  5. 8.Redis的复制(Master/Slave)

    Redis的复制(Master/Slave) a)是什么 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave ...

  6. Redis系列(四):Redis的复制机制(主从复制)

    本篇博客是Redis系列的第4篇,主要讲解下Redis的主从复制机制. 本系列的前3篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数据 ...

  7. Redis之复制

    1.配置 1.1 建立复制 参与复制的Redis实例划分为主节点(master) 和从节点(slave).默认情况下,Redis都是主节点.每个从节点只能有一个主节点,而主节点可以同时具有多个从节点. ...

  8. Redis的复制(Master/Slave)

    是什么 : 也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 能干嘛: 读写分离,容灾恢复 怎么玩: 1 ...

  9. Python Redis 数据复制.

    1 > 下载Python操作Redis的客户端 https://pypi.python.org/pypi/redis/2.7.6 下载完成后,参考该网站相关命令,执行安装. 2 > 下载 ...

随机推荐

  1. DAO层,Service层,Controller层、View层介绍

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  2. LeetCode算法题 菜鸟总结

    近期准备抽出一点时间,刷一些题防止手生,毕竟codemonkey,吃饭的手艺不能忘. ······································· 基本的题目都是基于java语言解答 ...

  3. Java 集合框架(常用数据结构)

    早在Java 2中之前,Java就提供了特设类.比如:向量(Vector).栈(Stack).字典(Dictionary).哈希表(Hashtable)这些类(数据结构)用来存储和操作对象组.虽然这些 ...

  4. Salesforce平台支持多租户Multi tenant的核心设计思路

    Multitenancy is the fundamental technology that clouds use to share IT resources cost-efficiently an ...

  5. Angular不同版本对应的Bootstrap组件

    AngularJS 1.x版本对应的 bootstrap组件库是ui-bootstrap; http://www.cnblogs.com/pilixiami/p/5597634.html Angula ...

  6. python虚拟环境virtualenv高级篇

    我曾经写过一篇virtualenv的博客:http://www.cnblogs.com/anpengapple/p/5907416.html 总体来讲还是适用的,不过稍微傻了一点.这一篇的内容有两个: ...

  7. HTML5 FormData对象

    利用FormData对象,你可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 创建一个FormData对象 你可以先创建一个空的F ...

  8. Bootstrap--模仿官网写一个页面

    本文参考Bootstrap官方文档写了简单页面来熟悉Bootstrap的栅格系统.常用CSS样.Javascript插件和部分组件. 以下html代码可以直接复制本地运行: BootstrapPage ...

  9. 机器学习基石笔记:Homework #2 decision stump相关习题

    原文地址:http://www.jianshu.com/p/4bc01760ac20 问题描述 程序实现 17-18 # coding: utf-8 import numpy as np import ...

  10. CS 20_Overview of Tensorflow

    tf.assign(A, new_number): 这个函数的功能主要是把new_number的值向前传递给了A run( fetches, feed_dict=None, options=None, ...