1. 拓扑结构
本文搭建如下图所示的redis拓扑结构,拓扑中共有3个哨兵,1和mater结点和2个slave结点。
拓扑信息:
角色 | ip | port |
---|---|---|
redis-master | redis-master或者master或者master-sentinel或者master-sentinel2或者master-sentinel3或自动分配的ip | 6379 |
redis-slave1 | 容器启动时自动分配的ip | 6380 |
redis-slave2 | 容器启动时自动分配的ip | 6381 |
redis-master-sentinel | 容器启动时自动分配的ip | 26379 |
redis-master-sentinel2 | 容器启动时自动分配的ip | 26380 |
redis-master-sentinel3 | 容器启动时自动分配的ip | 26381 |
注:master或者master-sentinel或者master-sentinel2或者master-sentinel3都是主节点容器的别名。与之相关联的容器可以通过别称来代替ip访问容器。
2. 搭建主从复制结构
2.1 master节点配置
2.1.1 master节点配置文件
2.1.2 master节点配置文件详解
-
port
: 端口号 -
daemonize
:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。 -
logfile
: 日志文件的名字,在工作目录下自动创建,会记录redis的运行日志。 -
dbfilename
: dump文件的名字,在工作目录下自动创建。 -
dir
: 工作目录的路径。
其他配置请参考redis中文官网:www.redis.cn
2.1.3 在docker中运行redis master节点服务
命令说明:
-
--name
: 命名容器为redis-master
,一定不要忽略容器命名,为后面--link
命令命名更容易记住名字。 -
-v
:将本地的配置文件~/redis/redis-6379.conf
挂载到容器中的/redis/redis-6379.conf
容器启动后,进入容器挂载的目录,执行redis-server redis-6379.conf
命令,使用redis-6379.conf
配置启动redis服务。具体操作如下图所示:
执行上述命令之后,如果没有消息,那么就是最好的消息,说明redis-server已经成功启动了。可以通过
redis-6379.conf
中配置的日志文件来查看启动情况。具体操作如下图所示:日志说明:
- 第一行:redis正在启动
- 第二行:redis版本信息,64位,进程号等
- 第三行:加载配置
- 第四行:redis的运行模式为standalone,端口为6379
- 第五行:警告,这句话的翻译大概就是:对一个高负载的环境来说tcp设置128这个值,太小了。具体解决方案参考:https://www.cnblogs.com/faunjoe88/p/7158484.html
- 第六行:说明redis server已经成功初始化
- 第七行: 警告,THP的系统配置问题,具体参考:https://jingyan.baidu.com/article/da1091fb196ea7027849d6b0.html
上述警告对于demo来说可以忽略,但是对于生产环境,需要重新对系统进行相关配置之后,再重新启动容器。
至此,master节点已经成功启动了。
2.2 slave节点配置
2.2.1 slave节点配置文件
两个slave节点的配置一模一样,除了端口号之外。slave1的端口为6380,slave2的端口号为6381。
2.2.2 slave节点配置文件详解
- 前5项配置和master节点类似,请参考master节点配置说明。
- 这里重点说一下
slaveof
命令,此命令用来给当前redis server节点指定一个master节点,自身作为master节点的slave节点。
slaveof
命令的格式为slaveof <ip> <port>
,很明显,当前节点通过ip和port来定位将哪一个节点作为master节点,但是对于配置slaveof redis-master 6379
来说,redis-master
参数并不是一个ip。这里是因为在docker环境下,容器启动是ip是不定的,所以容器的通信可以通过--link
选项来实现,而这里的redis-master
就是master节点容器的名字,用容器名可以代替ip。具体参看下文。
2.2.3 在docker中运行redis slave节点服务
命令说明:
-
--name
: 容器名为redis-slave1
-
-v
: 将本地~/redis/redis-6380.conf
挂载到容器目录/redis/redis-6380.conf
-
--link
: 建立与master节点之间的容器间的通信,redis-master
为master节点的容器名,master
为redis-master
的别名。因此,slave的配置文件redis-6380.conf中最后一项配置也可以配置为slaveof master 6379
。
容器启动后使用redis-server redis-6380.conf
命令启动redis server服务。如下图所示:
redis-server redis-6380.conf
命令执行后,如果没有任何消息,那么就是最好的消息,说明redis server已经成功启动。下面可以通过查看日志文件来查看启动情况。如下图所示:
日志分析:
- 从第二行可以看出redis-server已经启动成功了。
- Connecting to MASTER redis-master:6379说明已经连接到master节点,并且开始了数据的同步,从master节点复制到slave节点。
- 从最后6行可以看出,因为是新增的slave结点,所以master到slave的复制时全量复制(倒数第五行),部分复制不可用(倒数第六行)。复制一共经历了四个步骤(最后四行):1. 从master接收数据 2.清理掉旧的数据 3.在内存中接在db 4.复制成功。
2.3 配置redis哨兵
2.3.1 redis哨兵配置文件
配置说明:
-
port daemonize logfile dir
配置和普通redis server节点相同。 -
sentinel monitor
:该命令的格式为sentinel monitor <master> <ip> <port> <quorum>
。
<master>
:参数为哨兵监控的master节点的别名
<ip>
:参数为监控的master节点的ip(在docker中,容器间用--link
命令通信,所以可以替换为目标容器的名字或别名)
<port>
:为监控的master结点的端口
<quorum>
:代表要判定master节点最终不可达所需要的票数。用于故障发现和判定。例如如果将quorum配置为2,代表至少要两个哨兵节点认为master节点不可达,那么这个不可达的判定才是客观的,对于<quorum>值设置的越小,那么达到下线的条件就越宽松,反之越严格。一般建议将其设置为哨兵节点的数量加1。 -
sentinel down-after-milliseconds
命令格式为sentinel down-after-milliseconds <master-name> <times>
<master>
:参数为主节点的名称,这里为上面设置的mymaster
<times>
:sentinel节点定期会想master节点发送ping命令,如果超过times毫秒没有收到回复,则判定该节点不可达。down-after-milliseconds虽然以<master-name>为参数,但实际上对哨兵节点、主节点、从节点的判定同时有效,可以通过主节点来获取从节点和哨兵节点的信息。 -
sentinel parallel-syncs
格式为sentinel parallel-syncs <master-name> <nums>
当哨兵节点集合对主节点的故障判定达到一致时,哨兵领导节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs参数就是限制从节点向新的主节点发起复制的个数。若发起复制的从节点过多,那么可能会造成主节点阻塞。若发起复制的从节点过少,可能会造成数据在复制期间不一致的情况。
-
sentinel failover-timeout
格式为sentinel failover-timeout <master-name> <times>
表示故障转移的超时时间。
其他配置请参加redis中文官网:www.redis.cn
2.3.3 在docker容器中启动redis哨兵服务
使用下图命令在容器中启动redis哨兵服务。
其他两个哨兵服务只需要修改:
--name
参数(比如 redis-master-sentinel2
)-v
挂载相应的配置文件(比如~/redis/redis-26380.conf:/redis/redis-62380.conf
),--link参数给主节点去不同的别名(比如redis-master:master-sentinel2
)。
在容器中启动redis-sentinel服务:
运行上述命令后没有消息,就是最好的消息。
下面可以查看工作目录下的日志文件来查看启动情况。如下图所示:
日志说明:
- 从第四行可以看出,节点启动成功,以sentinel模式运行,端口为26379。
- 倒数第二行为sentinel的id信息
- 最后一行说明新加了一个哨兵节点监控到master节点,名字为mymaster,ip为172.17.0.2,quorum为2。
至此,redis-sentinel节点配置完毕,其余两个sentinel节点请读者根据上面配置自行配置完成(很容易)。
3 总结
本文从配置角度描述了怎么使用Docker搭建redis主从复制,并且添加了哨兵机制,但是并没有对redis进行详细剖析,这里强烈建议读者阅读相关书籍或是到redis官网了解redis运行机制。
若有问题,欢迎在评论区留言。
本文会定期更新,以便使用跟新版本的redis和docker。
`