docker 形态构建redis 哨兵模式集群

news/2024/11/18 16:27:45/

主从模式介绍

哨兵是 Redis 的一种运行模式,它专注于对 Redis 实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个 Redis 系统的可用性。结合 Redis官方文档,可以知道 Redis 哨兵具备的能力有如下几个:

  • 监控:持续监控 master 、slave 是否处于预期工作状态。
  • 自动切换主库:当 Master 运行故障,哨兵启动自动故障恢复流程:从 slave 中选择一台作为新 master。
  • 通知:让 slave 执行 replicaof ,与新的 master 同步;并且通知客户端与新 master 建立连接。
    在这里插入图片描述
    1.每个 Sentinel 以每秒一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。

2.如果一个实例距离最后一次有效回复 PING 命令的时间超过指定的值, 那么这个实例会被 Sentinel 标记为主观下线。

3.正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。

4.有足够数量的 Sentinel 在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。

5.每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。

6.Sentinel 和其他 Sentinel 协商主节点的状态,如果主节点处于 SDOWN 状态,则投票自动选出新的主节点。将剩余的从节点指向新的主节点进行数据复制。

7.当没有足够数量的 Sentinel 同意主服务器 下线时, 主服务器的客观下线状态就会被移除。主服务器重新向 Sentinel 的 PING 命令返回有效回复时,主服务器主观下线状态就会被移除

8.当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

环境准备:拉取redis

[root@172-16-82-218 redis]# docker pull redis:5.0.14

在这里插入图片描述

[root@172-16-82-218 redis]# docker images | grep redis

在这里插入图片描述

准备redis的配置文件redis.conf(放在自己定义的目录上),并复制redis.conf出3份用于redis docker镜像启动的配置文件

[root@172-16-82-218 redis]# wget http://download.redis.io/redis-stable/redis.conf
[root@172-16-82-218 redis]# cp redis.conf redis-6379.conf
[root@172-16-82-218 redis]# cp redis.conf redis-6380.conf
[root@172-16-82-218 redis]# cp redis.conf redis-6381.conf

在这里插入图片描述

配置这3个文件【redis-6379.conf为主服务器配置文件,redis-6380.conf , redis-6381.conf为从服务器配置文件】

1)修改配置文件redis-6379.conf如下参数,然后保存退出

vi redis-6379.conf
#允许远程连接
bind 0.0.0.0
#关闭保护模式(设置成:protected-mode no;保护模式关闭,如果你不关闭保护模式,启动哨兵的时候,无法正常运行。还有个解决办法就是你设置密码,但是一般都不设置redis的密码。麻烦,我每次连接还得输入密码。在部署中,可以设置密码。) 
protected-mode no
#开启后,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里
appendonly yes
#当protected-mode 设置成yes时,需要设置master的密码,否则不用设置
requirepass 123456  设置密码
#日志文件
logfile "/var/log/redis/redis-6379.log"

2)修改配置文件redis-6380.conf修改如下,然后保存退出

vi redis-6380.conf
bind 0.0.0.0
#关闭保护模式(设置成:protected-mode no;保护模式关闭,如果你不关闭保护模式,启动哨兵的时候,无法正常运行。还有个解决办法就是你设置密码,但是一般都不设置redis的密码。麻烦,我每次连接还得输入密码。在部署中,可以设置密码。) 
protected-mode no
appendonly yes
slave-read-only no
replicaof 172.17.0.3 6379
logfile "/var/log/redis/redis-6380.log"
#当protected-mode 设置成yes时,需要设置master的密码,否则不用设置
requirepass 123456  设置密码

3)修改配置文件redis-6381.conf修改如下,然后保存退出

vi redis-6381.conf
bind 0.0.0.0
#关闭保护模式(设置成:protected-mode no;保护模式关闭,如果你不关闭保护模式,启动哨兵的时候,无法正常运行。还有个解决办法就是你设置密码,但是一般都不设置redis的密码。麻烦,我每次连接还得输入密码。在部署中,可以设置密码。) 
protected-mode no
appendonly yes
slave-read-only no
replicaof 172.17.0.3 6379
logfile "/var/log/redis/redis-6380.log"
#当protected-mode 设置成yes时,需要设置master的密码,否则不用设置
requirepass 123456  设置密码

启动三个容器如下:

-d:后台运行容器,默认不进入容器
–name:容器别名
-p:指定映射的端口号
-v:绑定挂载目录

主服务器:redis-6379

[root@172-16-82-218 redis]# docker run -d --name redis-6379 -p 6379:6379 -v /software/redis/redis-6379.conf:/usr/local/etc/redis/redis-6379.conf redis:5.0.14

第二个从服务器redis-6380

[root@172-16-82-218 redis]# docker run -d --name redis-6380 -p 6380:6379 -v /software/redis/redis-6380.conf:/usr/local/etc/redis/redis-6380.conf redis:5.0.14

第三个从服务器redis-6381

[root@172-16-82-218 redis]# docker run -d --name redis-6381 -p 6381:6379 -v /software/redis/redis-6381.conf:/usr/local/etc/redis/redis-6381.conf redis:5.0.14

测试3个容器是否安装成功,出现有名称为,redis-6379,redis-6380,redis-6381表示启动成功,启动不成功,排查路径及配置文件,是否配置正确

在这里插入图片描述

此时这三台容器都是主服务器,例如进入redis-cli查看:

[root@172-16-82-218 redis]# docker exec -it redis-6379 redis-cli

执行redis指令:info Replication,这时可以看见节点在集群中的角色role是master
在这里插入图片描述
服务redis-6380和redis-6381重复上述操作查看

把【redis-6380,redis-6381配置成从服务器】

[root@172-16-82-218 redis]# docker exec -it redis-6380 redis-cli

执行redis指令:SLAVEOF 172.17.0.2 6379
在这里插入图片描述
在redis-6379查看master状态,可以看到主节点下链接了两个slaves
在这里插入图片描述

测试redis集群的操作

在主节点上

[root@localhost redis]# docker exec -it redis-6379 redis-cli
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> get test
"123"
127.0.0.1:6379> 

在从节点上(redis-6380、redis-6381 上分别查看)

[root@localhost redis]# docker exec -it redis-6380 redis-cli
127.0.0.1:6379> get test
"123"
127.0.0.1:6379>

sentinel 配置[redis哨兵]

使用docker inspect redis-6380 查看ip地址
redis-6379 ip 为 172.17.0.3
redis-6380 ip 为 172.17.0.4
redis-6381 ip 为 172.17.0.5
在这里插入图片描述

redis哨兵模式说明

使用docker启动3个redis服务器,一个master(主), 两个slave (从),进行主从配置。
3台redis服务器分别启动一个哨兵sentinel。

第一步:【master容器配置哨兵】:docker exec -it  redis-6379 /bin/bash
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf  (建立sentinel(哨兵模式)的配置文件,保存退出,内容如下:)
port 26379 (指定哨兵监听端口)
dir "/data"  #sentinel工作目录
logfile "sentinel.log"  #日志文件
sentinel monitor name 172.17.0.2 6379 2 #启动哨兵(名称:name) 监听master
daemonize yes #后台运行
#启动哨兵:
#redis-sentinel sentinel.conf第二步:【slave01容器配置哨兵:docker exec -it  redis-6380 /bin/bash】
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf  (建立sentinel配置文件保存退出,内容如下)
port 26380 
dir "/data"
logfile "sentinel.log"
sentinel monitor name 172.17.0.2 6379 2 
daemonize yes 启动哨兵:
redis-sentinel sentinel.conf第三步:【slave02容器配置哨兵:docker exec -it  redis-6381 /bin/bash】
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf  (建立sentinel的配置文件保存退出,内容如下)
port 26381
dir "/data"
logfile "sentinel.log"
sentinel monitor name 172.17.0.2 6379 2 
daemonize yes  启动哨兵:
redis-sentinel sentinel.conf

测试:redis-6379是主服务器,redis-6380, redis-6381是从服务器,

1、进入到容器,查看哨兵允许状态,26380.log为哨兵日志文件,上面有说道,此为实时显示最后20条日志
#docker exec -it redis-6380 /bin/bash
#tail -f 20 26380.log
> 26380.log <
12:X 20 Sep 2020 13:57:47.439 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12:X 20 Sep 2020 13:57:47.439 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=12, just started
12:X 20 Sep 2020 13:57:47.439 # Configuration loaded
13:X 20 Sep 2020 13:57:47.443 * Running mode=sentinel, port=26380.
… …

1、现在把主服务器redis-6379容器停止,

查看redis-6379容器id

root@lixiong:/home/lx# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f8fd1c59f55 redis “docker-entrypoint.s…” 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26381->26379/tcp sentinel3
ee5093e6f3a9 redis “docker-entrypoint.s…” 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26380->26379/tcp sentinel2
8ed84c9b5621 redis “docker-entrypoint.s…” 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26379->26379/tcp sentinel
d3b0c49aac92 redis “docker-entrypoint.s…” 3 hours ago Up 2 hours 0.0.0.0:6381->6379/tcp redis-6382
87611597b78b redis “docker-entrypoint.s…” 3 hours ago Up 2 hours 0.0.0.0:6380->6379/tcp redis-6381
#docker stop redis-6379
8ed84c9b5621
2、打开redis-6380客户端,:info replication查看,原先主服务器为redis-6379,此时从服务器会上升到主服务器[30秒后自动转换主服务器节点]

#docker exec -it redis-6380 redis-cli

127.0.0.1:6379>info replication

127.0.0.1:6379> info replication

Replication

role:master
master_host:172.17.0.3
master_port:6380
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:32521
slave_priority:100


http://www.ppmy.cn/news/32277.html

相关文章

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题——MYSQL安全测试解析(详细)

B-3任务三:MYSQL安全测试 *任务说明:仅能获取Server3的IP地址 1.利用渗透机场景kali中的工具确定MySQL的端口,将MySQL端口作为Flag值提交; 2.管理者曾在web界面登陆数据库,并执行了select <?php echo \<pre>\;system($_GET[\cmd\]); echo \</pre>\; ?…

我的CSDN四周年创作纪念日

机缘 记得还是上大一时候初次注册了CSDN&#xff0c;和很多大学生用这个网站的目的一样&#xff1a;搜寻能够实现老师布置的作业的代码&#xff0c;甚至是搜xxx管理系统然后改一改用来做课程设计。 后来大学毕业工作了&#xff0c;工作中也会记录遇到的问题和解决方案以及总结…

2022-2023年度广东省职业院校学生专业技能大赛 中职组网络安全赛项竞赛规程

2022-2023年度广东省职业院校学生专业技能大赛 中职组网络安全赛项竞赛规程 一、赛项名称 赛项编号&#xff1a;Z27 赛项名称&#xff1a;网络安全赛项组别&#xff1a;中职 赛项归属&#xff1a;信息技术类 二、竞赛目的 为检验中职学校网络信息安全人才培养成效&#xff0c;促…

【链表OJ题(五)】合并两个有序链表

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(五)1. 合并…

大学生考研的意义?

当我拿起笔头&#xff0c;准备写这个话题时&#xff0c;心里是非常难受的&#xff0c;因为看到太多的学生在最好的年华&#xff0c;在自由的大学本应该开拓知识&#xff0c;提升认知&#xff0c;动手实践&#xff0c;不断尝试和试错&#xff0c;不断历练自己跳出学生思维圈&…

电子取证的电脑配置有关问题,以我仅有的知识为大家建议一下。

电子取证火力很重要&#xff0c;用轻薄本是没法取证的&#xff0c;所以至少是全能本或者是游戏本&#xff0c;牛逼的选手上台式&#xff0c;参考浙警许专家&#xff0c;yyds我专家&#xff01; 我从实战出发&#xff0c;参考历年“美亚杯”和“长安杯”比赛&#xff0c;给大家…

chatGPT之Python API启用上下文管理

chatGPT已经爆火一段时间了&#xff0c;我想大多数的开发者都在默默的在开发和测试当中&#xff0c;可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧。为什么别人的机器人能联想之前的语料&#xff0c;而你的却像个每次都只如初见的高冷机器人&…

网络安全日志监控管理

内部安全的重要性 无论大小&#xff0c;每个拥有IT基础设施的组织都容易发生内部安全攻击。您的损失等同于黑客的收益&#xff1a;访问机密数据、滥用检索到的信息、系统崩溃&#xff0c;以及其他等等。专注于网络外部的入侵是明智的&#xff0c;但同时&#xff0c;内部安全也…