环境要求
由于我这里已经有相应的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
配置主从
这里演示就写配置文件了,这样的话,服务重启后就失效了,这里主要是记录一下过程,就 省略了....
查看各个服务的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 查看主从信息
在没有设置主从时,每个redis服务的角色都是master
在两台从服务器上执行如下命令
在从服务器上配置主服务器ip+端口号
#命令如下
slaveof 172.17.0.2 6379
#172.17.0.2 master的ip
#6379 master的端口
通过 info replication 查看role已经变成slave
在master 服务器上使用info replication查看信息
这里可以看到如下信息,说明主从搭建完成了
测试
#在master上写值,可以在从服务器上读取到,这里图略
当设置完主从后,写数据只能从master 写入,不能在从服务器上写入,会报错
如果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
测试
把redis-master停掉,来看下是否能自动切换master
关闭redis-master
docker stop redis-master
等待30s后,查看redis-sentinel日志
这里可以看到,已经把redis-slave2切换成了master,进入到redis-slave2容器中,可以看到如下图
如果再把redis-master重启后,它还会继续当master吗? 答案是:不会,
如下图
其实这咱哨兵模式会在生产环境下用的最多,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>