文章目录
Kafka(消息队列)
kafka是一个分布式的消息发布—订阅系统
1. 特性
- 可以实时的处理大量数据
- 低延迟,高并发
2. 组件
- 话题(Topic):是特定类型的消息流。消息是字节的有效负载(Payload),话题是消息的分类名或种子(Feed)名。(每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的)。
- 生产者(Producer):是能够发布消息到话题的任何对象(发布消息到 kafka 集群的终端或服务).
- 服务代理(Broker):已发布的消息保存在一组服务器中,它们被称为代理(Broker)或Kafka集群。
- 消费者(Consumer):可以订阅一个或多个话题,并从- Broker拉数据,从而消费这些已发布的消息。
- partition(区):partition 是物理上的概念,每个 topic 包含一个或多个 partition。每一个topic将被分为多个partition(区)。
3.kafka集群部署
1). 安装Jdk,部署java环境.
[root@up2 /]# tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local/
[root@up2 /]# mv /usr/local/jdk* /usr/local/java
[root@up2 /]# cat >> /etc/profile << EOF
> JAVA_HOME=/usr/local/java
> PATH=\$JAVA_HOME/bin:\$PATH
> export JAVA_HOME PATH
> EOF
[root@up2 /]# source /etc/profile
[root@up2 /]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
2). 部署kafka.(依赖->zookeeper)
kafka的拓扑结构图
[root@up2 /]# tar zxvf kafka_2.11-2.1.0.tgz -C /usr/local/
=======1. 将不以开头的行替换为\#开头,也就是注释所有行==============
[root@up2 kafka]# sed -i 's/^[^#]/#&/' config/zookeeper.properties
=====================2. 修改kafka配置文件======================
[root@up2 kafka]# vim config/zookeeper.properties
dataDir=/opt/data/zookeeper/data
dataLogDir=/opt/data/zookeeper/logs
##kafka的客户端访问端口
clientPort=2181
tickTime=2000
initLimit=20
syncLimit=10
##kafka集群的IP:port,2888为集群服务间通信的端口,3888是master挂了后通信的端口
server.1=10.30.161.196:2888:3888
server.2=10.30.161.14:2888:3888
===============3. 创建ZK的数据存放目录和日志目录================
[root@up2 kafka]# mkdir -p /opt/data/zookeeper/{data,logs}
======4.创建myid文件,集群各服务器的IP要独立区分开,不能一致=======
[root@up2 kafka]# echo 1 > /opt/data/zookeeper/data/myid
======================5. 配置kafka=========================
[root@up2 kafka]# sed -i 's/^[^#]/#&/' /usr/local/kafka/config/server.properties
[root@up2 kafka]# vim /usr/local/kafka/config/server.properties
##服务器的在集群中的ID标识,同一台服务器与myid相同无所谓,但是要区别于别的SERVER
broker.id=1
##本台服务器本身的IP
listeners=PLAINTEXT://10.30.161.196:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
##防止ONM内存溢出
socket.request.max.bytes=104857600
log.dirs=/opt/data/kafka/logs
num.partitions=6
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=2
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=536870912
log.retention.check.interval.ms=300000
##连接ZK的所有主机地址,集群中多台服务器用逗号隔开
zookeeper.connect=10.30.161.196:2181,10.30.161.14:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
##创建kafka的日志目录
[root@up2 kafka]# mkdir -p /opt/data/kafka/logs
[root@up2 kafka]# cd /usr/local/kafka
====================多节点依次执行,启动===================
[root@up2 kafka]# nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
==================测试 若是输出服务信息即部署完================
[root@up2 kafka]# yum -y install nmap-ncat
[root@up2 local]# echo conf | nc 10.30.161.196 2181
clientPort=2181
dataDir=/opt/data/zookeeper/data/version-2
dataLogDir=/opt/data/zookeeper/logs/version-2
....
##查看状态
[root@up2 local]# echo stat | nc 10.30.161.14 2181
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 00:39 GMT
Clients:
/10.30.161.196:42874[0](queued=0,recved=1,sent=0)
....
======创建topic=====
[root@up2 kafka]# bin/kafka-topics.sh --create --zookeeper 10.30.161.196:2181 --replication-factor 1 --partitions 1 --topic sihye
======查询topic=====
[root@up2 kafka]# bin/kafka-topics.sh --zookeeper 10.30.161.14:2181 --list
sihye
jiajia
======作为product选择指定的topic发送信息=====
[root@up2 kafka]# bin/kafka-console-producer.sh --broker-list 172.17.0.4:9092 --topic testtopic
======作为cusumer接收指定的topic信息=====
[root@up2 kafka]# bin/kafka-console-consumer.sh --bootstrap-server 10.30.161.196:9092 --topic jiajia --from-beginning
Hello Woeld
dd
ni shi xiao zhu
hai zhen shi ne
3). 部署filebeat.(业务环境)
a. 部署logstash服务器
- [ 环境部署在此不再描述 ]
- 在创建的conf.d下创建编辑logstash启动的配置文件kafka.conf
input {
kafka {
type => "kafka-logs"
group_id => "logstash"
auto_offset_reset => "earliest"
##在kafka中创建的topic名
topics => "kafka_run_log"
consumer_threads => 5
decorate_events => true
##所有的kafka集群IP:port
bootstrap_servers => "10.30.161.196:9092,10.30.161.14:9092"
}
}
output {
elasticsearch {
## ES集群的IP和端口,因此资源有限,此次只部署了一台作为ES
hosts => ["10.30.161.254:9200"]
## 创建的索引名称
index => "kafka-run-log-%{+YYYY.MM.dd}"
}
}
b. 部署filebeat(新机器)
- java环境(jdk)
- 解压包
[root@up2 /]# tar xf filebeat-6.5.4-linux-x86_64.tar.gz -C /usr/local
[root@up2 local]# mv filebeat-6.5.4-linux-x86_64/ filebeat
- 修改配置文件(只修改input和output部分)
查看非注释行:[root@up2 filebeat]# grep -Evn "^$|#" filebeat.yml
##修改完成的最终行
15:filebeat.inputs:
21:- type: log
24: enabled: true
27: paths:
28: - /var/log/yum.log
68:filebeat.config.modules:
70: path: ${path.config}/modules.d/*.yml
...
##将数据利用filebeat的代理传给kafka集群,kafka集群利用logstash传给es集群
148:output.kafka:
150: hosts: ["10.30.161.196:9092","10.30.161.14:9092"]
151: enabled: true
152: topic: 'kafka_run_log'
c. 启动(先启动Logstash机器, 再启动filebeat捕获数据)
☝️目的: 确保所有数据都能被接收到.以及服务能够正常启动
##启动logstash
[root@vm-1 conf.d]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/conf.d/kafka.conf &
##启动filebeat
[root@up2 filebeat]# ./filebeat -c filebeat.yml
?完成,在kibana中创建可视化图表