成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

帶你一文入門 Kafka

大數(shù)據(jù) Kafka
溫故而知新,反復(fù)學(xué)習(xí)優(yōu)秀的框架,定有所獲。因?yàn)楣ぷ髟颍枰玫?Kafka 的特殊場(chǎng)景,周末再次閱讀了 kafka 的資料,收獲不少。

作者:ninetyhe,騰訊 CDG 后臺(tái)開發(fā)工程師

溫故而知新,反復(fù)學(xué)習(xí)優(yōu)秀的框架,定有所獲。因?yàn)楣ぷ髟颍枰玫?Kafka 的特殊場(chǎng)景,周末再次閱讀了 kafka 的資料,收獲不少。

應(yīng)用場(chǎng)景

  • 異步解構(gòu):在上下游沒有強(qiáng)依賴的業(yè)務(wù)關(guān)系或針對(duì)單次請(qǐng)求不需要立刻處理的業(yè)務(wù);
  • 系統(tǒng)緩沖:有利于解決服務(wù)系統(tǒng)的吞吐量不一致的情況,尤其對(duì)處理速度較慢的服務(wù)來說起到緩沖作用;
  • 消峰作用:對(duì)于短時(shí)間偶現(xiàn)的極端流量,對(duì)后端的服務(wù)可以啟動(dòng)保護(hù)作用;
  • 數(shù)據(jù)流處理:集成 spark 做實(shí)事數(shù)據(jù)流處理。

Kafka 拓?fù)鋱D(多副本機(jī)制)

由上圖我們可以發(fā)現(xiàn) Kafka 是分布式,同時(shí)對(duì)于每一個(gè)分區(qū)都存在多副本,同時(shí)整個(gè)集群的管理都通過 zookeeper 管理。

Kafka 核心組件

broker

Kafka 服務(wù)器,負(fù)責(zé)消息存儲(chǔ)和轉(zhuǎn)發(fā);一 broker 就代表一個(gè) kafka 節(jié)點(diǎn)。一個(gè) broker 可以包含多個(gè) topic

topic

消息類別,Kafka 按照 topic 來分類消息

partition

  • topic 的分區(qū),一個(gè) topic 可以包含多個(gè) partition,topic 消息保存在各個(gè) partition 上;由于一個(gè) topic 能被分到多個(gè)分區(qū)上,給 kafka 提供給了并行的處理能力,這也正是 kafka 高吞吐的原因之一。
  • partition 物理上由多個(gè) segment 文件組成,每個(gè) segment 大小相等,順序讀寫(這也是 kafka 比較快的原因之一,不需要隨機(jī)寫)。每個(gè) Segment 數(shù)據(jù)文件以該段中最小的 offset ,文件擴(kuò)展名為.log。當(dāng)查找 offset 的 Message 的時(shí)候,通過二分查找快找到 Message 所處于的 Segment 中。

offset

  • 消息在日志中的位置,可以理解是消息在 partition 上的偏移量,也是代表該消息的唯一序號(hào)。
  • 同時(shí)也是主從之間的需要同步的信息。

Producer

生產(chǎn)者,負(fù)責(zé)向 Kafka Broker 發(fā)消息的客戶端

Consumer

消息消者,負(fù)責(zé)消費(fèi) Kafka Broker 中的消息

Consumer Group

消費(fèi)者組,每個(gè) Consumer 必須屬于一個(gè) group;(注意的是 一個(gè)分區(qū)只能由組內(nèi)一個(gè)消費(fèi)者消費(fèi),消費(fèi)者組之間互不影響。)

Zookeeper

管理 kafka 集群,負(fù)責(zé)存儲(chǔ)了集群 broker、topic、partition 等 meta 數(shù)據(jù)存儲(chǔ),同時(shí)也負(fù)責(zé) broker 故障發(fā)現(xiàn),partition leader 選舉,負(fù)載均衡等功能。

服務(wù)治理既然 Kafka 是分布式的發(fā)布/訂閱系統(tǒng),這樣如果做的集群之間數(shù)據(jù)同步和一致性,kafka 是不是肯定不會(huì)丟消息呢?以及宕機(jī)的時(shí)候如果進(jìn)行 Leader 選舉呢?

數(shù)據(jù)同步

在 Kafka 中的 Partition 有一個(gè) leader 與多個(gè) follower,producer 往某個(gè) Partition 中寫入數(shù)據(jù)是,只會(huì)往 leader 中寫入數(shù)據(jù),然后數(shù)據(jù)才會(huì)被復(fù)制進(jìn)其他的 Replica 中。而每一個(gè) follower 可以理解成一個(gè)消費(fèi)者,定期去 leader 去拉去消息。而只有數(shù)據(jù)同步了后,kafka 才會(huì)給生產(chǎn)者返回一個(gè) ACK 告知消息已經(jīng)存儲(chǔ)落地了。

ISR

在 Kafka 中,為了保證性能,Kafka 不會(huì)采用強(qiáng)一致性的方式來同步主從的數(shù)據(jù)。而是維護(hù)了一個(gè):in-sync Replica 的列表,Leader 不需要等待所有 Follower 都完成同步,只要在 ISR 中的 Follower 完成數(shù)據(jù)同步就可以發(fā)送 ack 給生產(chǎn)者即可認(rèn)為消息同步完成。同時(shí)如果發(fā)現(xiàn) ISR 里面某一個(gè) follower 落后太多的話,就會(huì)把它剔除。

具體流程如下:

 

 

 

 

 

 


 

上述的做法并無法保證 kafka 一定不丟消息。 雖然 Kafka 通過多副本機(jī)制中最大限度保證消息不會(huì)丟失,但是如果數(shù)據(jù)已經(jīng)寫入系統(tǒng) page cache 中但是還沒來得及刷入磁盤,此時(shí)突然機(jī)器宕機(jī)或者掉電,那消息自然而然的就會(huì)丟失。

Kafka 故障恢復(fù)

Kafka 通過 Zookeeper 連坐集群的管理,所以這里的選舉機(jī)制采用的是 Zab(zookeeper 使用)。

  • 生產(chǎn)者發(fā)生消息給 leader,這個(gè)時(shí)候 leader 完成數(shù)據(jù)存儲(chǔ),突然發(fā)生故障,沒有給 producer 返回 ack;
  • 通過 ZK 選舉,其中一個(gè) follower 成為 leader,這個(gè)時(shí)候 producer 重新請(qǐng)求新的 leader,并存儲(chǔ)數(shù)據(jù)。

Kafka 為什么這么快

順序?qū)懘疟P

Kafka 采用了順序?qū)懘疟P,而由于順序?qū)懘疟P相對(duì)隨機(jī)寫,減少了尋地址的耗費(fèi)時(shí)間。(在 Kafka 的每一個(gè)分區(qū)里面消息是有序的。

Page Cache

Kafka 在 OS 系統(tǒng)方面使用了 Page Cache 而不是我們平常所用的 Buffer。Page Cache 其實(shí)不陌生,也不是什么新鮮事物。

我們?cè)趌inux上查看內(nèi)存的時(shí)候,經(jīng)常可以看到buff/cache,兩者都是用來加速IO讀寫用的,而cache是作用于讀,也就是說,磁盤的內(nèi)容可以讀到cache里面這樣,應(yīng)用程序讀磁盤就非常快;而buff是作用于寫,我們開發(fā)寫磁盤都是,一般如果寫入一個(gè)buff里面再flush就非常快。而kafka正是把這兩者發(fā)揮了極致:Kafka雖然是scala寫的,但是依舊在Java的虛擬機(jī)上運(yùn)行,盡管如此,kafka它還是盡量避開了JVM的限制,它利用了Page cache來存儲(chǔ),這樣躲開了數(shù)據(jù)在JVM因?yàn)镚C而發(fā)生的STW。另一方面也是Page Cache使得它實(shí)現(xiàn)了零拷貝,具體下面會(huì)講。

零拷貝

無論是優(yōu)秀的 Netty 還是其他優(yōu)秀的 Java 框架,基本都在零拷貝減少了 CPU 的上下文切換和磁盤的 IO。當(dāng)然 Kafka 也不例外。零拷貝的概念具體這里不作太詳細(xì)的復(fù)述,大致的給大家講一下這個(gè)概念。

傳統(tǒng)的一次應(yīng)用程請(qǐng)求數(shù)據(jù)的過程

這里大致可以發(fā)傳統(tǒng)的方式發(fā)生了 4 次拷貝,2 次 DMA 和 2 次 CPU,而 CPU 發(fā)生了 4 次的切換。_(DMA 簡(jiǎn)單理解就是,在進(jìn)行 I/O 設(shè)備和內(nèi)存的數(shù)據(jù)傳輸?shù)臅r(shí)候,數(shù)據(jù)搬運(yùn)的工作全部交給 DMA 控制器,而 CPU 不再參與任何與數(shù)據(jù)搬運(yùn)相關(guān)的事情)。

零拷貝的方式

通過優(yōu)化我們可以發(fā)現(xiàn),CPU 只發(fā)生了 2 次的上下文切換和 3 次數(shù)據(jù)拷貝。(linux 系統(tǒng)提供了系統(tǒng)事故調(diào)用函數(shù)“ sendfile()”,這樣系統(tǒng)調(diào)用,可以直接把內(nèi)核緩沖區(qū)里的數(shù)據(jù)拷貝到 socket 緩沖區(qū)里,不再拷貝到用戶態(tài))。

分區(qū)分段

我們上面也介紹過了,kafka 采取了分區(qū)的模式,而每一個(gè)分區(qū)又對(duì)應(yīng)到一個(gè)物理分段,而查找的時(shí)候可以根據(jù)二分查找快速定位。這樣不僅提供了數(shù)據(jù)讀的查詢效率,也提供了并行操作的方式。

數(shù)據(jù)壓縮

Kafka 對(duì)數(shù)據(jù)提供了:Gzip 和 Snappy 壓縮協(xié)議等壓縮協(xié)議,對(duì)消息結(jié)構(gòu)體進(jìn)行了壓縮,一方面減少了帶寬,也減少了數(shù)據(jù)傳輸?shù)南摹?/p>

Kafka 安裝

安裝 JDK

由于使用壓縮包還需要自己配置環(huán)境變量,所以這里推薦直接用 yum 安裝,熟悉查看目前 Java 的版本:

  1. yum -y list Java* 

安裝你想要的版本,這里我是 1.8

  1. yum install java-1.8.0-openjdk-devel.x86_64 

查看是否安裝成功

  1. Java -version 

安裝 Zookeeper

首先需要去官網(wǎng)下載安裝包,然后解壓

  1. tar -zxvf zookeeper-3.4.9.tar.gz 

要做的就是將這個(gè)文件復(fù)制一份,并命名為:zoo.cfg,然后在 zoo.cfg 中修改自己的配置即可

  1. cp zoo_sample.cfg zoo.cfg 
  2. vim zoo.cfg 

主要配置解釋如下

  1. # zookeeper內(nèi)部的基本單位,單位是毫秒,這個(gè)表示一個(gè)tickTime為2000毫秒,在zookeeper的其他配置中,都是基于tickTime來做換算的 
  2. tickTime=2000 
  3. # 集群中的follower服務(wù)器(F)與leader服務(wù)器(L)之間 初始連接 時(shí)能容忍的最多心跳數(shù)(tickTime的數(shù)量)。 
  4. initLimit=10 
  5. #syncLimit:集群中的follower服務(wù)器(F)與leader服務(wù)器(L)之間 請(qǐng)求和應(yīng)答 之間能容忍的最多心跳數(shù)(tickTime的數(shù)量) 
  6. syncLimit=5 
  7. # 數(shù)據(jù)存放文件夾,zookeeper運(yùn)行過程中有兩個(gè)數(shù)據(jù)需要存儲(chǔ),一個(gè)是快照數(shù)據(jù)(持久化數(shù)據(jù))另一個(gè)是事務(wù)日志 
  8. dataDir=/tmp/zookeeper 
  9. ## 客戶端訪問端口 
  10. clientPort=2181 

配置環(huán)境變量

  1. vim ~/.bash_profile 
  2. export ZK=/usr/local/src/apache-zookeeper-3.7.0-bin 
  3. export PATH=$PATH:$ZK/bin 
  4. export PATH 
  5. // 啟動(dòng) 
  6. zkServer.sh start 

下面能看啟動(dòng)成功

 

安裝 Kafka

下載 kafka

https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka-2.8.0-src.tgz

安裝 kafka

  1. tar -xzvf kafka_2.12-2.0.0.tgz 

配置環(huán)境變量

  1. export ZK=/usr/local/src/apache-zookeeper-3.7.0-bin 
  2. export PATH=$PATH:$ZK/bin 
  3. export KAFKA=/usr/local/src/kafka 
  4. export PATH=$PATH:$KAFKA/bin 

啟動(dòng) Kafka

  1. nohup kafka-server-start.sh 自己的配置文件路徑/server.properties & 

 

大功告成!

責(zé)任編輯:未麗燕 來源: 騰訊技術(shù)工程
相關(guān)推薦

2022-05-16 10:49:28

網(wǎng)絡(luò)協(xié)議數(shù)據(jù)

2024-10-08 08:52:59

2023-07-07 08:00:00

KafkaSpringBoo

2022-05-11 11:54:55

Http傳送協(xié)議

2022-12-20 07:39:46

2023-11-20 08:18:49

Netty服務(wù)器

2023-12-21 17:11:21

Containerd管理工具命令行

2023-07-31 08:18:50

Docker參數(shù)容器

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2024-06-27 10:50:01

2025-01-08 11:10:46

2023-10-27 08:15:45

2022-02-24 07:34:10

SSL協(xié)議加密

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin

2019-06-13 21:31:19

AI

2024-05-22 09:45:49

2021-09-13 22:34:56

區(qū)塊鏈新基建數(shù)字化轉(zhuǎn)型

2023-03-06 21:29:41

mmap技術(shù)操作系統(tǒng)

2022-04-08 09:01:14

CSS自定義屬性前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产欧美精品一区二区三区 | 国色天香综合网 | 天天综合久久 | 欧美日韩精品一区二区三区视频 | 亚洲国产成人精品女人 | 亚洲国产高清免费 | 日韩精品一二三 | 欧美日韩一区二区三区四区 | 欧美黑人一区二区三区 | 我爱操| 中文字幕在线免费视频 | 精品欧美一区二区中文字幕视频 | 国产免费视频在线 | 亚洲视频一 | 精品国产乱码久久久久久图片 | 亚洲精品一区二区三区四区高清 | 国产日韩欧美精品一区二区 | 三区四区在线观看 | 亚洲一二三视频 | 亚州综合一区 | 国产精品一区二区在线免费观看 | 久久毛片| 国产不卡在线 | 中文字幕在线视频免费视频 | 97国产一区二区精品久久呦 | 亚洲精品中文在线 | 久久久久久蜜桃一区二区 | 久久久人| 韩日一区 | 欧美激情久久久 | 亚洲成年影院 | 欧美三区 | 福利一区在线观看 | 在线视频亚洲 | 日本午夜一区二区三区 | 日韩一区二区在线免费观看 | 99re66在线观看精品热 | www.蜜桃av | 黄色免费在线观看网站 | 国产九一精品 | 免费h在线 |