docker-compose搭建redis环境:哨兵模式(一主两重两哨兵)

文章目录

  • 0.BG
  • 1. 编写docker-compose.yml文件
  • 2. 哨兵配置文件sentinel.conf
  • 3.启动容器
  • 4.模拟故障转移

0.BG

redis环境有多中模式,包括Standalone,Cluster和Sentinel模式等。这里介绍一种简单搭建Sentinel模式的方法,搭建一个一主两重两哨兵的redis环境。
在这里插入图片描述

1. 编写docker-compose.yml文件

version: '3.8'services:redis-master:container_name: redis-masterimage: redis:6.0networks:redis-yy:ipv4_address: 172.28.5.2ports:- "6379:6379"command: redis-server --appendonly yesredis-slave-1:container_name: redis-slave-1image: redis:6.0networks:redis-yy:ipv4_address: 172.28.5.3ports:- "6380:6379"command: redis-server --slaveof redis-master 6379 --appendonly yesdepends_on:- redis-masterredis-slave-2:container_name: redis-slave-2image: redis:6.0networks:redis-yy:ipv4_address: 172.28.5.4ports:- "6381:6379"command: redis-server --slaveof redis-master 6379 --appendonly yesdepends_on:- redis-masterredis-sentinel-1:container_name: redis-sentinel-1image: redis:6.0networks:redis-yy:ipv4_address: 172.28.5.5ports: - "26379:26379"command: redis-sentinel /etc/redis/sentinel.confvolumes:- $PWD/sentinel.conf:/etc/redis/sentinel.confdepends_on:- redis-master- redis-slave-1- redis-slave-2redis-sentinel-2:container_name: redis-sentinel-2image: redis:6.0networks:redis-yy:ipv4_address: 172.28.5.6ports: - "26380:26379"command: redis-sentinel /etc/redis/sentinel.confvolumes:- $PWD/sentinel.conf:/etc/redis/sentinel.confdepends_on:- redis-master- redis-slave-1- redis-slave-2               networks:redis-yy:ipam:driver: defaultconfig:- subnet: 172.28.0.0/16ip_range: 172.28.5.0/24gateway: 172.28.5.254              

简单介绍一下上述文件:

  • 只是给容器命名,指定了其redis镜像的版本。
  • Command是容器启动后执行的指令:
    • master节点只是以AOF方式启动。
    • slave节点要指明其master节点是哪个。
    • sentinel节点启动指明了配置文件,具体配置内容在配置文件中。
    • 这里都没有设置密码

2. 哨兵配置文件sentinel.conf

sentinel monitor redis-yy 172.28.5.2 6379 2
sentinel down-after-milliseconds redis-yy 30000
sentinel parallel-syncs redis-yy 1
sentinel failover-timeout redis-yy 180000

sentinel monitor redis-yy 172.30.0.2 6379 2
这条指令的意思是哨兵监控一个名为redis-yy的redis,这个redis的IP与端口号是172.30.0.2与6379。最后一个2表示的是,由主观下线转变为客观下线的条件,即当两个哨兵认为当前master节点下线,那么就客观认为当前master节点已经下线。

sentinel down-after-milliseconds redis-yy 30000
要down超过30s才会认为其主观下线

sentinel down-after-milliseconds redis-yy 30000
选举超时时间

3.启动容器

使用如下指令启动docker容器

docker-compose -f docker-compose.yml up -d
Running 5/5✔ Container redis-master      Started                                                                                                                1.3s✔ Container redis-slave-2     Started                                                                                                                1.5s✔ Container redis-slave-1     Started                                                                                                                1.4s✔ Container redis-sentinel-1  Started                                                                                                                1.6s✔ Container redis-sentinel-2  Started

看到上述结果就表示容器已经启动成功。
可以连接到master节点查看信息:

➜  ~ docker exec -it 6473c293bda4 bash
root@6473c293bda4:/data# redis-cli
127.0.0.1:6379> info
# Server
redis_version:6.0.20
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7cb942700da8c107
redis_mode:standalone
os:Linux 5.15.49-linuxkit-pr x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:12.2.0
process_id:1
run_id:0f2dc11b814f4b3d39edc15554a3b8e7fe182d30
tcp_port:6379
uptime_in_seconds:6775
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:2576091
executable:/data/redis-server
config_file:
io_threads_active:0# Clients
connected_clients:5
client_recent_max_input_buffer:8
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0# Memory
used_memory:2041584
used_memory_human:1.95M
used_memory_rss:9568256
used_memory_rss_human:9.12M
used_memory_peak:2143616
used_memory_peak_human:2.04M
used_memory_peak_perc:95.24%
used_memory_overhead:1995264
used_memory_startup:803160
used_memory_dataset:46320
used_memory_dataset_perc:3.74%
allocator_allocated:2101520
allocator_active:2428928
allocator_resident:5189632
total_system_memory:8345645056
total_system_memory_human:7.77G
used_memory_lua:36864
used_memory_lua_human:36.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.16
allocator_frag_bytes:327408
allocator_rss_ratio:2.14
allocator_rss_bytes:2760704
rss_overhead_ratio:1.84
rss_overhead_bytes:4378624
mem_fragmentation_ratio:4.79
mem_fragmentation_bytes:7569184
mem_not_counted_for_evict:0
mem_replication_backlog:1048576
mem_clients_slaves:41024
mem_clients_normal:102496
mem_aof_buffer:8
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1713845348
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:339968
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
module_fork_in_progress:0
module_fork_last_cow_size:0
aof_current_size:93
aof_base_size:93
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0# Stats
total_connections_received:13
total_commands_processed:17403
instantaneous_ops_per_sec:3
total_net_input_bytes:841071
total_net_output_bytes:4686757
instantaneous_input_kbps:0.11
instantaneous_output_kbps:0.01
rejected_connections:0
sync_full:2
sync_partial_ok:6
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
expire_cycle_cpu_milliseconds:58
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:1
pubsub_patterns:0
latest_fork_usec:349
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
tracking_total_keys:0
tracking_total_items:0
tracking_total_prefixes:0
unexpected_error_replies:0
total_reads_processed:17089
total_writes_processed:23546
io_threaded_reads_processed:0
io_threaded_writes_processed:0# Replication
role:master
connected_slaves:2
slave0:ip=172.28.5.4,port=6379,state=online,offset=480313,lag=0
slave1:ip=172.28.5.3,port=6379,state=online,offset=480313,lag=0
master_replid:c092ef83b572c548e189eeae4c2cb6da8d64e616
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:480313
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:480313# CPU
used_cpu_sys:7.974892
used_cpu_user:3.743266
used_cpu_sys_children:0.006901
used_cpu_user_children:0.002612# Modules# Cluster
cluster_enabled:0# Keyspace
127.0.0.1:6379>

从上面的结果可以看到,当前master节点以Standalone mode在运行,其replication部分显示了只是个master节点,以及连接到master节点的两个slave节点,节点的IP、port、state和offset以及lag都可以看到。

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.28.5.4,port=6379,state=online,offset=540257,lag=0
slave1:ip=172.28.5.3,port=6379,state=online,offset=540257,lag=0
master_replid:c092ef83b572c548e189eeae4c2cb6da8d64e616
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:540257
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:540257

4.模拟故障转移

如果这个时候,master节点宕机了,那么哨兵会在判断master节点客观下线后,从slave节点中选举出新的master节点。

➜  ~ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED       STATUS       PORTS                                NAMES
0e6b49cc97f2   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   6379/tcp, 0.0.0.0:26380->26379/tcp   redis-sentinel-2
0c3f8f8f4dbd   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   6379/tcp, 0.0.0.0:26379->26379/tcp   redis-sentinel-1
951e5d81fde6   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:6381->6379/tcp               redis-slave-2
e3be7632c5f9   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:6380->6379/tcp               redis-slave-1
6473c293bda4   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:6379->6379/tcp               redis-master
➜  ~ docker stop 6473c293bda4
6473c293bda4
➜  ~ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED       STATUS       PORTS                                NAMES
0e6b49cc97f2   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   6379/tcp, 0.0.0.0:26380->26379/tcp   redis-sentinel-2
0c3f8f8f4dbd   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   6379/tcp, 0.0.0.0:26379->26379/tcp   redis-sentinel-1
951e5d81fde6   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:6381->6379/tcp               redis-slave-2
e3be7632c5f9   redis:6.0   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   0.0.0.0:6380->6379/tcp               redis-slave-1

此时已经master节点宕机,这个时候的查看sentinel的日志,可以看到:

2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.416 # +odown master redis-yy 172.28.5.2 6379 #quorum 2/2
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.416 # +new-epoch 1
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.416 # +try-failover master redis-yy 172.28.5.2 6379
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.421 # Could not rename tmp config file (Device or resource busy)
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.421 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.421 # +vote-for-leader ac58eb282da2eedff5843b98043caf42576dc273 1
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.427 # 7e1f67f1ed0cbc2763d8fa9b66913d3972d5c7c6 voted for ac58eb282da2eedff5843b98043caf42576dc273 1
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.493 # +elected-leader master redis-yy 172.28.5.2 6379
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.493 # +failover-state-select-slave master redis-yy 172.28.5.2 6379
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.584 # +selected-slave slave 172.28.5.3:6379 172.28.5.3 6379 @ redis-yy 172.28.5.2 6379
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.584 * +failover-state-send-slaveof-noone slave 172.28.5.3:6379 172.28.5.3 6379 @ redis-yy 172.28.5.2 6379
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.667 * +failover-state-wait-promotion slave 172.28.5.3:6379 172.28.5.3 6379 @ redis-yy 172.28.5.2 6379
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.951 # Could not rename tmp config file (Device or resource busy)
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.951 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.951 # +promoted-slave slave 172.28.5.3:6379 172.28.5.3 6379 @ redis-yy 172.28.5.2 6379
2024-04-23 15:40:25 1:X 23 Apr 2024 07:40:25.951 # +failover-state-reconf-slaves master redis-yy 172.28.5.2 6379
2024-04-23 15:40:26 1:X 23 Apr 2024 07:40:26.012 * +slave-reconf-sent slave 172.28.5.4:6379 172.28.5.4 6379 @ redis-yy 172.28.5.2 6379
2024-04-23 15:40:26 1:X 23 Apr 2024 07:40:26.514 # -odown master redis-yy 172.28.5.2 6379
2024-04-23 15:40:26 1:X 23 Apr 2024 07:40:26.970 * +slave-reconf-inprog slave 172.28.5.4:6379 172.28.5.4 6379 @ redis-yy 172.28.5.2 6379
2024-04-23 15:40:26 1:X 23 Apr 2024 07:40:26.970 * +slave-reconf-done slave 172.28.5.4:6379 172.28.5.4 6379 @ redis-yy 172.28.5.2 6379
2024-04-23 15:40:27 1:X 23 Apr 2024 07:40:27.022 # +failover-end master redis-yy 172.28.5.2 6379
2024-04-23 15:40:27 1:X 23 Apr 2024 07:40:27.022 # +switch-master redis-yy 172.28.5.2 6379 172.28.5.3 6379
2024-04-23 15:40:27 1:X 23 Apr 2024 07:40:27.022 * +slave slave 172.28.5.4:6379 172.28.5.4 6379 @ redis-yy 172.28.5.3 6379
2024-04-23 15:40:27 1:X 23 Apr 2024 07:40:27.022 * +slave slave 172.28.5.2:6379 172.28.5.2 6379 @ redis-yy 172.28.5.3 6379

从日志中已经可以看到,master节点已经切换到172.28.5.3这个节点。那么登录节点确认一下:

# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.28.5.4,port=6379,state=online,offset=90354,lag=0
master_replid:3f4312a3678a4e771d6a9a2668728b7202198c05
master_replid2:459d6b396219637670fa0b38dfe7a4ecf4227f89
master_repl_offset:90354
second_repl_offset:24036
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:90354
127.0.0.1:6379> 

可以确认,目前这个节点role已经是master了。目前只有一个slave节点。
此时,再重新启动172.28.5.2这个已经宕机的节点,它会再加入集群中,成为新的slave节点:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.28.5.4,port=6379,state=online,offset=110283,lag=0
slave1:ip=172.28.5.2,port=6379,state=online,offset=110283,lag=0
master_replid:3f4312a3678a4e771d6a9a2668728b7202198c05
master_replid2:459d6b396219637670fa0b38dfe7a4ecf4227f89
master_repl_offset:110283
second_repl_offset:24036
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:110283
127.0.0.1:6379> 

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

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

相关文章

一文速览Llama 3及其微调:如何通过paper-review数据集微调Llama3 8B

前言 4.19日凌晨正准备睡觉时,突然审稿项目组的文弱同学说:Meta发布Llama 3系列大语言模型了 一查,还真是 本文以大模型开发者的视角,基于Meta官方博客的介绍:Introducing Meta Llama 3: The most capable openly a…

vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)

一、ffmpeg安装​​​​​​ ffmpeg下载 https://ffmpeg.org/download.html找ffmpeg-release-essentials.zip点击下载,下载完解压ffmpeg.exe 程序运行 二、配置ffmpeg环境变量 添加成功后验证是否生效任意地方打开cmd窗口输入 ffmpeg 打印如下表示成功 三、node…

Codeforces Educational Codeforces Round 164 E. Chain Reaction 【思维、分块、调和级数复杂度】

E. Chain Reaction 题意 有 n n n 个怪物排成一行,第 i i i 个怪物的生命值为 a i a_i ai​ 当一只怪物的生命值为正数时,它才被认为是活着的 假设你的闪电技能每次能够造成 k k k 点伤害,你每次可以选择一个怪物攻击,这只怪…

如何使用 Vercel 托管静态网站

今天向大家介绍 Vercel 托管静态网站的几种方式,不熟悉 Vercel 的伙伴可以看一下之前的文章:Vercel: 开发者免费的网站托管平台 Github 部署 打开 Vercel 登录界面,推荐使用 GitHub账号 授权登录。 来到控制台界面,点击 Add New …

Linux——NFS网络文件系统

在生产环境中共享宿主目录可以用于集中管理账户 一、存储设备 DAS 是直连存储相当于移动硬盘 NAS 是网络文件系统,挂载后可以直接访问 SAN 存储区域网络 IPSAN 网线连接 共享的是设备,需要挂载后分区使用 FCSAN 光纤连接 二、服务的管理 1、安…

【一些神金】怎么缓解工作压力?使用VS-code彩虹屁插件

怎么缓解工作压力? 其实吃点好的,多睡一会儿,再锻炼锻炼身体就好。 但我只是想炫耀一下这个彩虹屁插件。 原版插件:VS-code-Rainbowfart 我的版本:RainbowFart-Oberon 基于 MIT 开源,包括所有设计资源及音…

影视后期特效合成:DaVinci Fusion Studio19 激活版

DaVinci Fusion Studio是一款功能强大的影视后期特效合成软件,可广泛应用于视觉效果、广播电视设计、动态图形设计、3D动画设计等领域。 如综合的绘图、动态掩蔽、遮片、图层叠加、字幕等工具,结合高效的粒子生成系统,通过它可以创建各种精细…

【电控笔记5.10】Luenberger估测器

Luenberger估测计 单积分器:pi控制器的补偿 双积分器:使用pid控制器的补偿 除了受控厂跟传感器,其他都在mcu 去掉Rs就是一个PLL锁相环 带宽比PLL更大

【Linux】gdb的简单使用

文章目录 一、gdb是什么?二、使用说明1. 安装2. 注意事项3. 常用调试指令3.1 gdb3.2 l3.3 r3.4 n3.5 s3.6 b3.7 info b3.8 finish3.9 p3.10 set var3.11 c3.12 d breakpoints3.13 d n3.14 disable/enable breakpoints3.15 disable/enable n3.16 info b3.17 display …

如何在Windows服务做性能测试(CPU、磁盘、内存)

目录 前言1. 基本知识2. 参数说明 前言 由于需要做一些接口测试,测试是否有真的优化 1. 基本知识 该基本知识主要用来用到Performance Monitor,以下着重介绍下这方面的知识 性能监视器(Performance Monitor):Windo…

梯度下降法总是在同一点收敛吗?

梯度下降法总是在同一点收敛吗? 梯度下降法并不总是在同一点收敛。梯度下降法的收敛取决于多个因素,包括初始参数的选择、学习率的设置、损失函数的形状等。 以下是一些影响梯度下降法收敛行为的关键因素: 1.初始参数: 初始参数…

【数据库】三、数据库SQL语言命令(基础从入门到入土)

【全文两万多字,涵盖大部分常见情况,建议点赞收藏】 目录 文章目录 目录安装SQL语言1.使用2.DATABASE查看所有库新建数据库修改数据库删除数据库连接数据库 3.TABLE创建表查看库所有表删除表查看表信息重命名表修改表字段(列)表中…

【八股】Java基础、集合、JVM

面向对象三大特性 1 封装: 将 方法 和 属性 写到同一个类中,并将属性 私有化,生成 get set方法,外部访问属性需要通过get和set方法,内部可以直接访问属性,这样的一个类我们认为它完成了封装。 2 继承: 子…

月入8k,21岁计算机专业男孩转行网优,天赋可以让人发光,努力也能!

今天的主人公是一位仅21岁的年轻小帅哥,大学学的是计算机专业,毕业后的工作是卖苦力,工作一段时间后毅然决然的选择了转行后台网优,让我们一起来看看这位21岁男孩转行背后的故事... 卖苦力,是没有前途的 今天的主人公…

【c++】list类接口函数介绍与深度剖析模拟实现

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章来到list有关部分,这一部分函数与前面的类似,我们简单讲解,重难点在模拟实现时的迭代器有关实现 目录 1.List介绍2.接…

富集分析不求人,零代码可视化GO/KEGG分析结果

01 爱基百客云平台小工具使用 首先,打开爱基百客官网:http://www.igenebook.com;点击菜单栏最右侧“云平台”按钮。 弹出云平台界面(下图),输入账号、密码和验证码方可登录;进入云平台&#xf…

《Beginning C++20 From Novice to Professional》第二章Fundamental Types

本章将介绍C的基础数据类型,主要涉及下列方面: 变量的声明、初始化、赋值整数字面量浮点数如何计算变量类型转换字符相关auto关键字 Variables, Data, and Data Types 这里先给出变量的定义:有名字的一块内存,这个变量的类型决…

2024-04-23 linux 查看内存占用情况的命令free -h和cat /proc/meminfo

一、要查看 Linux 系统中的内存占用大小,可以使用 free 命令或者 top 命令。下面是这两个命令的简要说明: 使用 free 命令: free -h这将显示系统当前的内存使用情况,包括总内存、已用内存、空闲内存以及缓冲区和缓存的使用情况。…

想冲宇宙厂,直接挂了。。。

宇宙厂实际是字节,这个称呼是因为字节跳动主宰了宇宙内一切App,有点家大业大的意思。 今天分享一位字节春招凉经,问了一些数据库和Java八股,没出算法题,直接挂了,竟然最喜欢出算法题的字节,这次…