Docker 快速搭建主从 + 哨兵监控

摘要:
安装Redis以执行命令我的正式组单击此处/Usr/bin/envbashset-e#script current directory cPath=$#root directory dirPath=$#get port port=“$1”if[!“$port”];Thenport=6379fi#创建数据目录mkdir-p“$dirPath”/data_“$port”#删除启动的服务containerId=$if[[“$containerId”]];Thenecho“正在删除服务:${containerId}”dockerrm-f${container Id}˃/dev/nullfi#正在启动服务dockerrun-itd-privilege=true-p“$port”:6379--nameredis_“$port”-v=“$dirPath”/conf/redis_”$port“.conf:/etc/redis/redis.conf-v=“$dirPath”/data_“$port”:/dataredis-redis-server/etc/redis/redis.conf sentinel.sh启动脚本文件#!

安装 Redis

执行命令

我的官方群点击此处

docker pull redis

部署方案

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

Docker 快速搭建主从 + 哨兵监控第1张

开始准备工作

 

目录结构

├── 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

  

效果图

 

 

Docker 快速搭建主从 + 哨兵监控第2张

 

启动 Sentinel 服务

sh scripts/sentinel.sh

  

效果图

 

 

Docker 快速搭建主从 + 哨兵监控第3张

 

手动停止主服务

  • 目前机器服务结构如下
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 主节点重新上线后将自动切换为从服务

 

更多学习内容请访问:

腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

免责声明:文章转载自《Docker 快速搭建主从 + 哨兵监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Maven 梳理 -多模块 vs 继承k8s中节点级别的日志下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

docker默认网段和主机网段冲突解决

一、 docker默认网卡docker0 172.17.0.0可能会与主机冲突,这时候需要修改docker默认分配的网段 1、修改/etc/docker/daemon.json文件,加入以下代码 {"default-address-pools":[{"base":"172.100.0.0/16","size":24}]} 其中上面的172.100.0.0/...

jenkins 新增节点的3种方式

1.通过ssh建立节点(在节点机子上要安装好jdk) (1)通过用户+密码建立ssh连接 (2)通过用户+密钥建立连接 2.通过jnlp,javaweb的方式连接 (1)创建好节点 (2)在节点的机子上,执行上面的语句,要安装好java,agent.jar 要放在节点机子上 3.通过Launch agent via execution of comman...

selenium+docker 遇到的问题

镜像3个   分别是   selenium/hub,selenium/node-firefox,selenium/node-chorme 出现错误:from unknown error: cannot determine loading status from tab crashed   (Session info: headless chrom 解决方法...

Docker 配置固定IP及桥接的实现方法(转载)

这篇文章主要介绍了Docker 配置固定IP和桥接的实现方法的相关资料,这里详细介绍了Docker 的四种网络模式及如何实现桥接的案例,需要的朋友可以参考下 docker默认使用bridge模式,通过网桥连接到宿主机,而容器内部的ip则从网桥所在的ip段取未用的ip。这样做一个不方便的地方在于容器内部的ip不是固定的,想要连接容器时只能通过映射到宿主...

Redis中算法之——Raft算法

  Sentinel系统选举领头的方法是对Raft算法的领头选举方法的实现。   在分布式系统中一致性是很重要的。1990年Leslie Lamport提出基于消息传递的一致性算法Paxos算法,解决分布式系统中就某个值或决议达成一致的问题。Paxos算法流程繁杂实现起来也比较复杂。   2013年斯坦福的Diego Ongaro、John Ousterh...

docker打包镜像,运行镜像命令,docker常用指令

dockerfile文件:解决图形验证码空指针异常 #FROM java:8FROM openjdk:8-jdk-alpineRUN set -xe && apk --no-cache add ttf-dejavu fontconfigARG JAR_FILECOPY ${JAR_FILE} app.jarEXPOSE xxxx端口号ENT...