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