docker-cmnpose 构建 Redis 一主两从三哨兵,实现主从切换

Redis 在Java企业级项目中基本是必备的,没有哪个项目会放弃这么好用的一个高性能内存性数据库。通常我们个人使用,可能只是部署单机版就行的。

但是公司的项目一般并发比较高,需要考虑性能,会考虑读写分离,也就是主从配置,主节点用于写,从节点用于读。通常有一主一从,一主多从。然后一主多从配置好了,可能还是不能满足性能需求,那就弄多个主从。

大致是如下架构图

本文先介绍一下如何使用 docker 配置一主多从,同时配置哨兵,实现主从切换。

一、创建 redis 集群

1.新建 docker-compose.yml

内容如下

  1. version: ‘2’
  2. services:
  3.   master:
  4.     image: redis
  5.     container_name: redis-master
  6.     command: redis-server –requirepass 123456 –appendonly yes
  7.     ports:
  8.     – “6379:6379”
  9.     volumes:
  10.     – “./redis-master/data:/data”
  11.     networks:
  12.     – sentinel-master
  13.   slave1:
  14.     image: redis
  15.     container_name: redis-slave-1
  16.     command: redis-server –slaveof redis-master 6379 –requirepass 123456 –masterauth 123456 –appendonly yes
  17.     ports:
  18.     – “6380:6379”
  19.     volumes:
  20.     – “./redis-slave-1/data:/data”
  21.     depends_on:
  22.     – master
  23.     networks:
  24.     – sentinel-master
  25.   slave2:
  26.     image: redis
  27.     container_name: redis-slave-2
  28.     command: redis-server –slaveof redis-master 6379 –requirepass 123456 –masterauth 123456  –appendonly yes
  29.     ports:
  30.     – “6381:6379”
  31.     volumes:
  32.     – “./redis-slave-2/data:/data”
  33.     depends_on:
  34.     – master
  35.     networks:
  36.     – sentinel-master
  37. networks:
  38.   sentinel-master:

名词解释

version  docker文件的版本
image  指定容器镜像就是之前拉取的redis镜像
container_name  给这个镜像起一个别名
restart  always:表名开机自启动
command  相当于执行一些命令   (–requirepass 指定redis密码  –appendonly yes 这个命令是用于开启redis数据持久化)
ports  端口映射,将容器的端口映射到对应宿主机的端口
volumes  数据卷的映射.因为一旦容器停止了那么里面的数据也没有.所以我们需要把这个数据文件放在外面,然后映射到容器中

2.docker-compose 常用命令

创建并启动所有容器 docker-compose up -d

停止并删除所有容器 docker-compose down

查看所有容器日志 docker-compose logs

查看容器状态 docker-compose ps

其他命令就不说了,可以直接用 docker 命令替代

3.创建并启动 Redis 容器

docker-compose up -d

二、测试一下主从

可以使用 redis-cli 去连接,或者可以配合 rdm 工具查看

redis-cli -h 指定ip -p 指定端口 -a 指定密码

1.先连接一下 master 节点

redis-cli -h 127.0.0.1 -p 6379 -a 123456

写入一条数据

然后连接一些从节点 slave-1,可以读数据

2.测试一些从节点能不能写数据

显然不能写,可以通过 info replication 命令查看 redis 节点信息,可以知道当前节点是 master 还是 slave

三、创建哨兵集群

1.新建sentinel-1.conf

内容如下

  1. port 26379
  2. dir /tmp
  3. sentinel monitor mymaster 172.18.0.2 6379 2
  4. sentinel auth-pass mymaster 123456
  5. sentinel down-after-milliseconds mymaster 30000
  6. sentinel parallel-syncs mymaster 1
  7. sentinel failover-timeout mymaster 10000
  8. sentinel deny-scripts-reconfig yes

IP查看可以通过 docker inspect redis-master 来查看

这里说明下:

第三行表示Redis监控一个叫做mymaster的运行在172.28.0.3:6379的master,投票达到2则表示master以及挂掉了。  第四行设置主节点的密码  第五行表示在一段时间范围内sentinel向master发送的心跳PING没有回复则认为master不可用了。 第六行的parallel-syncs表示设置在故障转移之后,同时可以重新配置使用新master的slave的数量。数字越低,更多的时间将会用故障转移完成,但是如果slaves配置为服务旧数据,你可能不希望所有的slave同时重新同步master。因为主从复制对于slave是非阻塞的,当停止从master加载批量数据时有一个片刻延迟。通过设置选项为1,确信每次只有一个slave是不可到达的。第七行表示10秒内mymaster还没活过来,则认为master宕机了。

然后复制两份该文件,命名为 sentinel-2.conf 和 sentinel-3.conf

内容一模一样,无需修改

2.新建 docker-compose.yml

内容如下

  1. version: ‘2’
  2. services:
  3.   sentinel-1:
  4.     image: redis
  5.     container_name: redis-sentinel-1
  6.     ports:
  7.     – “26379:26379”
  8.     command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  9.     volumes:
  10.     – “./sentinel-1.conf:/usr/local/etc/redis/sentinel.conf”
  11.   sentinel-2:
  12.     image: redis
  13.     container_name: redis-sentinel-2
  14.     ports:
  15.     – “26380:26379”
  16.     command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  17.     volumes:
  18.     – “./sentinel-2.conf:/usr/local/etc/redis/sentinel.conf”
  19.   sentinel-3:
  20.     image: redis
  21.     container_name: redis-sentinel-3
  22.     ports:
  23.     – “26381:26379”
  24.     command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  25.     volumes:
  26.     – ./sentinel-3.conf:/usr/local/etc/redis/sentinel.conf
  27. networks:
  28.   default:
  29.     external:
  30.       name: redis_sentinel-master

3.创建并启动容器

docker-compose up -d

4.然后我们可以通过 docker ps 查看所有正在运行的容器

最终文件结构如下

docker-cmnpose 构建 Redis 一主两从三哨兵,实现主从切换

四、测试主从切换

1.我们先看下目前状态

分别连接三个 redis

redis-cli -h 127.0.0.1 -p 6379 -a 123456

redis-cli -h 127.0.0.1 -p 6379 -a 123456

redis-cli -h 127.0.0.1 -p 6379 -a 123456

然后分别使用

info replication 查看 role 信息

2.测试一下主从同步

没问题,能正常同步

3.尝试让主节点宕机,测试主从切换

docker stop redis-master

4.然后我们再次启动 redis-master 节点

docker start redis-master

该节点以 slave 角色加入集群

五、配置文件地址

已经将配置文件上传到 GitHub,需要的朋友自取

https://github.com/saysky/redis-sentinel/

0
分享到:

评论0

请先

没有账号? 忘记密码?