1、编写命令脚本,直接将集群的kafka全部启动,同理编写zookeerper的集群启动脚本
/usr/local/java/zookeeper/bin/zkServer.sh start
case $1 in
"start"){
for i in hadoop01 hadoop02 hadoop03
do
echo "************$i************"
ssh $i "/usr/local/java/kafka/bin/kafka-server-start.sh -daemon /usr/local/java/kafka/config/server.properties"
done
};;
"stop"){
for i in hadoop01 hadoop02 hadoop03
do
echo "************$i************"
ssh $i "/usr/local/java/kafka/bin/kafka-server-stop.sh"
done
};;
esac
2、topic的增删改查
# 查看hadoop01:2181上所有的kafka分区,因为kafka中broker的数据信息都是存储再zookeeper下的
kafka-topics.sh --list --zookeeper hadoop01:2181
# Created topic first.注意副本数都一定要小于broekr数,分区主要是为了提高kafka负载均衡能力,而副本则是保证分区的高可用和数据安全,副本也分为leader和follow,leader负责全部的读写业务,follow则只是备份作用,follow是真正的副本,如果这两者大于broker数那就弊大于利,造成浪费,分区数最好等于broker数目
kafka-topics.sh --create --zookeeper hadoop01:2181 --topic first --partitions 3 --replication-factor 3
#删除副本(配置文件中进行相关配置才能真正删除,否则只能逻辑删除)
kafka-topics.sh --delete --zookeeper hadoop01:2181 --topic first
kafka-topics.sh --describe --topic first --zookeeper hadoop01:2181
#分区名first,分区id:xxx,分区数:3,每个分区对应了两台真正的副本分散到不同的服务器上
Topic: first TopicId: RVptyRB5QsCjB-8hrFGgog PartitionCount: 3 ReplicationFactor: 3
Configs:
#分别对应 分区名first、分区编号0,1,2 leadr:每个分区都有一个主分区,分区=一个主分区+n个副本,主分区通常都是分散在不同服务器上的,以下分别代表分布在broker2,broker0,broker1上, Replicas第一行都是代表主分区所在的服务器标号,余下的是副本所在服务的编号,Isr与Replicas相同代表当前集群健康度良好,都能访问,isr代表的是能访问的分区(通过时间差和内容差两个指标),同时如果leader挂掉会从isr中选择一个
Topic: first Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: first Partition: 1 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: first Partition: 2 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
#在hadoop01节点开启生产者
kafka-console-producer.sh --topic first --broker-list hadoop01:9092
#在hadoop02/3节点开启消费者,旧版消费者往往也是讲消费信息存储再zk中,新版本
bin/kafka-console-consumer.sh --zookeeper hadoop01:2181 --topic first
#新版消费者连接消息队列的方法
bin/kafka-console-consumer.sh --bootstrap-server hadoop01:9092 --topic first
bin/kafka-console-consumer.sh --bootstrap-server hadoop01:9092 --from-beginning --topic first
1 联通后producor可以发送数据,涉及的主题不存在也没关系,可以自动创建
2 由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位
效率低下,Kafka 采取了分片和索引机制,将每个 partition 分为多个 segment。每个 segment,对应两个文件——“.index”文件和“.log”文件。这些文件位于一个文件夹下,该文件夹的命名,规则为:topic 名称+分区序号
3 kafka broker集群的logs中xxx.log存储数据,xxx.index存储偏移量
4 ISR通过LEO和HW机制保证主从分区副本的数据一致性,但不能解决数据重复性和丢失的问题
4 ack机制和同步异步无关,kafka默认采用异步发送,而是用于平衡数据安全性和响应速度的关系,ack!=0时会造成数据重复发送问题
kafka架构关系
broker集群的数据信息注册在zookeeper集群中,zookeeper的选举机制选出一台broker controller,其它的均为broker slave,同时broker的数据信息也会存储再zookeeper及群中
producer存储于本地topic
consumer可以存储在本地topic也可以存储在zk中,推荐存储在本地topic
offset之前存储在zk中,后来存在于kafka本地特点的topic中,增强稳定性,
1 kafka存储位置为何由zk变为了本地topic中存储;
2 保证数据安全性ack
3 一个consumer group对应一个分布式的一个业务,比如商品详情业务,订单业务,客户信息业务…,每个业务下的服务器我们将其看成一个消费者
4 __consumer_offsets:0.9之前
同一partition的leader和follow不能同时出现在一台机器上
同一topic下的各个partition得leader是不能放到同一broker上