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

avatar 2019年11月24日18:14:50 评论 55 views

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/

历史上的今天
十一月
24
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: