Kafka环境搭建及springboot整合kafka

Kafka环境搭建及springboot整合kafka

资料地址:
链接:https://pan.baidu.com/s/1LuqMQ_VCm0FnVCpgdx9odg&shfl=sharepset
提取码:ms9p
复制这段内容后打开百度网盘手机App,操作更方便哦

Kafka环境搭建要点

环境搭建说明: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

安装jdk环境

1.解压jdk

tar –zxvf jdk-8u121-linux-x64.tar.gz

2.配置jdk

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

3.查看jdk

java -version

Zookeeper环境搭建

使用java-v命令测试服务器是否安装jdk1.8

1. 解压安装包

tar -zxvf zookeeper-3.4.10.tar.gz

2. 重命名zookeeper安装包

mv zookeeper-3.4.10 zookeeper

3. zoo_sample.cfg文件重命名

cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo.cfg

4. 修改zoo.cfg配置

(1)dataDir=/usr/local/zookeeper/data(注意同时在zookeeper创建data目录)
(2)最后面添加server.0=192.168.212.174:2888:3888

5.创建data文件

cd /usr/local/zookeeper/
mkdir data

6.添加服务器标识配置:

cd /usr/local/zookeeper/data/
vi myid (内容为服务器标识 : 0)

7. 启动zookeeper

cd /usr/local/zookeeper/bin
./zkServer.sh start

注意:关闭每台服务器节点防火墙,systemctl stop firewalld.service

Kafka环境搭建

1 解压下载好的kafka压缩包

cd /usr/local
tar -zxvf kafka_2.11-1.0.0.tgz

2. 重命名kafka

mv kafka_2.12-0.11.0.0 kafka

3. 修改配置文件

vi ./kafka/config/server.properties

该步骤所需要修改的内容如下

broker.id=0
listeners=PLAINTEXT://192.168.212.174:9092 

注意:listeners严格按照上述格式PLAINTEXT为协议不要删除
zookeeper.connect=192.168.212.174:9092

4. 环境中配置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

Kafka环境测试

1、开启zookeeper程序

/usr/local/zookeeper/bin/zkServer.sh start 

开启成功后查看zookeeper的状态

/usr/local/zookeeper/bin/zkServer.sh status 

2、在后台开启kafka程序

cd /usr/local/kafka
./bin/kafka-server-start.sh -daemon config/server.properties 

Kafka集群环境搭建

Kafka集群环境搭建步骤

1. linux服务器3台

假设服务器ip为
192.168.212.174
192.168.212.175
192.168.212.176

2.每台服务器上安装jdk1.8环境

Jdk环境按照单机版复制

3.每台服务器安装Zookeeper环境

在单机版基础上的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

4.每台服务器安装kafka环境

1.在kafka环境搭建的基础上修改

在系统环境中配置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

sprinboot项目整合kafka

1.新建项目

在idea编辑器中的parent项目中新建项目
点击ouos-parent->右键->new->module->maven->next->添加项目名->next 创建项目完成

2.添加项目依赖

org.springframework.kafka spring-kafka org.springframework.boot spring-boot-starter-web

3.新建生产者

@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";
}
}

4.消费者监听

@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());
}
}

5.yml配置文件

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,

Kafka相关知识总结

Kafka简介和应用场景

Apache Kafka是一个分布式发布-订阅消息传递系统。最初由LinkedIn公司开发,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。

注意:Kafka并没有遵循JMS规范,它只提供了发布和订阅通讯方式。
kafka中文官网:http://kafka.apachecn.org/quickstart.html

Kafka的优点?

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
  • 可扩展性:kafka集群支持热扩展
  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  • 高并发:支持数千个客户端同时读写

Kafka名词解释

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去消费。这样没有锁竞争,充分发挥了横向的扩展性,吞吐量极高。这也就形成了分布式消费的概念。

Kafka存储策略

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。

你可能感兴趣的:(java开发)