前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker方式Redis主从复制及Sentinel哨兵模式实现

Docker方式Redis主从复制及Sentinel哨兵模式实现

作者头像
itze
发布2022-10-31 16:14:20
4310
发布2022-10-31 16:14:20
举报
文章被收录于专栏:IT者

环境

  • 操作系统:CentOS 7
  • Redis版本:latest 默认拉取最新版
  • Docker版本:20.10

服务器

  • 192.168.100.1
  • 192.168.100.2
  • 192.168.100.3

前提

  • 在三台服务器上已经安装好Docker,并且已经拉取Redis镜像,文章使用的是默认拉取最新版
  • 三台服务器提前开放6379(Redis默认)和26379(Sentinel默认)端口,如何在CentOS开放指定端口可查看:CentOS 7 开启防火墙及开放指定端口
  • 如果你的服务器是阿里云、华为云等一些厂商的,控制面板中也需要防火墙端口放行

拉取镜像

代码语言:javascript
复制
docker pull redis

查看已存在镜像

代码语言:javascript
复制
docker images

1.主从复制

主从复制,这里是一台主(master)两台从(slave),master主节点可读可写,slave只具备读的权限

我们将 192.168.100.1 作为master主节点,其余两台为slave从节点

1.1 创建Redis配置文件(我们默认三台服务器文件位置均在 /redis 下)

以下操作默认为操作路径均为/redis,一定要记住创建配置文件的位置,下面创建容器需要用到!

1.1.1 创建master主节点文件:redis-master.conf 内容如下

首先复制该文件内容,根据你自己的需求更改

代码语言:javascript
复制
port 6379

logfile "redis-master.log"

dir /redis/data

appendonly yes

appendfilename appendonly.aof

masterauth 123456789

requirepass 123456789

文件内容解释

– port:Redis端口号,默认6379

– logfile:log文件名

– dir:存储路径,可根据自己实际修改,

– appendonly yes :Redis持久化方式,这里使用AOF,关于Redis持久化方式可参考:Docker配置Redis持久化

– appendfilename appendonly.aof:AOF持久化保存文件名

– masterauth 123456789 :主节点密码,可根据实际修改

– requirepass 123456789:建议设置masterauth一样

将配置内容修改复制-修改之后,在服务器创建配置文件,这里默认为创建位置为/redis/redis-master.conf,然后将配置内容粘贴进去,保存即可

代码语言:javascript
复制
vim /redis/redis-master.conf
1.1.2 创建slave从节点文件内容如下,两个从节点配置文件内容是一样的
代码语言:javascript
复制
port 6379

logfile "redis-slave.log"

dir /redis/data

appendonly yes

appendfilename appendonly.aof

replicaof 192.168.100.1 6379

masterauth 123456789

requirepass 123456789

:white_check_mark:从slave从节点文件和master主节点文件就多了一行配置 replicaof 192.168.100.1 6379 将内容master主节点服务器IP和端口

分别在其余两台slave从节点相同vim操作

192.168.100.2配置文件命名为:redis-slave.conf

192.168.100.3配置文件命名为:redis-slave.conf

两台从节点服务器配置文件相同命名,自己也可以修改

文件命名可根据自己心情修改,建议方便好记好区分

1.2 创建容器

建议先从master主节点服务器创建,依次slave从节点创建

1.2.1 创建master主节点容器

回到192.168.100.1 master主节点服务器,创建主节点容器

代码语言:javascript
复制
docker run --restart=always -p 6379:6379 --name redis_master -v /redis/redis-master.conf:/etc/redis/redis.conf -v /redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

命令解释

– –restart=always:docker服务重启时,该容器也会自动启动

– -p 6379:6379:指定端口映射,格式为:主机(宿主)端口:容器端口,映射出一个6379端口,两个相同不好区分,比如-p 6789:6379,对外的端口就是6789,也就是你使用工具连接Redis服务的需要填写的端口

– –name redis_master:给容器起个名字,这里就叫redis_master,可根据心情修改

– -v /redis/redis-master.conf:/etc/redis/redis.conf:文件映射,将本机/redis/redis-master.conf文件映射到容器的/etc/redis/redis.conf该位置

– -v /redis/data:/data:同上

– -d:后台运行容器,并返回容器ID

– –appendonly yes:开启Redis持久化

1.2.2 创建slave从节点容器,从节点容器启动命令相同,两台从服务器分别都要执行
代码语言:javascript
复制
docker run --restart=always -p 6379:6379 --name redis_slave -v /redis/redis-slave.conf:/etc/redis/redis.conf -v /redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

1.3 查看并验证主从复制

查看正在运行的容器

代码语言:javascript
复制
docker ps

进入master主节点容器查看,按照以下步骤执行

1.进入Redis容器

代码语言:javascript
复制
docker exec -it redis_master(替换成你的容器名) bash

2.在1的步骤成功进入前提,继续输入下面命令进入Redis服务,由于是后来整理的该文档,并未截图

代码语言:javascript
复制
redis-cli

3.看到127.0.0.1:6379>这个出现说明已经成功过进入Redis服务,此时输入info

代码语言:javascript
复制
127.0.0.1:6379> info(这里只有info是你输入的)

不出意外会出现提示:NOAUTH Authentication required.因为我们设置了密码,此时输入设置的密码

代码语言:javascript
复制
auth 123456789

输入之后回车出现:OK 即成功进入,此时输入命令查看是否有从节点连接

代码语言:javascript
复制
info Replication

出现以下表明成功,本来不想再进去截图了,还是来一张吧,最后出入两次exit退出

如果进入的容器是其他两台slave从节点服务器容器,role会是:slave

验证主从复制

可以通过第三方工具连接Redis服务,也可以在服务器上进入Redis容器测试,进行简单测试,比如写测试

代码语言:javascript
复制
set name 123

写完之后我们去连接其他两台从节点Redis服务,会发现其他两台均已存在key值name!其他删除、修改自己测试一下,博主已测试,文章里不再做验证

测试连接其他两台slave从节点服务发现写不进去,因为slave从节点只有只读功能!

2.哨兵模式

2.1创建sentinel.conf配置文件

建议三台服务器创建的位置和redis-xx.conf的配置文件放到相同位置!不要随意地方创建,最后找不到了。

在三台服务器各自创建sentinel.conf配置文件,文件内容相同,如下

代码语言:javascript
复制
port 26379

dir /tmp

logfile "sentinel.log"

sentinel monitor mymaster 192.168.100.1 6379 2

sentinel down-after-milliseconds mymaster 10000

sentinel failover-timeout mymaster 60000

sentinel auth-pass mymaster 123456789

稍微解释几点

– sentinel monitor mymaster 192.168.100.1 6379 2

– mymaster:名字可以自定,但是一定要相同,且记住这个名字,下篇文章和spring整合需要该名

– 192.168.100.1 6379:我们手动选择的master主节点服务器IP和端口号

– 2:最后面这个2代表有两台节点都认为master主节点挂掉之后才会从现有的slave从节点中选出一个新的master主节点

– sentinel down-after-milliseconds mymaster 10000

– 10000:master主节点挂掉10秒之后开始投票选举新的master主节点,默认是30秒,单位ms

2.2 创建Sentinel容器

三台服务器各自都要创建,容器命令相同,切记,相同的前提是sentinel.conf配置文件位置所在位置和文件名均一致开放的端口号也一致,命令我就不再解释了

代码语言:javascript
复制
docker run --restart=always -p 26379:26379 --name redis_sentinel -v /redis/sentinel.conf:/etc/redis/sentinel.conf -v /redis/data:/data -d redis redis-sentinel /etc/redis/sentinel.conf

2.3 测试哨兵模式

测试很简单,我们手动模拟master主节点宕机,比如我们手动把master主节点容器停掉,看一下Sentinel会不会在我们设置的时间选出新的master主节点

停止正在运行的容器

代码语言:javascript
复制
docker stop redis_master(容器名)

2.4 验证哨兵模式

验证同样很简单,使用第三方工具连接没有停掉的Redis节点,查看info Replication信息即可,或者和上面的相同操作进入Redis容器查看也是可以的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年11月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境
  • 服务器
  • 前提
  • 1.主从复制
    • 1.1 创建Redis配置文件(我们默认三台服务器文件位置均在 /redis 下)
      • 1.1.1 创建master主节点文件:redis-master.conf 内容如下
      • 1.1.2 创建slave从节点文件内容如下,两个从节点配置文件内容是一样的
    • 1.2 创建容器
      • 1.2.1 创建master主节点容器
      • 1.2.2 创建slave从节点容器,从节点容器启动命令相同,两台从服务器分别都要执行
    • 1.3 查看并验证主从复制
      • 验证主从复制
  • 2.哨兵模式
    • 2.1创建sentinel.conf配置文件
      • 2.2 创建Sentinel容器
        • 2.3 测试哨兵模式
          • 2.4 验证哨兵模式
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档