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

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

时间:2024-09-25 09:51:29浏览次数:3  
标签:AOF Redis redis 模式 conf sentinel 节点 搭建

        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;
    @Before
    public 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();

    }

    @After
    public void destroyDB(){
        // 数据库关闭
        jedis.close();
    }

    /**
     *  常见的数据库连接池有:c3p0 dbcp druid  HikariCP等
     */
    @Test
    public void testPool(){
        System.out.println(jedis.get("age"));
    }
}

3)哨兵模式的优缺点

        哨兵模式的优点是可以实现自动故障转移,提高系统的可用性。缺点是需要额外的资源来部署哨兵节点。

结语

        通过本文的介绍,相信大家对Redis的数据持久化、主从复制和哨兵模式有了更深入的了解。在实际应用中,可以根据业务需求选择合适的持久化策略和部署模式,以提高Redis的可用性和可扩展性。

标签:AOF,Redis,redis,模式,conf,sentinel,节点,搭建
From: https://blog.csdn.net/weixin_64726356/article/details/142424124

相关文章

  • 如何在ubuntu中安装code-server搭建一个在线编程环境
    code-server是一个开源项目,它允许你在浏览器中运行VisualStudioCode。通过code-server,你可以远程访问一个运行VisualStudioCode的服务器,并在任何设备上使用浏览器来编辑代码。这使得你可以在轻量级设备上(如平板电脑或手机)上运行VisualStudioCode,而无需在本地安装该软件......
  • redis
    Redis1几乎覆盖了Memcached的绝大部分功能2数据都在内存中,支持持久化,主要用作备份恢复3除了支持简单的key-value模式,还支持多种数据结构的存储,比如list、set、hash、zset等。4一般是作为缓存数据库辅助持久化的数据库MongoDB1高性能、开源、模式自由(schemafree)的......
  • redis-配置文件解读
    Redis配置文件解读第一节网络配置相关bind绑定连接IP默认情况bind=127.0.0.1只能接受本机的访问请求,不写的情况下,无限制接受任何ip地址的访问,生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉.如果开启了protected-mode,那么在没有设定bindip......
  • ArgoWorkflow教程(五)---Workflow 的多种触发模式:手动、定时任务与事件触发
    上一篇我们分析了argo-workflow中的archive,包括流水线GC、流水线归档、日志归档等功能。本篇主要分析Workflow中的几种触发方式,包括手动触发、定时触发、Event事件触发等。1.概述ArgoWorkflows的流水线有多种触发方式:手动触发:手动提交一个Workflow,就会触发一次构建......
  • 1.Javaweb-搭建Web环境、初识JSP
    Javaweb-搭建Web环境、初识JSP文章目录Javaweb-搭建Web环境、初识JSP一、pc端程序架构分类:二、web服务器Tomcat三、JSP页面四、脚本语言五、Web程序常见错误六、错误替换JSP九大内置对象(包括JSP四大作用域)JSP四大作用域一、pc端程序架构分类:B/S:浏览器—服务......
  • 设计模式——观察者模式
    设计模式——观察者模式1.天气预报应用案例具体需求:气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。需要设计开放型API,便于其他第三方也能接入气象站获取数据。提供温度、气压和湿度的接口测量数据更新时,要能实时的通知......
  • 用Podman搭建LAMP开发环境的容器(六) -- 使用普通用户
    上接:用Podman搭建LAMP开发环境的容器(五)–端口转发现在这个容器还是直接用root用户跑的。虽然说如果只是开发环境的话,而且是一个虚拟机容器,直接用root用户工作应该也问题不大。不过我还是想在一般情况下用普通用户。首先我要改containerfile文件的脚本,来创建一个普通......
  • 【Linux】多线程:线程池的创建、日志类、RAII互斥锁、单例模式:饿汉方式与懒汉方式
    目录一、线程池概念二、线程的封装及线程池类成员变量的介绍 三、单例模式饿汉方式(EagerInitialization)懒汉方式(LazyInitialization)四、RAII类型的互斥锁 五、日志类的实现六、简单的任务类创建七、线程池的创建 一、线程池概念线程池(ThreadPool)是一种基于......
  • Let‘s Encrypt基于阿里云Linux服务器搭建自动更新免费的SSL证书
    前言:‌SSL免费证书的有效期从2024年4月底开始从12个月缩短至3个月。对于使用免费SSL证书的中小企业或者个人开发者而言,每三个月去手动部署一次证书文件很容易遗忘,从而导致服务器接口或者网站访问异常,今天把基于阿里云一套自动更新的流程详细写出来。本系统环境基于阿里云......
  • 阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
    大家好,我是V哥,粉丝小A面试阿里,说被问到Redis的内存淘汰策略的问题,整理这个笔记给他参考,也分享给大家,如果你遇到这个问题,会怎么回答呢?Redis的内存淘汰策略是指当Redis的内存使用量达到设定的上限时,决定哪些数据应该被移除以便为新数据腾出空间的规则。Redis提供了多种......