都在讲Redis主从复制原理,我来讲实践总结
摘要:本文将演示主从复制如何配置、实现以及实现原理,Redis主从复制三大策略,全量复制、部分复制和立即复制。
本文分享自华为云社区《Redis主从复制实践总结》,原文作者:A梦多啦A 。
复制简介
Redis 作为一门非关系型数据库,其复制功能和关系型数据库(MySQL)来说,功能其实都是差不多,无外乎就是实现的原理不同。Redis 的复制功能也是相对于其他的内存性数据库(memcached)所具备特有的功能。
Redis 复制功能主要的作用,是集群、分片功能实现的基础;同时也是 Redis 实现高可用的一种策略,例如解决单机并发问题、数据安全性等等问题。
服务介绍
在本文环境演示中,有一台主机,启动了两个 Redis 示例。

实现方式
Redis 复制实现方式分为下面三种方式:
1. 服务启动时配置
该方式通过在启动 Redis 服务时,通过命令行参数,进行启动主从复制功能。该方式的弊端是不能实现配置持久化,当服务停掉之后,启动服务时,需要添加相同的命令参数。
1.1 master 服务器事先在 redis.confg 增加 requirepass 项。
requirepass 6379
1.2 启动从服务器。
redis-server --port 6380 --replicaof 192.168.2.102 6379
2. 命令行配置
该方式通过使用 redis-cli 进入操作行界面,进行配置。该方式的弊端是不能实现配置持久化,当服务停掉之后,启动服务需要执行同样的命令。
2.1 master 服务器执行。
127.0.0.1:6379> config set requirepass 6379
OK
2.2 从服务器执行。
127.0.0.1:6380> replicaof 192.168.2.102 6379
OK
127.0.0.1:6380> config set masterauth 6379
OK
3. 配置文件配置
该方式是通过 redis.conf 配置文件进行设置,能够实现配置的持久化,是一种推荐使用的方式。
3.1 配置主服务器,redis.config。
requirepass 6379
3.2 配置从服务器,redis.config。
masterauth 6379
replicaof 192.168.2.102 6379
4.配置说明
1.masterauth:设置 redis.confi 连接密码,如果设置了该值。其他客户端在连接该服务器时,需要添加密码才可以访问。
2.requirepass:设置主服务器的连接密码,和 1 中 masterauth 一致。
3.replicaof:从服务器连接到服务器的 IP 地址+端口号。
效果测试
1.主服务器添加数据。

2.从服务器获取数据。

实现原理

// uml图
@startuml
从服务器->主服务器: 1.保存配置
从服务器->主服务器: 2.建立socket连接
从服务器->主服务器: 3.发送ping命令
从服务器->主服务器: 4.权限验证
从服务器->主服务器: 5.同步数据
从服务器->主服务器: 6.持续复制数据
@enduml
主从复制主要实现的一个流程如上图:
1.第一步,从服务器保存主服务器的配置信息,保存之后待从服务器内部的定时器执行时,就会触发复制的流程。
2.第二步,从服务器首先会与主服务器建立一个socket套字节连接,用作主从通信使用。后面主服务器发送数据给从服务器也是通过该套字节进行。
3.第三步,socket套字节连接成功之后,接着发送鉴权ping命令,正常的情况下,主服务器会发送对应的响应。ping命令的作用是为了,保证socket套字节是否可以用,同时也是为了验证主服务器是否接受操作命令。
4.第四步,接着就是鉴权验证,判断从节点配置的主节点连接密码是否正确。
5.第五步,鉴权成功之后,就可以开始复制数据了。主服务器此时会进行全量复制,将主服务的数据全部发给从服务器,从服务器保存主服务器发送的数据。
6.接下来就是持续复制操作。主服务器会进行异步复制,一边将写的数据写入自身,同时会将新的写命令发送给从服务器。
实现策略
Redis主从复制主要分为三种弄策略方式,不同的策略方式都是针对不同的场景下进行使用。三种场景方式分别如下:
1.全量复制。全量复制用在主从复制刚建立时或者从切主服务器时,从服务器没有主服务器的数据,主服务器会将自身的数据通过rdb文件方式发送给从服务器,从服务器会清空自身数据,接着将主服务器发送的数据加载到自身中。

// uml图
@startuml
从服务器->主服务器: 1.psync ? -1
主服务器->从服务器: 2.fullsync runid offset
从服务器: 3.保存 runid offset
主服务器: 4.执行bgsave生成rdb
主服务器->从服务器: 5.发送rdb
从服务器: 6.清空自身老数据
从服务器: 7.加载主服务器数据
@enduml
2.部分复制。部分复制用在一些异常情况下,例如主从延迟、从服务宕机之后重新启动接收主服务器发送的部分数据。
部分复制的实现主要依赖于复制缓存区、主服务的runid、主从服务器各自的复制偏移量(offset)。
复制缓存区:主服务在接收写命令时,会将命令写入缓存区,以便从服务器在异常情况下,减少数据的丢失。当从服务器正常连接之后,主服务器会将缓存区内的数据发送给从服务器。这里的缓存区是一个长队列。
主服务器runid:主服务器会在每次服务启动之后,会生成一个唯一的ID,作为自身标识。从服务器会将该标识保存起来,发送部分复制命令时,会使用该runid。
psync runid offset
主从复制各自偏移量:主从服务在建立复制之后,都会有自身的偏移量。从节点会每秒钟发送自身复制的偏移量给从节点,主节点在发送写命令之后,从节点也会增加自身的复制偏移量。主节点在每次进行了写命令之后,也会增加自身的偏移量。这里的偏移量是通过命令的字节长度累加计算。
3.异步复制。异步复制是针对主从建立复制关系之后,主从服务器持续保持复制关系。
场景问题
1.数据安全。
// 从服务器只读
replica-read-only yes
// 从服务器连接密码
masterauth
2.数据延迟。
默认的情况下主节点存在新数据不会立即发送给从服务器,如果开启,则会理解发送给从服务器。默认的时间拒绝与Linux内核。
// 复制延迟
repl-disable-tcp-nodelay yes
3.主从节点连接状态。
主从节点一旦建立连接之后,会定时模拟成对方的客户端,检测对方的服务状态。主节点可以通过设置repl-ping-replica-period配置参数进行设置。默认的频率是10s。
从节点咋执行replconf ack {offsetid}时,也会将自身的复制偏移量发送给主服务器,主服务根据偏移量进行判断数据延迟。存在数据延迟就会从复制积压缓冲区的数据汇中,将对应的数据补发给从节点。
都在讲Redis主从复制原理,我来讲实践总结的更多相关文章
- 深入Redis 主从复制原理
原文:深入Redis 主从复制原理 1.复制过程 2.数据间的同步 3.全量复制 4.部分复制 5.心跳 6.异步复制 1.复制过程 从节点执行 slaveof 命令. 从节点只是保存了 slaveo ...
- 太全了!Redis主从复制原理以及常见问题总结
相信很多小伙伴都已经配置过主从复制,但是对于redis主从复制的工作流程和常见问题很多都没有深入的了解.这次给大家整理一份redis主从复制的全部知识点. 下方可视频观看,效果更佳 Redis实战精讲 ...
- Redis主从复制原理总结
和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redi ...
- 彻底搞懂Redis主从复制原理及实战
欢迎关注公众号:「码农富哥」,致力于分享后端技术 (高并发架构,分布式集群系统,消息队列中间件,网络,微服务,Linux, TCP/IP, HTTP, MySQL, Redis), Python 等 ...
- Redis 主从复制原理及雪崩 穿透问题
定义: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMw ...
- Redis面试篇 -- Redis主从复制原理
Redis一般是用来支撑读高并发的,为了分担读压力,Redis支持主从复制.架构是主从架构,一主多从, 主负责写,并且将数据复制到其它的 slave 节点,从节点负责读. 所有的读请求全部走从 ...
- 详解Redis主从复制原理
文章首发于公众号 "蘑菇睡不着" 前言 Redis 的主从复制和 MySQL 差不多,主要起着 数据备份,读写分离等作用.所以说主从复制对 Redis 来说非常重要,而无论是面试还 ...
- Redis主从复制原理
前言: 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构, ...
- redis 深入理解redis 主从复制原理
redis 主从复制 master 节点提供数据,也就是写.slave 节点负责读. 不是说master 分支不能读数据,也能只是我们希望将读写进行分离. slave 是不能写数据的,只能处理读请求 ...
随机推荐
- Python+OpenCV+图片旋转并用原底色填充新四角
import cv2 from math import fabs, sin, cos, radians import numpy as np from scipy.stats import mode ...
- KMP 算法 & 字符串查找算法
KMP算法 Knuth–Morris–Pratt algorithm 克努斯-莫里斯-普拉特 算法 algorithm kmp_search: input: an array of character ...
- Scratch 游戏开发
Scratch 游戏开发 可视化少儿编程 https://scratch.mit.edu/ Scratch Desktop https://scratch.mit.edu/download https ...
- git in depth
git in depth git delete remote branch # Deleting remote branches in Git $ git push origin --delete f ...
- VSCode & useful Extensions
VSCode & useful Extensions Code Spell Checker bug user dictionary https://www.cnblogs.com/xgqfrm ...
- 那些容易犯错的c++保留字
本文首发 | 公众号:lunvey 目前正在学习vc++6.0开发,而这里面使用的是c++98标准. 保留字,也称关键字,是指在变量.函数.类中不得重新声明的名称. c++98中大致有48个保留字,这 ...
- Vue学习笔记-Vue.js-2.X 学习(四)===>脚手架Vue-CLI(基本工作和创建)
(五) 脚手架Vue-CLI 一 Vue-CLI前提(nodejs和webpack) 二 Vue学习-nodejs按装配置,Node.js 就是运行在服务端的 JavaScript. 1. 去nod ...
- Java常用类:Scanner类
一.简介 java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入. 二.创建对象 示例: Scanner scanner = new Scanner(Sy ...
- java内存区域的划分
前言 之前我们探讨过一个.class文件是如何被加载到jvm中的.但是jvm内又是如何划分内存的呢?这个内被加载到了那一块内存中?jvm内存划分也是面试当中必被问到的一个面试题. 什么是JVM内存区域 ...
- 剑指 Offer 58 - I. 翻转单词顺序 + 双指针
剑指 Offer 58 - I. 翻转单词顺序 Offer_58_1 题目描述 方法一:使用Split函数 package com.walegarrett.offer; /** * @Author W ...