【006】Redis主从/哨兵/分片集群Docker搭建

news2024/11/25 7:26:46

项目源码合集 https://gitee.com/qiuyusy/small-project-study

搭建过程疯狂踩坑,记录一下希望各位少走弯路

目录

    • 主从搭建
      • 配置文件redis.conf
      • 运行容器
      • 测试
      • 优化
    • 哨兵集群
      • 配置文件
      • 运行容器
      • 测试
      • 代码
      • 读写分离
    • 分片集群

mkdir -p /opt/docker/redis_study/redis_0/conf
mkdir -p /opt/docker/redis_study/redis_0/data

docker run -p 6379:6379 --name redis_0 \
-v /opt/docker/redis_study/redis_0/data:/data \
-v /opt/docker/redis_study/redis_0/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf --appendonly yes

主从搭建

主 redis_0 7001

从 redis_1 7002

从 redis_2 7003

mkdir -p /opt/docker/redis_study/redis_0/conf
mkdir -p /opt/docker/redis_study/redis_0/data
mkdir -p /opt/docker/redis_study/redis_1/conf
mkdir -p /opt/docker/redis_study/redis_1/data
mkdir -p /opt/docker/redis_study/redis_2/conf
mkdir -p /opt/docker/redis_study/redis_2/data

配置文件redis.conf

/opt/docker/redis_study/redis_0/conf

记得配置文件需要关闭aof appendonly no

replica-announce-ip 192.168.222.128 设置IP地址

加入bind 0.0.0.0,这个很重要

把配置文件cp 到 两个从的目录下

然后在两个从机的配置中添加replicaof 192.168.222.128 7001,设定为主机的从机

5.0之前用 slaveof 5.0以后用replicaof

运行容器

注意这里三个节点容器内的端口别都设为6379!这样IP和端口相同会导致后面哨兵集群无法选出新的主节点

主 redis_0 7001

docker run -p 7001:7001 --name redis_0 \
-v /opt/docker/redis_study/redis_0/data:/data \
-v /opt/docker/redis_study/redis_0/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

从 redis_1 7002

docker run -p 7002:7002 --name redis_1 \
-v /opt/docker/redis_study/redis_1/data:/data \
-v /opt/docker/redis_study/redis_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf 

从 redis_2 7003

docker run -p 7003:7003 --name redis_2 \
-v /opt/docker/redis_study/redis_2/data:/data \
-v /opt/docker/redis_study/redis_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

测试

主机redis_0 set name qiuyu

image-20230309182711575

从机redis_2 get name

image-20230309182847869

主从设置成功

可以使用 info replication查看集群信息

image-20230309183119716

从节点只能读无法写

image-20230309183238843

优化

磁盘慢但网络快的话,主节点可以开启repl-diskless-sync no,提高全量同步性能

哨兵集群

sentinel_0 27001

sentinel_1 27002

sentinel_2 27003

mkdir -p /opt/docker/redis_study/sentinel_0/conf
mkdir -p /opt/docker/redis_study/sentinel_1/conf
mkdir -p /opt/docker/redis_study/sentinel_2/conf
mkdir -p /opt/docker/redis_study/sentinel_0/log
mkdir -p /opt/docker/redis_study/sentinel_1/log
mkdir -p /opt/docker/redis_study/sentinel_2/log

配置文件

protected-mode no
bind 0.0.0.0
# 后台运行 docker -d 这里就无需开启
daemonize no
port 27001 # 27001 27002 27003
# log
dir "/home/redis_sentinel/log"
logfile "/home/redis_sentinel/log/27001.log"
# sentinel
sentinel monitor mymaster 192.168.222.128 7001 2
# 超时
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

sentinel announce-ip 192.168.222.128
sentinel announce-port 27001 # 27001 27002 27003

其他两个哨兵也配置一下,记得修改port 和 log

运行容器

docker run -p 27001:27001 --name sentinel_0 \
--sysctl net.core.somaxconn=1024 \
--privileged=true \
-v /opt/docker/redis_study/sentinel_0/conf:/usr/local/etc/redis/conf/ \
-v /opt/docker/redis_study/sentinel_0/log:/home/redis_sentinel/log \
-d redis redis-sentinel /usr/local/etc/redis/conf/sentinel.conf

docker run -p 27002:27002 --name sentinel_1 \
--sysctl net.core.somaxconn=1024 \
--privileged=true \
-v /opt/docker/redis_study/sentinel_1/conf:/usr/local/etc/redis/conf/ \
-v /opt/docker/redis_study/sentinel_1/log:/home/redis_sentinel/log \
-d redis redis-sentinel /usr/local/etc/redis/conf/sentinel.conf

docker run -p 27003:27003 --name sentinel_2 \
--sysctl net.core.somaxconn=1024 \
--privileged=true \
-v /opt/docker/redis_study/sentinel_2/conf:/usr/local/etc/redis/conf/ \
-v /opt/docker/redis_study/sentinel_2/log:/home/redis_sentinel/log \
-d redis redis-sentinel /usr/local/etc/redis/conf/sentinel.conf

这里坑贼多,配吐了

  • 指定sentinel.conf配置文件映射到容器内时直接使用文件映射, 这么做有可能导致哨兵没有写入配置文件的权限, 表现为WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy. 解决方案:使用文件夹映射或者加上--privileged=true用来提升root权限

  • docker redis The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn 解决 : 加上 --sysctl net.core.somaxconn=1024

测试

关闭redis_0后,sentinel_1被选举为leader,然后sentinel_1选择redis_1成为主节点

1:X 09 Mar 2023 16:17:39.478 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:X 09 Mar 2023 16:17:39.478 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:X 09 Mar 2023 16:17:39.478 # Configuration loaded
1:X 09 Mar 2023 16:17:39.479 * monotonic clock: POSIX clock_gettime
1:X 09 Mar 2023 16:17:39.479 * Running mode=sentinel, port=27001.
1:X 09 Mar 2023 16:17:39.483 # Sentinel ID is bdc44c4a16815f0a2050c378df49c26e5de22874
1:X 09 Mar 2023 16:17:39.483 # +monitor master mymaster 192.168.222.128 7001 quorum 2
1:X 09 Mar 2023 16:17:39.484 * +slave slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:17:39.484 * +slave slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:17:41.738 * +sentinel sentinel dc564ce67b88380c9befc8324bee0c021995e570 192.168.222.128 27002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:17:42.290 * +sentinel sentinel 201d9e4b941d7adc262058975dab2f25e587e1cf 192.168.222.128 27003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.428 # +sdown master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.513 # +odown master mymaster 192.168.222.128 7001 #quorum 3/2
1:X 09 Mar 2023 16:19:05.513 # +new-epoch 1
1:X 09 Mar 2023 16:19:05.513 # +try-failover master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.515 # +vote-for-leader bdc44c4a16815f0a2050c378df49c26e5de22874 1
1:X 09 Mar 2023 16:19:05.521 # dc564ce67b88380c9befc8324bee0c021995e570 voted for bdc44c4a16815f0a2050c378df49c26e5de22874 1
1:X 09 Mar 2023 16:19:05.521 # 201d9e4b941d7adc262058975dab2f25e587e1cf voted for bdc44c4a16815f0a2050c378df49c26e5de22874 1
1:X 09 Mar 2023 16:19:05.587 # +elected-leader master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.587 # +failover-state-select-slave master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.688 # +selected-slave slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.688 * +failover-state-send-slaveof-noone slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.780 * +failover-state-wait-promotion slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:06.542 # +promoted-slave slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:06.542 # +failover-state-reconf-slaves master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:06.642 * +slave-reconf-sent slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.594 * +slave-reconf-inprog slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.594 * +slave-reconf-done slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.677 # -odown master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.677 # +failover-end master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.677 # +switch-master mymaster 192.168.222.128 7001 192.168.222.128 7002
1:X 09 Mar 2023 16:19:07.677 * +slave slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7002
1:X 09 Mar 2023 16:19:07.677 * +slave slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002
1:X 09 Mar 2023 16:19:12.702 # +sdown slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002

image-20230310002039070

然后恢复redis_0 ,成为redis_0的从节点

1:X 09 Mar 2023 16:22:34.113 # -sdown slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002
1:X 09 Mar 2023 16:22:44.100 * +convert-to-slave slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002

代码

导入依赖

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

配置: 无需配置redis节点,直接配置哨兵就行

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.222.128:27001
        - 192.168.222.128:27002
        - 192.168.222.128:27003

简单测一下,都是OK的

@SpringBootTest
class MyTest {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testSelect(){
        String name = stringRedisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

    @Test
    void testInset(){
        stringRedisTemplate.opsForValue().set("test","test");
    }
}

读写分离

启动类中配置下这个@Bean就行了

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class,args);

    }

    @Bean
    public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
        return new LettuceClientConfigurationBuilderCustomizer() {
            @Override
            public void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {
                clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
            }
        };
    }
    
    // 或者直接lambda
    @Bean
    public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
        return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
    }
}

这个bean中配置的就是读写策略,包括四种:

  • MASTER:从主节点读取
  • MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
  • REPLICA:从slave(replica)节点读取
  • REPLICA _PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master

分片集群

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

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

相关文章

藏经阁(五)温湿度传感器 SHT3x-DIS 手册 解析

文章目录芯片特性芯片内部框图芯片引脚定义芯片温湿度范围芯片寄存器以及时序讲解信号转换公式芯片特性 湿度和温度传感器完全校准&#xff0c;线性化温度补偿数字输出供电电压范围宽&#xff0c;从2.4 V到5.5 VI2C接口通讯速度可达1MHz和两个用户可选地址典型精度 2% RH和 0.…

Python 二分查找:bisect库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

优先级队列详解

目录优先级队列简介关于堆为什么得用完全二叉树用堆来实现优先级队列插入/删除/获取优先级最高的元素模拟实现使用PriorityQueue的注意事项PriorityQueue常用接口优先级队列的构造方法优先级队列简介 PriorityQueue&#xff0c;即优先级队列。它可以保证每次出出来的数据是队列…

探究:kafka生产者/消费者与多线程安全

目录 1. 多线程安全 1.1. 生产者是多线程安全的么&#xff1f; 1.1. 消费者是多线程安全的么&#xff1f; 2. 消费者规避多线程安全方案 2.1. 每个线程维护一个kafkaConsumer 2.2. [单/多]kafkaConsumer实例 多worker线程 2.3.方案优缺点对比 1. 多线程安全 1.1. 生产…

我的Git stash不小心清空了怎么办,提了代码能反悔吗

文章目录1. 前言2. git stash清空场景2. git stash clear后如何还原3.Git撤销已经推送(push)至远端仓库的信息1. 前言 本文总结的知识很实用哈&#xff0c;虽然是git工具的不常用操作&#xff0c;但是绝对不是冷知识&#xff0c;学会可以从会用git升级到git高手。 主要是两种场…

Centos7 安装Mysql8.0

1、到指定目录下下载安装包[rootVM-0-14-centos ~]# cd /usr/local/src2、下载mysql8[rootVM-0-14-centos src]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz3、解压mysql8, 通过xz命令解压出tar包&#xff0c; 然后通过t…

KDZD耐电压高压击穿强度测试仪

一、技术参数 01、输入电压&#xff1a; 交流 220 V。 02、输出电压&#xff1a; 交流 0--50KV ; 直流 0—50kv 。 03、电器容量&#xff1a;3KVA。 04、高压分级&#xff1a;0—50KV&#xff0c;&#xff08;全程可调&#xff09;。 05、升压速率&#xff1a;0.1KV/s-…

c++11 标准模板(STL)(std::unordered_map)(八)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…

【C++】你不得不爱的——继承

凡是面向对象的语言&#xff0c;都有三大特性&#xff0c;继承&#xff0c;封装和多态&#xff0c;但并不是只有这三个特性&#xff0c;是因为者三个特性是最重要的特性&#xff0c;那今天我们一起来看继承&#xff01; 目录 1.继承的概念及定义 1.概念 2.继承的定义 2.基类…

Linux进程学习【进程地址】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…

Dynabook笔记本电脑无法开机怎么重装新系统?

Dynabook笔记本电脑无法开机怎么重装新系统&#xff1f;有用户使用Dynabook笔记本电脑出现了无法正常开机的情况。遇到这样的问题是我们的电脑系统出现了损坏&#xff0c;可以尝试进行系统修复。如果无法修复的话&#xff0c;就需要进行系统重装了。以下为大家带来Dynabook笔记…

SQLMap安装教程

注意&#xff1a;在python3环境下安装sqlmap的时候会提示需要在python2的环境下才能安装&#xff0c;其实在python3.6以后也都支持sqlmap了。 sqlmap安装步骤&#xff1a; 一、下载python&#xff1b; 下载地址 https://www.python.org/downloads/ 下载教程参考&#xff08…

通过反射获取注解的属性值(内含源代码)

通过反射获取注解的属性值&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87554543 目录通过反射获取注解的属性值&#xff08;内含源代码&#xff09;源代码下载链接地址&#xff1a;[https://downl…

做互联网自媒体创业的月薪收入真的能过万吗?

搞自媒体创业有前途吗&#xff1f;收入月薪过万是真的吗&#xff1f; 自媒体创业是一种新兴的创业方法&#xff0c;它的远景十分广阔。自媒体创业能够让人们在自己的兴趣爱好和专业范畴上发挥自己的才能&#xff0c;一起也能够获得不错的收入。可是&#xff0c;月薪过万并不是…

ArangoDB——AQL编辑器

AQL 编辑器 ArangoDB 的查询语言称为 AQL。AQL与关系数据库管理系统 (RDBMS)区别在于其更像一种编程语言&#xff0c;更自然地适合无模式模型&#xff0c;并使查询语言非常强大&#xff0c;同时保持易于读写。数据建模概念 数据库是集合的集合。集合存储记录&#xff0c;称为文…

三维人脸实践:基于Face3D的人脸生成、渲染与三维重建 <三>

face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 基于BFM模型&#xff0c;估计3DMM的参数&#xff0c;可以实现线性的人脸表征&#xff0c;该方法可用于基于关键点的人脸生成、位姿检测以及渲染等。推荐…

信息收集之搜索引擎

Google Hacking 也可以用百度&#xff0c;不过谷歌的搜索引擎更强大 site 功能&#xff1a;搜索指定域名的网页内容&#xff0c;可以用来搜索子域名、跟此域名相关的内容 示例&#xff1a; site:zhihu.com 搜索跟zhihu.com相关的网页“web安全” site:zhihu.com 搜索zhihu…

提升学习 Prompt 总结

NLP现有的四个阶段&#xff1a; 完全有监督机器学习完全有监督深度学习预训练&#xff1a;预训练 -> 微调 -> 预测提示学习&#xff1a;预训练 -> 提示 -> 预测 阶段1&#xff0c;word的本质是特征&#xff0c;即特征的选取、衍生、侧重上的针对性工程。 阶段2&…

C++核心编程

一、内存分区模型概述&#xff1a;C程序在执行时&#xff0c;将内存划分为4个区域程序运行前&#xff1a;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统管理①共享。共享的目的是对于频繁被执行的程序&#xff0c;在内存中只需有一份代码即可②只读。使其只…

组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比

组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比 目录 组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现EMD-KP