kafka+zookeeper部署文档~(部分概念来源于网上)

kafka是一个消息队列服务器,服务称为broker, 消息发送者称为producer, 消息接收者称为consumer;通常我们部署多个broker以提供高可用性的消息服务集群.
典型的是3个broker;消息以topic的形式发送到broker,消费者订阅topic,实现按需取用的消费模式;创建topic需要指定replication-factor(复制数目,通常=broker数目);
每个topic可能有多个分区(partition), 每个分区的消息内容不会重复:

Broker
Kafka集群包含一个或多个服务器,这种服务器被称为broker

Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处)

Partition
parition是物理上的概念,每个topic包含一个或多个partition,创建topic时可指定parition数量。每个partition对应于一个文件夹,该文件夹下存储该partition的数据和索引文件

Producer
负责发布消息到Kafka broker

Consumer
消费消息。每个consumer属于一个特定的consuer group(可为每个consumer指定group name,若不指定group name则属于默认的group)。使用consumer high level API时,同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。

Producer在发布消息到某个Partition时,先通过Zookeeper找到该Partition的Leader,然后无论该Topic的Replication Factor为多少(也即该Partition有多少个Replica),Producer只将该消息发送到该Partition的Leader。Leader会将该消息写入其本地Log。每个Follower都从Leader pull数据。这种方式上,Follower存储的数据顺序与Leader保持一致。Follower在收到该消息并写入其Log后,向Leader发送ACK。一旦Leader收到了ISR中的所有Replica的ACK,该消息就被认为已经commit了,Leader将增加HW并且向Producer发送ACK。
为了提高性能,每个Follower在接收到数据后就立马向Leader发送ACK,而非等到数据写入Log中。因此,对于已经commit的消息,Kafka只能保证它被存于多个Replica的内存中,而不能保证它们被持久化到磁盘中,也就不能完全保证异常发生后该条消息一定能被Consumer消费。但考虑到这种场景非常少见,可以认为这种方式在性能和数据持久化上做了一个比较好的平衡。在将来的版本中,Kafka会考虑提供更高的持久性。
Consumer读消息也是从Leader读取,只有被commit过的消息(offset低于HW的消息)才会暴露给Consumer。

Leader会跟踪与其保持同步的Replica列表,该列表称为ISR(即in-sync Replica)

一:软件下载地址:
jdk http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gz

kafka http://download.nus.edu.sg/mirror/apache/kafka/0.9.0.1/kafka_2.10-0.9.0.1.tgz

zookeeper http://apache.fayea.com/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz

IP地址对应关闭
10.102.2.157 bj-mq-kafka-01
10.102.2.160 bj-mq-kafka-02
10.102.2.156 bj-mq-kafka-03

vim /etc/hosts
#--------------------------------
10.102.2.157 bj-mq-kafka-01
10.102.2.160 bj-mq-kafka-02
10.102.2.156 bj-mq-kafka-03
#---------------------------------

二:安装Java并设置环境变量
tar zvfx jdk-8u91-linux-x64.tar.gz
mv jdk1.8.0_91 /usr/local/jdk1.8

echo '
JAVA_HOME=/usr/local/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH CLASSPATH
'>> /etc/profile

source  /etc/profile

#查看java进程
jps -ml

三:zookeeper安装配置
tar zvfx zookeeper-3.4.8.tar.gz
mv zookeeper-3.4.8 /usr/local/
mkdir -p /data/zookeeper/data/
mkdir -p /data/zookeeper/log/

对每台主机分别设置对应 myid

#kafka-01
echo "0" > /data/zookeeper/data/myid

#kafka-02
echo "1" > /data/zookeeper/data/myid

#kafka-03
echo "2" > /data/zookeeper/data/myid

vim /usr/local/zookeeper-3.4.8/conf/zoo.cfg
#----------------------------------------------------------------
clientPort=2181
maxClientCnxns=1024
tickTime=2000
initLimit=20
syncLimit=10
dataDir=/data/zookeeper/data/
dataLogDir=/data/zookeeper/log/
server.0=10.102.2.157:2888:3888
server.1=10.102.2.160:2888:3888
server.2=10.102.2.156:2888:3888
#----------------------------------------------------------------

#分别启动三台zookeeper
/usr/local/zookeeper-3.4.8/bin/zkServer.sh start
echo "/usr/local/zookeeper-3.4.8/bin/zkServer.sh start " >> /etc/rc.local

#查看运行状态
echo stat|nc localhost 2181

#Exhibitor是 ZooKeeper实例监控、备份、恢复、清理和可视化工具 是ZooKeeper 的监控管理系统.
git clone https://github.com/Netflix/exhibitor.git

#相关安装可以参考如下
https://raw.github.com/Netflix/exhibitor/master/exhibitor-standalone/src/main/resources/buildscripts/standalone/maven/pom.xml


四:安装配置kafka
mkdir -p /data/kafka
tar zvfx kafka_2.10-0.9.0.1.tgz
mv kafka_2.10-0.9.0.1 /usr/local/kafka-0.9.01

vim /usr/local/kafka-0.9.01/config/server.properties
#----------------------------------------------------------------------------------------------------------------------
#保证broker.id唯一性 本机为0 其它两台为1 2
broker.id=0
broker.id.generation.enable=false
 
listeners=PLAINTEXT://10.102.2.157:9092
#listeners=PLAINTEXT://10.102.2.160:9092
#listeners=PLAINTEXT://10.102.2.156:9092
port=9092

#绑定本机IP地址 也可以不用设置
#host.name=172.16.18.233

num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600

log.dirs=/data/kafka
num.partitions=2
num.recovery.threads.per.data.dir=1

log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=960
log.retention.bytes=1073741824
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleanup.policy=delete
log.cleaner.enable=true

#多台机器逗号分开
zookeeper.connect=10.102.2.157:2181,10.102.2.160:2181,10.102.2.156:2181
zookeeper.connection.timeout.ms=60000
zookeeper.session.timeout.ms=6000
zookeeper.sync.time.ms=3000

#是否允许自动创建topic 允许为true,不允许为false,就需要通过命令创建topic
auto.create.topics.enable=false
delete.topic.enable=true

#----------------------------------------------------------------------------------------------------------------------

#后台启动
/usr/local/kafka-0.9.01/bin/kafka-server-start.sh -daemon /usr/local/kafka-0.9.01/config/server.properties

#停止应执行脚本(传递ctrl+c的信号),这样加载避免检测错误,加载快
sh bin/kafka-server-stop.sh

集群测试
#创建topic
[root@work-01 data]# /usr/local/kafka-0.9.01/bin/kafka-topics.sh --create --zookeeper 10.102.2.157:2181 --replication-factor 3  --partitions 1 --topic test1

/usr/local/kafka-0.9.01/bin/kafka-topics.sh --create --zookeeper 10.102.2.157:2181 --replication-factor 3  --partitions 3 --topic strategy-push
/usr/local/kafka-0.9.01/bin/kafka-topics.sh --create --zookeeper 10.102.2.157:2181 --replication-factor 3  --partitions 3 --topic history-calculate


#查看topic
[root@work-01 data]# /usr/local/kafka-0.9.01/bin/kafka-topics.sh --list --zookeeper 10.102.2.157:2181

#查看详细信息
[root@work-01 data]#/usr/local/kafka-0.9.01/bin/kafka-topics.sh --describe --zookeeper 10.102.2.157:2181

#查看集群情况
[root@work-01 data]# /usr/local/kafka-0.9.01/bin/kafka-topics.sh --describe --zookeeper 10.102.2.160:2181
[root@work-01 data]# /usr/local/kafka-0.9.01/bin/kafka-topics.sh --describe --zookeeper 10.102.2.256:2181

#生产数据
[root@work-01 data]# echo "hello world"|/usr/local/kafka-0.9.01/bin/kafka-console-producer.sh --broker-list 10.102.2.156:9092 --topic test1

#消费数据
[root@work-02 kz]# /usr/local/kafka-0.9.01/bin/kafka-console-consumer.sh --zookeeper 10.102.2.156:2181,10.102.2.157:2181,10.102.2.160:2181 --topic test1

#删除topic
 [root@work-01 data] /usr/local/kafka-0.9.01/bin/kafka-topics.sh --delete --zookeeper 10.102.2.156:2181 --topic test1
Topic test1 is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

kafka深度学习
posted @ 2016-04-28 19:00  study-notes  阅读(224)  评论(0编辑  收藏  举报