如果让你为开发、测试环境分别搭一套哨兵和集群模式的redis,你最快需要多久,或许你需要一天?2小时?事实是可以更短。 是的,你已经猜到了,用docker部署,真的只需要十几分钟。

一.准备工作

拉取redis镜像

运行如下命令:

  1. docker pull redis

该命令拉取的镜像是官方镜像,当然你可以搜索其他的镜像,这里不做深入

查看镜像情况:

二.部署redis哨兵主从模式

什么是哨兵模式?--请自行百度

1、什么是docker compose?

Docker Compose 可以理解为将多个容器运行的方式和配置固化下来!

就拿最简单的例子来说吧,如果我们要为我们的应用容器准备一个 MySQL 容器和一个 Redis 容器,那么在每次启动时,我们先要将 MySQL 容器和 Redis 容器启动起来,再将应用容器运行起来。这其中还不要忘了在创建应用容器时将容器网络连接到 MySQL 容器和 Redis 容器上,以便应用连接上它们并进行数据交换。

这还不够,如果我们还对容器进行了各种配置,我们最好还得将容器创建和配置的命令保存下来,以便下次可以直接使用。

针对这种情况,我们就不得不引出在我们开发中最常使用的多容器定义和运行软件,也就是 Docker Compose 了。

2、编写reids主从docker-compose.yml

  1. version: '3.7'
  2. services:
  3. master:
  4. image: redis
  5. container_name: redis-master
  6. restart: always
  7. command: redis-server --requirepass redispwd --appendonly yes
  8. ports:
  9. - 6379:6379
  10. volumes:
  11. - ./data1:/data
  12. slave1:
  13. image: redis
  14. container_name: redis-slave-1
  15. restart: always
  16. command: redis-server --slaveof redis-master 6379 --requirepass redispwd --masterauth redispwd --appendonly yes
  17. ports:
  18. - 6380:6379
  19. volumes:
  20. - ./data2:/data
  21. slave2:
  22. image: redis
  23. container_name: redis-slave-2
  24. restart: always
  25. command: redis-server --slaveof redis-master 6379 --requirepass redispwd --masterauth redispwd --appendonly yes
  26. ports:
  27. - 6381:6379
  28. volumes:
  29. - ./data3:/data

名词解释:

3、启动主从redis

进入redis对应的docker-compose.yml的目录,执行命令:

  1. docker-compose up -d

-d表示后台运行

使用命令docker ps命令查看启动结果:



出现截图所示,表示运行成功

4.编写哨兵docker-compose.yml

  1. version: '3.7'
  2. services:
  3. sentinel1:
  4. image: redis
  5. container_name: redis-sentinel-1
  6. restart: always
  7. ports:
  8. - 26379:26379
  9. command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  10. volumes:
  11. - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  12. sentinel2:
  13. image: redis
  14. container_name: redis-sentinel-2
  15. restart: always
  16. ports:
  17. - 26380:26379
  18. command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  19. volumes:
  20. - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  21. sentinel3:
  22. image: redis
  23. container_name: redis-sentinel-3
  24. ports:
  25. - 26381:26379
  26. command: redis-sentinel /usr/local/etc/redis/sentinel.conf
  27. volumes:
  28. - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
  29. networks:
  30. default:
  31. external:
  32. name: redis_default

5.编写哨兵sentinel.conf

  1. # 自定义集群名,其中172.19.0.3 为 redis-master 的 ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
  2. port 26379
  3. dir /tmp
  4. sentinel monitor mymaster 172.19.0.3 6379 2
  5. sentinel down-after-milliseconds mymaster 30000
  6. sentinel parallel-syncs mymaster 1
  7. sentinel auth-pass mymaster redispwd
  8. sentinel failover-timeout mymaster 180000
  9. sentinel deny-scripts-reconfig yes

将上述文件分别拷贝3份分别命名为sentinel1.conf、sentinel2.conf、sentinel3.conf与docker-compose.yml中的配置文件对应,然后放置和哨兵的docker-compose.yml在同一目录

6.启动哨兵

进入哨兵docker-compose.yml所在目录,执行命令:

  1. docker-compose up -d

查看容器,可以看到哨兵和主从redis都起来了

6.1哨兵启动日志



上述日志中可以看出,哨兵监听master和slave节点

6.2关掉master节点

通过命令停止redis的master节点

  1. docker stop redis-master



通过上述日志,我们可以看到sdown,odown,他们是什么意思呢?

sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机

odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机

然后就是开始选举,从日志可以看出两个哨兵选择了同一个slave节点,这时候满足了我们配置最小投票数,那么这台slave就被选为新的master。

6.3重开master节点



上述日志表明哨兵检测到原master重新启动,将原master节点变成新master的从节点

三.部署redis集群模式

1、创建目录和文件

  1. ├── docker-compose.yml
  2. ├── redis-6371
  3. ├── conf
  4. └── redis.conf
  5. └── data
  6. ├── redis-6372
  7. ├── conf
  8. └── redis.conf
  9. └── data
  10. ├── redis-6373
  11. ├── conf
  12. └── redis.conf
  13. └── data
  14. ├── redis-6374
  15. ├── conf
  16. └── redis.conf
  17. └── data
  18. ├── redis-6375
  19. ├── conf
  20. └── redis.conf
  21. └── data
  22. └── redis-6376
  23. ├── conf
  24. └── redis.conf
  25. └── data

2、redis.conf 配置文件

  1. port 6371
  2. cluster-enabled yes
  3. cluster-config-file nodes-6371.conf
  4. cluster-node-timeout 5000
  5. appendonly yes
  6. protected-mode no
  7. requirepass 1234
  8. masterauth 1234
  9. cluster-announce-ip 10.12.12.10 # 这里是宿主机IP
  10. cluster-announce-port 6371
  11. cluster-announce-bus-port 16371

每个节点的配置只需改变端口。

3、docker-compose 配置文件

  1. version: "3"
  2. # 定义服务,可以多个
  3. services:
  4. redis-6371: # 服务名称
  5. image: redis # 创建容器时所需的镜像
  6. container_name: redis-6371 # 容器名称
  7. restart: always # 容器总是重新启动
  8. volumes: # 数据卷,目录挂载
  9. - ./redis-6371/conf/redis.conf:/usr/local/etc/redis/redis.conf
  10. - ./redis-6371/data:/data
  11. ports:
  12. - 6371:6371
  13. - 16371:16371
  14. command:
  15. redis-server /usr/local/etc/redis/redis.conf
  16. redis-6372:
  17. image: redis
  18. container_name: redis-6372
  19. volumes:
  20. - ./redis-6372/conf/redis.conf:/usr/local/etc/redis/redis.conf
  21. - ./redis-6372/data:/data
  22. ports:
  23. - 6372:6372
  24. - 16372:16372
  25. command:
  26. redis-server /usr/local/etc/redis/redis.conf
  27. redis-6373:
  28. image: redis
  29. container_name: redis-6373
  30. volumes:
  31. - ./redis-6373/conf/redis.conf:/usr/local/etc/redis/redis.conf
  32. - ./redis-6373/data:/data
  33. ports:
  34. - 6373:6373
  35. - 16373:16373
  36. command:
  37. redis-server /usr/local/etc/redis/redis.conf
  38. redis-6374:
  39. image: redis
  40. container_name: redis-6374
  41. restart: always
  42. volumes:
  43. - ./redis-6374/conf/redis.conf:/usr/local/etc/redis/redis.conf
  44. - ./redis-6374/data:/data
  45. ports:
  46. - 6374:6374
  47. - 16374:16374
  48. command:
  49. redis-server /usr/local/etc/redis/redis.conf
  50. redis-6375:
  51. image: redis
  52. container_name: redis-6375
  53. volumes:
  54. - ./redis-6375/conf/redis.conf:/usr/local/etc/redis/redis.conf
  55. - ./redis-6375/data:/data
  56. ports:
  57. - 6375:6375
  58. - 16375:16375
  59. command:
  60. redis-server /usr/local/etc/redis/redis.conf
  61. redis-6376:
  62. image: redis
  63. container_name: redis-6376
  64. volumes:
  65. - ./redis-6376/conf/redis.conf:/usr/local/etc/redis/redis.conf
  66. - ./redis-6376/data:/data
  67. ports:
  68. - 6376:6376
  69. - 16376:16376
  70. command:
  71. redis-server /usr/local/etc/redis/redis.conf

编写完成后使用docker-compose up -d启动容器 ,这里没有使用主机模式(host),而是使用 NAT 模式,因为主机模式可能导致外部客户端无法连接。

4、进入容器,创建集群

上面只是启动了 6 个 Redis 实例,并没有构建成 Cluster 集群。

执行docker exec -it redis-6371 bash进入一个 Redis 节点容器,随便哪个都行。

继续执行以下命令创建集群:

  1. # 集群创建命令
  2. redis-cli -a 1234 --cluster create 10.35.30.39:6371 10.35.30.39:6372 10.35.30.39:6373 10.35.30.39:6374 10.35.30.39:6375 10.35.30.39:6376 --cluster-replicas 1
  3. # 执行过后会有以下输出
  4. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  5. >>> Performing hash slots allocation on 6 nodes...
  6. Master[0] -> Slots 0 - 5460
  7. Master[1] -> Slots 5461 - 10922
  8. Master[2] -> Slots 10923 - 16383
  9. Adding replica 10.35.30.39:6375 to 10.35.30.39:6371
  10. Adding replica 10.35.30.39:6376 to 10.35.30.39:6372
  11. Adding replica 10.35.30.39:6374 to 10.35.30.39:6373
  12. >>> Trying to optimize slaves allocation for anti-affinity
  13. [WARNING] Some slaves are in the same host as their master
  14. M: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371
  15. slots:[0-5460] (5461 slots) master
  16. M: 0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372
  17. slots:[5461-10922] (5462 slots) master
  18. M: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373
  19. slots:[10923-16383] (5461 slots) master
  20. S: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374
  21. replicates fcb83b0097d2a0a87a76c0d782de12147bc86291
  22. S: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375
  23. replicates e9a35d6a9d203830556de89f06a3be2e2ab4eee1
  24. S: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376
  25. replicates 0c8755144fe6a200a46716371495b04f8ab9d4c8
  26. Can I set the above configuration? (type 'yes' to accept): yes # 这里输入 yes 并回车 确认节点 主从身份 以及 哈希槽的分配
  27. >>> Nodes configuration updated
  28. >>> Assign a different config epoch to each node
  29. >>> Sending CLUSTER MEET messages to join the cluster
  30. Waiting for the cluster to join
  31. .
  32. >>> Performing Cluster Check (using node 10.35.30.39:6371)
  33. M: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371
  34. slots:[0-5460] (5461 slots) master
  35. 1 additional replica(s)
  36. M: 0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372
  37. slots:[5461-10922] (5462 slots) master
  38. 1 additional replica(s)
  39. S: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374
  40. slots: (0 slots) slave
  41. replicates fcb83b0097d2a0a87a76c0d782de12147bc86291
  42. M: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373
  43. slots:[10923-16383] (5461 slots) master
  44. 1 additional replica(s)
  45. S: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375
  46. slots: (0 slots) slave
  47. replicates e9a35d6a9d203830556de89f06a3be2e2ab4eee1
  48. S: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376
  49. slots: (0 slots) slave
  50. replicates 0c8755144fe6a200a46716371495b04f8ab9d4c8
  51. [OK] All nodes agree about slots configuration.
  52. >>> Check for open slots...
  53. >>> Check slots coverage...
  54. [OK] All 16384 slots covered.

看到上面的输出即为 Cluster 集群配置完成。且为 3 主 3 从。

总结:

以上就是通过docker compose方式部署哨兵模式和集群模式的全过程,redis部署在docker中,适用于本地、开发、测试等环境,生产环境请慎用,除非你对docker有很强的掌控力。

关注我,下一篇继续

5分钟实现用docker搭建Redis集群模式和哨兵模式的更多相关文章

  1. docker搭建redis集群

    一.简介 docker作为一个容器技术,在搭建资源隔离性服务上具有很大的优势,在一台服务器上可以启动多个docker容器,感觉每个在容器里面部署的服务就像是部署在不同的服务器上.此次基于docker以 ...

  2. docker搭建redis集群和Sentinel,实现故障转移

    0.引言 公司开发需要用到redis,虽然有运维自动搭建,还是记录下如何搭建redis集群和Sentinel. 采用的是vagrant虚拟机+docker的方式进行搭建. 搭建思路: 首先是借鉴下其他 ...

  3. 利用Docker搭建Redis集群

    Redis集群搭建 运行Redis镜像 分别使用以下命令启动3个Redis docker run --name redis-6379 -p 6379:6379 -d hub.c.163.com/lib ...

  4. Docker:Docker搭建Redis集群(6)

    国外的公有云实在是太慢了,经常time out 这里搜集几个国内出名的: hub.c.163.com (网易:https://c.163.com/hub#/m/home/) dev.aliyun.co ...

  5. 使用docker搭建redis集群

    创建网卡 docker network create redis --subnet 172.20.0.0/ --gateway 172.20.0.1 通过脚本创建6个redis配置 for i in ...

  6. docker 搭建 redis 集群(哨兵模式)

    文件结构 1. redis-sentinel 1-1. docker-compose.yml 1-2. sentinel 1-2-1 docker-compose.yml 1-2-2 sentinel ...

  7. 基于Docker的redis集群搭建

    Redis集群官方介绍:http://www.redis.cn/topics/cluster-tutorial.html 基于Docker搭建Redis集群 环境:6个节点,三主三从 制作Redis镜 ...

  8. docker 实现redis集群搭建

    摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群. 首先,我们需要理论知识:Redis Cluster是Re ...

  9. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

随机推荐

  1. Nacos集群部署:

    Nacos集群部署: 官网:    https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 1: 下载 Nacos1.2.0 链接:http ...

  2. C# Monitor.TryEnter 源码跟踪

    source: Monitor 获取指定对象的独占锁. [MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical, __Dyn ...

  3. 【转】Mysql中事务ACID实现原理

    转自:https://www.cnblogs.com/rjzheng/p/10841031.html 作者:孤独烟 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" ...

  4. mybatis传入参数为0被误认为是空字符串的解决方法

    在mbatis中使用Xml配置sql语句时,出现了这样一个问题.当我传入的参数为0去做判断时,mybatis会把参数0当成是空字符串去判断而引起查询结果错误 所以在做项目时一定要注意,用到MyBati ...

  5. JDBC基础篇(MYSQL)——使用CallabeStatement调用存储过程

    注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day04_callable; import java.sql.CallableStatement; import ...

  6. js在不同页面的导航背景不同 (设置网站公共头的导航)

    <script type="text/javascript" src="js/jquery.min.js"></script> < ...

  7. 基于Linux系统的网络服务——高速缓存DNS及企业级域名解析服务

    1.DNS域名系统 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数 ...

  8. 小程序 读取照片 EXIF 元信息

    安装 exif.js npm install exif-js --save UI <button type="primary" @click="onExif&quo ...

  9. 利用 Spring Boot 中的 @ConfigurationProperties,优雅绑定配置参数

    使用 @Value("${property}") 注释注入配置属性有时会很麻烦,尤其是当你使用多个属性或你的数据是分层的时候. Spring Boot 引入了一个可替换的方案 -- ...

  10. 离线安装Windows Terminal

    Windows Terminal颜值高.适配好.速度快,是Windows 10下命令行工具的不二选择. 最近在公司电脑上安装Windows Terminal时遇到一个问题,由于公司电脑不能直接连接外网 ...