[TOC]
# kafka簡介及安裝
### 1、Kafka是什么
* Apache Kafka是一個開源消息系統,由Scala寫成。是由Apache軟件基金會開發的一個開源消息系統項目。
* Kafka最初是由LinkedIn開發,并于2011年初開源。2012年10月從Apache Incubator畢業。該項目的目標是為處理實時數據提供一個統一、高通量、低等待的平臺。
* Kafka是一個分布式消息隊列:生產者、消費者的功能。它提供了類似于JMS的特性,但是在設計實現上完全不同,此外它并不是JMS規范的實現。
* Kafka對消息保存時根據Topic進行歸類,發送消息者稱為Producer,消息接受者稱為Consumer,此外kafka集群有多個kafka實例組成,每個實例(server)成為broker。
* 無論是kafka集群,還是producer和consumer都依賴于zookeeper集群保存一些meta信息,來保證系統可用性
### 2、JMS是什么
#### 2.1、JMS的基礎
> JMS是什么:JMS是Java提供的一套技術規范
* JMS干什么用:用來異構系統 集成通信,緩解系統瓶頸,提高系統的伸縮性增強系統用戶體驗,使得系統模塊化和組件化變得可行并更加靈活
* 通過什么方式:生產消費者模式(生產者、服務器、消費者)

### 2.2、JMS消息傳輸模型
* 點對點模式(一對一,消費者主動拉取數據,消息收到后消息清除)
點對點模型通常是一個基于拉取或者輪詢的消息傳送模型,這種模型從隊列中請求信息,而不是將消息推送到客戶端。這個模型的特點是發送到隊列的消息被一個且只有一個接收者接收處理,即使有多個消息監聽者也是如此。
* 發布/訂閱模式(一對多,數據生產后,推送給所有訂閱者)
發布訂閱模型則是一個基于推送的消息傳送模型。發布訂閱模型可以有多種不同的訂閱者,臨時訂閱者只在主動監聽主題時才接收消息,而持久訂閱者則監聽主題的所有消息,即時當前訂閱者不可用,處于離線狀態。

### 2.3、JMS核心組件
* Destination:消息發送的目的地,也就是前面說的Queue和Topic。
* Message :從字面上就可以看出是被發送的消息。
* Producer: 消息的生產者,要發送一個消息,必須通過這個生產者來發送。
* MessageConsumer: 與生產者相對應,這是消息的消費者或接收者,通過它來接收一個消息。

### 2.4、常見的類JMS消息服務器
#### 2.4.1、JMS消息服務器 ActiveMQ
> ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的。
> 主要特點:
* 多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
* 完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)
* 對Spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統里面去,而且也支持Spring2.0的特性
* 通過了常見J2EE服務器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上
* 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
* 支持通過JDBC和journal提供高速的消息持久化
* 從設計上保證了高性能的集群,客戶端-服務器,點對點
* 支持Ajax
* 支持與Axis的整合
* 可以很容易得調用內嵌JMS provider,進行測試
#### 2.4.2、分布式消息中間件 Metamorphosis
> Metamorphosis (MetaQ) 是一個高性能、高可用、可擴展的分布式消息中間件,類似于LinkedIn的Kafka,具有消息存儲順序寫、吞吐量大和支持本地和XA事務等特性,適用于大吞吐量、順序消息、廣播和日志數據傳輸等場景,在淘寶和支付寶有著廣泛的應用,現已開源。
> 主要特點:
* 生產者、服務器和消費者都可分布
* 消息存儲順序寫
* 性能極高,吞吐量大
* 支持消息順序
* 支持本地和XA事務
* 客戶端pull,隨機讀,利用sendfile系統調用,zero-copy ,批量拉數據
* 支持消費端事務
* 支持消息廣播模式
* 支持異步發送消息
* 支持http協議
* 支持消息重試和recover
* 數據遷移、擴容對用戶透明
* 消費狀態保存在客戶端
* 支持同步和異步復制兩種HA
* 支持group commit
#### 2.4.3、分布式消息中間件 RocketMQ
> RocketMQ 是一款分布式、隊列模型的消息中間件,具有以下特點:
* 能夠保證嚴格的消息順序
* 提供豐富的消息拉取模式
* 高效的訂閱者水平擴展能力
* 實時的消息訂閱機制
* 億級消息堆積能力
* Metaq3.0 版本改名,產品名稱改為RocketMQ
#### 2.4.4、其他MQ
* .NET消息中間件 DotNetMQ
* 基于HBase的消息隊列 HQueue
* Go 的 MQ 框架 KiteQ
* AMQP消息服務器 RabbitMQ
* MemcacheQ 是一個基于 MemcacheDB 的消息隊列服務器。
## 3、為什么需要消息隊列(重要)
> 消息系統的核心作用就是三點:解耦,異步和并行
> 以用戶注冊的案列來說明消息系統的作用
### 3.1、用戶注冊的一般流程

> 問題:隨著后端流程越來越多,每步流程都需要額外的耗費很多時間,從而會導致用戶更長的等待延遲。
### 3.2、用戶注冊的并行執行

> 問題:系統并行的發起了4個請求,4個請求中,如果某一個環節執行1分鐘,其他環節再快,用戶也需要等待1分鐘。如果其中一個環節異常之后,整個服務掛掉了。

### 3.3、用戶注冊的最終一致

1) 保證主流程的正常執行、執行成功之后,發送MQ消息出去。
2) 需要這個destination的其他系統通過消費數據再執行,最終一致。

## 4、Kafka核心組件
* Topic :消息根據Topic進行歸類
* Producer:發送消息者
* Consumer:消息接受者
* broker:每個kafka實例(server)
* Zookeeper:依賴集群保存meta信息。

## 5、Kafka集群部署
### 5.1集群部署的基本流程
> 下載安裝包、解壓安裝包、修改配置文件、分發安裝包、啟動集群
### 5.2集群部署的基礎環境準備
> 安裝前的準備工作(zk集群已經部署完畢)
1) 關閉防火墻
~~~
chkconfig iptables off && setenforce 0
~~~
2) 創建用戶
~~~
groupadd realtime && useradd realtime && usermod -a -G realtime realtime
~~~
3) 創建工作目錄并賦權
~~~
mkdir /export
mkdir /export/servers
chmod 755 -R /export
~~~
4) 切換到realtime用戶下
~~~
su realtime
~~~
### 5.3 Kafka集群部署
#### 5.3.1、下載安裝包
~~~
http://kafka.apache.org/downloads.html
在linux中使用wget命令下載安裝包
wget http://mirrors.hust.edu.cn/apache/kafka/0.8.2.2/kafka_2.11-0.8.2.2.tgz
~~~
#### 5.3.2、解壓安裝包
~~~
tar -zxvf /export/software/kafka_2.11-0.8.2.2.tgz -C /export/servers/
cd /export/servers/
ln -s kafka_2.11-0.8.2.2 kafka
~~~
#### 5.3.3、修改配置文件
~~~
cp /export/servers/kafka/config/server.properties
/export/servers/kafka/config/server.properties.bak
vi /export/servers/kafka/config/server.properties
~~~
> 輸入以下內容:

#### 5.3.4、分發安裝包
~~~
scp -r /export/servers/kafka_2.11-0.8.2.2 kafka02:/export/servers
~~~
> 然后分別在各機器上創建軟連
~~~
cd /export/servers/
ln -s kafka_2.11-0.8.2.2 kafka
~~~
#### 5.3.5、再次修改配置文件(重要)
> 依次修改各服務器上配置文件的的broker.id,分別是0,1,2不得重復。
> 如果修改了host,同事也需要修改host的值
#### 5.3.6、啟動集群
~~~
依次在各節點上啟動kafka
bin/kafka-server-start.sh config/server.properties
~~~
- hadoop
- linux基礎
- Linux入門
- Linux進階
- shell
- Zookeeper
- Zookeeper簡介及部署
- Zookeeper使用及API
- Redis
- Redis簡介安裝部署
- Redis使用及API
- Java高級增強
- Java多線程增強
- Maven簡介及搭建
- Hive
- Hive簡介及安裝
- Hive操作
- HIve常用函數
- Hive數據類型
- Flume
- Flume簡介及安裝
- flume 攔截器(interceptor)
- azkaban
- azKaban簡介及安裝
- Sqoop
- Sqoop簡介及安裝
- HDFS
- HDFS原理
- HDFS操作API
- MAPREDUCE原理
- MAPREDUCE圖片資源
- MAPREDUCE加強
- HBASE
- HBASE簡介及安裝
- HBASE操作及API
- HBASE內部原理
- Storm
- Storm簡介及安裝
- Storm原理
- kafka
- kafka簡介及安裝
- kafka常用操作及API
- kafka原理
- kafka配置詳解
- Scala
- Scala簡介及安裝
- Scala基礎語法
- Scala實戰