当前位置: 首页 > news >正文

docker搭建Redis集群及哨兵(windows10环境,OSS Cluster)

一、基本概念

Redis:即 "Remote DIctionary Server" ,翻译为“远程字典服务器”。从字面意义上讲,它指的是一个远程的字典服务,意味着它是一个可以远程访问的服务,主要用于存储键值对(key-value pairs)。Redis 是一个开源的、支持网络、基于内存亦即易失性的键值对存储数据库,用作数据库、缓存和消息中间件。它支持多种类型的值(value),如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。此外,Redis 还提供了数据持久化选项,可以在内存中的数据丢失时恢复数据;还支持事务、发布/订阅模式、Lua脚本执行等功能。

基础知识

NoSQL 数据库:NoSQL 指的是“Not Only SQL”,即不仅限于 SQL 查询语言的非关系型数据库。MongoDB 是文档型数据库,Cassandra 是列族存储数据库。
(包括Redis ,这些 NoSQL 数据库都是为了处理大规模数据并提供高可用性和扩展性设计的。然而,Redis 专注于内存中数据的高效读写,同时也提供了持久化能力;而 MongoDB 和 Cassandra 则各有侧重,比如 MongoDB 强调灵活的文档模型,Cassandra 注重分区容忍性和线性扩展。)

关系型数据库(RDBMS):关系型数据库管理系统,指的是一种基于表格结构存储数据的数据库系统。每个表都包含行和列,行代表记录,列定义了字段的数据类型。
(关系型数据库如 MySQL、PostgreSQL 等通常用于持久化存储结构化的数据,并支持复杂的查询操作。而 Redis 主要作为内存中的键值存储,提供快速读写性能,常被用作缓存层来减轻关系型数据库的压力。)

Memcached:一个简单的分布式内存对象缓存系统,主要用于加速动态Web应用程序。
(与Redis的联系,两者都是内存缓存解决方案,但 Redis 提供更多的功能,例如对多种数据结构的支持、持久化选项以及更丰富的命令集。Memcached 更加轻量级,适合需要简单键值对缓存的应用场景。)

本地缓存 vs 分布式缓存:本地缓存是指在同一进程或机器上的缓存机制,例如 Java 中的 HashMap;分布式缓存则是跨越多个节点的缓存系统。
(Redis 作为一个分布式缓存方案,允许不同服务器之间的数据共享,并且能够保证数据的一致性和可靠性。相比之下,本地缓存只能服务于单个应用实例,一旦该实例重启,所有缓存数据都会丢失。)

ACID事务 vs BASE理论 vs CAP理论:ACID 理论Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性),是传统关系型数据库遵循的原则;分布式系统BASE理论则是 Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性),反映了某些分布式系统的设计理念;分布式系统CAP理论C代表一致性,通过数据副本阶段同步或锁机制各节点数据读写一致,A代表可用性,读写请求都可立即相应且无错,通常与C相矛盾,副本写操作要同步数据就不一致,多节点同时写就影响可用性,P代表分区容忍性,比如网络延迟拥堵、硬件故障等,在实际情况是必然存在的。在分布式系统理论中,BASE 理论侧重于描述一种宽松的一致性和高可用性的系统行为模式,而 CAP 理论则是一个理论上的限制,指出了分布式系统中三个关键属性之间的权衡关系。
(Redis 支持一种简化版的事务,它能确保一系列命令按顺序执行,但是不提供回滚机制。在 CAP 理论下,Redis 更倾向于 AP,采用最终一致性模型以换取更高的可用性和性能。)

OSS Cluster:即"Open Source Software Cluster",是 Redis 集群的一种部署模式,表明该集群是以 Redis 的开源版本为基础构建的,使用了 Redis 内置的集群功能
("OSS Cluster" 作为 Redis 集群的一种类型,意味着它是基于官方提供的、未经修改的 Redis 开源代码实现的集群解决方案。与之相对的是企业级或商业版的 Redis 集群,例如由 Redis Labs 提供的 Redis Enterprise)

redis核心概念

键:键是字符串类型的数据,用于唯一标识一个值(在 Redis 中,键用于唯一标识一个值。所有的数据操作都是通过键来进行的,用户可以通过键来存取、更新或删除数据。)
值:由键关联的数据内容(值是 Redis 数据库中实际存储的内容,可以是字符串、列表、集合等多种类型的数据结构)

持久化:redis存储的数据保持不变的状态或性质(持久化机制确保即使在服务器重启后,数据仍然能够被保存下来。Redis 提供了 RDB 和 AOF 两种持久化方式。RDB 是 "Redis 数据库备份" 的缩写,它指的是创建 Redis 数据库的一个快照;AOF 表示 "仅追加文件",意味着所有对数据库的写操作命令都会被追加到该文件中)

发布/订阅(Pub/Sub):一种消息通信模式,发送者不知道接收者是谁,只需要发送者(发布者)将消息发送到频道,接收者订阅频道即可接收其他客户端发布的消息(Redis 实现了 Pub/Sub 模式,允许客户端订阅频道并接收其他客户端发布的消息)

事务:一系列作为单一工作单元执行的操作(Redis 事务保证一组命令要么全部被执行,要么都不执行,提供了基本的原子性。它通过MULTI, EXEC, WATCH等命令实现,允许多个命令排队并一次性执行。)

管道:一种优化技术,允许多个任务连续进行而不需要等待每个任务完成。(Redis 管道减少了客户端和服务器之间的往返次数,从而提高了效率。)

复制:创建数据副本或拷贝(Redis 的主从复制机制使得数据可以从一个主节点复制到多个从节点,增强了系统的可用性和读扩展能力。)

集群:一种分布式部署方式,它将数据分布在多个节点上以提高性能和可靠性(Redis集群提供了一种水平扩展的方式,通过分片来分配数据,同时保证高可用性。)

哨兵(Sentinel):警戒或监视的角色,提供监控、自动故障转移和其他管理任务(Redis Sentinel,它是为了提高 Redis 部署的可靠性和可用性而设计的一个组件,是 Redis 官方提供的一个高可用性解决方案,监控 Redis 实例(包括主节点和从节点)的健康状况,并在主节点出现故障时自动执行故障转移操作)

模块:可插入系统中的独立组件(自Redis 4.0起,允许开发者添加自定义的数据类型和命令,通过模块扩展Redis的功能)

Lua脚本: 使用 Lua 编程语言编写的代码片段(Redis 支持执行 Lua 脚本,这使得可以在服务器端运行复杂的逻辑,减少客户端和服务器之间的交互次数。)

redis集群核心概念

节点:节点是集群中的一个单独的Redis实例,可以是主节点(Master Node)或从节点(Replica Node)。每个节点都运行Redis服务,并存储一部分数据。
(Redis集群由多个节点组成。主节点负责存储数据和处理请求,而从节点用于数据的备份。当主节点故障时,从节点可以接管其角色,确保集群的高可用性。)

分片:将数据拆分并分布到多个存储位置的技术。每个分片只存储数据集的一部分。
(Redis集群通过分片将数据分散到多个主节点上。每个主节点负责一部分数据,提升了存储能力和查询性能。分片使得Redis能够处理比单个实例更大的数据量。)

哈希槽:哈希槽是一个数据结构,用于将数据(键)映射到集群中的特定位置。Redis集群将数据映射到16384个哈希槽上。
(哈希槽是Redis集群分片的基础。每个键通过哈希算法映射到一个哈希槽,哈希槽决定了数据在哪个主节点上存储。哈希槽是集群内数据分配的核心机制。而哈希槽的分配是Redis集群通过一致性哈希来进行的,这种分布式哈希技术使得节点的加入或移除不会导致大量数据重新分配,从而减少了对集群性能的影响)

迁移:指的是重新分配哈希槽或数据从一个节点到另一个节点的过程。
(迁移发生在扩展集群、增加节点或节点故障恢复时。Redis集群通过迁移哈希槽来确保数据均匀分布,避免某些节点过载)

键的分配:指将数据(键)按照一定规则分布到不同的节点或分片上。
(在Redis集群中,数据的键通过哈希槽分配到不同的主节点。每个主节点负责一定数量的哈希槽,确保数据均匀分布在集群中。)

重定向:当请求的目标无法在当前节点找到时,将请求引导到其他节点的过程。
(当客户端请求一个键,而该键并不存储在当前节点上时,Redis会返回一个 MOVED 错误并提供目标节点的地址,客户端根据这个地址重定向请求到正确的节点。)

故障转移:指在主节点发生故障时,从节点自动接管主节点的角色,确保集群继续提供服务。
(edis集群中的每个主节点都由从节点备份。当主节点发生故障时,集群会自动通过选举机制将从节点提升为主节点,保证集群的高可用性。)

集群总线:集群总线是Redis集群内各节点之间通信的传输通道。它用于传递集群的状态信息、故障检测和节点配置更新等。
(集群总线使得Redis集群中的各个节点能够相互协调,共享信息。当集群状态发生变化时,节点通过集群总线通知其他节点。服务端口+10000 是用来区分 数据端口 和 集群总线端口 的,确保数据访问和集群内部通信使用不同的端口,服务端口和集群通信端口都需要映射主机端口,映射时在主机上端口不唯一即可)

复制:指将一个节点的数据同步到另一个节点的过程,通常用于备份和高可用性。
(Redis集群支持主从复制,每个主节点都有一个或多个从节点作为备份。当主节点发生故障时,从节点可以自动接管,保证数据不会丢失。在主节点故障时。如果从节点的复制延迟较高,可能导致故障恢复时数据不一致的问题)

二、操作步骤

1、安装Docker Desktop

首先开启虚拟化和适用于Linux的window子系统功能并安装WSL2,然后下载安装Docker Desktop,地址https://www.docker.com/products/docker-desktop/,如果Docker Desktop打开报错,参考解决wsl 无法升级 wsl2 以及windows 下的Docker 打开报错_当前计算机配置不支持 wsl2-CSDN博客,bcdedit /set hypervisorlaunchtype Auto 后重启并重新wsl --install
(通过Docker Desktop能够在Windows 10上创建、管理并运行Redis等容器化服务)

2、拉取redis镜像

在Docker Desktop或命令行窗口拉取redis的镜像
(可供后续创建相同的Redis版本的容器实例并进行管理)

3、配置并创建redis节点实例

3.1、创建redis节点配置文件

创建redis-6379.conf、redis-6380.conf、redis-6381.conf、redis-6382.conf、redis-6383.conf、redis-6384.conf内容基本为:

port 6379 #服务端口,其他可设置为6380、6381、6382、6383、6384
cluster-enabled yes #启用 Redis 集群模式
cluster-config-file nodes.conf #指定集群节点配置文件,确保 Redis 节点重启后能恢复集群信息
cluster-node-timeout 5000 #设置 Redis 集群节点通信的超时时间
cluster-announce-ip 192.168.11.34 #指定节点向集群中其他节点及客户端广播的 IP 地址
appendonly yes #启用 AOF持久化。
bind 0.0.0.0 #监听所有可用的网络接口,允许远程客户端或其他节点通过网络访问该实例
protected-mode no #禁用保护模式,使得Redis 可以接受来自远程客户端的连接(开发环境用途)

(节点配置文件可以使得每个节点按照特定的配置行为运行,尤其是集群相关配置,它是后续创建集群节点和集群的基础)

3.2、启动redis实例

在配置文件的目录下打开powershell执行命令
docker network create redis-cluster-net(创建一个自定义的 Docker 网络,如果想在同一网络下创建集群实例时,可用于连接不同的 Redis 容器,以确保它们之间能够互相通信,避免其他容器的影响。由于容器可以识别,因此可以通过容器名称+端口创建集群,否则需要用ip+端口创建)
docker run -d --name redis-6379【 --net redis-cluster-net  非同一网络可不写】-v "${PWD}/redis-6379.conf:/usr/local/etc/redis/redis.conf" -p 6379:6379 -p 16379:16379 redis:7 redis-server /usr/local/etc/redis/redis.conf
docker run -d --name redis-6380【 --net redis-cluster-net  非同一网络可不写】-v "${PWD}/redis-6380.conf:/usr/local/etc/redis/redis.conf" -p 6380:6380 -p 16380:16380 redis:7 redis-server /usr/local/etc/redis/redis.conf
docker run -d --name redis-6381【 --net redis-cluster-net  非同一网络可不写】-v "${PWD}/redis-6381.conf:/usr/local/etc/redis/redis.conf" -p 6381:6381 -p 16381:16381 redis:7 redis-server /usr/local/etc/redis/redis.conf
docker run -d --name redis-6382【 --net redis-cluster-net  非同一网络可不写】-v "${PWD}/redis-6382.conf:/usr/local/etc/redis/redis.conf" -p 6382:6382 -p 16382:16382 redis:7 redis-server /usr/local/etc/redis/redis.conf
docker run -d --name redis-6383【 --net redis-cluster-net  非同一网络可不写】-v "${PWD}/redis-6383.conf:/usr/local/etc/redis/redis.conf" -p 6383:6383 -p 16383:16383 redis:7 redis-server /usr/local/etc/redis/redis.conf
docker run -d --name redis-6384【 --net redis-cluster-net  非同一网络可不写】-v "${PWD}/redis-6384.conf:/usr/local/etc/redis/redis.conf" -p 6384:6384 -p 16384:16384 redis:7 redis-server /usr/local/etc/redis/redis.conf

参数解析
        -d:以守护模式运行容器,容器将在后台运行。
        --name redis-7000:为容器命名为 redis-7000,便于管理和识别。
        --net redis-cluster-net:将容器加入 redis-cluster-net 网络,以便 Redis 节点间的通信。
        -v "${PWD}/redis-7000.conf:/usr/local/etc/redis/redis.conf":将当前目录的 redis-7000.conf 文件挂载到容器中的 /usr/local/etc/redis/redis.conf 路径。用途:为 Redis 容器提供启动配置文件。
        -p 6379:6379 -p 16379:16379:将宿主机的 6379 和 16379 端口映射到容器内的对应端口。用途:6379:供客户端连接 Redis 服务。16379:供 Redis 集群内部节点通信使用。
redis:7:使用 redis:7 镜像启动容器。redis-server /usr/local/etc/redis/redis.conf:指定 Redis 使用配置文件 /usr/local/etc/redis/redis.conf 启动。用途:以集群模式运行 Redis 节点。
(创建各集群节点实例,是后续创建这些节点集群的基础。)

4、创建redis集群

进入任意一个容器进行管理
docker exec -it redis-6379 bash

同一Docker网络下:
redis-cli --cluster create redis-6379:6379 redis-6380:6380 redis-6381:6381 redis-6382:6382 redis-6383:6383 redis-6384:6384 --cluster-replicas 1
否则:
redis-cli --cluster create 192.168.11.34:6379 192.168.11.34:6380 192.168.11.34:6381 192.168.11.34:6382 192.168.11.34:6383 192.168.11.34:6384 --cluster-replicas 1

命令解析
        docker exec:这个命令用于在一个运行中的容器内执行命令,而不需要停止容器。
        -it:这是两个参数组合:-i:代表 interactive,即启动一个交互式会话。-t:代表 tty,即为容器分配一个伪终端(类似于终端窗口),使得命令的输出能够格式化显示,允许你与容器进行交互。
         redis-6379:这是容器的名字或 ID,指定要进入的容器。在这个例子中,容器名是 redis-6379,表示一个运行 Redis 实例的容器。
         bash:在容器内部启动一个 Bash shell(如果容器中安装了 Bash)。这会将你带入该容器的命令行界面,使你可以在容器内执行命令。
(redis集群自带数据分片和故障转移高可用,因此就直接可以通过redis-cli或redis insight进行这些功能的验证)

5、验证

5.1、通过redis-cli工具验证

redis-cli -h 192.168.11.34 -p 6379
查看集群整体信息:cluster info
查看集群节点信息:cluster nodes

故障转移,高可用:可通过cluster nodes查看每个从节点对应的主节点,并尝试当停止某个主节点时,会发现所配的从节点变为主节点,并管理原先主节点的哈希槽,当get 某个原先主节点的键时也依然可以获取值。
重定向:当对某一个节点set key value时,如果键不在当前节点的哈希槽范围内,则会出现MOVED错误,并引导显示新节点。
主从复制:当给某个节点set key value时,如果可set,在从节点中也可以get到该key的值

5.2、通过Redis Insight工具验证

通过redis insight可视化工具连接集群任意一节点查看集群信息

验证类似上述在命令行窗口的操作,在redis insight的workbench中输入命令并验证,区别是即使当前节点不可插入某个键,也会显示插入成功,这是因为redis insight自动在底层重定向,将其插入到了对应的节点中。可以在Analysis Tools的Overview中查看主节点状态及其键的数量

总结

redis集群实现就是按照一定配置的完成多节点实例的启动以创建集群。关键点在于具体的集群配置规则

三、额外补充

1、redis持久化配置

Redis 提供了两种主要的持久化机制,以保证数据在服务重启或故障后能够恢复:RDB(Redis Database ,在指定的时间间隔将内存中的数据生成快照并保存到磁盘上来实现)快照持久化和AOF(Append-Only File ,将每个写操作记录到日志文件来实现)日志持久化。
redis.conf 中增加以下配置:
RDB配置:
save 900 1    # 如果 900 秒内至少有 1 次写操作,则触发快照
save 300 10   # 如果 300 秒内至少有 10 次写操作,则触发快照
save 60 10000 # 如果 60 秒内至少有 10000 次写操作,则触发快照
dbfilename dump.rdb    # 快照文件名
dir ./   # 快照路径,默认在当前安装目录下
AOF配置:
appendonly yes    #启用AOF
appendfilename "appendonly.aof"    # 指定 AOF 文件名和路径
appendfsync always       # 同步策略:每次写操作后立即同步,最安全但性能最差
appendfsync everysec     # 同步策略:每秒同步一次,默认值,性能与安全的平衡
appendfsync no           # 同步策略:由操作系统决定何时同步,性能最高但最不安全
auto-aof-rewrite-percentage 100    # 重写策略:AOF文件的大小等于或超过上次重写后大小两倍的比例时触发重写 
auto-aof-rewrite-min-size 64mb     # 重写策略:当 AOF 文件的当前大小达到或超过指定的值(如 64MB)时,Redis 才会检查是否满足触发 AOF 重写的其他条件 
RDB 和 AOF 的混合模式:
aof-use-rdb-preamble yes     #Redis 4.0 开始支持混合持久化模式,将 RDB 和 AOF 的优点结合,兼顾性能和数据安全

可以通过分别删除rdb或aof文件并重启redis查看数据,确认redis的持久化方式

2、使用docker compose部署集群

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。(通过使用 docker-compose.yml文件来配置应用程序的服务、网络和卷,然后使用docker-compose up(可以带上 - d表示程序以在后台运行的非守护模式运行)命令就可以从配置中启动所有服务。)
 docker-compose文件配置:

services:redis-6379:image: redis:7container_name: redis-6379ports:- "6379:6379"- "16379:16379"volumes:- ./redis-6379.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]redis-6380:image: redis:7container_name: redis-6380ports:- "6380:6380"- "16380:16380"volumes:- ./redis-6380.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]redis-6381:image: redis:7container_name: redis-6381ports:- "6381:6381"- "16381:16381"volumes:- ./redis-6381.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]redis-6382:image: redis:7container_name: redis-6382ports:- "6382:6382"- "16382:16382"volumes:- ./redis-6382.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]redis-6383:image: redis:7container_name: redis-6383ports:- "6383:6383"- "16383:16383"volumes:- ./redis-6383.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]redis-6384:image: redis:7container_name: redis-6384ports:- "6384:6384"- "16384:16384"volumes:- ./redis-6384.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]

(使用docker compose启动多容器简化了上述操作步骤中的“3.2、启动redis实例”部分,使得对于多redis节点得操作和管理更加方便了。在docker-compose.yml 文件中,如果没有定义自定义网络。这意味着 Docker Compose 会使用默认的网络设置,它会创建一个专用的桥接网络,命名为 <项目名>_default,所有在同一个 docker-compose.yml 文件中定义的服务都会自动连接到这个网络,服务之间可以通过服务名互相访问,无需额外配置)
然后打开powershell窗口中执行创建集群的命令:
docker exec -it redis-6379 bash
redis-cli --cluster create 192.168.11.34:6379 192.168.11.34:6380 192.168.11.34:6381 192.168.11.34:6382 192.168.11.34:6383 192.168.11.34:6384 --cluster-replicas 1

3、windows版redis

目前维护的windows版本的redis最新为3.0.504,不支持创建集群,在使用redis-cli创建集群的时候会报错,提示Unrecognized option or bad number of args for --cluster
需要安装Ruby 环境,通过redis-trib.rb 脚本工具创建集群

4、spring boot集成

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version>
</dependency>

修改配置文件

spring:redis:cluster:nodes:- 192.168.11.34:6379- 192.168.11.34:6380- 192.168.11.34:6381- 192.168.11.34:6382- 192.168.11.34:6383- 192.168.11.34:6384timeout: 5000

创建 RedisTemplate Bean

@Configuration
public class RedisTemplateConfig {@Beanpublic JedisConnectionFactory jedisConnectionFactory() {RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration().clusterNode("192.168.11.34", 6379).clusterNode("192.168.11.34", 6380).clusterNode("192.168.11.34", 6381);return new JedisConnectionFactory(clusterConfig);}@Beanpublic RedisTemplate<Object, Object> redisTemplate() {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(jedisConnectionFactory());return template;}
}

然后在代码中就可以注入使用

    @Resourceprivate RedisTemplate<Object, Object> redisTemplate;

5、redis哨兵

哨兵就像一名放哨的“守卫”,始终监控 Redis 实例(包括主节点和从节点)的运行状态。一旦它监测到主节点不可用,它便会触发自动故障转移,将其中一个从节点提升为新的主节点,从而保持 Redis 服务的高可用性。
(哨兵适合简单的主从架构中实现高可用,而 Redis 集群则在规模化、分片扩展和自动故障转移方面更为全面。)
配置结构如图

C:\Program Files\Docker\redis-sentinel\redis-master\redis-master.conf
port 6380
bind 0.0.0.0
appendonly yes
protected-mode no

C:\Program Files\Docker\redis-sentinel\redis-slave1
port 6381
bind 0.0.0.0
appendonly yes
protected-mode no
replicaof 192.168.11.34 6380

C:\Program Files\Docker\redis-sentinel\redis-slave2\redis-slave2.conf
port 6382
bind 0.0.0.0
appendonly yes
protected-mode no
replicaof 192.168.11.34 6380

C:\Program Files\Docker\redis-sentinel\sentinel1\sentinel1.conf
C:\Program Files\Docker\redis-sentinel\sentinel2\sentinel2.conf
C:\Program Files\Docker\redis-sentinel\sentinel3\sentinel3.conf
port 26379
bind 0.0.0.0
protected-mode no
sentinel monitor mymaster 192.168.11.34 6380 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000

C:\Program Files\Docker\redis-sentinel\docker-compose.yml
services:
  redis-master:
    image: redis:latest
    container_name: redis-master
    volumes:
      - ./redis-master:/usr/local/etc/redis
    ports:
      - "6380:6380"
    command: ["redis-server", "/usr/local/etc/redis/redis-master.conf"]

  redis-slave1:
    image: redis:latest
    container_name: redis-slave1
    ports:
      - "6381:6381"  
    depends_on:
      - redis-master
    volumes:
      - ./redis-slave1/redis-slave1.conf:/usr/local/etc/redis/redis-slave1.conf
    command: ["redis-server", "/usr/local/etc/redis/redis-slave1.conf"]

  redis-slave2:
    image: redis:latest
    container_name: redis-slave2
    depends_on:
      - redis-master
    ports:
      - "6382:6382"
    volumes:
      - ./redis-slave2/redis-slave2.conf:/usr/local/etc/redis/redis-slave2.conf
    command: ["redis-server", "/usr/local/etc/redis/redis-slave2.conf"]

  sentinel1:
    image: redis:latest
    container_name: sentinel1
    depends_on:
      - redis-master
    volumes:
      - ./sentinel1:/usr/local/etc/redis
    ports:
      - "26379:26379"
    restart: always  
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel1.conf"]

  sentinel2:
    image: redis:latest
    container_name: sentinel2
    depends_on:
      - redis-master
    volumes:
      - ./sentinel2:/usr/local/etc/redis
    ports:
      - "26380:26379"
    restart: always  
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel2.conf"]

  sentinel3:
    image: redis:latest
    container_name: sentinel3
    depends_on:
      - redis-master
    volumes:
      - ./sentinel3:/usr/local/etc/redis
    ports:
      - "26381:26379"
    restart: always  
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel3.conf"]

命令解析
        image: 使用最新版本的 Redis 镜像。
        container_name: 分别命名为 sentinel1, sentinel2, 和 sentinel3
        depends_on:确保 redis-master 容器先于哨兵启动。
        volumes:将主机目录(如 ./sentinel1)挂载到容器内的 /usr/local/etc/redis,以加载各自的 Sentinel 配置文件。
        ports:sentinel1 映射主机的 26379 端口到容器的 26379 端口。sentinel2sentinel3 分别映射主机的 2638026381 端口到容器的 26379 端口。注意,这样配置的目的是让每个哨兵实例通过不同的主机端口访问,而容器内部仍使用标准的 Sentinel 端口 26379
        restart:设置为 always,确保哨兵容器在停止后自动重启,增加系统的稳定性和可用性。        
        command:启动 Redis Sentinel,并指定各自的配置文件 sentinel1.conf, sentinel2.conf, 和 sentinel3.conf

验证用到的命令
        docker exec -it sentinel1 redis-cli -h 192.168.11.34 -p 26379(进入哨兵节点)
        SENTINEL MASTER mymaster(当 flags 中出现 s_down 时,表示该哨兵已同意主节点"看起来像"(subjectively)下线。如果后续达到仲裁(即其他哨兵也同意主节点下线),那么会出现 o_down(objectively down)的状态,继而触发故障转移过程)
        SENTINEL CKQUORUM mymaster(则表示达到了足够的哨兵数量同意下线状态。)
        SENTINEL slaves mymaster(查看从节点信息)
        info sentinel(关于哨兵系统的详细信息,可以看到主节点的状态和连接的节点是哪个。哨兵节点的配置文件中会记录从节点的信息,假如停止从节点后再启动,则需要还原清理哨兵配置文件,否则显示的slaves会增多超过实际运行的从节点数量。因为哨兵节点会给其配置文件中写入内容,因此需要设置挂载的配置文件权限是可写入的,比如设置Everyone 完全控制)

相关文章:

docker搭建Redis集群及哨兵(windows10环境,OSS Cluster)

一、基本概念 Redis:即 "Remote DIctionary Server" &#xff0c;翻译为“远程字典服务器”。从字面意义上讲&#xff0c;它指的是一个远程的字典服务&#xff0c;意味着它是一个可以远程访问的服务&#xff0c;主要用于存储键值对&#xff08;key-value pairs&…...

第8章 搬移特性

8.1 搬移函数 模块化是优秀软件设计的核心所在&#xff0c;好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序&#xff0c;我得保证互相关联的软件要素都能集中到一块&#xff0c;并确保块与块之间的联系易于查找、直观易懂。同时&#xff0c…...

[IT项目管理]项目时间管理(本章节3w字爆肝)

七.项目时间管理 7.1 项目进度的重要性 为什么要重视项目进度&#xff1a;在项目进行的过程之中会遇到变故。但是不论项目中发生了什么&#xff0c;时间总是在流逝&#xff0c;就可能会导致项目不可以在规定的时间完成。 7.2可能影响项目进度的因素 有员工离职个人的工作方…...

k8s中设置annotation的方法总结

k8s中设置annotation的方法总结 annotation是什么 在 Kubernetes 中&#xff0c;Annotations 是一种用于向 Kubernetes 对象附加非标识性元数据的机制。 annotation有什么用 annotation与 Labels 类似&#xff0c;但有一些关键区别和特定用途。 常用于存储与对象相关的配置…...

第19天:信息收集-Web应用源码获取闭源备份开发泄漏WebPack打包资源搜索ICO定位

#知识点 1、信息收集-Web应用-源码获取-已知指纹&未知指纹 2、信息收集-Web应用-源码获取-泄漏问题&发现指纹 一、参考文章&#xff1a; https://www.secpulse.com/archives/124398.html https://mp.weixin.qq.com/s/QgLDdaefXlZtvlSiFQShZw 二、源码泄漏原因&#xff…...

uniapp小程序的锚点定位(将页面滚动到目标位置)

小程序中&#xff0c;a页面跳转到b页面&#xff0c;跳转后滚动定位到b页面的特定位置。 1.uni.pageScrollTo传递一个scrollTop参数可以滚动到特定位置。2.可以通过 uni.createSelectorQuery()等获取定位元素的位置信息。3.uni.getSystemInfoSync()获取设备的导航栏和状态栏高度…...

py脚本部署到服务器定时启动

py脚本部署到服务器定时启动 一、准备好你的脚本二、把脚本放到服务器三、在服务器创建脚本所需要的环境1、安装 Miniconda&#xff08;如果不想安装 Anaconda 或 Miniconda&#xff0c;可以直接使用 Python 的venv模块创建虚拟环境&#xff0c;但安装 Conda 会更方便管理不同版…...

相机不动,机构动作----Hands Eyes

最近在研究 手眼标定&#xff0c;发现大家都需付费&#xff0c;搞啥子&#xff0c;说好的开源。。。 以相机在上固定不动&#xff0c;机械手为 EPSON_Robot 为例&#xff0c;详细的一步一步实例操作指引 EPSON_Robot 的192.168.0.1 2004 Server 详细操作步骤 1. 启动程序 运…...

Jdk1.7到Jdk1.8 HashMap 发生了什么变化(底层)

从JDK 1.7到JDK 1.8&#xff0c;HashMap在底层实现上发生了显著的变化&#xff0c; 主要体现在数据结构、链表插入方式、哈希算法、扩容机制以及并发性方面。 以下是具体的变化点&#xff1a; 1. 数据结构的变化 JDK 1.7&#xff1a;HashMap的底层数据结构是数组单向链表。…...

微积分复习笔记 Calculus Volume 2 - 4.2 Direction Fields and Numerical Methods

4.2 Direction Fields and Numerical Methods - Calculus Volume 2 | OpenStax...

java后端环境配置

因为现在升学了&#xff0c;以前本来想毕业干java的&#xff0c;很多java的环境配置早就忘掉了&#xff08;比如mysql maven jdk idea&#xff09;&#xff0c;想写个博客记录下来&#xff0c;以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…...

Unity UI Button 事件优先级调整技术方案

Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中&#xff0c;针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法&#xff0c;旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…...

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…...

PHP排序算法:数组内有A~E,A移到C或者C移到B后排序,还按原顺序排序,循环

效果 PHP代码 public function demo($params){function moveNext($arr){$length count($arr);$lastElement $arr[$length - 1];for ($i $length - 1; $i > 0; $i--) {$arr[$i] $arr[$i - 1];}$arr[0] $lastElement;return $arr;}function moveAndReplace($array, $from…...

keepalived的高可用集群

keepalived的概念 keepalived的工作原理 基于vrrp实现的调度器高可用方案 keepalived的配置实验 先在调度服务器上安装keepalived和ipvsadm apt -y install keepalived ipvsadm 复制keepalived的配置文件到/etc/keepalived/目录下 cp /usr/share/doc/keepalived/samples/keep…...

基于单片机的农田灌溉系统(论文+源码)

1.系统设计 本系统主要实现如下目标&#xff1a; 1&#xff0e;可以实时监测土壤湿度&#xff1b; 2&#xff0e;土壤湿度太低时&#xff0c;进行浇水操作&#xff1b; 3&#xff0e;可以按键设置湿度的触发阈值&#xff1b; 4. 可以实现远程操控 5&#xff0e;可以实现手…...

技术文档分享——绘制精准航海图:技术文档规划、表达与维护的艺术

绘制精准航海图&#xff1a;技术文档规划、表达与维护的艺术 方向一&#xff1a;技术文档的规划布局从技术文档的规划布局入手&#xff0c;探讨如何确定文档的整体架构&#xff0c;如章节设置、逻辑顺序等&#xff0c;以确保信息呈现的系统性与连贯性。1. 确定文档的目标和读者…...

43124123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

Pytorch应用实战(1)- 基于YOLO的视频人脸马赛克处理

免费链接: Blogger(需翻Q), Github 文章目录 本文介绍给图片的人脸打码给视频的人脸打码本文介绍 YoloV11(Github)提供了非常方便的API帮助用户实现目标检测(detect)、语义分割(segement)、肢体识别(Pose)等功能。 本文将基于YoloV11的目标检测来实现一个视频人脸马…...

【Prompt Engineering】1.编写 Prompt 的原则

一、环境配置 使用 OpenAI 的 ChatGPT API&#xff0c;需要有 API_KEY&#xff0c;并安装 OpenAI 库。安装命令&#xff1a;pip install openai 和 pip install zhipuai。配置方法&#xff1a;直接设置 openai.api_key 或通过环境变量设置。 二、两个基本原则 2.1 原则一&am…...

非vip版opengl

环境搭建 安装编译器和构建工具&#xff1a;在 Windows 上可以使用 Visual Studio&#xff0c;在 Linux 上可以使用 GCC 等编译器。确保编译器已正确安装并配置好环境变量。安装 OpenGL 库和相关辅助库&#xff08;以 GLUT 为例&#xff09;&#xff1a; Windows&#xff1a; 下…...

【深入理解Nginx】

深入理解Nginx 介绍 Nginx&#xff08;发音为 “engine-x”&#xff09;是一款高性能的HTTP服务器和反向代理服务器&#xff0c;同时支持IMAP/POP3协议。它以其高并发处理能力、稳定性、丰富的功能集、简单的配置和低资源消耗而受到广泛欢迎。Nginx特别适合提供静态文件服务、…...

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…...

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍

Microi吾码&#xff5c;开源低代码.NET、VUE低代码项目&#xff0c;表单引擎介绍 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、Microi吾码表单引擎是什么&#xff1f;四、Microi吾码表单引擎功能4.1 模块引擎 - 由表单引擎驱动4.2 流程引擎 - 由表…...

css常用属性有哪些

在上篇文章我们知道了利用css选择器来对HTML进行简单装饰&#xff0c;就像做word文档一样&#xff0c;需要对哪一段落修改格式&#xff0c;就需要先选中&#xff0c;css选择器就是这意思。这格式如何修改&#xff0c;怎么放大字体&#xff0c;怎么加粗&#xff0c;怎么修改背景…...

Java设计模式 —— 【结构型模式】装饰者模式详解

文章目录 前言结构说明案例演示小结静态代理和装饰者的区别 前言 在日常生活中&#xff0c;我们常会遇到一种场景&#xff1a;去快餐店吃饭&#xff0c;里面琳琅满目的主食&#xff0c;还有各式各样的配菜作为消费者&#xff0c;只管挑选就行&#xff0c;但是如果让我们来设计…...

简道云与金蝶云星空无缝集成的技术探索

简道云数据集成到金蝶云星空的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确对接是关键环节。本文将聚焦于一个实际运行的系统对接集成案例&#xff1a;简道云-其他入库单--->金蝶-其他入库单&#xff0c;通过轻易云数据集成平台实现这一目标。 案例背…...

单片机原理及应用笔记:单片机中断系统原理与项目实践

高金鹏&#xff1a;男&#xff0c;银川科技学院计算机与人工智能学院&#xff0c;2022级别计算机科学与技术本科生&#xff0c;单片机原理及应用课程第六组。 指导教师&#xff1a;王兴泽 电子邮件&#xff1a;高金鹏3535558665qq.com 个人CSDN:暴躁的海绵宝宝 暴躁的海绵宝…...

uniapp使用百度地图配置了key,但是显示Map key not configured

搞了我两天的一个问题。 hbuilderx版本&#xff1a;4.36 问题介绍&#xff1a; 我的项目是公司的项目&#xff0c;需要在H5端使用百度地图&#xff0c;使用vue-cli创建的uniapp&#xff0c;就是uni代码在src里的目录结构。就是使用这种方式才会遇到这个问题。 问题原因&#xf…...

CTFHub ssrf

第一关&#xff08;内网访问&#xff09; 尝试访问位于127.0.0.1的flag.php吧 第二关(伪协议读取文件) 尝试去读取一下Web目录下的flag.php吧 1.首先尝试http://127.0.0.1/flag.php 2.查看页面源代码 3.根据提示输入file:///var/www/html/flag.php 4.查看页面源代码 第三关&…...

字符串哈希

1. LC 3292 形成目标字符串需要的最少字符串数Ⅱ 这题在3291的基础上开大数据量了。 3291我是比较标准的dp字典树优化匹配。先把所有word扔到字典树里面&#xff0c;定义dp[i]表示到target[i]需要的最少次数。对于每个i进行target子串的最长前缀匹配&#xff0c;随后向后刷表…...

ensp 静态路由配置

A公司有广州总部、重庆分部和深圳分部3个办公地点&#xff0c;各分部与总部之间使用路由器互联。广州、重庆、深圳的路由器分别为R1、R2、R3&#xff0c;为路由器配置静态路由&#xff0c;使所有计算机能够互相访问&#xff0c;实训拓扑图如图所示 绘制拓扑图 给pc机配置ip地址…...

Android Room 数据库使用详解

一、Room介绍 Android Room 是 Google 提供的一个 Android 数据持久化库&#xff0c;是 Android Jetpack 组成部分之一。它提供了一个抽象层&#xff0c;使得 SQLite 数据库的使用更为便捷。通过 Room&#xff0c;开发者可以轻松地操作数据库&#xff0c;不需要直接编写繁琐的…...

Ubuntu安装或卸载mariadb-server软件包

1、安装mariadb-server sudo apt install mariadb-server 检查MariaDB服务器的服务状态 service mariadb status 仅需要卸载MariaDB&#xff0c;而不是删除所有MariaDB相关软件包 sudo apt-get remove mariadb-server 2、卸载MariaDB 从系统中完全删除MariaDB数据库&#xf…...

canal详解及demo

提示&#xff1a;如何保证Redis中的数据与数据库中的数据一致性&#xff1f;数据同步canal的介绍和demo、大型企业如何实现mysql到redis的同步&#xff1f;使用binlog实时更新redis缓存、canal的接入教程、win下canal的服务器端、canal客户端的创建、连接、测试教程、数据同步方…...

SQL语句

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系数据库系统的标准编程语言。它允许用户执行数据的定义、查询、更新和管理等操作。以下是一些常见的SQL语句及其简要说明&#xff1a; 数据定义语言&#xff08;DDL&#…...

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …...

设计模式12:抽象工厂模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 参考&#xff1a; C设计模式&#xff1a;抽象工厂模式&#xff08;风格切换案例&#xff09;_c 抽象工厂-CSDN博客 1.概念 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是软件设计…...

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记&#xff1a;从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档&#xff1a; https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…...

基础库urllib的使用

学习爬虫&#xff0c;其基本的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢?请求需要我们自己构造吗?我们需要关心请求这个数据结构怎么实现吗?需要了解 HTTP、TCP、IP层的网络传输通信吗?需要知道服务器如何响应以及响应的原理吗? 可能…...

SSM 电脑配件销售系统设计要点与 JSP 实现难点攻克

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于电脑配件销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了电脑配件销售系统&#xff0c;它彻底改变了过…...

AI前沿分析:ChatGPT搜索上线,Google搜索地位能否守住?

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 引言:AI与搜索领域的激烈博弈一、ChatGPT搜索的优势是什么?1. 实时信息获取:超越传统搜索2. 对话式搜索:重构用户体验3. 个性化推荐:深度挖掘用户需求二、G…...

单片机:实现utf-8转gb2312(附带源码)

单片机实现UTF-8转GB2312 在嵌入式系统中&#xff0c;字符编码是常见的问题之一&#xff0c;尤其是在显示中文字符时。UTF-8和GB2312都是常见的字符编码标准&#xff0c;UTF-8广泛用于Web和现代操作系统中&#xff0c;而GB2312是中国大陆常用的中文字符集。在一些嵌入式系统中…...

VMProtect:软件保护与安全的全面解决方案

在当今数字化时代&#xff0c;软件的安全性和保密性愈发重要。VMProtect 作为一款备受瞩目的软件保护工具&#xff0c;因其强大的功能和广泛的应用而成为开发者保护软件的首选方案。 VMProtect 是一款新一代的软件保护实用程序&#xff0c;支持多个编译器平台&#xff0c;包括…...

linux下观察进程捕获信号的情况

linux观察进程收到信号的情况&#xff0c;信号可以来自外部进程、进程自身、内核定时器等。 观察捕获信号方法一&#xff1a;strace strace所有信号&#xff1a; strace -e signal -f -p $pid 过滤出某个信号&#xff1a; #grep 信号名&#xff0c;取自kill -l strace -e …...

VSCode编辑+GCC for ARM交叉编译工具链+CMake构建+OpenOCD调试(基于STM32的标准库/HAL库)

一、CMake安装 进入CMake官网的下载地址Get the Software&#xff0c;根据系统安装对应的Binary distributions。 或者在CMake——国内镜像获取二进制镜像安装包。 或者访问GitHub的xPack项目xPack CMake v3.28.6-1&#xff0c;下载即可。 记得添加用户/系统的环境变量&#…...

概率论得学习和整理26:EXCEL 关于plot 折线图--频度折线图的一些细节

目录 0 折线图有很多 1 频度折线图 1.1 直接用原始数据做的频度折线图 2 将原始数据生成数据透视表 3 这样可以做出了&#xff0c;频度plot 4 做按某字段汇总&#xff0c;成为累计plot分布 5 修改上面显示效果&#xff0c;做成百分比累计plot频度分布 0 折线图有很多 这…...

数据结构之栈和队列算法题

一&#xff1a;有效括号数 学了栈之后这一题就比较简单了。 思路&#xff1a;1、左括号进栈 2、右括号出栈匹配。 完整代码&#xff1a; 因为使用C语言写的&#xff0c;所以里面包含了栈的实现 #include<stdio.h> #include<stdlib.h> #include<assert.h>…...

离散数学---随机漫步

本文根据 MIT 计算机科学离散数学课程整理&#xff08;Lecture 25&#xff09;。 赌徒破产问题&#xff08;Gamblers Ruin&#xff09; 问题描述 初始为 n 元&#xff0c;对于每一次独立的赌注&#xff0c;都有 p 的概率赢得 1 元&#xff0c;(1-p) 的概率输掉 1 元。当输完…...

HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装

TCP/IP协议栈的封装过程 用户从应用层发出数据先会交给传输层&#xff0c;传输层会添加TCP或者UDP头部&#xff0c;然后交给网络层&#xff0c;网络层会添加IP头部&#xff0c;然后交给数据链路层&#xff0c;数据链路层会添加以太网头部和以太网尾部&#xff0c;最后变成01这样…...