zoukankan      html  css  js  c++  java
  • Docker快速搭建主从+哨兵监控

    安装Redis

    执行命令

    docker pull redis
    

    部署方案

    启动三台机器,6379容器作为主节点,其余作为从节点

    机器IP 角色 端口
    172.17.0.2 Master 6379
    172.17.0.3 Slave1 6380
    172.17.0.4 Slave2 6381

    开始准备工作

    目录结构

    ├── conf
    │   ├── redis_6379.conf
    │   ├── redis_6380.conf
    │   ├── redis_6381.conf
    │   ├── sentinel_26379.conf
    │   ├── sentinel_26380.conf
    │   └── sentinel_26381.conf
    ├── data_6379
    │   ├── appendonly.aof
    │   └── dump.rdb
    ├── data_6380
    │   └── dump.rdb
    ├── data_6381
    │   └── dump.rdb
    └── scripts
        ├── run.sh
        └── sentinel.sh
    

    redis_.conf 配置文件

    下载配置文件,具体配置另行调整即可

    https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf
    

    sentinel_.conf 配置文件

    port 26379
    dir "/etc/redis"
    sentinel monitor mymaster 172.17.0.2 6379 1
    sentinel down-after-milliseconds mymaster 60000
    sentinel failover-timeout mymaster 180000
    

    run.sh 启动脚本文件

    #!/usr/bin/env bash
    set -e
    
    # 脚本当前目录
    cPath=$(cd $(dirname "$0") || exit; pwd)
    
    # 根目录
    dirPath=$(dirname "$cPath")
    
    # 获取端口
    port="$1"
    if [[ ! "$port" ]]; then
      port=6379
    fi
    
    # 创建数据目录
    mkdir -p "$dirPath"/data_"$port"
    
    # 删除已启动服务
    containerId=$(docker ps -a | grep "redis_$port" | awk -F' ' '{print $1}')
    if [[ "$containerId" ]]; then
        echo "正在删除服务:${containerId}"
        docker rm -f ${containerId} > /dev/null
    fi
    
    # 启动服务
    docker run -itd --privileged=true -p "$port":6379 --name redis_"$port" 
    -v="$dirPath"/conf/redis_"$port".conf:/etc/redis/redis.conf 
    -v="$dirPath"/data_"$port":/data 
    redis 
    redis-server /etc/redis/redis.conf
    

    sentinel.sh 启动脚本文件

    #!/usr/bin/env bash
    set -e
    
    # 脚本当前目录
    cPath=$(cd $(dirname "$0") || exit; pwd)
    
    # 根目录
    dirPath=$(dirname "$cPath")
    
    # 设置端口
    port=$1
    if [[ ! "$port" ]]; then
      port=26379
    fi
    
    # 删除已启动服务
    containerId=$(docker ps -a | grep "sentinel_$port" | awk -F' ' '{print $1}')
    if [[ "$containerId" ]]; then
        echo "正在删除服务:${containerId}"
        docker rm -f ${containerId} > /dev/null
    fi
    
    # 启动服务
    docker run -itd --privileged=true -p "$port":26379 --name "sentinel_$port" 
    -v="${dirPath}/conf/sentinel_${port}.conf":/etc/redis/sentinel.conf 
    -w=/etc/redis/ 
    redis 
    redis-server /etc/redis/sentinel.conf --sentinel
    

    注意

    启动 sentinel 服务如果如下错误

    1:X 10 May 2020 08:10:48.234 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    1:X 10 May 2020 08:10:48.235 # Sentinel config file /etc/redis/sentinel.conf is not writable: Permission denied. Exiting...
    

    解决方案

    • 在docker run 中增加 -w=/etc/redis/,具体见 sentinel.sh 脚本
    • 修改目录权限
    docker run -it --rm --privileged=true -v=/root/docker-config/redis/conf/:/etc/redis/ redis chown -R redis /etc/redis
    

    主要语句:chown -R redis /etc/redis

    查看修改后的权限

    root@DESKTOP-Q13EI52:~/docker-config/redis# docker run -it --rm --privileged=true -v=/root/docker-config/redis/conf/:/etc/redis/ redis ls -l /etc/redis/
    total 204
    -rw-r--r-- 1 redis root 61793 May 10 07:41 redis_6379.conf
    -rw-r--r-- 1 redis root 61864 May 10 12:52 redis_6380.conf
    -rw-r--r-- 1 redis root 61890 May 10 12:52 redis_6381.conf
    -rw-r--r-- 1 redis root   459 May 10 12:52 sentinel_26379.conf
    -rw-r--r-- 1 redis root   161 May 10 07:56 sentinel_26380.conf
    -rw-r--r-- 1 redis root   161 May 10 10:16 sentinel_26381.conf
    

    启动 Redis 服务

    启动主服务

    sh scripts/run.sh 6379
    

    启动从服务

    sh scripts/run.sh 6380
    sh scripts/run.sh 6381
    

    进入从服务

    docker exec -it redis_6380 bash
    docker exec -it redis_6381 bash
    
    # 进入容器后执行命令
    redis-cli
    
    # 设置为从服务
    slaveof 172.17.0.2 6379
    

    效果图

    启动 Sentinel 服务

    sh scripts/sentinel.sh
    

    效果图

    手动停止主服务

    • 目前机器服务结构如下
    root@DESKTOP-Q13EI52:~/docker-config/redis# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                NAMES
    e518580ce8eb        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26379->26379/tcp   sentinel_26379
    e2ef253d3513        redis               "docker-entrypoint.s…"   2 hours ago          Up 2 hours          0.0.0.0:6381->6379/tcp               redis_6381
    15fdc81eb530        redis               "docker-entrypoint.s…"   2 hours ago          Up 2 hours          0.0.0.0:6380->6379/tcp               redis_6380
    77f4fdc84cb1        redis               "docker-entrypoint.s…"   2 hours ago          Up 2 hours          0.0.0.0:6379->6379/tcp               redis_6379
    

    执行命令:docker stop redis_6379

    1:X 10 May 2020 12:52:15.634 # +sdown master mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:15.634 # +odown master mymaster 172.17.0.2 6379 #quorum 1/1
    1:X 10 May 2020 12:52:15.634 # +new-epoch 1
    1:X 10 May 2020 12:52:15.634 # +try-failover master mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:15.649 # +vote-for-leader 6905a137af7baedbdfce4978d1d9126fdaad4faf 1
    1:X 10 May 2020 12:52:15.649 # +elected-leader master mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:15.649 # +failover-state-select-slave master mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:15.725 # +selected-slave slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:15.725 * +failover-state-send-slaveof-noone slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:15.781 * +failover-state-wait-promotion slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:16.798 # +promoted-slave slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:16.798 # +failover-state-reconf-slaves master mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:16.845 * +slave-reconf-sent slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:17.837 * +slave-reconf-inprog slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:17.837 * +slave-reconf-done slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379
    1:X 10 May 2020 12:52:17.937 # +failover-end master mymaster 172.17.0.2 6379
    
    # 生成执行故障转移
    1:X 10 May 2020 12:52:17.937 # +switch-master mymaster 172.17.0.2 6379 172.17.0.3 6379
    
    1:X 10 May 2020 12:52:17.938 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
    1:X 10 May 2020 12:52:17.938 * +slave slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.3 6379
    
    1:X 10 May 2020 12:53:18.010 # +sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.3 6379
    

    注意

    已经掉线的172.17.0.2:6379 主节点重新上线后将自动切换为从服务

  • 相关阅读:
    第九周博客作业 <西北师范大学| 周安伟>
    第八周博客作业 <西北师范大学| 周安伟>
    第七周博客作业 <西北师范大学| 周安伟>
    第六周博客作业 <西北师范大学| 周安伟>
    第五周博客作业 <西北师范大学| 周安伟>
    启动两个jboss需要修改的端口号 (两个不能相同)
    以&#开头的是什么编码?
    创建一个小窗口 实现最简单信息交互
    创建一个小窗口 并实现最简单交互
    使用js实现复选框的全选、取消功能
  • 原文地址:https://www.cnblogs.com/zhanghuizong/p/12865005.html
Copyright © 2011-2022 走看看