文章目录
1.kafka的优点
- 高吞吐量,低延迟:Kafka每秒可以处理几十万条消息,他的延迟最低只有几毫秒,每个topic可以分多个partition,consumer,group
对 partition进行consumer操作 - 可扩展性:kafka支持集群进行扩展
- 持久性,可靠性:消息可以被持久化到硬盘当中,支持数据备份
- 容错性:允许集群中节点的失败
- 高并发:支持上千个客户端进行同时的读写
2.Kafka相关名词解释
3.Kafka的集群原理
4.Kafka集群环境的搭建
4.1 搭建broker流程图
4.2 服务器集群的准备
使用vm虚拟三个linux主机
192.168.212.174
192.168.212.175
192.168.212.176
4.2 Zookeeper集群环境搭建
因为kafka环境依赖于Zookeeper,所以这里也要搭建Zookeper的集群环境搭建
1.每台服务器节点上安装jdk1.8环境
使用java-v命令测试
2.每台服务器节点上安装Zookeeper,解压并且进行重命名
-
下载并且安装zookeeper安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
-
解压安装包
tar -zxvf zookeeper-3.4.10.tar.gz
-
重命名
重命名: mv zookeeper-3.4.10 zookeeper
4.3 搭建Zookeeper集群环境
1.重命名
mv zookeper.16.2 Zookeper # 重命名文件夹
mv zoo_sample.cfg zoo.cfg # 重命名配置文件
2.修改 zoo.cfg配置文件
(1)修改 dataDir文件的目录为安装目录的data
dataDir=/usr/local/zookeeper/data # 这个data目录 目前是没有的,第三部有创建
(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
3.创建服务器标识
服务器标识配置:
创建文件夹: mkdir data
创建文件myid并填写内容为0
4.复制zookeeper
进行复制zookeeper目录到hadoop01和hadoop02还有/etc/profile文件
把hadoop01、 hadoop02中的myid文件里的值修改为1和2
路径(vi /usr/local/zookeeper/data/myid)
关闭每台服务器节点防火墙,systemctl stop firewalld.service
4.4 Kafka集群环境搭建
1.解压下载好的kafka压缩包并重命名
cd /usr/local # 进入文件目录
wget http://mirror.bit.edu.cn/apache/kafka/1.0.0/kafka_2.11-1.0.0.tgz # 下载kafka资源
tar -zxvf kafka_2.11-1.0.0.tgz # 解压
mv kafka_2.12-0.11.0.0 kafka #更名
2.修改配置文件
vi ./kafka/config/server.properties
修改内容如下
broker.id=0
listeners=PLAINTEXT://192.168.131.130:9092 ##PLAINTEXT不能省略,且9092不会改变
zookeeper.connect=192.168.131.130:2181,192.168.131.131:2181,192.168.131.132:2181
3.在系统环境中配置kafka的路径
// 在文件最下方添加kafka路径
export KAFKA_HOME=/usr/local/kafka
// 多路径PATH写法为PATH=${ZOOKEEPER_HOME}/bin:${KAFKA_HOME}/bin:$PATH
PATH=${KAFKA_HOME}/bin:$PATH
export PATH
zk的环境变量也需要配置的
// 使修改完的环境变量生效
source /etc/profile
然后把kafka和Zookeper进行克隆,只用修改mycatid 和 brokerid 匹配即可
4.5环境测试
1.启动Zookeper
启动zookeeper:
路径: /usr/local/zookeeper/bin
执行: zkServer.sh start
(注意这里3台机器都要进行启动)
状态: zkServer.sh status(在三个节点上检验zk的mode,一个leader和俩个follower)
2.Kaka集群环境测试
1、开启3台虚拟机的zookeeper程序
/usr/local/zookeeper/bin/zkServer.sh start
开启成功后查看zookeeper集群的状态
/usr/local/zookeeper/bin/zkServer.sh status
出现Mode:follower或是Mode:leader则代表成功
2、在后台开启3台虚拟机的kafka程序(cd /usr/local/kafka)
./bin/kafka-server-start.sh -daemon config/server.properties
3、在其中一台虚拟机(192.168.131.130)创建topic
/usr/local/kafka/bin/kafka-topics.sh –create –zookeeper 192.168.131.130:2181 –replication-factor 3 –partitions 1 –topic my-replicated-topic
// 查看创建的topic信息
/usr/local/kafka/bin/kafka-topics.sh –describe –zookeeper 192.168.131.130:2181 –topic my-replicated-topic
3.SpringBoot整合kakfa
项目依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itmayiedu</groupId>
<artifactId>springboot2.0_kafka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!-- springBoot集成kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
配置文件
# kafka
spring:
kafka:
# kafka服务器地址(可以多个)
bootstrap-servers: 192.168.212.174:9092,192.168.212.175:9092,192.168.212.176: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,192.168.212.175:9092,192.168.212.176:9092
controller
package com.mayikt;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* @author 余胜军
*/
@RestController
@SpringBootApplication
public class KafkaController {
/**
* 注入kafkaTemplate
*/
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
/**
* 发送消息的方法
*
* @param key
* 推送数据的key
* @param data
* 推送数据的data
*/
private void send(String key, String data) {
// topic 名称 key data 消息数据
kafkaTemplate.send("my_test", key, data);
}
// test 主题 1 my_test 3
@RequestMapping("/kafka")
public String testKafka() {
int iMax = 6;
for (int i = 1; i < iMax; i++) {
send("key" + i, "data" + i);
}
return "success";
}
public static void main(String[] args) {
SpringApplication.run(KafkaController.class, args);
}
/**
* 消费者使用日志打印消息
*/
@KafkaListener(topics = "my_test")
public void receive(ConsumerRecord<?, ?> consumer) {
System.out.println("topic名称:" + consumer.topic() + ",key:" + consumer.key() + ",分区位置:" + consumer.partition()
+ ", 下标" + consumer.offset());
}
}