Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式
Redis作为一个高性能的key-value数据库,广泛应用于缓存、消息队列、排行榜等场景。然而,Redis是基于内存的数据库,这意味着一旦服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了数据持久化的机制,包括RDB和AOF两种方式。此外,为了提高数据的可用性和可扩展性,Redis还支持主从复制和哨兵模式。本文将详细介绍Redis的数据持久化机制、如何搭建Redis主从复制模式以及如何搭建Redis的哨兵模式。
Redis简单介绍与安装应用-CSDN博客
Redis实战--Windows上的Redis使用及Java代码操作Redis-CSDN博客
一、Redis的数据持久化
1)为什么要持久化?
Redis是基于内存的数据库,其优点是速度快,但缺点是数据容易丢失。为了解决这个问题,Redis提供了两种持久化机制:RDB和AOF。
2)RDB持久化
RDB持久化是通过创建数据的快照来实现的。
在redis.conf文件中,默认开启了RDB持久化:

操作越频发,保存的间隔时间越短
目前默认的配置:

save 900 1 代表如果用户在900秒内(15分钟)操作redis一次以上就保存一下。
通过如上的配置,我们得出一个结论,用户只要操作redis越频繁,保存的间隔时间就短。
RDB持久化有两种命令:SAVE和BGSAVE。
SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:
1)SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
2)BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求。bg = backgroud的意思,这两个命令都是手动的保存数据。

RDB方案优点
1、对性能影响最小。如前文所述,Redis在保存RDB快照时会fork出子进程进行,几乎不影响Redis处理客户端请求的效率。
2、每次快照会生成一个完整的数据快照文件,所以可以辅以其他手段保存多个时间点的快照(例如把每天0点的快照备份至其他存储媒介中),作为非常可靠的灾难恢复手段。3、使用RDB文件进行数据恢复比使用AOF要快很多
RDB方案缺点
1、快照是定期生成的,所以在Redis crash时或多或少会丢失一部分数据。
如果数据集非常大且CPU不够强(比如单核CPU),Redis在fork子进程时可能会消耗相对较长的时间,影响Redis对外提供服务的能力
3)AOF持久化
AOF持久化是通过记录每次执行的命令来实现的。这种方式每操作一次就保存一次,数据安全性更高,但性能会有一定影响。
AOF功能会产生aof文件,这个文件会越来越大,如何处理? redis有一个rewrite功能。
随着AOF不断地记录写操作日志,因为所有的操作都会记录,所以必定会出现一些无用的日志。大量无用的日志会让AOF文件过大,也会让数据恢复的时间过长。不过Redis提供了AOF rewrite功能,可以重写AOF文件,只保留能够把数据恢复到最新状态的最小写操作集。
AOF rewrite可以通过BGREWRITEAOF命令触发,也可以配置Redis定期自动进行:
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
上面配置的含义是,Redis在每次AOF rewrite时,会记录完成rewrite后的AOF日志大小,当AOF日志大小在该基础上增长了100%后,自动进行AOF rewrite。同时如果增长的大小没有达到64mb,则不会进行rewrite。AOF文件 10M --> 20M 增长100%会触发 rewrite功能
变大了64M --> 也会触发rewrite
AOF优点
1、最安全,在启用appendfsync always时,任何已写入的数据都不会丢失,使用在启用appendfsync everysec也至多只会丢失1秒的数据
2、AOF文件在发生断电等问题时也不会损坏,即使出现了某条日志只写入了一半的情况,也可以使用redis-check-aof工具轻松修复。
3、AOF文件易读,可修改,在进行了某些错误的数据清除操作后,只要AOF文件没有rewrite,就可以把AOF文件备份出来,把错误的命令删除,然后恢复数据。
AOF的缺点
1、AOF文件通常比RDB文件更大
2、性能消耗比RDB高
3、数据恢复速度比RDB慢

AOF方案配置
在redis中,aof的持久化机制默认是关闭的
AOF持久化,默认是关闭的,默认是打开RDB持久化appendonly yes,可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的数据也无所谓
打开AOF持久化机制之后,redis每次接收到一条写命令,就会写入日志文件中,当然是先写入os cache的,然后每隔一定时间再fsync一下
而且即使AOF和RDB都开启了,redis重启的时候,也是优先通过AOF进行数据恢复的,因为aof数据比较完整
可以配置AOF的fsync策略,有三种策略可以选择,一种是每次写入一条数据就执行一次fsync; 一种是每隔一秒执行一次fsync; 一种是不主动执行fsync
always: 每次写入一条数据,立即将这个数据对应的写日志fsync到磁盘上去,性能非常非常差,吞吐量很低; 确保说redis里的数据一条都不丢,那就只能这样了
在redis当中默认的AOF持久化机制都是关闭的。# appendfsync always
always: 每次写入一条数据,立即将这个数据对应的写日志fsync到磁盘上去,性能非常非常差,吞吐量很低; 确保说redis里的数据一条都不丢,那就只能这样了appendfsync everysec
每秒将os cache中的数据fsync到磁盘,这个最常用的,生产环境一般都这么配置,性能很高,QPS还是可以上万的
# appendfsync no
4. 综合比较
RDB和AOF各有优缺点,可以根据业务需求选择合适的持久化策略。如果对数据完整性要求高,可以选择AOF;如果对性能要求高,可以选择RDB。
RDB (丢数据比较频繁)
AOF(稍微慢,但是相对来讲数据比较安全) 默认不开启。
AOF的保持机制: always everysec no
AOF 还有rewrite机制:日志有很多是垃圾数据,需要挑选一下。
二、Redis主从复制
1) 为什么要主从复制?
主从复制可以实现数据同步和读写分离,提高系统的可用性和可扩展性。
2.)搭建主从复制

搭建主从复制
我们的方案就是在服务器上安装主从,一个主,两个从,在redis.conf中配置主从关系。例如:

[root@caiji bin]# mkdir mastersalves
[root@caiji bin]# cp redis.conf ./mastersalves/
配置隶属关系
修改从节点的配置文件 ,这个配置很重要,一定要配置
redis5.0 需要如下配置
# replicaof <masterip> <masterport>
replicaof bigdata01 6379


检查一下以前的配置是否修改了:
Redis简单介绍与安装应用-CSDN博客

配置日志文件和数据目录
产生的日志
mkdir -p /usr/local/bin/mastersalves/logs
产生的数据
mkdir -p /usr/local/bin/mastersalves/redisdata

数据路径

如果主节点配置了密码保护,从节点也需要配置密码:
masterauth 123456
启动主节点
./redis-server redis.conf
启动从节点
./redis-server mastersalves/redis.conf

验证主从效果


3)故障转移
验证主节点挂了,从节点顶上去

在从节点,cli端,输入命令
slaveof NO ONE

这种模式,虽然可以实现主从,从节点可以顶上去,但是是手动模式,不太方便。
假如主节点又修复好了,启动了,此时从节点从主节点再变为从节点:
在从节点,执行这句话
SLAVEOF bigdata01 6379
三、Redis的哨兵模式
1)哨兵模式解决的问题
哨兵模式可以自动将从节点升级为主节点,解决了主从模式下无法自动故障转移的问题。
2)搭建哨兵模式
环境搭建
在 /usr/local/bin下面:
mkdir sentinel-zc
复制外面的sentinel.conf 到 sentinel-zc 文件夹下面
cp /opt/installs/redis-4.0.14/sentinel.conf sentinel-zc
修改sentinel.conf配置
修改bind
bind bigdata01
修改端口号
port 26379 第一次不需要修改
daemonize yes 表示将来的sentinel服务,后台启动


sentinel monitor mymaster bigdata01 6379 2
将配置文件拷贝三份,修改端口号
[root@bigdata02 sentinel-zc]# cp sentinel.conf sentinel2.conf
[root@bigdata02 sentinel-zc]# cp sentinel.conf sentinel3.conf

另一个修改为 26381
假如主节点server 配置了密码,需要在sentinel.conf 文件中也配置密码:大约70行左右
sentinel auth-pass mymaster 123456谨记: 以上这个语句必须写在 sentinel monitor mymaster 192.168.32.129 6379 2
的下方,否则启动报错。
启动三台sentinel 服务
先启动 redis-server 服务
./redis-server redis.conf
./redis-server mastersalves/redis.conf
再次启动 redis-sentinel服务:
./redis-sentinel sentinel-zc/sentinel.conf
./redis-sentinel sentinel-zc/sentinel2.conf
./redis-sentinel sentinel-zc/sentinel3.conf

测试哨兵模式:将主节点杀死,从节点自动变为主节点:


哨兵模式可以自动将从节点变为主节点(重点是:自动)
假如这个时候主节点又启动起来了,会自动变为从节点,并且从主节点中同步数据。
相当于以前的主节点变从节点,从节点自动变主节点,而且两边数据会同步。从节点也可以重新变为从节点,主节点变为主节点,需要手动修改。
SLAVEOF bigdata01 6379
主节点输入命令:slaveof NO ONE 变为主节点
主节点的redis的数据默认是存储在 ./的文件夹下
启动的时候在哪里启动,数据就保存在哪里,很不方便,可以通过配置文件指定数据的位置
cd /usr/local/bin
mkdir masterdata
修改 redis.conf
dir /usr/local/bin/masterdata
如果是哨兵模式,jedis代码做稍微的调整,当然以前的也可以使用(但是假如主节点发生了变化,代码会连接不上)。
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisSentinelPool;import java.util.HashSet;public class JedisSentinalPoolTest {Jedis jedis = null;@Beforepublic void initDB(){GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();// idle 空闲的 最大空闲poolConfig.setMaxIdle(200);// 最大的连接数量poolConfig.setMaxTotal(1000);// 最小空闲poolConfig.setMinIdle(5);HashSet<String> hashSet = new HashSet<>();hashSet.add("bigdata01:26379");hashSet.add("bigdata01:26380");hashSet.add("bigdata01:26381");JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster",hashSet,poolConfig,"123456");jedis = sentinelPool.getResource();}@Afterpublic void destroyDB(){// 数据库关闭jedis.close();}/*** 常见的数据库连接池有:c3p0 dbcp druid HikariCP等*/@Testpublic void testPool(){System.out.println(jedis.get("age"));}
}
3)哨兵模式的优缺点
哨兵模式的优点是可以实现自动故障转移,提高系统的可用性。缺点是需要额外的资源来部署哨兵节点。
结语
通过本文的介绍,相信大家对Redis的数据持久化、主从复制和哨兵模式有了更深入的了解。在实际应用中,可以根据业务需求选择合适的持久化策略和部署模式,以提高Redis的可用性和可扩展性。
相关文章:
Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式
Redis作为一个高性能的key-value数据库,广泛应用于缓存、消息队列、排行榜等场景。然而,Redis是基于内存的数据库,这意味着一旦服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了数据持久化的机制&#…...
World of Warcraft [CLASSIC] Engineering 421-440
工程学421-440 World of Warcraft [CLASSIC] Engineering 335-420_魔兽世界宗师级工程学需要多少点-CSDN博客 【萨隆邪铁锭】421-425 学习新技能,其他都不划算,只能做太阳瞄准镜 【太阳瞄准镜】426、427、428、429 【随身邮箱】430 这个基本要做的&am…...
VUE3.5版本解读
官网:Announcing Vue 3.5 | The Vue Point 2024年9月1日,宣布 Vue 3.5“天元突破:红莲螺岩”发布! 反应系统优化 在 3.5 中,Vue 的反应系统经历了另一次重大重构,在行为没有变化的情况下实现了更好的性能…...
spark计算引擎-架构和应用
一Spark 定义:Spark 是一个开源的分布式计算系统,它提供了一个快速且通用的集群计算平台。Spark 被设计用来处理大规模数据集,并且支持多种数据处理任务,包括批处理、交互式查询、机器学习、图形处理和流处理。 核心架构&#x…...
VUE 开发——AJAX学习(二)
一、Bootstrap弹框 功能:不离开当前页面,显示单独内容,供用户操作 步骤: 引入bootstrap.css和bootstrap.js准备弹框标签,确认结构通过自定义属性,控制弹框显示和隐藏 在<head>部分添加:…...
机器学习-KNN分类算法
1.1 KNN分类 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法。它是概念极其简单,而效果又很优秀的分类算法。1967年由Cover T和Hart P提出。 KNN分类算法的核心思想:如果一个样本在特征空间中的k个最…...
云计算 Cloud Computing
文章目录 1、云计算2、背景3、云计算的特点4、云计算的类型:按提供的服务划分5、云计算的类型:按部署的形式划分 1、云计算 定义: 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可…...
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(上篇)
【ps】本篇有 9 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)全排列 .1- 题目解析 .2- 代码编写 2)子集 .1- 题目解析 .2- 代码编写 3)找出所有子集的异或总和再求和 .1- 题目解析 .2- 代码编写 4)全排列 II…...
怎么绕开华为纯净模式安装软件
我是标题 众所周不知,华为鸿蒙系统自带纯净模式,而且 没法关闭 : ) 我反正没找到关闭键 以前或许会有提示,无视风险,“仍要安装”。但我这次遇到的问题是,根本没有这个选项,只有“应用市场”和“取消”&…...
CentOS7 离线部署docker和docker-compose环境
一、Docker 离线安装 1. 下载docker tar.gz包 下载地址: Index of linux/static/stable/x86_64/ 本文选择版本:23.0.6 2.创建docker.service文件 vi docker.service文件内容如下: [Unit] DescriptionDocker Application Container Engi…...
Vue 自定义组件实现 v-model 的几种方式
前言 在 Vue 中,v-model 是一个常用的指令,用于实现表单元素和组件之间的双向绑定。当我们使用原生的表单元素时,直接使用 v-model 是很方便的,但是对于自定义组件来说,要实现类似的双向绑定功能就需要一些额外的处理…...
Python Pandas数据处理效率提升指南
大家好,在数据分析中Pandas是Python中最常用的库之一,然而当处理大规模数据集时,Pandas的性能可能会受到限制,导致数据处理变得缓慢。为了提升Pandas的处理速度,可以采用多种优化策略,如数据类型优化、向量…...
最大正方形 Python题解
最大正方形 题目描述 在一个 n m n\times m nm 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形,输出边长。 输入格式 输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100),接…...
ubuntu中软件的进程管理-结束软件运行
在Ubuntu系统中,当某个运行中的软件无法正常退出时,可以通过以下几种方法强制结束该软件: 方法一:使用系统监视器(System Monitor)–小白专属 这个相当于win上的资源管理器 打开系统监视器 可以通过点击屏…...
Windows环境部署Oracle 11g
Windows环境部署Oracle 11g 1.安装包下载2. 解压安装包3. 数据库安装3.1 执行安装脚本3.2 电子邮件设置3.3 配置安装选项3.4 配置系统类3.5 选择数据库安装类型3.6 选择安装类型3.7 数据库配置3.8 确认安装信息3.9 设置口令 Oracle常用命令 2023年10月中旬就弄出大致的文章&…...
C语言进阶【8】--联合体和枚举(联合体和枚举这么好用,你不想了解一下吗?)
本章概述 联合体类型的声明联合体的特点联合体的大小的计算枚举类型的声明枚举类型的优点枚举类型的使用枚举类型的大小彩蛋时刻!!! 联合体类型的声明 概述:联合体的关键字为 union。它的结构和结构体是一样的。进行展示…...
Android OTA升级
针对Android系统OTA升级,MTK平台有相关介绍文档:https://online.mediatek.com/apps/faq/detail?faqidFAQ27117&listSW 概念一:OTA包的构建 AOSP full build:Android原生提供的全量包的构建,意思就是可以从任何一…...
【项目经验分享】深度学习自然语言处理技术毕业设计项目案例定制
以下毕业设计是与深度学习自然语言处理(NLP)相关的毕业设计项目案例,涵盖文本分类、生成式模型、语义理解、机器翻译、对话系统、情感分析等多个领域: 实现案例截图: 基于深度学习的文本分类系统基于BERT的情感分析系…...
一觉醒来,YOLO11 冷不丁就来了
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 前言:一觉醒来,YOLO11 冷不丁就来了ultralytics 版本更新…...
智能编辑器、版本控制与自动化脚本
在繁忙的工作中,每个开发者都渴望拥有一个“秘密武器”,帮助自己提升效率、减少错误,从而更快地完成任务。那么,在众多编程工具中,哪一款能够成为你的工作效率翻倍的“秘密武器”呢?本文将探讨智能的代码编…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...


