Kafka高可用集群环境搭建

1.kafka的优点

  • 高吞吐量,低延迟:Kafka每秒可以处理几十万条消息,他的延迟最低只有几毫秒,每个topic可以分多个partition,consumer,group
    对 partition进行consumer操作
  • 可扩展性:kafka支持集群进行扩展
  • 持久性,可靠性:消息可以被持久化到硬盘当中,支持数据备份
  • 容错性:允许集群中节点的失败
  • 高并发:支持上千个客户端进行同时的读写

2.Kafka相关名词解释

在这里插入图片描述

kafka以topic来进行消息管理,每个topic包含多个partition,每个partition对应一个逻辑log,有多个consumer组成每个segment中存储多条消息,消息id由其逻辑位置决定,即从消息id可以直接定位到消息的存储位置,避免id到位置的额外映射每个part在内存中对应一个index,记录每个segment中的第一条消息偏移发布者发布到某个topic的消息被均匀的分不到多个partition上(或者根据用户执行的路由规则进行分布),broker收到发布

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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值