关于zookeeper和kafka不得不说的秘密

news2024/12/26 21:44:12

zookeeper简介

1. zookeeper的概述

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。

它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

2. Zookeeper的定义

Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。

3.Zookeeper的工作机制

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。

Zookeeper =文件系统+通知机制。

4. Zookeeper 的特点

(1) Zookeeper:一个领导者(Leader) ,多个跟随者(Follower) 组成的集群。

(2) Zookeepe集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。

(3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。

(4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行,即先进先出。

(5)数据更新原子性,一次数据更新要么成功,要么失败。

(6)实时性,在一定时间范围内,Client能读到最新数据。

Zookeeper的应用场景

提供的服务包括:统一命名服务、 统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

  1. 统一命名服务

在分布式环境下,经常需要对应用/服务进行统一命名, 便于识别。例如: IP不容易记住,而域名容易记住。

  1. 统一配置管理

分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。

配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper.上的一-个Znode。各个客户端服务器监听这个Znode。

一旦Znode中的数据被修改,ZooKeeper将 通知各个客户端服务器。

3. 统一集群管理

分布式环境中,实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。

ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化。

4. 服务器动态上下线

客户端能实时洞察到服务器上下线的变化。

5. 软负载均衡

在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。

zookeeper群集安装

主机内存要求2G,内存太小带不动,有条件的话多给点。

node-1

1.解压安装包到/usr/local/并改名为zookeeper

[root@node-1 ~]# tar zxf /media/zookeeper-3.4.9.tar.gz -C /usr/local/
[root@node-1 ~]# cd /usr/local
[root@node-1 local]# mv zookeeper-3.4.9/ zookeeper

2.修改配置

[root@node-1 local]# cd zookeeper/conf/
[root@node-1 conf]# cp zoo_sample.cfg zoo.cfg
[root@node-1 conf]# vim zoo.cfg
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
server.1=192.168.8.1:3188:3288
server.2=192.168.8.2:3188:3288
server.3=192.168.8.3:3188:3288
[root@node-1 conf]# cd /usr/local/zookeeper/
[root@node-1 zookeeper]# mkdir data logs
[root@node-1 zookeeper]# echo 1 > data/myid
[root@node-1 zookeeper]# cd
[root@node-1 ~]# /usr/local/zookeeper/bin/zkServer.sh start
[root@node-1 ~]# /usr/local/zookeeper/bin/zkServer.sh status

查看状态发现Error,这里表示虽说你的服务没开启,是因为群集状态未完成,等部署完另外两台后就可以查看状态了。

把本机的服务复制到node-2和node-3主机上,修改id启动即可。

[root@node-1 ~]# scp -rp /usr/local/zookeeper  root@192.168.8.2:/usr/local/
[root@node-1 ~]# scp -rp /usr/local/zookeeper  root@192.168.8.3:/usr/local/

node-2

[root@node-2 ~]# cd /usr/local/zookeeper/
[root@node-2 zookeeper]# echo 2 > data/myid
[root@node-2 zookeeper]# /usr/local/zookeeper/bin/zkServer.sh start 
[root@node-2 zookeeper]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader            //第二台查看状态为leader(主),那么现在查看node-1一定为follower(从)

node-3

[root@node-3 ~]# cd /usr/local/zookeeper/
[root@node-3 zookeeper]# echo 3 > data/myid
[root@node-3 zookeeper]# /usr/local/zookeeper/bin/zkServer.sh start 
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node-3 zookeeper]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower            //第三台也是follower(从)

以上就是关于zookeeper的配置。

消息队列介绍

1. 为什么需要消息队列(MQ)

主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发too many connection 错误,引发雪崩效应。

我们使用消息队列,通过异步处理请求,从而缓解系统的压力。消息队列常应用于异步处理,流量削峰,应用解耦,消息通讯等场景当前比较常见的MQ 中间件有 ActiveMQ、RabbitMQ、RocketMQ、Kafka等。

2. 使用消息队列的好处

(1)解耦

允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

(2)可恢复性

系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

(3)缓冲

有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

(4)灵活性 & 峰值处理能力

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

(5)异步通信很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制, 允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

3. 消息队列的两种模式

(1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)消息生产者生产消息发送到消息队列中, 然后消息消费者从消息队列中取出并且消费消息。 消息被消费以后, 消息队列中不再有存储,所以消息消费者不可能消费到已经被消费的消息。消息队列支持存在多个消费者, 但是对一个消息而言,只会有一个消费者可以消费。

(2)发布/订阅模式(一对多, 又叫观察者模式,消费者消费数据之后不会清除消息)

消息生产者(发布)将消息发布到topic 中,同时有多个消息消费者 (订阅)消费该消息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。发布/订阅模式是定义对象间一种—对多的依赖关系,使得每当一个对象 ( 目标对象)的状态发生改变, 则所有依赖干它的对象 (观察者对象)都会得到通知并自动更新。

Kafka相关介绍

1. Kafka定义

Kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ,Message Queue),主要应用于大数据实时处理领域。

2. Kafka简介

Kafka 是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 Zookeeper协调的分布式消息中间件系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于 hadoop的批处理系统、低延迟的实时系统、Spark/Flink 流式处理引擎,nginx 访问日志,消息服务等等,用 scala 语言编写, Linkedin 于 2010 年贡献给了 Apache 基金会并成为顶级开源项目。

3. Kafka的特性

(1)高吞吐量、低延迟

Kafka 每秒可以处理几十万条消息,它的延迟最低只有几毫秒。每个 topic 可以分多个 Partition,Consumer Group 对 Partition 进行消费操作,提高负载均衡能力和消费能力。

(2)可扩展性

kafka 集群支持热扩展

(3)持久性、可靠性

消息被持久化到本地磁盘,并且支持数据备份防止数据丢失

(4)容错性

允许集群中节点失败(多副本情况下,若副本数量为n,则允许 n-1 个节点失败)

(5)高并发

支持数干个客户端同时读写

安装kafka群集

kafka需要安装zookeeper,但是kafka集成zookeeper,再单机搭建的时候可以直接使用。

node-1

  1. 解压并改名

[root@node-1 ~]# tar zxf /media/kafka_2.11-2.2.1.tgz -C /usr/local/
[root@node-1 ~]# cd /usr/local/
[root@node-1 local]# mv kafka_2.11-2.2.1/ kafka

2.修改配置

[root@node-1 local]# cd kafka/config/
[root@node-1 config]# cp server.properties server.properties.bak    //养成文件备份的习惯
[root@node-1 config]# vim server.properties
broker.id=1
listeners=PLAINTEXT://192.168.8.1:9092
log.dirs=/usr/local/kafka/logs
zookeeper.connect=192.168.8.1:2181,192.168.8.2:2181,192.168.8.3:2181

3.复制kafka目录到其他服务器

[root@node-1 ~]# scp -rp /usr/local/kafka/ root@192.168.8.2:/usr/local
[root@node-1 ~]# scp -rp /usr/local/kafka/ root@192.168.8.3:/usr/local

node-2

[root@node-2 ~]# cd /usr/local/kafka/config/
[root@node-2 config]# vim server.properties
broker.id=2
listeners=PLAINTEXT://192.168.8.2:9092

node-3

[root@node-3 ~]# cd /usr/local/kafka/config/
[root@node-3 config]# vim server.properties
broker.id=3
listeners=PLAINTEXT://192.168.8.3:9092

kafka应用

三台服务器启动kafka服务,复制粘贴过去即可:

cd /usr/local/kafka/bin
./kafka-server-start.sh  ../config/server.properties   &

在第一台服务器发布消息,复制粘贴即可,需注意IP:

cd /usr/local/kafka/bin
./kafka-console-producer.sh --broker-list 192.168.8.1:9092,192.168.8.2:9092,192.168.8.3:9092 --topic test

下图中我在命令行中分别输入了hello、linux。

在第二台服务器订阅消息:

cd /usr/local/kafka/bin 
./kafka-console-consumer.sh --bootstrap-server 192.168.8.1:9092,192.168.8.2:9092,192.168.8.3:9092 --topic test --from-beginning

连接后可以在node-2看到这两条消息。

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

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

相关文章

【四】Netty 分隔符和定长解码器的应用

Netty 分隔符和定长解码器的应用理论说明LineBasedFrameDecoder 开发大概流程代码展示netty 依赖EchoServer 服务端启动类EchoServerHandlerEchoClientEchoClientHandler结果打印客户端打印服务端打印FixedLengthFrameDecoder 开发代码展示EchoServer 服务端启动类EchoFixServe…

【云原生】k8s之pod控制器

内容预知 前言 1.pod控制器的相关知识 1.1 pod控制器的作用 1.2 pod控制器的多种类型 1.3 pod容器中的有状态和无状态的对比 (1)有状态实例 (2)无状态实例 2.Deployment控制器 2.1 SatefulSet 控制器的运用 2.1 Sateful…

从0到1完成一个Vue后台管理项目(六、404页)

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

[LeetCode周赛复盘] 第 95 场周赛20230107

[LeetCode周赛复盘] 第 95 场周赛20230107 一、本周周赛总结二、 [Easy] 2525. 根据规则将箱子分类1. 题目描述2. 思路分析3. 代码实现三、[Medium] 2526. 找到数据流中的连续整数![在这里插入图片描述](https://img-blog.csdnimg.cn/237210adb20e457aaf2671e6e8f9e43b.png)2. …

Linux系统中C++多态和数据封装的基本方法

大家好,今天主要和大家分享一下,多态,数据封装的使用方法。 目录 第一:C中的多态 第二:C中数据封装方法 第一:C中的多态 C多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函…

将内核加载到内存

文章目录前言前置知识代码实验操作前言 本博客记录《操作系统真象还原》第五章第3个实验的操作~ 实验环境:ubuntu18.04VMware , Bochs下载安装 实验内容:将内核载入内存,初始化内核代码 实验原理 编写内核程序。将内核程序用dd命令复制到…

Odoo 16 企业版手册 - 库存管理之存储类别

存储类别 Odoo中的存储类别功能将允许您将许多存储位置分组到一个类别下。您可以在Odoo 库存管理模块中创建许多此类类别,这将有助于执行更智能的放置操作。在配置存储类别之前,您必须配置库存中可用的存储位置。然后,您可以将它们分组到一个…

LeetCode刷题模版:31 - 40

目录 简介31. 下一个排列32. 最长有效括号33. 搜索旋转排序数组34. 在排序数组中查找元素的第一个和最后一个位置35. 搜索插入位置36. 有效的数独37. 解数独38. 外观数列39. 组合总和40. 组合总和 II结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指…

电影解说开头怎么写吸引人?

电影解说开头怎么写吸引人?很多电影解说创作者文采不够好,开头不知道怎么写?毕竟想留住用户继续观看视频,开头是至关重要的,今天笔者就分享电影解说文案万能公式模板,让大家创作更简单!一个好的…

feature engnineering 特征工程

特征工程数值型变量standardizationlog_transformation(使其符合正态分布)polynomial features分类型变量orinigalencoderonehot encoder分类创造下的数值以下代码根据Abhishek Thakur在kaggle上的机器学习30天 (b站) (kaggle)可惜的是,我没有…

Oracle 19c VLDB and Partitioning Guide 第5章:管理和维护基于时间的信息 读书笔记

本文为Oracle 19c VLDB and Partitioning Guide第5章Managing and Maintaining Time-Based Information的读书笔记。 Oracle 数据库提供了基于时间管理和维护数据的策略。 本章讨论 Oracle 数据库中的组件,这些组件可以构建基于时间管理和维护数据的策略。 尽管大…

计算机网络复习之网络层

文章目录数据报与虚电路服务的对比IP 协议IP数据报格式IP地址NAT(网络地址转换)子网划分和子网掩码在支持子网划分的因特网中,路由器如何转发IP数据报无分类编制CIDR构成超网RIP协议OSPF协议ARP协议ICMP协议Ping和Traceroute参考路由选择是网…

Eclipse安装教程

Eclipse安装教程 目录一. 概述二. 下载eclipse三. 安装eclipse四. 使用eclipse。一. 概述 eclipse是针对java编程的集成开发环境,其设计思想是“一切皆插件”。就其本身而言,eclipse只是一个框架…

Hive表的创建,删除,修改

TBLPROPERTIES的主要作用是按键-值对的格式为表增加额外的文档说明。Hive会自动增加两个表属性:一个是last_modified_by,其保存着最后修改这个表的用户的用户名﹔另一个是 last_modified_time,其保存着最后一次修改的新纪元时间秒。用户还可以拷贝一张已…

数据的合并和分组聚合

一:字符串离散化的案列 对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据? 思路:重新构造一个全为0的数组,列名为分类,如果某一条数据中分类出现过,就让…

Java之class类

Class类 1.类图 2.Class类对象 系统创建 该class对象是通过类加载器ClassLoader的loadClass()方法生成对应类对应的class对象 通过debug可以追到该方法 3.对于某个类的class类对象 只加载一次 因为类值加载一次 类加载的时机 //1.创建对象实例的时候(new&#xf…

7-10 列车调度

火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车&am…

联合证券|道指狂拉700点!八大科技巨头市值暴涨1.3万亿!

本周最终一个交易日,美股三大指数收盘团体大涨。道指涨2.13%,标普500指数涨2.28%,纳斯达克指数涨2.56%。 大型科技股遍及走强,苹果、亚马逊涨超3%。特斯拉经历惊险一夜,股价盘初跌近8%后反弹,收盘涨幅超2%。…

上半年要写的博客,提前占坑1

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

第二章 创建数据集

2.1 数据集的概念 数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。表2-1提供了一个假想的病例数据集。 不同的行业对于数据集的行和列叫法不同。统计学家称它们为观(observation)和变量(variable&…