docker安装redis并实现主从复制(哨兵)
·
描述:
主从复制
- 是什么
所说的主从复制指的是:主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 - 能干嘛
- 读写分离
- 容灾恢复
哨兵模式
- 是什么
自动切换主从,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
环境准备
描述:
- 多台虚拟机开启多个redis实例,按照此文章,运行分别在三台虚拟机上运行三个实例即可。
- 一台虚拟机启动三个redis实例。以下测试使用一台虚拟机启动三个redis实例
- 注意:防火墙要关闭
准备:
- 虚拟机新建文件夹用于保存conf文件,新建data文件用于保存数据(为什么新建文件夹,可参考上方redis单机版文章)
# 新建文件夹,用于存储配置文件
mkdir -p /mydata/redis/conf
# 新建配置文件,若没有配置文件,通过启动命令-v,挂载redis.conf文件时会当作路径,而非文件,所以需要提前创建,文件内具体内容可直接复制官网即可,上方【redis配置文件介绍】中有介绍
# bind 127.0.0.1,这个一定要记得修改,可以改为任意IP访问bind 0.0.0.0
# redis.conf 6379配置文件
touch /mydata/redis/conf/redis.conf
# 复制6380配置文件
cp redis.conf redis6380.conf
# 复制6381配置文件
cp redis.conf redis6381.conf
# 修改6380和6381中端口(port)信息,分别改为6380和6381,不要使用默认的6379,具体原因在文章最后【测试期间排坑经历】有介绍
- 启动命令(命令解释可参考上方redis单机版文章)
# 6379启动命令
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis:latest redis-server /etc/redis/redis.conf
# 6380启动命令
docker run -p 6380:6380 --name redis6380 \
-v /mydata/redis/data6380:/data \
-v /mydata/redis/conf/redis6380.conf:/etc/redis/redis.conf \
-d redis:latest redis-server /etc/redis/redis.conf
# 6381启动命令
docker run -p 6381:6381 --name redis6381 \
-v /mydata/redis/data6381:/data \
-v /mydata/redis/conf/redis6381.conf:/etc/redis/redis.conf \
-d redis:latest redis-server /etc/redis/redis.conf
主从方法一:通过命令实现(了解即可)
此方法不建议使用,在redis重启后还需要重新配置关联主从关系。
- 分别启动三台redis实例(分别为:6379、6380、6381),启动可参考redis单机版
- 配从不配主:假设以6379为主,其他两台为从。进入6380、6381终端执行以下命令即可(docker进入redis终端命令在单机版中有描述)。谨记:配从不配主,主库不要动
slaveof 主库IP 主库端口
- 验证:分别进入三台redis实例,运行info replication命令,可以查看角色等信息
主库信息显示为:【role:master 主库,connected_slaves:2 两个从库】
从库信息显示为:【role:slave 从库,master_*:主库信息】
以上方法只要会部署单台redis,则会配置简易的主从。只要redis重启,则需要重新配置主从(slaveof 主库IP 主库端口)。
主从方法二、通过配置文件
谨记:配从不配主,主库不要动,假设还是以6379为主,其他两台为从
- 在启动redis实例时,已经将配置文件挂载到虚拟机本地,编辑虚拟机本地的redis配置文件即可,在redis6380.conf和redis6381.conf配置文件中搜寻##### REPLICATION ######
- 修改# replicaof ,注释打开,填写对应的虚拟机的ip和端口(replicaof 192.168.0.130 6379),若主库(6379)配置了密码,在下方masterauth、masteruser分别填写密码和用户即可。谨记:修改为参数注释一定要打开
- 重新启动6380和6381redis实例。【docker restart 容器ID或name 】
- 验证:进入分别进入三台redis终端【docker exec -it 容器ID或容器名 redis-cli】,若有密码最后加上【-a 密码】,若进入6380和6381再在命令末尾加上-p 端口(默认为6379),进入终端输入命令【info replication】,即可查看角色等信息。
docker exec -it 容器ID/容器名 redis-cli -a 密码 -p 端口
主从简单测试
注:以下测试结果非本次运行测试结果,想测试的化可以按照截图事例进行简单测试。
- 主从通过命令实现,redis重启之后,需要重新绑定主从
- 切入点问题?主库在从库绑定前已经存在数据,那主库在绑定的时,是否会同步主库历史数据?
答:配置主库时都是全备,会同步主库历史数据
- 从库是否可以写?set可否?
答:从库不允许写,会报错:(error) READONLY You can’t write against a read only replica.
4. 主机shutdown后,从库是会变为主库吗?
答:不会,从库还是原地待命,从库还是从库
- 主机shutdown后,再次启动,主机新增记录,从机还能否顺利复制?
答:能
- 其中一台从库down后,再次启动还可以同步主库数据吗?
答:若是通过slaveof命令配置的主从,每次与master断开之后,都需要重新连接。若通过配置文件配置,则会自动同步
手动切换主从
- slaveof 主库IP 主库端口:在从库执行此命令,会将此redis作为指定IP:端口redis实例的从库
- SLAVEOF NO ONE:将当前redis实例变为主库

单哨兵模式(sentinel)(自动切换主从)【重要】
- 通过主从方法一或者二调整本地redis生成一主两从模式(6379主,其他从)
- 新建哨兵的配置文件
# 新建配置文件,并将官方配置文件内容复制到此配置文件
# 进入redis官方GitHub,将版本切换为个人实际的版本,在源码中即可找到对应的sentinel.conf【https://github.com/redis/redis/blob/6.0/sentinel.conf,个人使用的是6.0的】
# 建议阅读并使用官方文档,不要直接照着文章抄。
touch /mydata/redis/conf/sentinel.conf
- 修改配置文件(其他信息可查看官方文档描述,例如密码,日志)
# 配置监控的主结点信息
# quorum:选举参数/票数,一般配置为哨兵总数/2+1,哨兵一般配置奇数个
# 官方文档描述quorum为有quorum个哨兵认为主服务器不可访问,以便真正将主服务器标记为失败
# 起别名 主节点IP 主节点端口 选举参数/票数
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
# 目前测试单哨兵模式,所以quorum设置为1
sentinel monitor mymaster 192.168.0.130 6379 1
- 启动哨兵
# redis-sentinel /etc/redis/sentinel.conf ,容器启动时直接启动哨兵,不需要进入容器再手动启动
docker run -p 26379:26379 --name redissentinel \
-v /mydata/redis/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis:latest redis-sentinel /etc/redis/sentinel.conf
- 验证:
- 停掉主库,进入从库终端输入命令【info replication】,查看角色等信息,需要等待一段时间才会切换成功。
# sentinel.conf配置中,默认在主库宕机30秒后才会执行按照配置信息自动将从库转换为主库
# Default is 30 seconds.
sentinel down-after-milliseconds mymaster 30000
- 查看哨兵容器运行日志【docker logs -f 容器ID或者容器name】,若切换主从,会有日志输出。
四、多哨兵模式(sentinel)(自动切换主从)【重要】
一般配置为奇数,以下测试配置三台。
- 通过主从方法一或者二调整本地redis生成一主两从模式(6379主,其他从)
- 若测试过单机建议将单机的配置信息,容器删除,重新配置(sentinel.conf配置信息)
# 新建sentinel.conf、sentinel01.conf、sentinel02.conf三个配置文件,修改对应端口为26379、26380、26381
# 修改sentinel monitor mymaster 192.168.0.130 6379 2,三个文件同一修改,主机IP、端口,选举参数/票数:一般为哨兵总数/2+1
docker run -p 26379:26379 --name redissentinel \
-v /mydata/redis/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis:latest redis-sentinel /etc/redis/sentinel.conf
docker run -p 26380:26380 --name redissentinel01 \
-v /mydata/redis/conf/sentinel01.conf:/etc/redis/sentinel.conf \
-d redis:latest redis-sentinel /etc/redis/sentinel.conf
docker run -p 26381:26381 --name redissentinel02 \
-v /mydata/redis/conf/sentinel02.conf:/etc/redis/sentinel.conf \
-d redis:latest redis-sentinel /etc/redis/sentinel.conf
- 测试,同单哨兵模式
主从复制原理
- slaveof/replicaof,启动成功连接到master后会发送一个sync命令
- master接到命令启动后台的存盘进程(BGSAVE),同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件(生成的RDB文件)到slave,以完成一次完全同步
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
测试期间排坑经历
- 单redis实例:容器启动正常,日志打印正常,在虚拟机redis终端操作正常,在宿主机使用redis可视化工具rdm(redis-desktop-manager)链接不上redis
解决:bind 127.0.0.1,redis配置文件中,默认只允许本机访问,这个一定要记得修改,可以改为任意IP访问bind 0.0.0.0,或者指定特定IP,建议测试期间可以先允许任意IP,等调试通之后再更改为指定IP - 在配置主从之后,容器启动报错:【Connecting to MASTER 192.168.0.130:6379】
解决:先确保一台redis启动正常,再测试主从,个人报错是由于未关闭防火墙。 - 测试单哨兵模式时,刚启动哨兵服务之后,发现三台redis实例均变为了从库,主库均指向192.168.0.130 6379
解决:查看哨兵服务启动日志发现,日志中均显示172.17.0.1 6379,由于个人测试期间三个redis实例的端口未改(redis配置文件中均使用的6379),只是对外暴露的端口做了修改(6379、6380、6381),哨兵服务启动后查到的从库信息为(172.17.0.1 6379),把三个redis实例当作了一个。解决方法是,在启动redis时,均指定端口(修改redis配置文件中的端口)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)