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

2022-10-31 16:14:20 浏览数 (1)

环境

  • 操作系统: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容器查看也是可以的。

0 人点赞