使用Docker搭建Redis主从复制的集群

在主从复制模式的集群里,主节点一般是一个,从节点一般是两个或多个,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统能切换到从节点去读写数据,这样能提升系统的可用性。而且如果再采用主从复制模式里默认的读写分离的机制,更能提升系统的缓存读写性能。所以对性能和实时性不高的系统而言,主从复制模式足以满足一般的性能和安全性方面的需求。

1 概述主从复制模式

在实际应用中,如果有相应的设置,在向一台Redis服务器里写数据后,这个数据可以复制到另外一台(或多台)Redis服务器,这里数据源服务器叫主服务器(Master Server),而复制数据目的地所在的服务器叫从服务器(Slave Server)。

这种主从复制模式能带来两个好处,第一,可以把写操作集中在主服务器上,把读操作集中到从服务器上,这样能提升读写性能;第二,由于出现了数据备份,所以能提升数据安全性,比如当主Redis服务器失效后,能很快切换到从服务器上读数据。

如果在项目,并发要求不高,或者说哪怕从Redis缓存里读不到数据对性能也不会有太大的损害,那么可以用一主一从的复制模式,效果图如下图所示。

使用Docker搭建Redis主从复制的集群

也可以设置一主多从的复制效果,在下图里,给出对应的效果图,即写到主节点的数据会同步到两个从节点上,其它一主多从的模式和这很相似。

使用Docker搭建Redis主从复制的集群

关于主从复制模式,请大家注意如下的要点。

第一, 一个主服务器可以带一个或多个从服务器,甚至从服务器也可以再带从服务器,但在复制数据时,只能把主服务器的数据复制到从服务器上,反之不能。

第二, 一台从服务器只能跟随一台主服务器,而不能出现一从多主的模式。

第三, 在 Redis 2.8以后的版本里,是采用异步的复制模式,即进行主从复制时,不会影响主服务器上的读写数据操作。

2 用命令搭建主从集群

这里将用Docker容器来搭建一主二从模式的集群,在配置主从关系时,需要在从节点上使用slaveof命令,具体的步骤如下。

第一步,打开一个命令窗口,在其中运行如下命令创建一个名为redis-master的Redis容器,请注意它的端口是6379。

docker run -itd --name redis-master -p 6379:6379 redis:latest

第二步,再新开一个命令窗口,在其中运行如下命令创建一个名为redis-slave1的容器,请注意它的端口是6380。请注意这里是在一台电脑上运行,所以用端口号来区别一台主Redis容器和另外两台从Redis容器。如果在真实项目里,多台Redis会部署在不同的服务器上,所以可以都用6379端口。

docker run -itd --name redis-slave1 -p 6380:6380 redis:latest

第三步,回到包含redis-master容器的命令窗口,在其中运行docker inspect redis-master命令,查看redis-master容器的信息,在其中能通过IPAddress项看到改容器的IP地址,这里是172.17.0.2。如果在真实项目里,Redis服务器所在的IP地址是固定的,而通过Docker容器启动的Redis服务器的IP地址是动态的,所以这里要用上述命令来获取IP地址。

第四步,在redis-master容器的命令窗口里,运行docker exec -it redis-master /bin/bash命令,进入到命令行窗口,在其中用redis-cli命令进入到Redis客户端命令行后,再通过info replication命令查看当前的主从模式的状态,能看到如下所示的部分结果。

 c:\work>docker exec -it redis-master /bin/bash
    root@9433cd584d80:/data# redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:0

从第5行的输出里能看到,当前reids-master容器在主从模式里的角色是“主服务器”,从第6行的输出里能看到,当前该主服务器没有携带从服务器。

同样再到redis-slave1容器的命令窗口里,通过docker exec -it redis-slave1 /bin/bash命令进入容器的命令行窗口,也通过redis-cli命令进入客户端命令行,也再通过info replication命令查看该Redis服务器的主从模式的状态,部分结果如下所示。

使用Docker搭建Redis主从复制的集群

扫一扫手机访问