Docker方式Redis主从复制及Sentinel哨兵模式实现
环境
- 操作系统: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 开启防火墙及开放指定端口
- 如果你的服务器是阿里云、华为云等一些厂商的,控制面板中也需要防火墙端口放行
拉取镜像
docker pull redis |
查看已存在镜像
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 内容如下
首先复制该文件内容,根据你自己的需求更改
port 6379 |
文件内容解释 - 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**,然后将配置内容粘贴进去,保存即可
vim /redis/redis-master.conf |
1.1.2 创建slave从节点文件内容如下,两个从节点配置文件内容是一样的
port 6379 |
: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主节点服务器,创建主节点容器
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从节点容器,从节点容器启动命令相同,两台从服务器分别都要执行
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 查看并验证主从复制
查看正在运行的容器
docker ps |
进入master主节点容器查看,按照以下步骤执行 1.进入Redis容器
docker exec -it redis_master(替换成你的容器名) bash |
2.在1的步骤成功进入前提,继续输入下面命令进入Redis服务,由于是后来整理的该文档,并未截图
redis-cli |
3.看到127.0.0.1:6379>这个出现说明已经成功过进入Redis服务,此时输入info
127.0.0.1:6379> info(这里只有info是你输入的) |
不出意外会出现提示:**NOAUTH Authentication required.**因为我们设置了密码,此时输入设置的密码
auth 123456789 |
输入之后回车出现:OK 即成功进入,此时输入命令查看是否有从节点连接
info Replication |
出现以下表明成功,本来不想再进去截图了,还是来一张吧,最后出入两次exit退出 如果进入的容器是其他两台slave从节点服务器容器,role会是:slave
验证主从复制
可以通过第三方工具连接Redis服务,也可以在服务器上进入Redis容器测试,进行简单测试,比如写测试
set name 123 |
写完之后我们去连接其他两台从节点Redis服务,会发现其他两台均已存在key值name!其他删除、修改自己测试一下,博主已测试,文章里不再做验证 测试连接其他两台slave从节点服务发现写不进去,因为slave从节点只有只读功能!
2.哨兵模式
2.1创建sentinel.conf配置文件
建议三台服务器创建的位置和redis-xx.conf的配置文件放到相同位置!不要随意地方创建,最后找不到了。 在三台服务器各自创建sentinel.conf配置文件,文件内容相同,如下
port 26379 |
稍微解释几点 - 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配置文件位置所在位置和文件名均一致开放的端口号也一致,命令我就不再解释了
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主节点 停止正在运行的容器
docker stop redis_master(容器名) |
2.4 验证哨兵模式
验证同样很简单,使用第三方工具连接没有停掉的Redis节点,查看info Replication信息即可,或者和上面的相同操作进入Redis容器查看也是可以的。