redis入门到精通系列(八):redis的高可用--主从复制详解
(一)主从复制介绍
前面所讲的关于redis的操作都属于单机操作,单机操作虽然操作简单,但是处理能力有限,无法高可用。所谓高可用性,就是指当一台服务器宕机的时候,有备用的服务器能顶替上,在单机操作上这是无法实现的,因此就出现了主从复制。
我们把一台服务器看作是主服务器(master),把另外多台服务器看作是从服务器(slave),主从复制就是将master中的数据即时有效的复制到slave中。

主从复制特征:
一个master可以拥有多个slave,一个slave只对应于一个master
master负责执行写数据,将出现变化的数据自动同步到slave
slave负责读数据,禁止写数据
有了主从复制之后,就可以实现高可用了,当一台slave宕机后,还有多台slave存在;当master宕机后,由于slave的数据和master是一样的,就可以推选一台slave为新的master,都能做到高可用。
主从复制的作用:
读写分离:master写,slave读
负载均衡:由slave分担master负载,并根据具体的需求可以改变slave的数量
故障恢复:当master出现问题时,可以由slave来代替master,实现快速恢复
数据冗余:有了多台slave,数据备份就变得更加容易
(二)主从复制工作流程
主从复制工作流程可以分为三个阶段:
1.建立连接阶段
2.数据同步阶段
3.命令传播阶段(反复同步)

2.1 建立连接阶段
1.设置master的地址和端口号
2.建立socket连接
3.发送ping命令(定时器任务)
4.身份验证

为了实现上述过程,我分别在两个端口开启redis服务,6379代表master,6380代表slave
复制两份redis的配置文件,重命名为redis6379.conf和redis6380.conf,分别修改配置文件中的port为6379和6380。在cmd下开启两个服务:

再开启两个客户端分别连接两个redis服务,6379是master,6380是slave
-
redis-cli -p 6379
-
redis-cli -p 6380
主从连接
slaveof <masterip> <masterport>

此时主从连接已经完成,我在master设置一个name,在slave中可以直接获取


主从连接除了可以用命令连接之外,还可以在配置文件中进行配置,在redis6380.conf中增加这一句
slaveof 127.0.0.1 6379
再启动时就自动完成了主从连接
断开主从连接
slaveof no one
2.2 数据同步阶段
1.请求同步数据
2.创建RDB同步数据
3.恢复RDB同步数据
4.请求部分同步数据
5.恢复部分同步数据
光看这样5步可能有点抽象,用一张图来表示:

数据同步又分为全量复制和部分复制两块,其中全量复制就是你启动同步指令之后进行的RDB操作,把master中的数据通过RDB发送给slave。由于RDB采用bgsave指令,所以在全量复制期间master所做的操作会进入一个缓冲区,当全量复制结束后就需要通过部分复制来恢复缓冲区中的操作,这里采用AOF。
数据部分同步的注意事项:
通过上面的介绍我们知道了当在进行全量复制时所进行的操作会放入缓存区,但是如果缓存区设置过小就会导致master阻塞,通过下面方式可以设置缓存区大小:
repl-backlog-size 1mb
可以通过配置以下参数暂时关闭slave对外服务
slave-server-stable-data yes|no
2.3 命令传播阶段
命令传播阶段就是当master数据库状态发生变化,就会通过命令传播阶段同步给slave
命令传播阶段有三个核心要素:
服务器的运行id、主服务器的复制积压缓冲区、主从服务器的复制偏移量
服务器运行id:
服务器运行id是每台服务器每次运行的身份识别码,由40个字符组成,用于在服务器之间传输时识别身份。
主服务器的复制积压缓冲区:
复制积压缓冲区又称为复制缓冲区,是一个先进先出的队列。当master数据库发生变化时,master会将要传播给slave的命令保存在复制缓冲区中,slave分别从复制缓冲区接收信息。
主从服务器的复制偏移量:
因为命令传播阶段首先由master把数据放入缓冲区中,因此master需要一个复制偏移量记录发送给slave的指令对应的位置。而slave要把缓冲区中的数据同步到自己这里,因此也需要一个复制偏移量记录接收到的位置,如果因为意外断网,等网络再次连接之后就可以直接从复制偏移量的位置继续复制。
2.4 心跳机制
进入命令传播阶段后,master和slave需要通过心跳机制保持双方连接
master心跳:
通过ping指令查询slave是否在线,可由repl-ping-slave-period设置周期,默认10秒
slave心跳:
指令:
replconf ack {offset}
周期1秒;
作用:汇报slave自己的复制偏移量;判断master是否在线
当slave多数都掉线或者slave延迟过高时,可以强制关闭master的写功能,停止数据同步:
-
min-slaves-to-write 2 当连接的slave小于等于2台时停止数据同步
-
min-slaves-max-lag 10 当连接的slave延迟大于10秒,停止数据同步
redis入门到精通系列(八):redis的高可用--主从复制详解的更多相关文章
- redis入门到精通系列(四):Jedis--使用java操作redis详解
(一)前言 如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用.Java语言通过JDBC操作mysql,用Jedis操作redis.当然了,java操作redis的方式不止jedis一种 ...
- redis入门到精通系列(二):redis操作的两个实践案例
在前面一篇博客中我们已经学完了redis的五种数据类型操作,回顾一下,五种操作类型分别为:字符串类型(string).列表类型(list).散列类型(hash).集合类型(set).有序集合类型(so ...
- redis入门到精通系列(一)
(一)为什么要用Nosql 如果你是计算机本科学生 ,那么一定使用过关系型数据库mysql.在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿 ...
- redis入门到精通系列(九):redis哨兵模式详解
(一)哨兵概述 前面我们讲了redis的主从复制,为了实现高可用,会选择一台服务器作为master,多台服务器作为slave.现在有这样一种情况,master宕机了,这时系统会选择一台slave作为m ...
- redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...
- redis入门到精通系列(七):redis高级数据类型详解(BitMaps,HyperLogLog,GEO)
高级数据类型和五种基本数据类型不同,并非新的数据结构.高级数据类型往往是用来解决一些业务场景. (一)BitMaps (1.1) BitMaps概述 在应用场景中,有一些数据只有两个属性,比如是否是学 ...
- redis入门到精通系列(六):redis的事务详解
(一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...
- redis入门到精通系列(五):redis的持久化操作(RDB、AOF)
(一)持久化的概述 持久化顾名思义就是将存储在内存的数据转存到硬盘中.在生活中使用word等应用的时候,如果突然遇到断电的情况,理论上数据应该是都不见的,因为没有保存的word内容都存放在内存里,断电 ...
- Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)
1.简介 上一篇中宏哥已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先宏哥给大家介绍一下如何来创建一个测试计划(Test Plan). 2.创建一个 ...
随机推荐
- OSI模型 & TCP/IP模型
分层思想 分层思想:将复杂 的流程分解 为几个功能相对单一 的子过程 整个流程更加清晰 ,复杂问题简单化 更容易发现问题并针对性的解决问题 分层思想在网络中的应用 OSI模型 国际标准化组织(Inte ...
- robot_framewok自动化测试--(9)连接并操作 MySql 数据库
连接并操作 MySql 数据库 1.mysql数据库 1.1安装mysql数据库 请参考我的另一篇文章:MYSQL5.7下载安装图文教程 1.2.准备测试数据 请参考我的另一篇文章:Mysql基础教程 ...
- 添加su权限
在root用户下 visudo amy ALL=(ALL) NOPASSWD:ALL 在amy用户下 vim ~/.bashrc alias sd = "sudo"
- Part 35 AngularJS caseInsensitiveMatch and Inline Templates
In this video we will discuss 2 simple but useful features in Angular caseInsensitiveMatch Inline Te ...
- c++学习笔记(八)
内联函数 概念 内联(inline)函数是c++为提高程序运行速度所做得一项改进. 与常规函数的区别不在于编写方式,而在于被调用时的运行机制不同----编译器使用函数代码替换函数调用. 引用内联函数时 ...
- java解析Excel日期格式转换问题
Excel上传导入,Excel里面单元格是日期的会解析出来数字,比如2020-07-11会解析为44023解决方法一: Excel单元格格式设置为文本格式.解决方法二: 使用代码处理,把解析出来的44 ...
- Python科普系列——类与方法(上篇)
欢迎来到新的系列,up又开新坑了~~ 实际上,Python作为一门易用性见长的语言,看上去简单,却仍然有很多值得一说的内容,因此这个系列会把Python中比较有意思的地方也给科普一遍.而另一方面,关于 ...
- Linux驱动实践:带你一步一步编译内核驱动程序
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- 【linux系统】java环境搭建
搭建步骤 1.安装java : 上传java安装包到linux系统----- rz jdk-8u202-linux-x64.tar.gz jdk下载地址:https://www.oracle.com/ ...
- [bzoj1106]立方体大作战
先贪心,容易发现如果两个点中间没有点对,那么一定可以先把这两个点消掉分析一下,就可以发现这样两个点的答案就是这两个点对中间不成对的点数量扫描过去,线段树维护每一个点的权值(是否会被算入答案)即可 1 ...