资料地址:
链接:https://pan.baidu.com/s/1LuqMQ_VCm0FnVCpgdx9odg&shfl=sharepset
提取码:ms9p
复制这段内容后打开百度网盘手机App,操作更方便哦
环境搭建说明:Kafka环境需要依赖zookeeper,而zookeeper为java代码编写,启动zookeeper需要jdk环境,故而也需要在linux环境安装jdk和zookeeper
安装工具使用xshell,xftp
其安装步骤如下:
1.linux服务器
2.服务器上安装jdk1.8环境
3.安装Zookeeper环境
4.安装kafka环境
在192.168.212.174服务器上通过xftp上传安装包到/usr/local/目录下
jdk-8u121-linux-x64.tar.gz
zookeeper-3.4.10.tar.gz
kafka_2.12-2.2.0.tgz
tar –zxvf jdk-8u121-linux-x64.tar.gz
vi /etc/profile
添加配置如下
JAVA_HOME=/usr/local/jdk1.8.0_121
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
java -version
使用java-v命令测试服务器是否安装jdk1.8
tar -zxvf zookeeper-3.4.10.tar.gz
mv zookeeper-3.4.10 zookeeper
cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
(1)dataDir=/usr/local/zookeeper/data(注意同时在zookeeper创建data目录)
(2)最后面添加server.0=192.168.212.174:2888:3888
cd /usr/local/zookeeper/
mkdir data
cd /usr/local/zookeeper/data/
vi myid (内容为服务器标识 : 0)
cd /usr/local/zookeeper/bin
./zkServer.sh start
注意:关闭每台服务器节点防火墙,systemctl stop firewalld.service
cd /usr/local
tar -zxvf kafka_2.11-1.0.0.tgz
mv kafka_2.12-0.11.0.0 kafka
vi ./kafka/config/server.properties
该步骤所需要修改的内容如下
broker.id=0
listeners=PLAINTEXT://192.168.212.174:9092
注意:listeners严格按照上述格式PLAINTEXT为协议不要删除
zookeeper.connect=192.168.212.174:9092
vi /etc/profile
添加内容如下
JAVA_HOME=/usr/local/jdk1.8.0_121
ZOOKEEPER_HOME=/usr/local/zookeeper
KAFKA_HOME=/usr/local/kafka
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$KAFKA_HOME/bin
export PATH JAVA_HOME ZOOKEEPER_HOME KAFKA_HOME CLASSPATH
/usr/local/zookeeper/bin/zkServer.sh start
开启成功后查看zookeeper的状态
/usr/local/zookeeper/bin/zkServer.sh status
cd /usr/local/kafka
./bin/kafka-server-start.sh -daemon config/server.properties
假设服务器ip为
192.168.212.174
192.168.212.175
192.168.212.176
Jdk环境按照单机版复制
在单机版基础上的zookeeper环境搭建第4步第(2)小步添加
server.0=192.168.212.174:2888:3888
server.1=192.168.212.175:2888:3888
server.2=192.168.212.176:2888:3888
需要修改的内容如下(192.168.212.174)
broker.id=0
listeners=PLAINTEXT://192.168.212.174:9092
zookeeper.connect=192.168.212.174:2181, 192.168.212.175:2181, 192.168.212.176:2181
需要修改的内容如下(192.168.212.175)
broker.id=1
listeners=PLAINTEXT://192.168.212.175:9092
zookeeper.connect=192.168.212.174:2181, 192.168.212.175:2181, 192.168.212.176:2181
需要修改的内容如下(192.168.212.176)
broker.id=2
listeners=PLAINTEXT://192.168.212.176:9092
zookeeper.connect=192.168.212.174:2181, 192.168.212.175:2181, 192.168.212.176:2181
在系统环境中配置kafka的路径配置完全一样
vi /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_121
ZOOKEEPER_HOME=/usr/local/zookeeper
KAFKA_HOME=/usr/local/kafka
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$KAFKA_HOME/bin
export PATH JAVA_HOME ZOOKEEPER_HOME KAFKA_HOME CLASSPATH
source /etc/profile
在idea编辑器中的parent项目中新建项目
点击ouos-parent->右键->new->module->maven->next->添加项目名->next 创建项目完成
@RestController
@RequestMapping("/kafkasender")
public class Kafkasender {
/**
* 注入kafkaTemplate
*/
@Autowired
private KafkaTemplate kafkaTemplate;
/**
* 发送消息的方法
*
* @param key
* 推送数据的key
* @param data
* 推送数据的data
*/
private void send(String key, String data) {
// topic 名称 key data 消息数据
kafkaTemplate.send("my_test2", key, data);
}
/*
*
* 生产者生产消息
* */
@RequestMapping("/kafka")
public String testKafka() {
int iMax = 16;
for (int i = 1; i < iMax; i++) {
send("key" + i, "data" + i);
}
return "success";
}
}
@SpringBootApplication
public class BusinessServerApplication {
public static void main(String[] args) {
SpringApplication.run(BusinessServerApplication.class, args);
}
/**
* 消费者使用日志打印消息
*/
@KafkaListener(topics = "my_test2")
public void receive(ConsumerRecord, ?> consumer) {
System.out.println("topic名称:" + consumer.topic() + ",key:" + consumer.key() + ",分区位置:" + consumer.partition()
+ ", 下标" + consumer.offset());
}
}
spring:
kafka:
# kafka服务器地址可以为多个(即是集群环境)用逗号隔开
bootstrap-servers: 192.168.212.174:9092,
consumer:
# 指定一个默认的组名
group-id: kafka2
# earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
# latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
# none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
auto-offset-reset: earliest
# key/value的反序列化
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
producer:
# key/value的序列化
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# 批量抓取
batch-size: 65536
# 缓存容量
buffer-memory: 524288
# 服务器地址可以为多个(即是集群环境)用逗号隔开
bootstrap-servers: 192.168.212.174:9092,
Apache Kafka是一个分布式发布-订阅消息传递系统。最初由LinkedIn公司开发,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。
注意:Kafka并没有遵循JMS规范,它只提供了发布和订阅通讯方式。
kafka中文官网:http://kafka.apachecn.org/quickstart.html
Kafka中发布订阅的对象是topic。我们可以为每类数据创建一个topic,把向topic发布消息的客户端称作producer,从topic订阅消息的客户端称作consumer。Producers和consumers可以同时从多个topic读写数据。一个kafka集群由一个或多个broker服务器组成,它负责持久化和备份具体的kafka消息。
Broker:Kafka节点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。
Topic:一类消息,消息存放的目录即主题,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。
Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列
Segment:partition物理上由多个segment组成,每个Segment存着message信息
Producer: 生产message发送到topic
Consumer: 订阅topic消费message, consumer作为一个线程来消费
Consumer Group:一个Consumer Group包含多个consumer, 这个是预先在配置文件中配置好的。各个consumer(consumer 线程)可以组成一个组(Consumer group ),partition中的每个message只能被组(Consumer group ) 中的一个consumer(consumer 线程 )消费,如果一个message可以被多个consumer(consumer 线程 ) 消费的话,那么这些consumer必须在不同的组。Kafka不支持一个partition中的message由两个或两个以上的consumer thread来处理,即便是来自不同的consumer group的也不行。它不能像AMQ那样可以多个BET作为consumer去处理message,这是因为多个BET去消费一个Queue中的数据的时候,由于要保证不能多个线程拿同一条message,所以就需要行级别悲观锁(for update),这就导致了consume的性能下降,吞吐量不够。而kafka为了保证吞吐量,只允许一个consumer线程去访问一个partition。如果觉得效率不高的时候,可以加partition的数量来横向扩展,那么再加新的consumer thread去消费。这样没有锁竞争,充分发挥了横向的扩展性,吞吐量极高。这也就形成了分布式消费的概念。
1)kafka以topic来进行消息管理,每个topic包含多个partition,每个partition对应一个逻辑log,有多个segment组成。
2)每个segment中存储多条消息(见下图),消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。
3)每个part在内存中对应一个index,记录每个segment中的第一条消息偏移。
4)发布者发到某个topic的消息会被均匀的分布到多个partition上(或根据用户指定的路由规则进行分布),broker收到发布消息往对应partition的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到一定的大小后将不会再往该segment写数据,broker会创建新的segment。