Zookeeper实现Master选举(哨兵机制)

10蚂蚁-分布式解决方案——3.ZooKeeper实现选举策略与哨兵机制 Zookeeper实现哨兵机制 master选举使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-salve模式,也就是常说的主从模式,正常情况下主机提供服务,备机负责监听主机状态,当主机异常时,可以自动切换到备机继续提供服务(这里有点儿类似于数据库主库跟备库,备机正常情况下只监听,不工作),这个切换过... 阅读详情

Zookeeper实现Master选举(哨兵机制)

master选举使用场景及结构

 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-salve模式,也就是常说的主从模式,正常情况下主机提供服务,备机负责监听主机状态,当主机异常时,可以自动切换到备机继续提供服务(这里有点儿类似于数据库主库跟备库,备机正常情况下只监听,不工作),这个切换过程中选出下一个主机的过程就是master选举。

对于以上提到的场景,传统的解决方式是采用一个备用节点,这个备用节点定期给当前主节点发送ping包,主节点收到ping包后会向备用节点发送应答ack,当备用节点收到应答,就认为主节点还活着,让它继续提供服务,否则就认为主节点挂掉了,自己将开始行使主节点职责。如图1所示:

 

使用Zookeeper实现服务master选举

        在哨兵机制中 只能一个主 多个从!

使用zk可以实现之!

 

  原理: 多个服务器在启动时候,会在Zookeeper上创建相同的临时节点,谁如果能够创建成功,谁就为主!(节点保证唯一)

           如果主服务器宕机,会话连接断开。临时节点删除。其他节点服务选举开始

 

 

 

   

 创建项目:

pom文件: 注意springboot 整合 zk的包

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.0.RELEASE</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.10</version>
			<exclusions>
				<exclusion>
					<artifactId>slf4j-api</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
				<exclusion>
					<artifactId>log4j</artifactId>
					<groupId>log4j</groupId>
				</exclusion>
				<exclusion>
					<artifactId>slf4j-log4j12</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>  

 后台controller

package com.toov5.zkMaster;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {
   @Value("${server.port}")
   private String serverPort;
   
   @RequestMapping("getServerInfo")
   public String getServerInfo(){
       return "serverPort"+serverPort+(ElectionMaster.isSurvival? "选举为主" :"选举为从");
   }

    public static void main(String[] args) {
        //1,项目启动的时候  在zk创建临时节点
        //2,谁能够创建成功谁就是主服务器
        //3,使用服务监听节点是否被删除,如果被删。 重新开始创建节点
        
    }
    
}

启动加载运行类

package com.toov5.zkMaster;

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationRunner implements ApplicationRunner{
      private ZkClient zkClient  =    new ZkClient("192.168.91.5:2181");
      private String path = "/election";
      @Value("${server.port}")
      private String serverPort;
    //启动后执行的方法
     public void run(ApplicationArguments args) throws Exception {  //重写这个方法
        System.out.println("项目启动成功!"); 
             //1,项目启动的时候  在zk创建临时节点
           createEphemeral();
            //2,谁能够创建成功谁就是主服务器
            //3,使用服务监听节点是否被删除,如果被删。 重新开始创建节点
        zkClient.subscribeDataChanges(path, new IZkDataListener() {
            //返回节点如果被删除后 返回通知
            public void handleDataDeleted(String arg0) throws Exception {
               //重新创建(选举)
                System.out.println("开始重新选举策略");
                 createEphemeral();
            }
            
            public void handleDataChange(String arg0, Object arg1) throws Exception {
                // TODO Auto-generated method stub
                
            }
        });
    }
    
    private void createEphemeral(){
       try {
       zkClient.createEphemeral(path); 
        System.out.println("serverport"+serverPort+",选举成功!");
        ElectionMaster.isSurvival=true; //标志位true  单个jvm共享
    } catch (Exception e) {
        System.out.println("该节点已经存在");
        ElectionMaster.isSurvival=false;
    }
    }
     
     
}

全局变量

package com.toov5.zkMaster;

public class ElectionMaster {
     //服务器info信息 是否存活
    public static boolean isSurvival;  //静态的 标志下 服务器是否还存活
}

运行类

package com.toov5.zkMaster;

public class ElectionMaster {
     //服务器info信息 是否存活
    public static boolean isSurvival;  //静态的 标志下 服务器是否还存活
}

yml:

server:
  port: 8088

 

运行,启动两个端口

一个主 一个从 

然后关掉主,重新选举从(需要等待一段时间,强制关闭有延迟的)

 

 

 

 

zookeeperMaster选举以及数据同步代码 改代码主要功能能是完成通过zookeeper同步mysql数据,具体的介绍可以参考博文zookeeperMaster选举以及数据同步 立即下载

相关推荐

python多线程实现http代理

python多线程实现http代理文章要求1.py socket模块2.py threading模块3.环境搭建3.1设置代理3.2搭建http简单服务器代码分析1.完整代码2.逻辑结构 文章要求 1.py socket模块 socket模块接触后很简单,我实现的是阻塞性的套接字。 需要了解到,连接套接字,监听套接字,和套接字accept()方法的返回值是元组 数据传递过程sock.recv(1024),sock.send()也不需要转换编码,直接以b"二进制流"传输 2.py threading模块 th

qq_43402663的博客 2508

zookeeper之master选举代码实现

master选举的基本概念: (1)假设有一个系统A,它向外提供了一个服务,叫做服务B。并且这个服务需要24小时持续不断的向外提供。也就是提供服务的机器不能够有单点故障。于是我们考虑使用集群。 (2)我们采用的是master-slave的方式。集群中有一台主机,多台备机。由主机向外提供服务,备机负责监听主机的状态。一旦出现了宕机,备机必须要很迅速的接管主机。继续向外服务。在这个过程中,由备机选出...

li12412414的博客 1220

PostgreSQL高可用之主备复制

多个PostgreSQL可协同工作,如果主库发生宕机备库将迅速进行接管并对外提供服务以实现高可用。本文将从主备复制、主备切换、故障转移等角度进行实际测试演练。第一章主备复制是基础,通过主备复制可以得到一个或多个相同的实例。在主备复制的基础上通过第二章主备切换介绍了如何手工将主库与备库互换角色。在第三章中,采用了Keepalived进行实时监测,在主库宕机后,使用主备切换中提到的命令使备库升级为主库并对外提供服务,以达到PostgreSQL高可用的目标。

asdasdsaff的博客 1348

ZooKeeper - Master选举

在分布式系统中,经常会碰到这样的场景:对于一个复杂的任务,仅需要从集群中选举出一台进行处理即可。诸如此类的分布式问题,我们统称为 “Master 选举” ,借助 ZooKeeper,我们可以比较方便的实现 Master选举的功能,其大体思路非常简单: 选择一个根节点,例如 /master_select ,多台机器同时向该节点创建一个 子节点 /master_select/lock,利用 Zoo...

TrustNature 377

汽车OTA安全启动:ECU双验签机制与实战排障指南

汽车OTA升级中的安全启动,本质是基于密码学的信任建立过程,其核心在于ECU上电时对固件镜像的可信验证。该机制依托硬件信任根(Secure Boot ROM),通过RSA/ECDSA等非对称算法完成签名验签,确保升级包未被篡改且来源可信。技术价值体现在防止恶意固件注入、支撑功能安全(ASIL)与信息安全(ISO/SAE 21434)合规。典型应用场景包括4S店远程升级、BMS控制器固件更新及多ECU协同启动。实践中,验签名失败往往源于证书链断裂、Flash布局错位或KeyUsage字段不匹配等底层工程细节,

weixin_29314405的博客 77

别再手动点按钮了!用C#给PowerMill做个自动化小助手(附完整源码)

本文详细介绍了如何使用C#进行PowerMill二次开发,打造自动化助手以提升CAM工程师的工作效率。通过实战案例和完整源码,展示了从环境配置到核心功能实现的完整流程,包括智能连接模块、项目批量处理器和刀路智能分析器等高级功能开发。

weixin_26899659的博客 347

zookeeper的选举机制

但Eureka中,集群是对等的,地位是相同的,虽不能保证一致性,但至少可以提供注册服务。对于ZK1而言,它的投票是(1, 0),接收ZK2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时ZK2的myid最大,于是ZK2胜。配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。,同一轮投票过程中的逻辑时钟值是相同的。组成的服务器集群为例。

m0_37047995的博客 657

SECS/GEM协议库及开源代码

以下是在开发SECS/GEM协议过程中,在网络上搜集协议实现资源,希望对SECS/GEM协议感兴趣的同学能有所帮助。 开源代码 freesecs FREESECS 是一个开源的SEMI SECS协议库,采用C++语言实现,可运行于Linux, MacOS X, NetBSD。 实现协议:E37.1、E5 开源地址:freesecs download | SourceForge.net 下载地址:https://download.youkuaiyun.com/download/BT_LEO/24305429

码农的历程 9944

zookeeper系列(二)实战master选举

zookeeper系列(一)zookeeper必知zookeeper系列(二)实战master选举zookeeper系列(三)实战数据发布订阅zookeeper系列(四)实战负载均衡zookeeper系列(五)实战分布式锁zookeeper系列(六)实战分布式队列zookeeper系列(七)实战分布式命名服务zookeeper系列(八)z...

weixin_34176694的博客 289

Remote ID的调制解调FPGA实现

Remote ID源于航空安全需求,例如在无人机密集区域实现设备跟踪和防碰撞。它类似于航空领域的ADS-B系统,但针对低空飞行器。Remote ID系统通常工作在特定频段(如2.4 GHz或5.8 GHz),通过无线链路广播数据包,包含设备ID、经纬度、高度和速度等信息。调制解调过程确保这些数据在噪声环境中可靠传输。例如,标准如ASTM F3411定义了Remote ID的协议框架,其中调制解调是关键物理层组件。

yulongfenghu的博客 1506

Windows11安装Ubuntu 20.04.3 LTS双系统(详细过程)

一、基础环境 听说BIOS模式的传统MBR模式和新式UEFI模式,会对安装双系统产生影响。Windows11应该都是UEFI吧,可以按win+r输入msinfo32回车确认查看BIOS模式,我的电脑是UEFI+双硬盘 Ubuntu安装准备 1、 官网下载Ubuntu 20.04.3 LTS镜像iso文件:https://ubuntu.com/download/desktop 2、 下载官网推荐的U盘启动制作工具rufus: https://rufus.ie/ 3、制作启动u盘 插入U盘, 运行 rufu

学习随笔 9万+

Zookeeper应用场景(四) Master选举

分布式最核⼼的特性就是将具有独⽴计算能⼒的系统单元部署在不同的机器上,构成⼀个完整的分布式系统。⽽与此同时,实际场景中往往也需要在这些分布在不同机器上的独立系统单元中选出⼀个所谓的**老大(Master)**。.........

脑细胞:-D的博客 578

【YOLO目标检测全栈实战】68 模型量化:从FP32到INT8,精度不掉,速度翻倍

摘要: 模型量化能显著提升推理速度(如YOLOv5s帧率从15FPS提升至38FPS),但需避免三大误区:1)校准集需覆盖实际场景,而非随机采样;2)敏感层(如检测头)应保留FP32精度;3)预处理必须与量化前后一致。通过混合精度量化(Backbone用INT8,检测头用FP32)和逐通道量化,可实现<1%的mAP损失。关键步骤包括校准数据准备、量化感知训练及逐层精度评估,最终在Jetson Nano等边缘设备上实现速度与精度的平衡。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 146

基于Zookeeper实现服务Master选举(哨兵机制)

一、master选举使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-salve模式,也就是常说的主从模式,正常情况下主机提供服务,备机负责监听主机状态,当主机异常时,可以自动切换到备机继续提供服务(这里有点儿类似于数据库主库跟备库,备机正常情况下只监听,不工作),这个切换过程中选出下...

小尾寒羊的博客 1012

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

分布式-Zookeeper解决分布式Session一致性问题、实现哨兵机制(Master选举)

一、聊一聊Session 1.1、什么是Session Session是客户端与服务器通讯会话技术,比如浏览器登录、记录整个浏览会话信息 1.2、Session实现原理 客户端向服务器发送请求后,Session创建在服务器端,返回SessionId给客户端浏览器保存在本地,当下次再发送请求时,在请求头中传递sessionid获取对应的从服务器上获取对用的session。 1.3、Se...

RuiKe的博客 696

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Zookeeper】实现哨兵机制(选举策略)

一、Master选举使用场景及结构 二、代码实现 2.1 Maven依赖信息 2.2 IndexController 2.3 MyApplicationRunner 2.4 ElectionMaster 一、Master选举使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在...

diaolin2115的博客 562

64-分布式协调工具-ZooKeeper实现选举策略与哨兵机制

文章目录1. zookeeper实现master选举2. Zookeeper实现哨兵机制代码 1. zookeeper实现master选举 2. Zookeeper实现哨兵机制代码 @Component public class MyApplicationRunner implements ApplicationRunner { // 创建zk连接 ZkClient zkClient = ...

weixin_43594483的博客 409

Zookeeper实现哨兵机制

master选举使用场景及结构  现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-salve模式,也就是常说的主从模式,正常情况下主机提供服务,备机负责监听主机状态,当主机异常时,可以自动切换到备机继续提供服务(这里有点儿类似于数据库主库跟备库,备机正常情况下只监听,不工作),这个切换过程中选出下一个主机的过程就是m...

selt791的博客 849

分布式系列教程(12) -分布式协调工具Zookeeper(选举与哨兵机制)

代码已上传到Github,有兴趣的同学可以下载来看看(git版本号:45eb8ccf3ebe3872194dd7161eaf41780207a8a7):https://github.com/ylw-github/Zookeeper-Demo 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-salve模式,也就是常说的...

阿甘兄 632

zookeeper学习

什么是ZooKeeper ZooKeeper是Java语言编写的开源框架,用以协调分布式的一个工具。 ZooKeeper存储结构与特性 类似于树形结构,同一层节点名称不能重复。节点类型分为临时节点与持久节点 Zookeeper以节点方式进行存储,类似于xml树状结构; a、节点又分为节点名称(全路径不能重复)和 节点值 b、节点类型有持久节点(持久化在硬盘上)和临时节点(会话...

笙箫的博客 908

zookeeper的结构、选举机制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33887443的博客 146

Redis--哨兵机制与CAP定理

对于master的宕机之后的冷处理是无法实现高可用的。Redis2.6开始提供高可用的解决方案--Sentinel 哨兵机制。在Redis集群中增加一个节点,充当Sentinel哨兵,用来监视master运行状态,在master宕机后,自动指定一个slave充当新的master,整个过程无需人工参与,由哨兵自动完成。但是,如果这个Sentinel哨兵发生故障,整个集群就会瘫痪,这要怎么解决?为Sentinel 创建一个集群,一个哨兵宕机,不会影响整个Redis集群的运行。

zHT0x0g2d的博客 180

Redis哨兵机制

什么是哨兵机制 Redis的哨兵(sentinel)系统用于管理多个Redis服务器,该系统执行以下三个任务: ·监控(Monitoring):哨兵(sentinel)会不断地检查你的Master和Slave是否运作正常。 ·提醒(Notification):当被监控的某个Redis出现问题时,哨兵(sentinel)可以通过API向管理员...

Leon_Jinhai_Sun的博客 163
上一篇: 分布式session之token解决方案实现
下一篇: Zookeeper集群
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值