docker 搭建redis-sentinel架构-亲测可用!

 

目录

 

什么是redis-sentinel?

docker搭建redis-sentinel

文档结构 以及 配置文件内容

docker-compose.yml配置

节点的配置

redis-master.conf

redis-slave1.conf

redis-slave2.conf

sentinel配置

redis-sentinel-1.conf

redis-sentinel-2.conf

redis-sentinel-3.conf

 

具体操作步骤

1.进入到文档目录

2.执行docker compose

3.开启redis sentinel

4.进行测试

遇到的问题:


什么是redis-sentinel?

谈redis-sentinel离不开谈主从架构,主从架构,主节点master只负责写入,写入的数据同步从节点查询时去从节点拿数据。这就是主从架构。

它的问题在于,主节点如果挂掉以后,从节点就没用了。

redis-sentinel架构,除了主从节点以外,还有哨兵。这个哨兵的作用,是监测节点的健康状况,如果主节点挂掉了,哨兵会从 从节点之后选举出新的主节点,如果主节点又恢复了,那它会变为从节点。

 

docker搭建redis-sentinel

文档结构 以及 配置文件内容

TIPS: windows下使用cmd命令 tree /f >  dir.txt  可以在当前目下生成目录结构 并输出到dir.txt文件中呦

F:.
│  dyh.md
│  
└─redis-sentinel
    └─config
        │  docker-compose.yml
        │  redis-master.conf
        │  redis-sentinel-1.conf
        │  redis-sentinel-2.conf
        │  redis-sentinel-3.conf
        │  redis-slave1.conf
        │  redis-slave2.conf
        │  
        ├─data
        │  ├─redis-master
        │  │      dump.rdb
        │  │      
        │  ├─redis-slave-1
        │  │      dump.rdb
        │  │      
        │  └─redis-slave-2
        │          dump.rdb
        │          
        └─log

docker-compose.yml配置

---
version: '3'
services:
  # 主节点的容器
  redis-server-master:
    build:
      network: host
    image: redis
    container_name: redis-server-master
    restart: always
    # 为了规避Docker中端口映射可能带来的问题
    # 这里选择使用host网络
    # 指定时区,保证容器内时间正确
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      # 映射配置文件和数据目录
      - ./redis-master.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-master:/data
      - ./redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel.conf
      - ./log:/home/log
    sysctls:
      # 必要的内核参数
      net.core.somaxconn: '511'
    command: redis-server /usr/local/etc/redis/redis.conf 
  # 从节点1的容器
  redis-server-slave-1:
    build:
      network: host
    image: redis
    container_name: redis-server-slave-1
    restart: always
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-slave-1:/data
      - ./redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel.conf
      - ./log:/home/log
    sysctls:
      net.core.somaxconn: '511'
    command: redis-server /usr/local/etc/redis/redis.conf 
  # 从节点1的容器
  redis-server-slave-2:
    build:
      network: host
    image: redis
    container_name: redis-server-slave-2
    restart: always
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-slave-2:/data
      - ./redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel.conf
      - ./log:/home/log
    sysctls:
      net.core.somaxconn: '511'
    command: redis-server /usr/local/etc/redis/redis.conf 

节点的配置

redis-master.conf

 

# bind 127.0.0.1

# protected-mode yes
port 6379
# 设定密码认证
requirepass 123456
masterauth 123456

redis-slave1.conf

# bind 127.0.0.1

port 6380
requirepass 123456
slaveof redis-server-master 6379
masterauth 123456
 

redis-slave2.conf

# bind 127.0.0.1

port 6381
requirepass 123456
slaveof redis-server-master 6379
masterauth 123456
 

sentinel配置

redis-sentinel-1.conf

# bind 127.0.0.1
logfile "/home/log/sentinel1.log"
port 26379
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master redis-server-master 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
sentinel down-after-milliseconds local-master 30000

#后台执行

daemonize yes

redis-sentinel-2.conf

# bind 127.0.0.1
logfile "/home/log/sentinel2.log"
port 26380
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master redis-server-master 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
sentinel down-after-milliseconds local-master 30000

#后台执行

daemonize yes

redis-sentinel-3.conf

# bind 127.0.0.1
logfile "/home/log/sentinel3.log"
port 26381
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master redis-server-master 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
sentinel down-after-milliseconds local-master 30000

#后台执行

daemonize yes

 

具体操作步骤

1.进入到文档目录

# cd 到docker-compose所在的目录
PS C:\Users\GW00190182> cd F:
PS F:\> cd docker
PS F:\docker> cd .\redis-sentinel\
PS F:\docker\redis-sentinel> cd config
PS F:\docker\redis-sentinel\config> 

2.执行docker compose

docker compose up -d 

PS F:\docker\redis-sentinel\config> docker compose up -d
[+] Running 4/4
 - Network "config_default"        Created                                 0.0s
 - Container redis-server-master   Star...                                 0.7s
 - Container redis-server-slave-2  Sta...                                  0.6s
 - Container redis-server-slave-1  Sta...                                  0.6s 

查看运行状态

PS F:\docker\redis-sentinel\config> docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS      NAMES
469efd8bb683   redis     "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   6379/tcp   redis-server-master
65001dc46e8f   redis     "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   6379/tcp   redis-server-slave-2
59ea1855464b   redis     "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   6379/tcp   redis-server-slave-1

以上都启动成功

3.开启redis sentinel

进入master容器 查看主从架构是否生效了

PS F:\docker\redis-sentinel\config> docker exec -it redis-server-master redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=6380,state=online,offset=4214,lag=1
slave1:ip=172.18.0.2,port=6381,state=online,offset=4214,lag=1

master_replid:c5a0145917afedc81326a0bdf86fa0e8b27b8da4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4214
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4214
127.0.0.1:6379>

好的!主从架构完毕。

分别进入到master和从节点 开启redis sentinel

PS F:\docker\redis-sentinel\config> docker exec -it redis-server-master /bin/bash

root@469efd8bb683:/data# redis-sentinel /usr/local/etc/redis/redis-sentinel.conf

 

53:X 19 Mar 2021 09:18:49.413 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
53:X 19 Mar 2021 09:18:49.413 # Redis version=6.0.10, bits=64, commit=00000000, modified=0, pid=53, just started
53:X 19 Mar 2021 09:18:49.413 # Configuration loaded
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.0.10 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 53
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

53:X 19 Mar 2021 09:18:49.420 # Could not rename tmp config file (Device or resource busy)
53:X 19 Mar 2021 09:18:49.420 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
53:X 19 Mar 2021 09:18:49.420 # Sentinel ID is 788272feca447e06f46db987a45080c6829e5231
53:X 19 Mar 2021 09:18:49.420 # +monitor master local-master 172.18.0.4 6379 quorum 2
53:X 19 Mar 2021 09:18:49.420 * +slave slave 172.18.0.3:6380 172.18.0.3 6380 @ local-master 172.18.0.4 6379
53:X 19 Mar 2021 09:18:49.424 # Could not rename tmp config file (Device or resource busy)
53:X 19 Mar 2021 09:18:49.424 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
53:X 19 Mar 2021 09:18:49.424 * +slave slave 172.18.0.2:6381 172.18.0.2 6381 @ local-master 172.18.0.4 6379
53:X 19 Mar 2021 09:18:49.427 # Could not rename tmp config file (Device or resource busy)
53:X 19 Mar 2021 09:18:49.427 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy

4.进行测试

如上哨兵模式搭建完毕

关闭master

docker stop redis-server-master

查看选主过程

 

查看从节点是否变为了主节点

slave-1 正式上位

恢复master 看看是否变为了从节点

sentinel 打印的选举过程

 

遇到的问题:

1.docekr 的网络模式 需要选择为host ,不然哨兵无法连通

2.如果报出了配置文件的错误,建议自己手打一份文件,就可以解决问题

3.本想redis 启动和sentinel 启动 都放在docker-compose.yml之中,一气呵成,发现这样不可行,sentinel的启动必须要进入到容器里面,手动启动,而且如果主节点挂掉之后重启,sentinel也需要手动重启一遍。这里可以使用脚本,设置成开机自启。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值