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

avatar 2019年11月24日18:14:50 6 3663 views
博主分享免费Java教学视频,B站账号:Java刘哥
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 查看所有正在运行的容器   最终文件结构如下

四、测试主从切换

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/
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0