<返回更多

Docker搭建Redis主从复制+哨兵模式

2021-07-26    石老师小跟班
加入收藏

环境要求

步骤

由于我这里已经有相应的redis镜像,这里就不记录了,关于docker一些基础知识可以看我以前的笔记

开启3台redis服务,一个当作master,另两个当slave

#这里就把配置文件和数据映射到宿主机中了,如果是生产环境下,需要这做映射

#开启主服务,端口6379

docker run --name redis-master -d -p 6379:6379 redis:6.0.6

#开启2台从服务,端口6380,6381

docker run --name redis-slave1 -d -p 6380:6379 redis:6.0.6

docker run --name redis-slave2 -d -p 6381:6379 redis:6.0.6

Docker搭建Redis主从复制+哨兵模式

 

配置主从

这里演示就写配置文件了,这样的话,服务重启后就失效了,这里主要是记录一下过程,就 省略了....

查看各个服务的ip地址

docker inspect 容器id或者使用 docker.NETwork inspect bridge查看ip地 址

#ip地址如下

#master

172.17.0.2

#slave1

172.17.0.3

#slave2

172.17.0.4

进入容器内部,设置主从配置

master主机

#进入容器

docker exec -it redis-master /bin/bash

#执行redis-cli命令

redis-cli

#执行info replication 查看主从信息

info replication

执行info replication 查看主从信息

Docker搭建Redis主从复制+哨兵模式

 

在没有设置主从时,每个redis服务的角色都是master

在两台从服务器上执行如下命令

在从服务器上配置主服务器ip+端口号

#命令如下

slaveof 172.17.0.2 6379

#172.17.0.2 master的ip

#6379 master的端口

通过 info replication 查看role已经变成slave

Docker搭建Redis主从复制+哨兵模式

 

在master 服务器上使用info replication查看信息

这里可以看到如下信息,说明主从搭建完成了

Docker搭建Redis主从复制+哨兵模式

 

测试

#在master上写值,可以在从服务器上读取到,这里图略

注意

当设置完主从后,写数据只能从master 写入,不能在从服务器上写入,会报错

Docker搭建Redis主从复制+哨兵模式

 

问题

如果master由于某种原因挂了,咋办,在以前的版本只能手工处理切换,现在可以哨兵来解决!

生产环境使用的哨兵模式搭建主从

创建一个哨兵服务

我这里由于是测试,只开启了一个哨兵服务,如果是线上需要开启多台,来保证高可用,最好设置成3台以上

#开启一个哨兵docker服务
docker run -d --name redis-sentinel -p 26379:26379 redis:6.0.6
#26379 redis-sentinel默认端口,需要做下端口映射,要不无法进行通信

进入到redis-sentinel容器中进行配置

进入容器

docker exec -it redis-sentinel /bin/bash

创建sentinel.conf 文件

#由于容器里没有vim,vi编辑器,为了保持容器最小化,我这里使用echo进行操作

echo "sentinel monitor mymaster 172.2.0.2 6379 1" >> sentinel.conf

#添加后台运行,我 这里为了方便截图,并没有设置后台运行

echo "daemonize yes" >>sentinel.conf

#也可以指定目录

echo "logfile "/log.txt"" >>sentinel.conf

启动

redis-sentinel sentinel.conf

Docker搭建Redis主从复制+哨兵模式

 

测试

把redis-master停掉,来看下是否能自动切换master

关闭redis-master

docker stop redis-master

等待30s后,查看redis-sentinel日志

Docker搭建Redis主从复制+哨兵模式

 

这里可以看到,已经把redis-slave2切换成了master,进入到redis-slave2容器中,可以看到如下图

Docker搭建Redis主从复制+哨兵模式

 

问题

如果再把redis-master重启后,它还会继续当master吗? 答案是:不会,

如下图

Docker搭建Redis主从复制+哨兵模式

 

总结

其实这咱哨兵模式会在生产环境下用的最多,sentinel.conf里的配置也不是和上面那样简单,接下来说下sentinel.conf配置文件里常用的一些配置

sentinel.conf常用配置

#端口

port 26379 #可以修改

#监听

sentinel monitor <master-name> <ip> <port> <quorum>

#master-name 可以自定义

#quorum 是一个数字:当有多个sentinel时,指明当有多少个sentinel认为一个master失效时,master才算真正失效,比方说:如果是数字3,则说明得有3个sentinel说master失效时,master才真正的客观下线

#ip 要写master的真正ip

sentinel monitor mymaster 172.2.0.2 6379 3

#设置连接master和slave时的密码,master和slave密码应该一样

sentinel auth-pass <master-name> <password>

#设置失效时间,单位毫秒 默认为30s

sentinel down-after-milliseconds <master-name> <milliseconds>

#例如

sentinel down-after-milliseconds mymaster 30000

# sentinel parallel-syncs <master-name> <numslaves>

#这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。

# sentinel failover-timeout <master-name> <milliseconds>

#failover-timeout 可以用在以下这些方面:

# 1. 同一个sentinel对同一个master两次failover之间的间隔时间。

# 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。

# 3.当想要取消一个正在进行的failover所需要的时间。

# 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。

# sentinel的notification-script和reconfig-script 是用来配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。对于脚本的运行结果有以下规则:

#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10

#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。

# 如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。

# 一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。

sentinel notification-script <master-name> <script-path>

#当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息

sentinel client-reconfig-script <master-name> <script-path>

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>