演示环境
- 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
version: '2'
services:
master:
# 镜像
image: redis
# 容器名
container_name: myredis
# --requirepass 用来设置密码
command: redis-server --requirepass molotest123
# 暴露端口
ports:
- "6379:6379"
# 创建网络
networks:
- sentinel-master
slave1:
image: redis
container_name: redis1
ports:
- "6380:6379"
# --slaveof contanerName port, 把当前节点变成 contanerName节点的 slave 节点.
# --masterauth, 配置主节点的密码.
command: redis-server --slaveof myredis 6379 --requirepass molotest123 --masterauth molotest123
depends_on:
- master
networks:
- sentinel-master
slave2:
image: redis
container_name: redis2
ports:
- "6381:6379"
command: redis-server --slaveof myredis 6379 --requirepass molotest123 --masterauth molotest123
depends_on:
- master
networks:
- sentinel-master
# 创建一个指定的网络, redis-master.
networks:
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