在我上第一个项目的时候,就已经接触过redis的主从和哨兵了。但一直以来,仅仅是在项目上用到,却没有自己搭建过。最近研究了一下,用docker搭建了一个【一主二从三哨兵】的集群,下面来记录一下。

首先,自然是要拉取redis的镜像。我们直接输入docker pull redis,等待拉取完成,然后输入docker images查看结果。

docker启动redis linux docker启动redis哨兵_缓存

可以看到redis的镜像已经被拉下来了。下一步,我们需要准备redis的配置文件。

因为我们用docker启动redis,默认是以无配置文件启动的,所以我们需要为其额外准备一份配置文件。可以去官网下载一个标准版的redis,把里面的配置文件拿到,并上传到服务器。我这里采用的就是这种方式。

拿到redis.conf之后,我们分别为这些节点复制一份,如下图所示。

docker启动redis linux docker启动redis哨兵_redis_02

之后,我们就要开始修改配置文件了。

master的配置文件基本不需要改动,修改一下密码即可。

两个从节点的配置文件,我们分别修改端口为6380和6381,并且增加2个配置项:

slaveof 127.17.0.2 6379

masterauth 123456

这里是设置主节点的地址以及密码

到这一步,我们可以先启动主节点和两个从节点看看效果,先不管哨兵。

docker run --name redis-master -p 6379:6379 -v /root/docker_redis_conf/redis-master.conf:/redis.conf redis redis-server /redis.conf
docker run --name redis-slave1 -p 6380:6380 -v /root/docker_redis_conf/redis-slave1.conf:/redis.conf redis redis-server /redis.conf
docker run --name redis-slave2 -p 6381:6381 -v /root/docker_redis_conf/redis-slave2.conf:/redis.conf redis redis-server /redis.conf

docker启动redis linux docker启动redis哨兵_缓存_03

用工具连接上三个redis节点,输入命令info replication,查看主从连接情况

docker启动redis linux docker启动redis哨兵_docker启动redis linux_04

docker启动redis linux docker启动redis哨兵_配置文件_05

docker启动redis linux docker启动redis哨兵_docker启动redis linux_06

可以看到,主从已经搭建成功了,主节点和从节点都分别识别到了。在主节点尝试插入一条数据,可以发现两个从节点都复制到了数据。

然后我们开始搭建哨兵节点。哨兵的配置文件有三个,首先还是修改端口,这里我们为了方便分别修改为11111、22222、33333。然后是三个哨兵的通用配置

sentinel monitor mymaster 172.17.0.2 6379 2
sentinel auth-pass mymaster 123456

这个其实和从节点类似,都是指定主节点的地址和密码。mymaster是自己给主节点起的一个名字,第一条命令最后的2,指的是当两个哨兵都认为主节点挂了之后,才会重新选取一个从节点作为主节点。

然后我们来启动哨兵

docker run --name redis-sentinel1 -p 11111:11111 -v /root/docker_redis_conf/redis-sentinel1.conf:/redis.conf redis redis-sentinel /redis.conf
docker run --name redis-sentinel2 -p 22222:22222 -v /root/docker_redis_conf/redis-sentinel2.conf:/redis.conf redis redis-sentinel /redis.conf
docker run --name redis-sentinel3 -p 33333:33333 -v /root/docker_redis_conf/redis-sentinel3.conf:/redis.conf redis redis-sentinel /redis.conf

现在我们执行docker ps来看一下整体的启动情况

docker启动redis linux docker启动redis哨兵_redis_07

然后我们来测试一下哨兵是否能正常工作,我们手动停止掉master节点,然后分别在两个从节点执行info replication,看看会有什么效果。

docker启动redis linux docker启动redis哨兵_docker启动redis linux_08

docker启动redis linux docker启动redis哨兵_缓存_09

可以看到,slave2自动变成了master节点,slave的master也变成了slave2。这就证明了哨兵搭建成功了,可以自动将master转移到某个slave上。