简单dockerfile文件,用于演示sentinel哨兵故障转移
FROM centos:latest
MAINTAINER BIXIAOYU
RUN groupadd -r redis &&useradd -r -g redis redis
RUN yum -y update && yum -y install epel-release && yum -y install redis && yum -y install net-tools
EXPOSE 6379

# docker build --no-cache -t redis .

启动docker容器实例

docker run -itd --name redis-master --net=mynetwork -p 6383:6379 --ip 172.60.0.3 redis

docker run -itd --name redis-slave1 --net=mynetwork -p 6384:6379 --ip 172.60.0.4 redis

docker run -itd --name redis-slave2 --net=mynetwork -p 6385:6379 --ip 172.60.0.5 redis

docker run -itd --name redis-sentinel1 --net=mynetwork -p : --ip 172.60.0.5 redis

docker run -itd --name redis-sentinel2 --net=mynetwork -p : --ip 172.60.0.6 redis

docker run -itd --name redis-sentinel3 --net=mynetwork -p : --ip 172.60.0.7 redis

 #docker network create --subnet=172.60.0.0/16 mynetwork  

【配置】

先完成主从同步,主从同步的配置可参考https://www.cnblogs.com/bixiaoyu/p/10706811.html这篇文章,在此就不必细说了,重点是sentinel的配置

bind 0.0.0.0            #设置允许访问的IP,这里仍然设置0.0.0.0
protected-mode no #允许在连接时,密码为空
port
dir "/tmp"
sentinel myid 6d0d4099c13cdeab018e1f2005455be6f1cd6f6b
sentinel monitor mymaster 172.60.0.3 2 #设置监听
sentinel config-epoch mymaster
sentinel leader-epoch mymaster
logfile "/var/log/redis/sentinel.log"
sentinel known-slave mymaster 172.60.0.2
sentinel known-slave mymaster 172.60.0.4
sentinel known-sentinel mymaster 172.60.0.7 dfce433e021aa3e82276974aa12fa0684fb0b4f0
sentinel known-sentinel mymaster 172.60.0.6 ceb363cf84103950cfa2a785816c4e8a36c02143
sentinel current-epoch

 选择一个sentinel节点,查看日志信息,发现默认主节点为172.60.0.2

【测试故障转移】

先通过pkill模拟故障master故障宕机,随后观察哨兵任意节点的情况

我们可以从下面sentinel节点上看到172.0.0.3被选举成为新主节点

[root@ef77b61448fc /]# tail /var/log/redis/sentinel.log
:X Apr ::26.472 * +sentinel sentinel ceb363cf84103950cfa2a785816c4e8a36c02143 172.60.0.6 @ mymaster 172.60.0.2
:X Apr ::24.154 * +sentinel sentinel dfce433e021aa3e82276974aa12fa0684fb0b4f0 172.60.0.7 @ mymaster 172.60.0.2
:X Apr ::05.724 # +sdown master mymaster 172.60.0.2
:X Apr ::05.895 # +new-epoch
:X Apr ::05.895 # +vote-for-leader dfce433e021aa3e82276974aa12fa0684fb0b4f0
:X Apr ::06.276 # +config-update-from sentinel dfce433e021aa3e82276974aa12fa0684fb0b4f0 172.60.0.7 @ mymaster 172.60.0.2
:X Apr ::06.276 # +switch-master mymaster 172.60.0.2 172.60.0.3
:X Apr ::06.276 * +slave slave 172.60.0.4: 172.60.0.4 @ mymaster 172.60.0.3
:X Apr ::06.276 * +slave slave 172.60.0.2: 172.60.0.2 @ mymaster 172.60.0.3

查看sentinel节点的日志信息

此时,我们把pkill掉的172.60.0.2(旧主节点)重启,在看看新任Master主节点172.60.0.3有何变化

重启的旧主节点成为从节点并加入进来,此时正在进行复制动作,offset的偏移量还没有同步一致,

【小结】

进入哨兵节点客户端执行SENTINEL masterts命令显示被监控的所有master以及状态

127.0.0.1:> SENTINEL masters
) ) "name"
) "mymaster" #被监控主节点的名称
) "ip"
) "172.60.0.3" #被监控主节点的IP
) "port"
) ""
) "runid"
) "dd3696a2793e4e19892fca48793d75cec3f07bea" #被监控主节点的runid值
) "flags"
) "master"
) "link-pending-commands"
) ""
) "link-refcount"
) ""
) "last-ping-sent"
) ""
) "last-ok-ping-reply"
) ""
) "last-ping-reply"
) ""
) "down-after-milliseconds"
) "" #监控节点不可达超时时间
) "info-refresh"
) ""
) "role-reported"
) "master"
) "role-reported-time"
) ""
) "config-epoch"
) ""
) "num-slaves" #检测剩余slave节点个数
) ""
) "num-other-sentinels" #检测其它sentinel节点个数
) ""
) "quorum" #允许主节点不可用的sentinels的数量(最多允许两个sentinel节点故障)
) ""
) "failover-timeout" #延迟时间
) ""
) "parallel-syncs" #复制转移数量
) ""

 执行SENTINEL slaves mymastert查看从节点信息,此时你会看到两个从节点

)  ) "name"
) "172.60.0.2:6379"
) "ip"
) "172.60.0.2"
) "port"
) ""
) "runid"
) "3ede55439a3ce6fb1ab171ed7fd6b6c639725966"
) "flags"
) "slave"
) "link-pending-commands"
) ""
) "link-refcount"
) ""
) "last-ping-sent"
) ""
) "last-ok-ping-reply"
) ""
) "last-ping-reply"
) ""
) "down-after-milliseconds"
) ""
) "info-refresh"
) ""
) "role-reported"
) "slave"
) "role-reported-time"
) ""
) "master-link-down-time"
) ""
) "master-link-status"
) "ok"
) "master-host"
) "172.60.0.3"
) "master-port"
) ""
) "slave-priority"
) ""
) "slave-repl-offset"
) ""
) ) "name"
) "172.60.0.4:6379"
) "ip"
) "172.60.0.4"
) "port"
) ""
) "runid"
) "f17cfcfc4b9217e1f5a3c0d0a2c55d82da46c37e"
) "flags"
) "slave"
) "link-pending-commands"
) ""
) "link-refcount"
) ""
) "last-ping-sent"
) ""
) "last-ok-ping-reply"
) ""
) "last-ping-reply"
) ""
) "down-after-milliseconds"
) ""
) "info-refresh"
) ""
) "role-reported"
) "slave"
) "role-reported-time"
) ""
) "master-link-down-time"
) ""
) "master-link-status"
) "ok"
) "master-host"
) "172.60.0.3"
) "master-port"
) ""
) "slave-priority"
) ""
) "slave-repl-offset"
) ""

 查看主节点的端口

127.0.0.1:> sentinel get-master-addr-by-name mymaster
) "172.60.0.3"
) ""

执行sentinel failover mymaster命令,强制切换主节点!下图所示,发现主节点已经由172.60.0.3变为172.60.0.2了,

待更。。。。

基于docker实现哨兵集群部署的更多相关文章

  1. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

  2. 基于Docker的redis集群搭建

    Redis集群官方介绍:http://www.redis.cn/topics/cluster-tutorial.html 基于Docker搭建Redis集群 环境:6个节点,三主三从 制作Redis镜 ...

  3. Docker学习-Kubernetes - 集群部署

    Docker学习 Docker学习-VMware Workstation 本地多台虚拟机互通,主机网络互通搭建 Docker学习-Docker搭建Consul集群 Docker学习-简单的私有Dock ...

  4. 基于docker安装pxc集群

    基于docker安装pxc集群 一.PXC 集群的安装 PXC集群比较特殊,需要安装在 linux 或 Docker 之上.这里使用 Docker进行安装! Docker的镜像仓库中包含了 PXC数据 ...

  5. 基于docker搭建elasticsearch集群

    es集群的搭建 - 基于单机搭建elasticsearch集群见官网 https://www.elastic.co/guide/en/elasticsearch/reference/current/d ...

  6. 【Redis学习专题】- Redis主从+哨兵集群部署

    集群版本: redis-4.0.14 集群节点: 节点角色 IP redis-master 10.100.8.21 redis-slave1 10.100.8.22 redis-slave2 10.1 ...

  7. 基于pgpool搭建postgressql集群部署

    postgresql集群搭建 基于pgpool中间件实现postgresql一主多从集群部署,这里用两台服务器作一主一从示例 虚拟机名 IP 主从划分 THApps 192.168.1.31 主节点 ...

  8. 基于minikube的kubernetes集群部署及Vitess最佳实践

    简介 minikube是一个可以很容易在本地运行Kubernetes集群的工具, minikube在电脑上的虚拟机内运行单节点Kubernetes集群,可以很方便的供Kubernetes日常开发使用: ...

  9. 基于Docker的Consul集群实现服务发现

    服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的. ...

随机推荐

  1. 什么是MIPI

        随着客户要求手机摄像头像素越来越高同时要求高的传输速度传统的并口传输越来越受到挑战.提高并口传输的输出时钟是一个办法但会导致系统的EMC设计变得越来困难,增加传输线的位数是但是这又不符合小型化 ...

  2. C# 中的#if、#elif、#else、#endif等条件编译符号

    C#编译器遇到一个由#if和#endif包围起来的语句块时,会检查#if后面的符号是否已经被定义了,如果已经被定义,那么才会编译语句块之间的代码.而定义一个可以被#if测试的符号需要事先用#defin ...

  3. SQL随记(五)——函数篇

    1.SQL函数: (1)replace(String1,String2,String3):从String1字符串中找到String2,然后用String3替换String2 如:replace('ab ...

  4. 保护代理模式-Access Proxy(Java实现)

    保护代理模式-Access Proxy 保护代理模式(Access Proxy), 也叫Protect Proxy. 这种代理用于对真实对象的功能做一些访问限制, 在代理层做身份验证. 通过了验证, ...

  5. 深入理解Java自带的线程池和缓冲队列

    前言 线程池是什么 线程池的概念是初始化线程池时在池中创建空闲的线程,一但有工作任务,可直接使用线程池中的线程进行执行工作任务,任务执行完成后又返回线程池中成为空闲线程.使用线程池可以减少线程的创建和 ...

  6. 10、jstl标签库

    一.JSTL是SUN公司制定的一个JSP标签库,由apache jakarta组织负责维护的开源项目,目的是用标签代替java代码片段.JSTL 1.0 由四个定制标记库(core.format.xm ...

  7. Luogu P4204 神奇口袋 题解报告

    题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为a[i],每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. ...

  8. Python appium搭建app自动化测试环境

    appium做app自动化测试,环境搭建是比较麻烦的. 也是很多初学者在学习app自动化之时,花很多时间都难跨越的坎. 但没有成功的环境,就没有办法继续后续的使用. 在app自动化测试当中,我们主要是 ...

  9. html-webpack-plugin详解

    引言 我们来看看主要作用: 为html文件中引入的外部资源如script.link动态添加每次compile后的hash,防止引用缓存的外部文件问题 可以生成创建html入口文件,比如单页面可以生成一 ...

  10. java平台学习笔记

    java程序从编写源码开始到程序执行一共有三个阶段,编写期,编译期,运行期. 通常,人们都希望自己的程序更快(不仅仅是执行更快,也有编写更快),因此java在不断更新. java源码先通过javac编 ...