Redis在Docker容器中快速搭建主从哨兵模式(master:1个 slave:2个 sentinel:3个 )

Redis在Docker容器中快速搭建主从哨兵模式(master:1个 slave:2个 sentinel:3个 )

本文精简的介绍了redis在docker中快速搭建主从哨兵模式的具体流程,欢迎大家多多点赞收藏!
redis官网:http://redis.p2hp.com/
redis下载:https://github.com/tporadowski/redis/releases
简单连接redis工具点击下载
Docker Compose 使用教程: https://www.runoob.com/docker/docker-compose.html

1. Docker-compose搭建Redis 主从哨兵模式

Redis Sentinel是针对原始Master/Slave模型而衍生的高可用模型。我们为便于灵活部署,先易后难,先搭建Redis Master/Slave模型,再搭建Redis Sentinel模型。

Redis Sentinel提供的主要功能:

  1. 当主节点发生故障时,它将自动选择一个备用节点并将其升级为主节点。
    它是如何做到的?它会定期检查Redis实例的运行状况和运行状况,还会将新的主服务器通知给客户端和从服务器。使用的是带有领导者选举算法的gossip协议。
  2. Sentinel还充当客户端发现的中心授权来源,客户端连接到Sentinel以获取主节点的地址。

在这里插入图片描述

以下是使用Docker-compose搭建一个Redis Sentinel模型(1:master-2:slave:3:sentinel):

文件组织格式如下:
可以放置在/usr/etc/ 文件目录下:

 /usr/etc/redis-sentinel/redis
 /usr/etc/redis-sentinel/sentinel
redis-sentinel
├── redis
│   └── docker-compose.yml
└── sentinel
    ├── docker-compose.yml
    ├── sentinel1.conf
    ├── sentinel2.conf
    ├── sentinel3.conf
    └── sentinel.conf

1.1 创建Master&Slave

进入Redis文件夹,创建docker-compose.yml文件,
下面的Compose文件设置了1Master 2Slave

version: '3'
services:
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass **ll  --masterauth **ll
    ports:
      - 6380:6379
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
      - 6381:6379
    command:  redis-server --slaveof redis-master 6379 --requirepass **ll --masterauth **ll
  slave2:
    image: redis
    container_name: redis-slave-2
    ports:
      - 6382:6379
    command: redis-server --slaveof redis-master 6379 --requirepass **ll --masterauth **ll

相关命令释义:

在这里插入图片描述

注意:,如果设置了Redis客户端访问密码requirepass, 那么也要设置相同的副本集同步密码masterauth。
另外我们后面使用哨兵模式能够完成故障转移,现有的Master可能会变成Slave,故在当前Master容器中也要携带masterauth参数。

可在容器内使用 config get [Param] 命令验证:
执行docker-compose up -d会产生3个Redis容器,分别映射到宿主机6380、6381、6382端口, 默认连接在redis-default网桥。

docker ps输出如下:

4a97057cef5c   redis          "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:6381->6379/tcp, :::6381->6379/tcp                 redis-slave-1
5d86b0109a15   redis          "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:6382->6379/tcp, :::6382->6379/tcp                 redis-slave-2
5b4b3922edf2   redis          "docker-entrypoint.s…"   About an hour ago   Up 4 seconds       0.0.0.0:6380->6379/tcp, :::6380->6379/tcp                 redis-master

2.1 创建 Redis Sentinel

很明显我们即将搭建的Sentinel容器需要能访问到以上3个容器,故需要在形成Sentinel容器时使用外置的redis-default网桥(Redis Master/Slave docker-compose 已经创建).

2.1.1 进入sentinel文件夹,创建docker-compose.yml:
version: '3'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
  default:
    external:
      name: redis_default
2.1.2 创建哨兵文件

将如下内容拷贝进去:

port 26379
dir /tmp
sentinel monitor mymaster 172.20.0.3 6379 2
sentinel auth-pass mymaster **ll
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

注意:以上 172.20.0.3是之前Redis Master/slave启动之后Master节点的IP,通过docker inspect [containerIP]获取, 这里我们要配合设置Master/Slave访问密码。

2.1.3 将哨兵文件复制三份,Volume进Sentinel容器:
sudo cp sentinel.conf sentinel1.conf
sudo cp sentinel.conf sentinel2.conf
sudo cp sentinel.conf sentinel3.conf

docker-compose up -d生成3个Sentinel容器。
此时docker ps显示如下:

CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                                                     NAMES
a58c37fd763d   redis          "docker-entrypoint.s…"   About an hour ago   Up About an hour   6379/tcp, 0.0.0.0:26380->26379/tcp, :::26380->26379/tcp   redis-sentinel-2
314b9c6723dc   redis          "docker-entrypoint.s…"   About an hour ago   Up About an hour   6379/tcp, 0.0.0.0:26381->26379/tcp, :::26381->26379/tcp   redis-sentinel-3
7dc49c1d61d9   redis          "docker-entrypoint.s…"   About an hour ago   Up About an hour   6379/tcp, 0.0.0.0:26379->26379/tcp, :::26379->26379/tcp   redis-sentinel-1
4a97057cef5c   redis          "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:6381->6379/tcp, :::6381->6379/tcp                 redis-slave-1
5d86b0109a15   redis          "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:6382->6379/tcp, :::6382->6379/tcp                 redis-slave-2
5b4b3922edf2   redis          "docker-entrypoint.s…"   About an hour ago   Up 11 minutes      0.0.0.0:6380->6379/tcp, :::6380->6379/tcp                 redis-master

3.1 验证

3.1.1 Master/Slave副本集

进入Master容器,确认两个Slave容器已经连接。

可以通过以下命令进行查看:

进入master节点:

[root@bogon ~]# docker exec -it redis-master bash
root@5d86b0109a15:/data# redis-cli
127.0.0.1:6379> auth **ll
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.2,port=6379,state=online,offset=605293,lag=1
slave1:ip=172.18.0.3,port=6379,state=online,offset=605158,lag=1
master_failover_state:no-failover
master_replid:cee0cfbae5d705ef6e307e9f586762e57b574ba1
master_replid2:7d8cda08563e7998863fdf1be57bad2af07acef2
master_repl_offset:605293
second_repl_offset:213057
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:605293
127.0.0.1:6379> 

显示如下信息:
在这里插入图片描述

此处显示即为主节连接两个从节点成功。

3.1.2 Redis Sentinel

进入其中一个Sentinel容器,确认Master、2个Slave、另外2个Sentinel

flags: master  表明master正常运作,异常情况会显示s-down,o-down
num-slaves:侦测到2个Slave副本集
num-other-sentinels:除此之外,还有2个哨兵
3.1.3 Redis Sentinel高可用

停止 master容器,等待10s,进入任意sentinel容器,使用
sentinel master mymaster
命令观察主节点发生变化,观察外挂的Sentinel*.conf主节点IP发生变化,验证成功。

2. 总结

通过Docker Compose我们可以极大地减少部署的工作量,通过配置好的yml文件,我们可以实现快速部署。当然Docker Compose只是对Docker容器的编排,如果想统一管理多个Docker容器则需要考虑使用k8s针对多容器的Pod进行管理。

以下为k8s的基础架构图:
在这里插入图片描述

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值