演示环境

  • Macos Catalina;
  • Docker version 18.06.0-ce, build 0ffa825;
  • docker-compose version 1.24.1

主从模式

Redis 主从模式简介

什么 Redis 主从模式?
Redis 主从模式是一种分布式的数据同步机制. Master 主节点用来写入, Slave 从节点用来读取.

Redis 主从模式有什么优势?

  • 读写分离, 提高 Redis 的效率.
  • 自动分割数据到不同的节点上.
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令.

主从模式配置关键点

  • 主节点 A 不需要任何改动, 节点B只需要执行 slaveof hostA portA 就可以变成 A 的 Slave 节点.
  • 查看当前的主从配置, 使用 info replication

配置 docker-compose.yml

  1. version: '2'
  2. services:
  3. master:
  4. # 镜像
  5. image: redis
  6. # 容器名
  7. container_name: myredis
  8. # --requirepass 用来设置密码
  9. command: redis-server --requirepass molotest123
  10. # 暴露端口
  11. ports:
  12. - "6379:6379"
  13. # 创建网络
  14. networks:
  15. - sentinel-master
  16. slave1:
  17. image: redis
  18. container_name: redis1
  19. ports:
  20. - "6380:6379"
  21. # --slaveof contanerName port, 把当前节点变成 contanerName节点的 slave 节点.
  22. # --masterauth, 配置主节点的密码.
  23. command: redis-server --slaveof myredis 6379 --requirepass molotest123 --masterauth molotest123
  24. depends_on:
  25. - master
  26. networks:
  27. - sentinel-master
  28. slave2:
  29. image: redis
  30. container_name: redis2
  31. ports:
  32. - "6381:6379"
  33. command: redis-server --slaveof myredis 6379 --requirepass molotest123 --masterauth molotest123
  34. depends_on:
  35. - master
  36. networks:
  37. - sentinel-master
  38. # 创建一个指定的网络, redis-master.
  39. networks:
  40. sentinel-master:

启动, 注意要在 yml 的同一级目录:

docker-compose up -d

验证

执行如下命令:

# 进入 myredis 容器内部
docker exec -it myredis /bin/bash

# 链接 redis shell
redis-cli

# redis 密码
auth molotest123

# 查看集群信息
info replication

输出信息:

# Replication
role:master
connected_slaves:2 # connected_slaves 为2, 说明正确.

哨兵模式

简介

Redis 哨兵模式是主从模式的升级版, 除了主从模式提到的优点外, 哨兵模式优势在于:
能够实现 “自动故障转移”, 当主节点挂掉后, 能够自动进行主动切换.

获取 redis 的官方配置:

wget wget -c http://download.redis.io/redis-stable/redis.conf

配置 docker-compose.yml

把主动模式的 redis 容器先干掉, docker rm -f myredis redis1 redis2

在刚才的 yml 的基础下做如下修改:

version: '3.7'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    restart: always
    ports:
      - 26379:26379
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf

  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    restart: always
    ports:
      - 26380:26379
    volumes:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf

  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    restart: always
    ports:
      - 26381:26379
    volumes:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf

编写 sentinel.conf

port 26379
dir /tmp
protected-mode no
# 自定义集群名,其中 192.168.8.188 为 redis-master 的 ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
sentinel monitor mymaster 192.168.0.6 6379 2  
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster test@dbuser2018
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
sentinel auth-pass mymaster molotest123

补充-排查时用到命令

删除刚才创建的所有容器:

docker rm -f myredis redis1 redis2

查看 redis1 容器的日志:

docker logs redis1 -f

查看容器的启动情况:

docker-compose ps

查看容器网络:

docker network ls