Redis Replication

news2025/1/12 8:53:15

高可用架构-Redis Replication

今天学习下如何基于Redis 复制功能构建高可用架构-主从复制,Redis Replication 支持数据复制和故障切换。Redis复制是允许Redis实例完全复制主实例的过程。默认情况下,复制是一个异步过程。Redis复制在主机端和副本端都是非阻塞的。这意味着当一个或多个副本执行初始同步或部分重新同步时,主机将继续处理查询。同样,在副本端,在复制期间,它可以使用旧版本的数据集处理查询。

Redis Replication为了解决Redis高并发的问题,在数据实时性要求不高的场景下,允许应用程序进行读写分离操作。读取副本可提高读取吞吐量,并在节点故障时防止数据丢失。复制既可以用于可扩展性,以便为只读查询提供多个副本,也可以用于提高数据安全性和高可用性。

除了默认情况下是只读的之外,主副本和副本之间的一个重要区别是副本不会过期/收回密钥,它们等待主副本过期密钥,当主副本过期或收回密钥时,副本会合成一个DEL命令,该命令会传输到所有副本。

在这里插入图片描述

主从复制的核心机制

  • 当主机和副本实例连接良好时,主机通过向副本发送一系列命令来复制主机侧发生的对数据集的影响,从而保持副本的更新,原因包括:客户端写入、密钥过期或被逐出、任何其他更改主数据集的操作。
  • 当主服务器和副本之间的链接断开时,由于网络问题或由于在主服务器或副本中检测到超时,副本将重新连接并尝试继续进行部分重新同步:这意味着它将尝试只获取断开连接期间丢失的部分命令流。
  • 当无法进行部分重新同步时,复制副本将要求进行完全重新同步。这将涉及一个更复杂的过程,在该过程中,主服务器需要创建其所有数据的快照,将其发送到副本,然后在数据集更改时继续发送命令流。

核心配置

启动Redis的主从复制很简单,只需要在从节点的配置中加入

replicaof <redis master IP>

主从复制特点

  • Redis使用异步复制,通过从节点来处理的数据量(读取数据)
  • 主节点可以配置多个从节点
  • 从节点能够接受来自其他从节点的连接。除了将多个从节点连接到同一主节点之外,从节点还可以拥有自己的从节点。自Redis 4.0以来,所有子副本将从主副本接收完全相同的复制流。
  • Redis复制在主节点端是非阻塞的。这意味着当一个或多个副本执行初始同步或部分重新同步时,主节点将继续处理查询。
  • Redis主从复制,在从节点也是非阻塞执行,执行数据同步时,从节点使用旧数据进行数据处理。
  • Redis主从复制既可以用于可扩展性,也可以用于只读查询的多个副本(例如,可以将缓慢的O(N)操作卸载到副本),也可以简单地用于提高数据安全性和高可用性。

单机主从

主从方案

在单机搭建三个节点的主从复制架构,一主两从。节点占用的端口分配为

  • 主节点 - 6379端口
  • 从节点1 - 6380端口
  • 从节点2 - 6381端口
# 创建 replica 目录
mkdir replica

# copy redis.conf 文件至 replica下
cp redis.conf replica/redis_master.conf
cp redis.conf replica/redis_node1.conf
cp redis.conf replica/redis_node2.conf

主节点配置

# vim replica/redis_master.conf
protected-mode no
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
appendfilename "appendonly_6379.aof"

从节点配置

  • 从节点1Redis 配置
# vim replica/redis_node1.conf
port 6380
protected-mode no
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
appendfilename "appendonly_6380.aof"
replicaof 127.0.0.1 6379
  • 从节点2Redis 配置
# vim replica/redis_node2.conf
port 6381
protected-mode no
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
appendfilename "appendonly_6381.aof"
replicaof 127.0.0.1 6379

启动服务

AndydeMacBook-Pro:redis-stable andy$ redis-server replica/redis_master.conf 
AndydeMacBook-Pro:redis-stable andy$ redis-server replica/redis_node1.conf 
AndydeMacBook-Pro:redis-stable andy$ redis-server replica/redis_node2.conf
# 查看进程是否启动
AndydeMacBook-Pro:redis-stable andy$ ps -ef | grep redis
  501 93666     1   0  4:48上午 ??         0:16.63 redis-server 127.0.0.1:6380 
  501 93670     1   0  4:48上午 ??         0:16.77 redis-server 127.0.0.1:6379 
  501 94881     1   0  8:23下午 ??         0:00.04 redis-server 127.0.0.1:6381 

验证测试

验证工作分两部分,查看各节点状态是否一致;从主节点添加数据,查看其他节点是否已经进行数据同步

节点状态验证

  • 主节点状态验证

    AndydeMacBook-Pro:redis-stable andy$ redis-cli 
    127.0.0.1:6379> info replication
    
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=::1,port=6380,state=online,offset=7512,lag=0
    slave1:ip=127.0.0.1,port=6381,state=online,offset=7512,lag=0
    master_failover_state:no-failover
    master_replid:e63e82a592894ab10f2e2e02b2d3d4160c8a61aa
    master_replid2:952696240184bb42a0f7109718c5aa87ee025e00
    master_repl_offset:7512
    second_repl_offset:157
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:157
    repl_backlog_histlen:7356
    
  • 从节点1状态验证

    AndydeMacBook-Pro:redis-stable andy$ redis-cli -p 6380
    127.0.0.1:6380> info replication
    
    # Replication
    role:slave
    master_host:localhost
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_read_repl_offset:8354
    slave_repl_offset:8354
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:e63e82a592894ab10f2e2e02b2d3d4160c8a61aa
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:8354
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:216
    repl_backlog_histlen:8139
    
  • 从节点2状态验证

    AndydeMacBook-Pro:redis-stable andy$ redis-cli -p 6381
    127.0.0.1:6381> info replication
    
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_read_repl_offset:8424
    slave_repl_offset:8424
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:e63e82a592894ab10f2e2e02b2d3d4160c8a61aa
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:8424
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:7247
    repl_backlog_histlen:1178
    

数据同步验证

  • 登录主节点

    AndydeMacBook-Pro:redis-stable andy$ redis-cli
    127.0.0.1:6379> set java world
    OK
    127.0.0.1:6379> get java
    "world"
    
  • 查看从节点1

    AndydeMacBook-Pro:~ andy$ redis-cli -p 6380
    127.0.0.1:6380> get java
    "world"
    
  • 查看从节点2

    AndydeMacBook-Pro:~ andy$ redis-cli -p 6381
    127.0.0.1:6381> get java
    "world"
    

同步机制

增量同步

在这里插入图片描述

如上图,当从节点连接到主节点时,自动发送PSYNC命令到主节点,同时携带 副本ID、偏移量。这样,主节点根据副本ID、偏移量就知道从节点上次同步数据的位置,只需要发送所需的增量部分,即数据增量同步。

# 语法
PSYNC replicationid offset

在这里插入图片描述

如上图,可以看到从节点的ID,以及偏移量信息

全库同步

对于新加入的节点,或者在master中找不到副本ID,则会发生完全重新同步:在这种情况下,从节点的复制将从头开始获得完整数据。其内部机制为:

主节点启动后台进程异步生成RDB文件,当后台进程完成Redis服务接收的写入指令后。主节点将RDB文件传输到从节点,从节点将数据保存在磁盘文件,然后将其加载到内存中。需要注意:当Redis数据十分庞大时,整个复制过程将非常缓慢。

同步认证

如果主节点设置了密码,那么从节点在进行数据同步时配置密码,相关的配置也非常的简单。

  1. 通过脚本临时性设置密码 - 临时性: 表示当redis节点重启时 密码设置无效

    config set masterauth <password>
    
  2. 修改配置文件 永久性的设置文件

    masterauth <password>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业设计选题档案管理系统bvr3c

毕业设计其实不难&#xff0c;主要毕业的时候任务太紧了&#xff0c;所以大家都非常忙没有时间去做&#xff0c;毕业设计还是早做准备比较好&#xff0c;多花点时间也可以做出来的&#xff0c;建议还是自己动手去做&#xff0c;比如先选一个题&#xff0c;这样就有方向&#xf…

Flutter实现文件上传华为对象存储(OBS)

本文主要讲述在 Flutter 项目中如何实现将文件上传到华为 OBS&#xff08;对象存储&#xff09;中&#xff0c;并封装为三方库方便灵活使用。 背景介绍 在大多项目中都会存在文件上传的需求&#xff0c;之前的实现都是调用后台的文件上传接口将文件上传到服务器上&#xff0c;…

从投资人发现“新大陆”,看“产融星城”为何成?

文丨熔财经 作者|陈小江 “我从来不把《我要投资》节目看作是秀&#xff08;综艺&#xff09;&#xff0c;要知道《我要投资》是在前面的&#xff0c;秀&#xff08;综艺&#xff09;只是一种形式而已。本质上&#xff0c;&#xff08;参加节目&#xff09;还是为了投资”。 …

「Redis数据结构」跳跃表(SkipList)

「Redis数据结构」跳跃表&#xff08;SkipList&#xff09; 文章目录「Redis数据结构」跳跃表&#xff08;SkipList&#xff09;一、概述二、结构跳跃表节点跳跃表三、特点一、概述 跳表&#xff08;SkipList&#xff0c;全称跳跃表&#xff09;是用于有序元素序列快速搜索查找…

shell编程二

目录语法引号exprtestif...then...fiif...elseif...elseif嵌套case…esacforwhilebreak 和 continue函数语法 引号 " ":如果有字符串&#xff0c;字符串原样输出&#xff0c;如果有$变量则查看变量的值 :所有的字符无论是否有变量都原样输出 ˋˋ:在该引号包含的…

如何批量查询网站的搜狗收录情况?搜狗收录么查询

如何批量查询网站的搜狗收录情况&#xff1f;搜狗收录么查询 查询网站的搜狗收录的具体操作&#xff1a; 第一步、打开网站综合查询工具 第二步、添加需要查询的网站域名 第三步、勾选要查询的功能&#xff08;勾选搜狗是否收录和搜狗总收录&#xff09; 第…

redis 主从复制(读写分离)集群搭建(含错误处理)

目录 1.概述 2.搭建 2.1.安装配置 2.2.认主 2.3.错误处理 3.原理 1.概述 当面临大流量时&#xff0c;redis可以采取集群的方式进行扩容&#xff0c;将压力分散到集群中的多个结点上去防止redis被打挂。redis的扩容方式有两种&#xff1a; 垂直扩容&#xff0c;即读写分离…

【移动端测试】了解Android的配置和使用过程

Android 是基于JAVA语言来进行开发编写的&#xff0c;但是对于Android体系中最底层是Linux层&#xff0c;现在说一下android 项目的结构目录: 整体结构和一个普通的java项目很类似 每一个项目都有一个主Activity 相当于java类中的main 方法是程序的入口 比如 该项目中的ListVi…

centos7搭建nginx主从以及集群

一、nginx升级之路 之前因为业务量并不是很大&#xff0c;所以公司nginx采用的是单机。因为nginx单机性能也很好&#xff0c;所以也没有发生过什么问题。不过后来还是慢慢进行了几次调整。最终换成了多IP地址解析和nginx主从。下面就介绍一下怎么一步步升级的。 1.最初版本&a…

天翼物联携手6家单位发起移动物联网高质量发展共同倡议

近日&#xff0c;由工信部指导&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信学会、无锡市人民政府、人民邮电报社、江苏省工业和信息化厅、江苏省通信管理局共同主办&#xff0c;无锡物联网创新促进中心、天翼物联科技有限公司等单…

uniapp中tabBar菜单栏的实现以及页面常用的生命周期(菜单栏颜色切换)

前言 本篇文章带大家使用uniapp通过小案例实现tab菜单栏的切换&#xff0c;并对页面中常用的生命周期进行介绍。 实现菜单栏的切换 配置page页面 我们这里要实现三个页面的切换&#xff0c;所以要先在page.json文件中配置三个页面的路径 "pages": [ //pages数组…

HTML -- 一文学会HTML及常用标签

文章目录1. HTML简介1.1 网页1.1.1 什么是网页1.1.2 什么是HTML1.1.3 网页的形成1.2 常用浏览器1.2.1 常见的浏览器1.2.2 浏览器内核1.3 Web标准1.3.1 为什么需要Web标准1.3.2 Web标准的构成2. HTML基础2.1 HTML语法规范2.1.1 基本语法规范2.1.2 标签关系2.2 HTML基本结构标签2…

我做软件测试工作的两大乐趣

大家好&#xff0c;我是小谭。 曾几何时&#xff0c;我们都有一个梦想&#xff0c;梦想着做自己喜欢的工作。但现实往往事与愿违&#xff0c;我们被家庭、身份、社会捆绑&#xff0c;做着自己不喜欢的工作&#xff0c;即便做着自己喜欢的工作&#xff0c;也容易在日常的琐碎中…

SAAS系统和ERP区别?

saas系统和erp区别&#xff1f; saas是云计算应用的一种形式,而传统erp系统并不具备此特征&#xff1b;saas系统的数据存储也是在云端上&#xff0c;只要使用的软件即可用于业务管理的属于ERP的类别。 saas行业和传统软件区别很大吗&#xff1f; 很大&#xff0c;一个是新兴产…

C#捐款信息管理系统

捐款信息管理系统 技术 C#sqlserver 主要功能 登录、注册功能&#xff0c;两种角色登录判断&#xff0c;一种为管理员&#xff0c;一种为用户管理员发起项目&#xff0c;即发布项目&#xff0c;同时拥有对项目的增加、删除、修改、查询用户对管理员发起的项目可以进行申请操…

魏副业而战:做闲鱼副业项目的3个阶段

我是魏哥&#xff0c;与其在家躺平&#xff0c;不如魏副业而战&#xff01; 小伙在社群提问&#xff1a;有没整套的模板案例&#xff1f; 他找了一上午的同行&#xff0c;没有找到“完整”的案例&#xff0c;他很苦恼&#xff0c;所以想请老师指导一下。 其实呢&#xff0c;…

wait_queue如何使用

Linux内核的 等待队列&#xff08;Wait Queue&#xff09;是重要的数据结构&#xff0c;与进程调度机制紧密相关联&#xff0c;可以用来同步对系统资源的访问、异步事件通知、跨进程通信等。如下图所示&#xff0c; 在Linux中&#xff0c;等待队列以循环链表为基础结构&#xf…

基于web的实验教学管理系统java ssm教学视频平台源码和论文

研究背景 近几年来&#xff0c;随着地方高等院校办学规模的不断扩大&#xff0c;为了适用社会发展需要&#xff0c;地方高校将应用 型人才培养作为学校的人才培养目标。为了适应学校应用型人才培养目标&#xff0c;各专业尤其是理工科专 业人才培养方案中加强了实践教学环节&a…

1559_AURIX_TC275_RCU系统中的Boot支持、Pad配置以及NMI trap处理

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这一次看的10页文档虽然文字内容不多&#xff0c;但是涉及到的面还是很多的。而且&#xff0c;看完之后的确是有一种答疑解惑的畅快感。 1. ESRx作为GPIO用的时候&#xff0c;也拥有GPIO设…

高等数学(第七版)同济大学 习题11-1 个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题11-1 函数作图软件&#xff1a;Mathematica 1.设在xOy面内有一分布着质量的曲线弧L&#xff0c;在点(x,y)处它的线密度为μ(x,y)&#xff0c;用对弧长的曲线积分分别表达&#xff1a;\begin{aligned}&1. \ 设在xOy面内…