docker 搭建并测试Redis主从、哨兵和集群模式
一、Redis集群相关概念
可以参考以下几篇文章:
https://www.jianshu.com/p/8e1ed39fdab3
https://www.cnblogs.com/linuxk/p/10718153.html
https://blog.csdn.net/u014527619/article/details/88232178
二、docker创建redis容器
1.先拉取redis镜像最新版本,如果需要其他版本或者其他仓库的可以在pull后面加版本号
docker pull redis
2.这里以三个redis为例,使用以下命令启动3个redis服务
docker run --name redis-6380 -p 6380:6379 -d redis
docker run --name redis-6381 -p 6381:6379 -d redis
docker run --name redis-6382 -p 6382:6379 -d redis
其中--name
是对redis容器的命名,-p 6380:6379
第一个端口是宿主机的访问端口,第二个端口是容器内部的端口,-d
表示后台启动容器。
更多的docker命令操作可以参考这篇文章
https://www.cnblogs.com/DeepInThought/p/10896790.html
使用 docker ps
查看已经在运行的容器
如图,可以看到三个redis服务已经启动
分别使用docker inspect 容器ID
命令,查看redis在docker的网关地址
记录一下三个redis服务的内网地址,打算把redis-6380当做主节点,其他两个当做从节点
redis-6380 172.17.0.3:6379 主节点
redis-6381 172.17.0.4:6379 从节点
redis-6382 172.17.0.5:6379 从节点
三、配置主从模式
1.进入redis容器内部
docker exec -it redis-6380 /bin/bash
2.连接redis服务端
redis-cli
连接后使用info replication
可以查看redis的当时角色状态
我这里是已经改过的,如果什么都没有配置,默认是master节点状态
3.设置另外两个节点的状态为从节点
主节点默认不动,分别在redis-6381和redis-6382使用 slaveof 172.17.0.3 6379
命令
这样子就搭建好了一主两从的模式了
四、测试主从模式
1.测试是否同步
使用主节点redis-6380容器输入redis-cli
进入redis控制台
设置k1 123的值
可以在从节点找到对应的值
2.测试只有主库能读写、从库只能读
redis集群主从其他模式
上面一主多从是经典的主从模型,还有比如树形结构的,在从节点后面还有从节点,这样子很大减少了主节点的同步压力,如图所示,可以给从节点再配置从节点
五、配置哨兵模式
1.在宿主机上准备一个文件sentinel.conf
,这个文件的文件名是任意取的,文件的配置规则如下
# 端口
port 26379
# 是否后台启动
daemonize yes
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile "/var/log/sentinel.log"
# 定义工作目录
dir /tmp
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 172.17.0.3 6379 2
# 如果mymaster 10秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 10000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
修改完配置后,分别把该文件从宿主机复制到三个容器中的根目录下面
docker cp /mydata/redis/sentinel.conf redis-6380:/
/mydata/redis/sentinel.conf
是放在宿主机的文件位置
考虑到容器本身没有vim修改文件功能,如果安装vim包的话需要每个容器都需要修改镜像源
/etc/apt/sources.list
文件,可以用echo的方式追加文件文本内容,操作不太方便,所以从宿主机复制是最快的
2.启动哨兵模式,在容器根目录下执行
redis-sentinel /sentinel.conf
3.查看哨兵状态
redis-cli -p 26379 info sentinel
这里面的address
就是表示哨兵认为的主节点ip和端口,如果去手动slaveof
修改主从关系,而不修改哨兵的配置,哨兵发现主从变了之后,哨兵会根据之前 的address
切回原来的主从关系,手动修改无效
六、测试哨兵模式
测试主节点挂了,哨兵选举
1.如果主节点挂了的话,会选举一个新的从节点当做主节点,当之前旧的主节点服务恢复了,会成为新的主节点的一个从节点,从日志中可以看出
2.同时,哨兵文件配置会自动修改的,如图
注意:这里是使用的是docker stop 主节点的容器名
,除了把主节点的redis服务干掉了之外,主节点的哨兵也挂了,当使用docker start 刚stop的容器名
启动容器后,redis的服务起来了,但是26379端口的哨兵服务没有启动,需要手动使用redis-sentinel /sentinel.conf
启用哨兵模式
当之前旧的主节点服务恢复了,会成为新的主节点的一个从节点,但是该服务的哨兵服务没有自动启动,而哨兵服务的配置文件中监听的主节点也是旧的,这个时候恢复它的服务
会自动修改哨兵服务监听主节点的
至此,三个节点的三个哨兵服务都会去监听主节点的状态
请教一下,如何在docker启动redis容器的时候,同时启动哨兵服务?
七、配置集群模式(cluster)
上面搭建了一主二从,并加入了哨兵,任何一个节点挂掉都不影响正常使用,实现了高可用。仍然存在一个问题,一主二从每个节点都存储着全部数据,随着业务庞大,数据量会超过节点容量,即便是redis可以配置清理策略,但也有极限,于是需要搭建redis集群,将数据分别存储到不同的redis上,并且可以横向扩展。
基于上面的一主2从配置,我们再增加4个redis容器,他们的现在的关系如下
第一组主从
redis-6380 172.17.0.3:6379 从节点
redis-6381 172.17.0.4:6379 主节点
redis-6382 172.17.0.5:6379 从节点
第二组主从
redis-6480 172.17.0.6:6379 主节点
redis-6481 172.17.0.7:6379 从节点
第三组主从
redis-6580 172.17.0.8:6379 主节点
redis-6581 172.17.0.9:6379 从节点
搭建好7个redis容器后,这个树莓派的主板虽然没有电脑那么强,但是还是很给力的,如果想看使用树莓派主板搭建自己的个人永久服务器,可以查看该系列其他教程
1.配置好三组redis 的主从和哨兵后,查看集群状态
cluster info
还没有配置集群,所以看不到
2.配置redis多主节点集群
需要修改redis容器内的/usr/local/redis/redis.conf
文件
参考链接:
https://www.cnblogs.com/Tu9oh0st/p/11205281.html
https://www.cnblogs.com/DeepInThought/p/10896790.html
https://www.cnblogs.com/river2005/p/8503238.html
https://www.cnblogs.com/hmxs/p/12101921.html