redis主从复制

1.redis主从复制的作用

  redis的定位是一个高可用的数据服务器,可是在实际生产环境下,单机的redis服务器是无法满足真正意义上的高可用性的。

  第一,单机的redis服务器很容易发生单点故障,即使redis提供了各种持久化的方法来避免数据的丢失,但是物理上的故障(硬盘损毁等)还是无法完全避免的。

  第二,如果对单台机器的性能进行纵向拓展,无论是CPU,内存还是磁盘容量都很容易达到瓶颈,无法满足实际需求。

  针对这些问题,redis提供了复制(replication)的功能,通过"主从(一主多从)"和"集群(多主多从)"的方式对redis的服务进行水平扩展,用多台redis服务器共同构建一个高可用的redis服务系统。

  在这里,我们主要介绍redis的主从复制功能。

2.redis主从复制介绍  

  在redis的复制概念模型中,分为"主(master)""从(slave)"两种角色类型的服务器,从服务器"服从"主服务器。主服务器既可以读也可以写,而从服务器原则上只允许读操作(通过修改配置,从服务器也可以执行写入操作),同时负责接收和同步主服务器上的数据。主服务器和从服务器是一对多的关系,从服务器也可以拥有从服务器,以此类推。  

  可以看到主从结构下的redis服务器集群节点的拓扑结构是一棵树。

            

  使用了主从结构的redis系统,一般是读写分离的:"主库负责写入,在写入的同时和从库进行数据的同步;而从库负责读取操作。"

  一主多从的结构下,不会出现单点故障,同时可用性也得到了保障。由于负责读取的从库相对较多,因此很适合读多写少(例如:电商)的场景。

  使用redis的主从复制功能比较简单,只需要在从服务器启动的配置文件中添加slaveof "IP" "PORT"配置即可,同时redis也允许其它的方式来实现这一目的(启动时命令行参数、redis命令等)。可以通过info replication来查看当前redis服务器在主从复制中的状态。

    6381端口 从库状态

    6379端口 主库状态

3.redis主从复制原理  

  1.从服务器初始化

  当从服务器启动时,会向主服务器发送SYNC命令,请求同步数据。主服务器接收到消息之后,进行RDB持久化,并生成一个快照文件;与此同时,主服务器会将生成快照期间新执行的命令缓存起来。在快照文件生成完毕之后,主服务器将RDB快照文件和缓存下来的命令一并发送给从服务器,从服务器首先载入接收到的RDB快照文件,接着执行被缓存下来的新命令,完成主从数据的初始化同步操作。

  2.从服务器保持同步

  从服务器在同步完成之后,主服务器接收到的所有命令都会异步的发送给从服务器用来保持主从数据的一致性。

  3.从服务器故障后处理

  当从服务器崩溃之后,重启之后进行初始化,会自动的同步主服务器的数据。在redis的2.8版本之后,redis采用了"增量复制"的方式优化了从服务器的初始化同步数据的过程。

  4.主服务器故障后处理

  当主服务器崩溃之后,首先需要手动的选择一个从服务器升级为主服务器(需要手动调整所有相关的从服务器),然后启动之前已经崩溃的主服务器作为从服务器回到系统中。

  可以看到,redis在主服务器崩溃之后需要繁琐的人工干预来恢复服务,特别是在主数据库禁止了持久化之后,上述步骤不能错乱,否则会导致主数据库重启后恢复了错误数据,进而导致从数据库也同步错误数据这一灾难性后果。为此,redis提供了哨兵机制,用于自动化的监控和维持分布式redis系统的良好运转。

4.redis哨兵

  1.哨兵的介绍  

  redis的设计者为了让redis能够在主从模式下实现故障恢复的自动化,为此提供了redis的哨兵功能。哨兵是一个独立于数据服务器的进程,用于监控redis数据服务器的状态,当主从模式下最关键的主服务器出现故障时,能够被哨兵自动的察觉。同时哨兵会在剩余的从服务器中"选举"出新的主服务器,达到自动化恢复系统服务的目的。

  2.哨兵的使用

  redis提供了redis-sentinel脚本用于部署哨兵,启动时通过指定的哨兵配置文件来对哨兵的行为进行灵活的控制。哨兵的配置文件中至少需要包含被哨兵监控的主服务器IP、端口、投票决定数目,当然也可以配置诸如down-after-milliseconds(发送ping命令的时间间隔,用于监听)等选项。

  sentinel monitor "master_name" "IP" "PORT" 

  down-after-milliseconds "milliseconds" ("milliseconds"大于1000时,默认为1000)

  3.哨兵的工作方式

  哨兵启动时会与主服务器建立连接,并且间接的获得所属从服务器信息,完成哨兵的初始化。哨兵初始化完成之后,会周期性的和主从服务器、其它哨兵节点(通过消息频道的订阅/发布)进行通信。

  哨兵每10秒会向所有服务器发送一次INFO命令,获得相关redis服务器的当前状态以便决定是否需要故障恢复。

  当一个哨兵在down-after-milliseconds规定时间内未收到主服务器的响应,则当前哨兵"主观"认为主服务器下线,同时和监视当前系统的其它哨兵进行投票决定,当超过当前哨兵配置中投票决定的数目时,则当前哨兵"客观"认为主服务器下线,哨兵集群会选举出领导哨兵来进行主从服务器集群主从状态的切换(使用Raft算法)。

5.redis主从复制总结

  1.乐观复制策略

  redis的主从复制采用的是乐观复制的策略,在一定的时间内允许主从服务器的数据不完全一致,但是保持主从数据库数据的最终一致性(按照CAP定理,放弃了C(强一致性))。

  这意味着redis主从服务器之间的数据复制操作时异步的,主服务器不等待从服务器返回复制的结果,可以立即处理新的写入命令。这一策略使得主服务器的性能在复制时不会受到太大影响,但是从服务器会出现短时间内数据不一致的情况。redis允许用户配置主库的min-slaves-to-write(代表至少N台从服务器完成复制,才允许主服务器写入)和min-slaves-max-lag(允许从服务器断开连接的时间)这两个配置项来控制分区中数据不一致的影响。

  2.和集群的区别

  redis的主从复制特性为redis带来了很高的读取可用性,但是对于海量数据的持久化存储是力不从心的。因为主从复制结构下,任意的节点都保存了100%的存储数据,所以能够存储的数据规模还是受限于单例服务器存储容量的大小。

  为此,在单主多从结构的基础上,redis还提供了集群特性。通过将存储数据合理的分片存储在不同的redis节点上,通过集群水平扩容之后的redis集群拥有了极高的读写可用性和分区容错性。理解redis的主从复制原理是理解更为复杂的集群特性的基础。

redis学习(七)redis主从复制的更多相关文章

  1. Redis学习笔记~Redis主从服务器,读写分离

    回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...

  2. redis学习笔记-redis的安装

    Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...

  3. Redis学习笔记-Redis内部数据结构

    Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...

  4. redis学习之——redis.conf配置(基本)文件学习

    # Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...

  5. Redis学习笔记10--Redis主从复制

    redis主从复制配置和使用都非常简单.通过主从复制可以允许多个slave server拥有和master server相同的数据库副本.下面是关于redis主从复制的一些特点:       1.ma ...

  6. Redis学习笔记(二) - 主从复制

    概述 指将一台redis服务器上的数据,复制到其他redis服务器上,前者称为主服务器(master),后者称为从服务器(slave). 默认情况下主从关系为一对多关系. 数据复制是单向的,只能从主服 ...

  7. Redis 学习-持久化与主从复制

    一.持久化 1. RDB rdb 是 redis 内存到硬盘的快照,用于持久化 ①. 通过执行命令,主动保存快照 save # 执行保存快照,执行时 redis 会处理阻塞状态直至执行完成. bgsa ...

  8. Redis学习七:Redis的持久化-总结(Which one)

    1.官网建议 2.RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储 3.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些 命令来恢复原始的数据,AOF命令以red ...

  9. redis学习笔记——Redis过期键的删除策略

    Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...

  10. Redis学习笔记——Redis的基本操作

    之前介绍过如何在ubuntu安装Redis服务器:https://www.cnblogs.com/zifeiy/p/9062738.html 接下来,我们在Redis上进行一些基本的操作. 所县使用命 ...

随机推荐

  1. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    转自: http://blog.csdn.net/liubenlong007/article/details/54692241 概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺 ...

  2. 《计算机科学基础》学习笔记_Part 1 Computer and Data

    Technorati Tags: 计算机科学基础,读书笔记 Chapter 1. Introduction Ø  计算机:黑盒,Output Data=f(Input Data, Program) Ø ...

  3. TF-IDF模型的概率解释

    信息检索概述 信息检索是当前应用十分广泛的一种技术,论文检索.搜索引擎都属于信息检索的范畴.通常,人们把信息检索问题抽象为:在文档集合D上,对于由关键词w[1] … w[k]组成的查询串q,返回一个按 ...

  4. Flashcache基本使用及注意事项

    Flashcache基本使用及注意事项 发表回复 环境:Centos6.5 x64 minal 安装方法 Contents [hide] 1 安装方法 2 自动加载模块 3 创建Flashcache ...

  5. 在 Centos7 的KVM上启用嵌套虚拟化

    1.嵌套虚拟化意味着在虚拟机内配置虚拟化环境.换句话说,我们可以说嵌套虚拟化是虚拟机管理程序hypervisor的一个特性,它允许我们通过虚拟化管理程序(宿主机)的硬件加速在虚拟服务器内安装和运行虚拟 ...

  6. Windows核心编程:第3章 内核对象

    Github https://github.com/gongluck/Windows-Core-Program.git //第3章 内核对象.cpp: 定义应用程序的入口点. // #include ...

  7. C#调用接口注意要点

    在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存cookie值,再进行其他接 ...

  8. Redis .Net

    一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括 ...

  9. react-native项目之样式总结

    react native(以下简称rn)里面涉及到的样式规则都是在js文件中写的,一改pc端的在样式文件中定义规则,所以pc端开发习惯的童鞋转向开发rn项目时,可能会对样式感到有些奇怪:其实react ...

  10. Codeforces Round #469 (Div. 2)C. Zebras(思维+模拟)

    C. Zebras time limit per test memory limit per test 512 megabytes input standard input output standa ...