zookeeper集群(很少用)+kafka集群(常用)

news2024/11/20 6:16:52

一、zookeeper

zookeeper+kafka(2.7.0版本)

kafka(3.4.1版本)不依赖于zookeeper

1、定义:zookeeper开源,分布式架构,提供协调服务(Apache项目),基于观察者模式涉及的分布式服务管理架构。作用:存储和管理数据,分布式节点上的服务接受观察者的注册,一旦分布式节点上的数据发生变化,由zookeeper来负责通知分布式节点上的服务

2、特点:zookeeper分为领导者(leader)和追随者(follower)。只要有一般以上的集群存活,zookeeper集群就可以正常工作,适用于安装奇数台的服务器集群;全局数据一致,每个zookeeper节点都保存相同的数据

3、主要作用

(1)维护监控服务器的数据一致,每个zookeeper节点都保存相同的数据;

(2)数据更新的原子性,要么全成功,要么全失败;

(3)实时性,只要有变化,立刻同步

4、应用场景(记)

(1)统一命名服务:在分布式环境下,对所有的应用和服务进行统一命名

(2)统一配置管理(配置文件同步):假设kafka的配置文件被修改,可以快速同步到其他节点

(3)统一集群管理★★★:实时掌握所有节点的状态

(4)服务器动态上下线

(5)实现服务在均衡:将访问服务器的数据发送到访问最少的服务器,来处理客户端的请求

5、选举机制

以三台服务器为例:A B C

第一步:A先启动,发起第一次选举,投票给自己,只有1票,不满足半数,此时A是looking状态

第二步:B启动,再发起一次选举,A和B分别投自己一票,交换选票信息,A发现B的myid比自己大,A的这1票会转投给B,此时B2票,A1票,还是不满足半数,A和B都是looking状态

B可能成为leader,C直接成为follower,如果B没有成为leader,那么执行第三步

特殊情况:

①leader已存在,建立连接即可

②leader不存在,服务器ID大的胜出

服务器ID:zookeeper集群中的机器都有一个ID,和myid保持一致

③epoch大,直接胜出

epoch:每个leader任期的代号,如果没有leader代号,大家的逻辑地位相同,但是每投完一次之后,数据递增

④epoch相同,事务ID大的胜出

事务ID:用来标识服务器的每一次变更,每变更一次,事务ID变化一次

第三步:C启动,若C的myid最大,A和B都会把票投给C,此时A—0票,B—0票,C—3票,C的状态变为leader,A和B变为follower

只有leader确定,后续的服务器都是追随者,无论myid大小

只有两种情况重新开启选举机制:

①初始化的情况下产生选举

②服务器之间和leader丢失连接状态

二、消息队列kafka(重要)

1、为什么要引入消息队列(MQ)?

kafka是一个中间件,负责发消息。在高并发环境下,同步请求来不及处理,会形成阻塞。比如,数据库会形成表锁或行锁。请求线程超标,会出现错误too many connection,整个系统崩溃(系统雪崩)

客户端————kafka————服务端

2、消息队列的作用

(1)异步处理请求(留一个延迟时间)

(2)流量削峰

(3)应用解耦

4可恢复性

5缓冲机制

(6)峰值处理能力

(7)异步通信★★★

2、消息队列的模式

(1)点对点模式(一对一模式)

消息的产生者发送消息到队列中,消费者从队列中提取消息,消费者提取完消息后,队列中的消息将会被移除,后续消费者不能再消费队列中的消息。消息队列可以有多个消费者,但是一个消息只能由一个消费者提取(举例:rabbitmq)

(2)发布和订阅模式(一对多、观察者模式)

生产者发布一个消息到主题(topic)中,所有消费者都是通过主题获取消息,消费者提取数据后,队列中的消息不会被移除

主题:topic,类似于一个数据流管道,生产者把消息发布到主题,消费者从主题中订阅数据(获取数据),每个主题可以分成多个分区,每个分区有自己的偏移量。kafka默认不允许删除主题(可以理解成微信群)

分区:partition,每个主题可以分成多个分区,每个分区是数据有序子集,分区可以允许kafka进行水平拓展,以处理大量数据,消息在分区中按照偏移量存储,消费者可以独立读取每个分区的数据【人为创建】(可以理解成备份)

偏移量:是每个消息在分区中的唯一标识,消费者通过偏移量来跟踪、获取、已读、未读消息的位置;也可以通过提交偏移量记录已处理的信息——指示消费者到底要获取哪个位置的数据(可以理解成微信群中的聊天时间)

分区数量越多,存储数据越多,处理并发能力越强

获取消息的两种方式:

①begin:从头开始获取所有【常用】

②实时获取,只消费后续产生的消息【常用】

③指定偏移量消费【代码实现】

生产者:producer,生产者把数据发送到kafka的主题中,负责写入消息

消费者:consumer,从主题中读取数据,消费者是一个或多个,每个消费者都有一个唯一的消费者组ID,kafka通过消费者实现负载均衡和容错

3、kafka的工作流程

至少一次语义:只要消费者进入,确保消息至少被消费一次

三、zookeeper+kafka实验

实验目的:监控所有服务器上的数据一致

实验条件:

主机名

IP地址

组件

硬件条件

(最少)

test1

20.0.0.10

zookeeper+kafka(2.7.0版本)

2核4G

test2

20.0.0.20

zookeeper+kafka(2.7.0版本)

2核4G

test3

20.0.0.30

zookeeper+kafka(2.7.0版本)

2核4G

实验步骤:

1、部署zookeeper【所有服务器】

(1)升级java环境

yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

(2)解zookeeper安装包,改名

(3)修改zookeeper配置文件

1,2,3表示每个zookeeper集群的初始myid【自定义】

3188表示领导者和追随者之间交换信息的端口(内部通信的端口)

3288表示一旦leader丢失响应,重新开启选举的端口(选举端口—互相通知选票信息的端口)

(4)创建目录【已在配置文件中自定义】

(5)给集群中的每台服务器分配myid

test1

test2

test3

(6)启动脚本【所有服务器】

1)创建脚本文件

2)赋权脚本文件

chmod +x /etc/init.d/zookeeper

3)添加到系统服务中,让系统识别

chkconfig --add zookeeper

4)依次启动zookeeper,查看leader和follower状态

启动service zookeeper start

查看service zookeeper status

①第一次先启动test1

②第二次启动test2

此时再次查看test1的状态,选举完成后test1自动变为follower

③第三次启动test3

选举完成,2票大于1票,即便test3启动,leader也不会改变

2、部署kafka【所有服务器】

(1)升级java环境

yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

(2)解kafka压缩包

(3)声明kafka环境变量

添加

export KAFKA_HOME=/opt/kafka

export PATH=$PATH:$KAFKA_HOME/bin

(4)修改kafka的配置文件

test1

test2

test3

(5)创建kafka的启动脚本【所有服务器】

①赋权脚本chmod +x /etc/init.d/kafka

②添加系统命令,让系统识别chkconfig --add kafka

③启动kafka

kafka的默认端口号9092

(6)主机映射

【注意:在kafka的bin目录下创建,bin是kafka所有可执行命令文件】

(7)创建主题topic

【在任意一台服务器上创建主题即可,所有服务器都可使用这个主题】

kafka-topics.sh --create --zookeeper 20.0.0.10:2181,20.0.0.20:2181,20.0.0.30:2181 --replication-factor 2 --partitions 3 --topic yyy

①查看所有主题topic详情

②查看指定主题topic详情

(8)发布消息

test1发布

(9)消费(订阅)

test2消费

①实时同步

②begin同步

test3也能同步获取消息

(10)不同主机订阅不同主题

①test3创建主题mmm

test3创建主题nnn

②test2在mmm主题上发布消息

test1订阅主题mmm

③test2在nnn主题上发布消息

test1订阅mmm

结论:主题之间互相隔离

(11)修改分区数

(12)删除主题【kafka机制默认不能删除主题】

(13)查看内部保存的元数据信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1269583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】把歌词里的播放时间跟歌词提取出来

一,介绍 给到一个字符串,里面包含了时间(唱该歌词的时间以及该歌词)例如“[02:16.33][04:11.44][05:11.44]我想大声宣布对你依依不舍”,如何把两者都给打印出来呢?下面给出解释 二,代码 #incl…

<蓝桥杯软件赛>零基础备赛20周--第8周第1讲--十大排序

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周(读者可以按…

fastadmin 如何引入自己的js

在需要的界面中&#xff1a;如何实例说明&#xff1a; 中<script> function zhuruJs(url) { let temp document.createElement( script ); temp.setAttribute( type, text/javascript" );temp.src urL; document.head . appendChild(temp); zhuruJs(location…

轻松愉悦的验证方式:实现图片旋转验证功能

说在前面 在当今互联网时代&#xff0c;随着技术的不断进步&#xff0c;传统的验证码验证方式已经无法满足对安全性和用户体验的需求。为了应对日益狡猾的机器人和恶意攻击&#xff0c;许多网站和应用程序开始引入图形验证码&#xff0c;其中一种备受欢迎的形式就是图片旋转验证…

springmvc实验(三)——请求映射

【知识要点】 方法映射概念 所谓的方法映射就是将前端发送的请求地址和后端提供的服务方法进行关联。在springMVC框架中主要使用Controller和RequestMapping两个注解符&#xff0c;实现请求和方法精准匹配。注解符Controller Spring中包含了一个Controller接口&#xff0c;但是…

【C/C++笔试练习】this指针的概念、初始化列表、const对象调用、构造和析构函数、继承和组合、重载和多态、虚函数的定义、计算日期到天数转换、幸运的袋子

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;this指针的概念&#xff08;2&#xff09;初始化列表&#xff08;3&#xff09;const对象调用&#xff08;4&#xff09;构造和析构函数&#xff08;5&#xff09;继承和组合&#xff08;6&#xff09;重载和多态&#x…

七天.NET 8操作SQLite入门到实战 - 第四天EasySQLite前后端项目框架搭建

前言 今天的主要任务是快速下载并安装.NET 8 SDK&#xff0c;搭建EasySQLite的前后端框架。 .NET 8 介绍 .NET 8 是 .NET 7 的后继版本。 它将作为长期支持 (LTS) 版本得到三年的支持。 使用技术栈和开发环境 咱们的.NET 8操作SQLite入门到实战教程主要使用技术栈为如下所示…

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…

Java---抽象类讲解

文章目录 1. 抽象类概述2. 抽象类特点3. 抽象类的成员特点4. 抽象类猫狗应用 1. 抽象类概述 在Java中&#xff0c;一个没有方法体的方法应该定义为抽象方法&#xff1b;而类中如果有抽象方法&#xff0c;该类必须定义为抽象类。 2. 抽象类特点 1. 抽象类和抽象方法必须使用abst…

RabbitMQ消息模型之Routing-Topic

Routing Topic Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符&#xff01;这种模型Routingkey一般都是由一个或多个单词组成&#xff0c;多个单词之间以”…

vscode非常好用的扩展插件

1、Code Spell Checker&#xff1a; 帮助我们检查单词是否拼写错误&#xff0c;检查规则遵循驼峰拼写法。 2、Color Highlight&#xff1a;高亮显示颜色值 3、Svg Preview&#xff1a; 实时预览svg图片&#xff08;修改width、height、fill等值来实时查看效果&#xff09; 4、…

统信桌面版arm系统安装火狐浏览器和浏览器驱动

一、系统信息 二、下载浏览器和驱动 1、浏览器 https://security.debian.org/debian-security/pool/updates/main/f/firefox-esr/firefox-esr_115.5.0esr-1~deb10u1_arm64.deb 2、驱动 https://github.com/mozilla/geckodriver/releases geckodriver-v0.33.0-linux-aarch6…

pip安装python包(pytorch)时遇到超时现象的通用解决方案

最近在使用服务器配置pytorch环境的时候&#xff0c;遇到了极为恼火的事情&#xff0c;使用pytorch官方的命令来下载GPU版本的pytorch总会是不是下载到一半就会崩溃&#xff0c;然而pip下载并不会断点续传&#xff08;什么时候能出这个功能啊喂&#xff01;&#xff09;。每次下…

字节10年经验之谈 —— 从0到1开发自动化测试框架!

一、序言 随着项目版本的快速迭代、APP测试有以下几个特点&#xff1a; 首先&#xff0c;功能点多且细&#xff0c;测试工作量大&#xff0c;容易遗漏&#xff1b;其次&#xff0c;代码模块常改动&#xff0c;回归测试很频繁&#xff0c;测试重复低效&#xff1b;最后&#x…

【Node.js】笔记整理 3 -npm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

Android修行手册 - 一篇文章从0到1搞一个Android Studio插件。

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

Web安全漏洞分析-XSS(上)

随着互联网的迅猛发展&#xff0c;Web应用的普及程度也愈发广泛。然而&#xff0c;随之而来的是各种安全威胁的不断涌现&#xff0c;其中最为常见而危险的之一就是跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;。XSS攻击一直以来都是Web安全领…

一次Apollo Client升级导致的生产404 Not Found问题排查记录

概述 本文记录一次升级Apollo Client组件到1.7.0后遇到的重大生产事故。只想看结论的&#xff0c;可直接快进到文末。实际上&#xff0c;第一句话就是一个结论。 另&#xff0c;本文行文思路事后看起来可行略显思路清晰&#xff0c;实际上排查生产问题时如无头苍蝇&#xff0…

初学者如何入门深度学习:以手写数字字符识别为例看AI 的学习路径,一图胜千言!

文章大纲 深度神经网络机器学习,深度学习,数据发掘之间的关系理解深度神经网络最好的可视化工具深度学习基础概念能解决神马种类的问题?卷积池化以手写字符识别为例讲述深度学习的分类问题MNIST 数据集简介初学者入门 :生成式 AI -- generative-ai-for-beginners参考文献与…

【Web端CAD/CAE文字标注】webgl+canvas 2d实现文字标注功能

一、需求背景 在CAD/CAE领域经常会遇到显示节点编号这种需求&#xff0c;效果如下图&#xff1a; 本文介绍如何在WebGL中实现文字的显示&#xff0c;对于如何在OpenGL中实现请绕路。 二、实现原理 Canvas是HTML5提供的元素&#xff0c;用于在网页上绘制图形&#xff0c;其支…