Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式

        Redis作为一个高性能的key-value数据库,广泛应用于缓存、消息队列、排行榜等场景。然而,Redis是基于内存的数据库,这意味着一旦服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了数据持久化的机制,包括RDB和AOF两种方式。此外,为了提高数据的可用性和可扩展性,Redis还支持主从复制和哨兵模式。本文将详细介绍Redis的数据持久化机制、如何搭建Redis主从复制模式以及如何搭建Redis的哨兵模式。

一、Redis的数据持久化

1)为什么要持久化?

        Redis是基于内存的数据库,其优点是速度快,但缺点是数据容易丢失。为了解决这个问题,Redis提供了两种持久化机制:RDB和AOF。

2)RDB持久化

        RDB持久化是通过创建数据的快照来实现的。

redis.conf文件中,默认开启了RDB持久化:

操作越频发,保存的间隔时间越短

目前默认的配置:

save 900 1 代表如果用户在900秒内(15分钟)操作redis一次以上就保存一下。
通过如上的配置,我们得出一个结论,用户只要操作redis越频繁,保存的间隔时间就短。

RDB持久化有两种命令:SAVEBGSAVE

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的可用性和可扩展性。

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

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

相关文章

C语言 | Leetcode C语言题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; int countSegments(char * s){int count 0; //count用来记录单词个数for(int i0; i < strlen(s); i){ //遍历字符串 if((i 0 || s[i-1] ) && s[i] ! ) //一个…

Python | Leetcode Python题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; class Solution:def countSegments(self, s):segment_count 0for i in range(len(s)):if (i 0 or s[i - 1] ) and s[i] ! :segment_count 1return segment_count

【计网】从零开始掌握序列化 --- 实现网络计算器项目

​​​请各位保持头脑清醒&#xff0c; ​​​读些好书&#xff0c;做点有用的事&#xff0c; ​​​快快乐乐地生活。 ​​​ --- 斯蒂芬金 《肖申克的救赎》--- 从零开始掌握序列化 1 知识回顾2 服务器框架3 客户端框架4 运行测试 1 知识回顾 前面两篇文章学习中基础知识…

ROS第六梯:ROS+VSCode+C++消息发布和订阅

第一步&#xff1a;创建ROS工作空间&#xff0c;并在工作空间下创建名为srr_pkg的功能包&#xff0c;具体步骤参考第二章。 第二步&#xff1a;在src下创建publisher.cpp作为发布节点代码文件&#xff0c;创建subscriber.cpp作为订阅节点代码文件&#xff1a; 主要步骤是&#…

数字通云平台智慧政务 login 存在登录绕过

0x01 漏洞描述&#xff1a; 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术&#xff0c;为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平&#xff0c;推动电子政务向更高层次发展。 数字通云平台 智…

【高分系列卫星简介——高分五号卫星(GF-5)】

高分五号卫星&#xff08;GF-5&#xff09; 高分五号&#xff08;GF-5&#xff09;卫星是中国高分辨率对地观测系统重大专项系列中的一颗重要卫星&#xff0c;主要承担着遥感、测绘等任务。以下是对高分五号卫星的详细介绍&#xff1a; 一、基本信息 国籍&#xff1a;中国研…

Android JNI 调用流程

为啥要用JNI&#xff0c;我个人理解是&#xff0c;Java 代码效率不够高&#xff0c;代码调用底层逻辑隔着一层Java 虚拟机&#xff0c;不能直接操控底层硬件&#xff0c;而C/C 可以直接操控硬件设备&#xff0c;对于需要效率更高的操作&#xff0c;就需要通过C/C 完成。。 比如…

GNU链接器(LD):存储命令(MEMORY)用法及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

最小花费爬楼梯(动态规划)问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; 最小花费爬楼梯_牛客题霸_牛客网 二思路&#xff1a; 思路&#xff1a;动态规划找前后规律化简题意&#xff1a;此题想要的结果其实就是能上到顶楼也就是&#xff1a; 分为&#xff1…

【华为】用策略路由解决双出口运营商问题

需求描述 不同网段访问互联网资源时&#xff0c;走不同的出口&#xff0c;即PC1走电信出口&#xff0c;PC2走移动出口。 客户在内网接口下应用策略路由后往往出现无法访问内网管理地址的现象&#xff0c;该举例给出解决办法。 拓扑图 基础配置 #sysname R1 # # interface G…

QT 中的信号与槽机制详解

目录 一、引言 二、信号与槽的基本概念 1.信号&#xff08;Signals&#xff09; 2.槽&#xff08;Slots&#xff09; 三、声明信号和槽 1.声明信号和槽 2.发射信号 3.连接信号和槽 四、高级特性 1.多信号连接到一个槽 2.一个信号连接到多个槽 3.断开信号和槽的连…

SpringBoot和JPA初探

目录 SpringBoot和JPA初探0.准备条件1.创建JPA项目2.项目3.总结 SpringBoot和JPA初探 我们使用SpringBootJPA做一个简单的API接口演示&#xff0c;通过一个简单的例子让大家对Spring Data JPA有一个整体的认知。 0.准备条件 IntelliJ IDEAjdk 1.8mysql 8.0maven 3.8.x 1.创…

多智能体笔记本专家系统:集成CrewAI、Ollama和自定义Text-to-SQL工具

在这个项目中&#xff0c;我们的目标是创建一个由多智能体架构和本地大语言模型&#xff08;LLM&#xff09;驱动的个人笔记本电脑专家系统。该系统将使用一个SQL数据库&#xff0c;包含有关笔记本电脑的全面信息&#xff0c;包括价格、重量和规格。用户可以根据自己的特定需求…

前缀和问题

洛谷题面 这个其实可以当模板了。 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e510; int sum[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m,x;cin>>n;for(int i1;i<n;i){cin>>x;sum[i]sum[i…

【算法】模拟:(leetcode)495.提莫攻击(easy)

目录 题目链接 题目介绍 解法 代码 题目链接 495. 提莫攻击 - 力扣&#xff08;LeetCode&#xff09; 题目介绍 解法 模拟 分情况讨论。 当寒冰再次中毒时&#xff0c;上次「中毒」是否已经结束。 ​ 当上次中毒已经结束了&#xff0c;那么上次「中毒」维持的时间就是 …

【图书管理系统】数据结构、链表、C/C++课程设计

【图书管理系统】数据结构、链表、课程设计、C/C 一、前言二、系统概述2.1 功能简介2.2 系统架构 三、数据结构与算法3.1 单链表的定义与操作3.2 图书信息结构体 四、功能实现详解4.1 主菜单选择系统4.2 信息注册系统4.3 用户登录系统4.4 访问图书系统 五、详细代码分析5.1 全局…

SegFormer网络结构的学习和重构

因为太多的博客并没有深入理解,本文是自己学习后加入自己深入理解的总结记录&#xff0c;方便自己以后查看。 segformer中encoder、decoder的详解。 学习前言 一起来学习Segformer的原理,如果有用的话&#xff0c;请记得点赞关注哦。 一、Segformer的网络结构图 网络结构&…

一道简单的css动态宽度问题?

题目&#xff1a; 如何实现left的宽度随着父级宽度改变而改变&#xff1f; .content {display: flex;height: 300px;}.left {max-width: 200px;min-width: 100px;background: red;}.right {flex: 1;background: yellow;}.left { max-width: 200px; min-width: 100px; backgroun…

【Redis】分布式锁之 Redission

一、基于setnx实现的分布式锁问题 重入问题&#xff1a;获得锁的线程应能再次进入相同锁的代码块&#xff0c;可重入锁能防止死锁。例如在HashTable中&#xff0c;方法用synchronized修饰&#xff0c;若在一个方法内调用另一个方法&#xff0c;不可重入会导致死锁。而synchroni…

IntraWeb开发Web网站时对数据库“增、删、改、查”的操作

delphi源代码&#xff1a;示例两列布局带顶部汉堡菜单&#xff0c;对数据库“增、删、改、查”的操作&#xff08;兼容电脑与手机&#xff09; 功能&#xff1a;交互式网页&#xff0c;两列布局&#xff0c;顶部汉堡菜单&#xff0c;点击汉堡图标关闭左侧栏&#xff0c;这里演示…