Redis 之复制-初入江湖
一.前言
在分布式系统中,为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复合负载均衡等需求.Redis也是如此,它为我们提供了复制的功能,实现了相同数据的多个Redis副本.复制功能是Redis高可用的基础,后面的哨兵和集群都是在复制的基础上实现高可用的.
二.复制的配置
1.如何建立配置
参与复制的Redis实例划分为master(主节点)和slave(从节点).在默认情况下,Redis都是master节点,每个节点只能有一个master节点,而master节点是可以同时具有多个slave节点的(如图一所示).复制数据的流是单向的,只能由master节点复制到slave节点.配置复制的方式有三种,如下:
- 在配置文件中加入slaveof {masterHost} {masterPort} 虽Redis启动生效.
- 在redis-server启动命令后加入--slaveof {mastaerHost} {masterPort} 生效.
- 直接使用命令:slaveof {mastaerHost} {masterPort}生效
2.如何断开复制
slaveof命令不但可以建立复制,还可以在从节点执行 slaveof no one 来断开于主机节点的复制关系(如图二所示).从节点在断开复制后并不会抛弃原有的数据,只是无法获取主节点上的数据变化而已.其主要流程如下:
- 断开于主节点的复制关系
- 从节点晋升为主节点
通过slaveof命令还可以实现切主操作,所谓的切主是指把当前的从节点对主节点的复制切换到另一个主节点.执行slaveof {newMastaerIp} {newMasterPort}命令即可,切主其流程如下:
- 断开与旧主节点复制关系
- 与新主节点建立复制关系
- 删除从节点当前所有数据
- 对新主节点进行复制操作
图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 之复制-初入江湖的更多相关文章
- 14、Redis的复制
写在前面的话:读书破万卷,编码如有神 --------------------------------------------------------------------------------- ...
- Redis的复制特性
对于有扩展平台以适应更高负载经验的工程师和管理员来说,复制(replication)是不可或缺的.复制可以让其他服务器拥有一个不断更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读 ...
- Redis(八):Redis的复制(Master/Slave)
Redis的复制(Master/Slave)目录导航: 是什么 能干嘛 怎么玩 复制原理 哨兵模式(sentinel) 复制的缺点 是什么 官网 行话:也就是我们所说的主从复制,主机数据更新后根据配置 ...
- Redis的复制(Master/Slave)、主从复制、读写分离
1.什么是Redis的复制 行话:也就是我们所说的主从复制,主数据更新后根据配置和策略自动同步到备用机的master/slave机制,Mater以写为主,slave以读为主. 2.能干什么 2.1.读 ...
- 8.Redis的复制(Master/Slave)
Redis的复制(Master/Slave) a)是什么 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave ...
- Redis系列(四):Redis的复制机制(主从复制)
本篇博客是Redis系列的第4篇,主要讲解下Redis的主从复制机制. 本系列的前3篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数据 ...
- Redis之复制
1.配置 1.1 建立复制 参与复制的Redis实例划分为主节点(master) 和从节点(slave).默认情况下,Redis都是主节点.每个从节点只能有一个主节点,而主节点可以同时具有多个从节点. ...
- Redis的复制(Master/Slave)
是什么 : 也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 能干嘛: 读写分离,容灾恢复 怎么玩: 1 ...
- Python Redis 数据复制.
1 > 下载Python操作Redis的客户端 https://pypi.python.org/pypi/redis/2.7.6 下载完成后,参考该网站相关命令,执行安装. 2 > 下载 ...
随机推荐
- C# 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
C# 在调用C++dll时,可能会出现 :试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B)这个错误. 一般情况下是C#目标平台跟C++dll不兼容,64位跟32位兼容性问 ...
- 【转】网络管理员必知之:IP地址划分
1.IP地址分类 IP地址有四个段,包括网络标识和主机标识两部分:netid+hostid. IP地址应用分为A.B.C三类,D.E类是保留和专用的. ...
- 使用CALayer制作View的辉光效果
使用CALayer制作View的辉光效果 实现以下的辉光效果: 思路是这样子的: 1. 创建好需要实现辉光效果的View 2. 对这个View进行截图 3. 将这个截图重新添加进View中 4. 对这 ...
- MYSQL数据库、用户、表等基础构建
MYSQL数据库.用户.表等基础构建: 1.->:创建数据库: 1.1. create schema [数据库名称] default character set utf8 collate utf ...
- Android studio ocr初级app开发问题汇总(含工程代码)
博客第一篇文章,稍作修改,增加文字介绍 开发目的 最近由于某些需求,需要在Android手机端实现OCR功能,大致为通过手机照相,识别出相片中的中文信息字段.但是由于新手光环+流程不熟悉,遇到了各种各 ...
- aclocal: error: aclocal: file '/usr/local/share/aclocal/wxwin.m4' does not exist
1. 查找wxwin.m4文件 mdfind -name wxwin.m4 2. 删除/usr/local/share/aclocal/wxwin.m4,建立软连接 cd /usr/local/sha ...
- 使用android studio检测app内存泄漏【转载】
Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的crash,甚至可能出现因内存不足而导致APP崩溃. 一般检测android ...
- DQL、DML、DDL、DCL概念与区别
SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...
- Failed to read Class-Path attribute from manifest of jar file:/XXX问题
java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX ...
- Protocols, Generics, and Existential Containers — Wait What?
For the longest time now, I thought that the two functions above were the same. But in actuality, wh ...