(一)、簡介
一、Kafka簡介:
Kafka is a distributed,partitioned,replicated commit logservice。它提供了相似於JMS的特性,可是在設計實現上徹底不一樣,此外它並非JMS規範的實現。kafka對消息保存時根據Topic進行歸類,發送消息者成爲Producer,消息接受者成爲Consumer,此外kafka集羣有多個kafka實例組成,每一個實例(server)成爲broker。不管是kafka集羣,仍是producer和consumer都依賴於zookeeper來保證系統可用性集羣保存一些meta信息。apache
二、主要功能:
1:It lets you publish and subscribe to streams of records.發佈和訂閱消息流,這個功能相似於消息隊列,這也是kafka歸類爲消息隊列框架的緣由
2:It lets you store streams of records in a fault-tolerant way.以容錯的方式記錄消息流,kafka以文件的方式來存儲消息流
3:It lets you process streams of records as they occur.能夠再消息發佈的時候進行處理bootstrap
三、主要場景:
一、Messaging : 對於一些常規的消息系統,kafka是個不錯的選擇;partitons/replication和容錯,可使kafka具備良好的擴展性和性能優點.不過到目前爲止,咱們應該很清楚認識到,kafka並無提供JMS中的"事務性""消息傳輸擔保(消息確認機制)""消息分組"等企業級特性;kafka只能使用做爲"常規"的消息系統,在必定程度上,還沒有確保消息的發送與接收絕對可靠(好比,消息重發,消息發送丟失等)
二、Websit activity tracking: kafka能夠做爲"網站活性跟蹤"的最佳工具;能夠將網頁/用戶操做等信息發送到kafka中.並實時監控,或者離線統計分析等
三、Log Aggregation : kafka的特性決定它很是適合做爲"日誌收集中心";application能夠將操做日誌"批量""異步"的發送到kafka集羣中,而不是保存在本地或者DB中;kafka能夠批量提交消息/壓縮消息等,這對producer端而言,幾乎感受不到性能的開支.此時consumer端可使hadoop等其餘系統化的存儲和分析系統.bash
四、工做機制
4.一、消息傳輸流程:
服務器
Producer即生產者,向Kafka集羣發送消息,在發送消息以前,會對消息進行分類,即Topic,上圖展現了兩個producer發送了分類爲topic1的消息,另一個發送了topic2的消息.
Topic即主題,經過對消息指定主題能夠將消息分類,消費者能夠只關注本身須要的Topic中的消息
Consumer即消費者,消費者經過與kafka集羣創建長鏈接的方式,不斷地從集羣中拉取消息,而後能夠對這些消息進行處理。
從上圖中就能夠看出同一個Topic下的消費者和生產者的數量並非對應的。app
4.二、Kafka服務器存儲策略框架
談到kafka的存儲,就不得不提到分區,即partitions,建立一個topic時,同時能夠指定分區數目,分區數越多,其吞吐量也越大,可是須要的資源也越多,同時也會致使更高的不可用性,kafka在接收到生產者發送的消息以後,會根據均衡策略將消息存儲到不一樣的分區中。
在每一個分區中,消息以順序存儲,最晚接收的的消息會最後被消費異步
4.三、與生產者的交互
生產者在向kafka集羣發送消息的時候,能夠經過指定分區來發送到指定的分區中
也能夠經過指定均衡策略來將消息發送到不一樣的分區中
若是不指定,就會採用默認的隨機均衡策略,將消息隨機的存儲到不一樣的分區中socket
4.四、與消費者的交互
在消費者消費消息時,kafka使用offset來記錄當前消費的位置
在kafka的設計中,能夠有多個不一樣的group來同時消費同一個topic下的消息,如圖,咱們有兩個不一樣的group同時消費,他們的的消費的記錄位置offset各不項目,不互相干擾。
對於一個group而言,消費者的數量不該該多餘分區的數量,由於在一個group中,每一個分區至多隻能綁定到一個消費者上,即一個消費者能夠消費多個分區,一個分區只能給一個消費者消費
所以,若一個group中的消費者數量大於分區數量的話,多餘的消費者將不會收到任何消息。ide
(二)、安裝和使用
一、下載。可經過官網下載相應的版本(http://kafka.apache.org/downloads )。工具
二、安裝。因爲kafka運行須要Java環境,所以須要安裝jdk。之前的kafka還須要zookeeper,新版的kafka已經內置了一個zookeeper環境,因此咱們能夠直接使用
說是安裝,若是隻須要進行最簡單的嘗試的話咱們只須要解壓到任意目錄便可,這裏咱們將kafka壓縮包解壓到所需的目錄文件夾中。
三、具體的安裝配置步驟以下:
[appuser@Kafka2 ~]#wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.0.0/kafka_2.12-2.0.0.tgz [root@Kafka2 opt]# tar xf kafka_2.12-2.0.0.tgz [root@Kafka2 opt]# mv kafka_2.12-2.0.0 /usr/local/kafka [root@Kafka2 kafka]# grep '^[a-Z]' config/server.properties broker.id=0 listeners=PLAINTEXT://172.20.67.57:9092 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 log.dirs=/tmp/kafka-logs num.partitions=1 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 zookeeper.connect=localhost:2181 zookeeper.connection.timeout.ms=6000 group.initial.rebalance.delay.ms=0 重要參數說明: 一、broker.id 申明當前kafka服務器在集羣中的惟一ID,需配置爲integer,而且集羣中的每個kafka服務器的id都應是惟一的,咱們這裏採用默認配置便可 二、listeners 申明此kafka服務器須要監聽的端口號,若是是在本機上跑虛擬機運行能夠不用配置本項,默認會使用localhost的地址,若是是在遠程服務器上運行則必須配置,例如listeners=PLAINTEXT:// 192.168.180.128:9092。並確保服務器的9092端口可以訪問 三、zookeeper.connect 申明kafka所鏈接的zookeeper的地址 ,需配置爲zookeeper的地址,因爲本次使用的是kafka高版本中自帶zookeeper,使用默認配置便可zookeeper.connect=localhost:2181
四、運行。
4.一、因爲啓動kafka須要先啓動zookeeper才能夠,全部先啓動zookeeper服務。
[root@Kafka2 kafka]# /usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties
看到以上輸出基本正常了。
4.二、啓動kafka。接下來能夠啓動kafka了,從新打開一個bash.
[root@Kafka2 ~]# /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
上圖看出啓動成功了。
五、建立測試消息。
5.一、建立一個topic。 Kafka經過topic對同一類的數據進行管理,同一類的數據使用同一個topic能夠在處理數據時更加的便捷。在kafka解壓目錄打開終端,建立topic並查看。
[root@Kafka2 ~]# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test Created topic "test". [root@Kafka2 ~]# /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper localhost:2181 test
5.二、建立一個消費信息的消費者。消費者建立完成以後,由於尚未發送任何數據,所以這裏在執行後沒有打印出任何數據
[root@Kafka2 ~]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 172.20.67.57:9092 --topic test --from-beginning`
5.三、建立一個消息的生產者。
[root@Kafka2 ~]# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list 172.20.67.57:9092 --topic test >this is my sif first message
按回車鍵,發送消息。消費終端就能夠看到了。