Redis进阶(3)——在Linux上基于Docker容器Redis搭建一主二从三哨兵 SpringBoot整合Redis哨兵

news2025/4/29 5:57:10

目录

  • 引出
  • redis主从搭建:一主2从
    • 6389Master
      • 准备文件redis.conf
      • redis.log日志文件
      • 运行容器
      • 查看日志方式tail
    • 6390Slave
    • 6391Slave
  • 创建3哨兵
    • 创建文件夹sentinel
    • 创建运行哨兵容器
    • 问题:脑裂问题
  • SpringBoot整合Redis哨兵
    • 启动1主2从,3哨兵
    • pom.xml文件
    • 写配置类,列出哨兵
    • 写service存个值
    • 写测试类
  • 总结

引出


1.Redis的1主2从搭建,主要是redis.conf文件的修改,核心bing允许任何端口访问;
2.Redis的3哨兵搭建,设置好自己的端口,监听的主的ip和端口,运行即可;
3.SpringBoot整合Redis哨兵初步;

redis主从搭建:一主2从

6389

6390

6391

6389Master

在这里插入图片描述

准备文件redis.conf

[root@localhost software]# mkdir -p 6389/conf 6389/data 6389/log
[root@localhost software]# ls
6380  6381  6389  canal  rabbitmq
[root@localhost software]# cd 6389
[root@localhost 6389]# ls
conf  data  log
[root@localhost 6389]# tree
.
├── conf
├── data
└── log

3 directories, 0 files

拷贝之前的配置文件

在这里插入图片描述

[root@localhost conf]# pwd
/usr/local/software/6389/conf
[root@localhost conf]# cp ../../6380/conf/redis.conf ./
[root@localhost conf]# ls
redis.conf
[root@localhost conf]# 

conf的修改:允许任何端口访问

在这里插入图片描述

关掉保护,可随意访问

在这里插入图片描述

端口映射6389—6379

在这里插入图片描述

为哨兵做的准备,暴露服务器的ip

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

打开AOF持久化方法

在这里插入图片描述

vim文件显示行数冒号 :set number

在这里插入图片描述

快速跳转:行号+gg

在这里插入图片描述

redis.log日志文件

在这里插入图片描述

linux中文件可执行

X 执行
R 读
W 写
RWX 111

运行容器

修改时区,,日志正常:-v /etc/localtime:/etc/localtime \

docker run
-i:以交互模式运行容器
-t:为容器重新分配一个伪输入终端
–name :容器名称
–privileged: 设置容器公开权限(默认为true)
-p :映射端口 linux端口: 容器内置端口(mysql默认端口为3306)
-v : linux挂载文件夹/文件和容器内路径的映射
-e: 容器的环境变量(设置mysql默认用户名&密码)
-d: 后台运行容器,并返回容器ID

docker run -it \
--name redis_6389 \
--privileged \
-p 6389:6379 \
--network pet_docker_net \
--ip 172.18.12.80 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/6389/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/6389/data/:/data \
-v /usr/local/software/6389/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf

查看日志方式tail

cat/tail/head

cat 日志文件名称

tail 日志文件名称 — 最新的日志内容:最新的日志

head 日志文件

在这里插入图片描述

[root@localhost log]# tail redis.log |grep version
1:C 12 Aug 2023 11:02:56.436 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
[root@localhost log]# 

从aof中读取的日志

在这里插入图片描述

在这里插入图片描述

6390Slave

获取主的内部的ip地址

在这里插入图片描述

“IPAddress”: “172.18.12.80”, 从配置主的端口

在这里插入图片描述

运行容器

docker run -it \
--name redis_6390 \
--privileged \
-p 6390:6379 \
--network pet_docker_net \
--ip 172.18.12.85 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/6390/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/6390/data/:/data \
-v /usr/local/software/6390/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf

在这里插入图片描述

6391Slave

[root@localhost 6391]# cd conf
[root@localhost conf]# cp ../../6390/conf/redis.conf ./
[root@localhost conf]# pwd
/usr/local/software/6391/conf
[root@localhost conf]# ll
总用量 92
-rwxr-xr-x. 1 root root 93909 812 12:44 redis.conf
[root@localhost conf]# cd ..
[root@localhost 6391]# ls
conf  data  log
[root@localhost 6391]# cd log/
[root@localhost log]# touch redis.log
[root@localhost log]# ll
总用量 0
-rw-r--r--. 1 root root 0 812 12:45 redis.log
[root@localhost log]# chmod 777 redis.log 
[root@localhost log]# ll
总用量 0
-rwxrwxrwx. 1 root root 0 812 12:45 redis.log

运行容器

docker run -it \
--name redis_6391 \
--privileged \
-p 6391:6379 \
--network pet_docker_net \
--ip 172.18.12.86 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/6391/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/6391/data/:/data \
-v /usr/local/software/6391/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf

在这里插入图片描述

搭建成功1主2从

在这里插入图片描述

[root@localhost log]# docker exec -it redis_6389 bash
root@013a85fa5f85:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.12.85,port=6379,state=online,offset=784,lag=1
slave1:ip=172.18.12.86,port=6379,state=online,offset=784,lag=1
master_failover_state:no-failover
master_replid:9db2c05f3c084af02e48840cc9aa6467304ecd20
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:784
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:784
127.0.0.1:6379> 

在这里插入图片描述

创建3哨兵

奇数个哨兵。

三哨兵策略: 1主二从

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

创建文件夹sentinel

在这里插入图片描述

在这里插入图片描述

[root@localhost conf]# touch sentinel.conf
[root@localhost conf]# vim sentinel.conf 
[root@localhost conf]# cat sentinel.conf 
# 所以无需担心端口重复使用
# 如果需要在单机
port 26389

# 设定密码认证
# requirepass 123456

# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis_6389 192.168.111.130 6389 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
# sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds redis_6389 30000

[root@localhost conf]# 

创建运行哨兵容器

docker run -it \
--name sentinel_26389 \
--privileged \
--network pet_docker_net \
--sysctl net.core.somaxconn=1024 \
--ip 172.18.12.90 \
-p 26389:26389 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/sentinel/26389/conf:/user/local/etc/redis/conf/ \
-d redis \
redis-sentinel /user/local/etc/redis/conf/sentinel.conf
docker run -it \
--name sentinel_26390 \
--privileged \
--network pet_docker_net \
--sysctl net.core.somaxconn=1024 \
--ip 172.18.12.91 \
-p 26390:26390 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/sentinel/26390/conf:/user/local/etc/redis/conf/ \
-d redis \
redis-sentinel /user/local/etc/redis/conf/sentinel.conf
docker run -it \
--name sentinel_26391 \
--privileged \
--network pet_docker_net \
--sysctl net.core.somaxconn=1024 \
--ip 172.18.12.92 \
-p 26391:26391 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/sentinel/26391/conf:/user/local/etc/redis/conf/ \
-d redis \
redis-sentinel /user/local/etc/redis/conf/sentinel.conf

1主2从搭建成功

在这里插入图片描述

查看哨兵日志

在这里插入图片描述

问题:脑裂问题

在这里插入图片描述

问题:

  1. 主由于某种网络原因,被哨兵判断为被动下线, 踢下线,2秒钟上线???
  2. 脑裂问题?

在这里插入图片描述

SpringBoot整合Redis哨兵

启动1主2从,3哨兵

在这里插入图片描述

[root@localhost log]# docker exec -it redis_6389 bash
root@013a85fa5f85:/data# redis-cli
127.0.0.1:6379> info replication

在这里插入图片描述

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tianju.redis</groupId>
    <artifactId>springboot-redis-deep</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--    起步依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.13</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>

写配置类,列出哨兵

在这里插入图片描述

server:
  port: 9099

spring:
  redis:
    sentinel:
      master: redis_6389
      nodes: 192.168.111.130:26389,192.168.111.130:26390,192.168.111.130:26391

写service存个值

package com.tianju.redis.service.impl;

import com.tianju.redis.service.ISentinelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class SentinelServiceImpl implements ISentinelService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void add() {
        stringRedisTemplate.opsForValue().set("stu", "pet");
    }
}

写测试类

package com.tianju.redis.service.impl;

import com.tianju.redis.service.ISentinelService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.*;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class SentinelServiceImplTest {

    @Autowired
    private ISentinelService sentinelService;

    @Test
    public void add() {
        sentinelService.add();
    }
}

总结

1.Redis的1主2从搭建,主要是redis.conf文件的修改,核心bing允许任何端口访问;
2.Redis的3哨兵搭建,设置好自己的端口,监听的主的ip和端口,运行即可;
3.SpringBoot整合Redis哨兵初步;

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

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

相关文章

聊聊服务端缓存那些事(预热、淘汰、污染、雪崩、穿透、击穿等)

文章目录 概要一、缓存预热二、缓存污染2.1、先更新数据库再更新缓存2.2、先更新缓存再更新数据库2.3、先删除缓存再更新数据库&#xff0c;读时再更新2.4、先更新数据库再删除缓存&#xff0c;读时再更新2.5、缓存污染总结2.6、删除缓存失败了怎么办&#xff1f;2.7、延迟双删…

【数据结构与算法】十大经典排序算法-堆排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…

JZ33二叉搜索树的后序遍历序列

题目地址&#xff1a;二叉搜索树的后序遍历序列_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 使用栈 栈的特点是&#xff1a;先进后出。 通读题目后&#xff0c;我们可以得出&#xff0c;二叉搜索树是左子节点小于根节点&#xff0c;右子节点大于根节点。 …

wps设置一键标题字体和大小

参考 wps设置一键标题字体和大小&#xff1a;https://www.kafan.cn/A/7v5le1op3g.html 统一一键设置

[FPGA IP系列] 2分钟了解FPGA中的BRAM

FPGA设计中&#xff0c;BRAM是一项非常关键的内置存储资源&#xff0c;FPGA开发需要熟练使用BRAM&#xff0c;今天再复习一下BRAM的知识&#xff0c;包括BRAM的定义、组成、应用等等。 一、BRAM介绍 1、BRAM的定义 RAM是Random Access Memory&#xff0c;也就是随机访问数据…

C字符串练习题(6.3.1)

编写一个程序&#xff0c;从键盘上读入一个小于1000的正整数&#xff0c;然后创建并输出一个字符串&#xff0c;说明该整数的值。例如&#xff0c;输入941&#xff0c;程序产生的字符串是“Nine hundred and forty one”。 #include<stdlib.h> #include<string.h>…

【STM32】FreeRTOS互斥量学习

互斥量&#xff08;Mutex&#xff09; 互斥量又称互斥信号量&#xff08;本质也是一种信号量&#xff0c;不具备传递数据功能&#xff09;&#xff0c;是一种特殊的二值信号量&#xff0c;它和信号量不同的是&#xff0c;它支持互斥量所有权、递归访问以及防止优先级翻转的特性…

Spring Boot 项目实现 Spring AOP

【注】实现在SpringBoot项目中&#xff0c;同时给两个类的方法添加AOP前置通知 1、创建一个SpringBoot项目 2、创建两个目标类和方法 package com.tqazy.learn_spring_project.spring_aop;import org.springframework.stereotype.Service;/*** ClassName SpringAopUserServi…

【树状数组优化哈希DP】CF1801 C

Problem - C - Codeforces 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define lowbit(x) (x & (-x))using i64 long long;constexpr int N 2e5 10; constexpr int mod 1e9 7;std::vector<int> V[N];int n, m, x, mxv 0; int a[N], id[N…

MySQL入门学习教程(一)

mysql简介 1、什么是数据库 &#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;它产生于距今六十多年前&#xff0c;随着信息技术和市场的发展&#xff0c;特别是二十世纪九十年代以后&#xff0c;数据管理不再仅仅…

学习笔记整理-JS-02-基本类型

文章目录 一、数据类型简介和检测1. JavaScript中两大数据类型 二、基本数据类型1. 数字类型2. 字符串类型3. 布尔类型4. undefined类型5. null 三、数据类型的转换1. 数据类型的转换 四、重点内容 一、数据类型简介和检测 1. JavaScript中两大数据类型 基本数据类型 Number S…

Android学习之路(3) 布局

线性布局LinearLayout 前几个小节的例程中&#xff0c;XML文件用到了LinearLayout布局&#xff0c;它的学名为线性布局。顾名思义&#xff0c;线性布局 像是用一根线把它的内部视图串起来&#xff0c;故而内部视图之间的排列顺序是固定的&#xff0c;要么从左到右排列&#xf…

最强自动化测试框架Playwright(22)-模拟器

可以使用测试生成器通过仿真生成测试&#xff0c;以便为特定窗口、设备、配色方案生成测试&#xff0c;以及模拟地理位置、语言或时区。测试生成器还可以生成测试&#xff0c;同时保留经过身份验证的状态。 模拟视口大小 Playwright 打开一个浏览器窗口&#xff0c;其视口设置…

电路基础之电容

电容器&#xff08;Capacitor&#xff09;是由两个导体电极之间夹着一个电介质而组成的元件。这两个电极可以是金属板、箔片、涂层等&#xff0c;而电介质则是放置在电极之间的绝缘材料。电容器的基本构成包括以下几个要素&#xff1a; 电极&#xff1a;电容器的电极是两个导体…

无涯教程-Perl - readpipe函数

描述 该函数将EXPR作为命令执行。然后,将输出作为标量文本中的多行字符串返回,或者将行作为列表context中的单个元素返回。 语法 以下是此函数的简单语法- readpipe EXPR返回值 此函数在标量context中返回String,在列表context中返回List。 例 以下是显示其基本用法的示…

HTML详解连载(6)

HTML详解连载&#xff08;6&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽CSS特性继承性注意 层叠性特点 优先级规则公式注意 叠加计算公式&#xff08;每以及之间不存在进位&#xff09;规则 Emmet写法分析属性名属性值注意 背景图平铺方式属性…

【分布式存储】数据存储和检索~B+树

为什么数据存储结构重要 在存储系统中&#xff0c;其实不管数据是什么样的&#xff0c;归根结底其实都还是取决于数据的底层存储结构&#xff0c;而主要常见的就是数据库索引结构&#xff0c;B树、Redis中跳表、以及LSM、搜索引擎中的倒排索引。本质都是如何利用不用的数据结构…

群辉nas看剧设置

首先打开NAS的后台页面&#xff0c;打开“控制面板” 然后依次点开“文件服务--SMB--高级设置”&#xff0c;在最小SMB协议后面的方框选择“SMB1"&#xff0c;然后点击”保存“按钮即可&#xff0c;这里这样设置的原因是因为还有很多旧设备只支持SMB1&#xff08;我几年前…

章节7:Burp Intruder模块

章节7&#xff1a;Burp Intruder模块 参考资料 https://portswigger.net/burp/documentation/desktop/tools/intruder 01 Intruder模块作用与原理 原理 http://xxx.xx.com/bbs/index.php?namewuyanzu&mottogo 对请求参数进行修改&#xff0c;分析响应内容&#xff0…