elk+filebeat+kafka完整架构

elk简单架构部署

kafka部署

终极版elk架构简述

filebeat + kafka + ogstash + es + kibana

1.kafka特点
特点 (基于zookeeper)

  • 高吞吐量:kafka每秒可以处理几十万条消息。
  • 可扩展性:kafka集群支持热扩展- 持久性
  • 可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败
  • 高并发:支持数千个客户端同时读写

zookeeper :
ZooKeeper是一个分布式协调服务,它的主要作用是为分布式系统提供一致性服务,提供的功能包括:配置维护、分布式同步等

2. kfaka部署

  • 运行依赖jdk
tar zxvf /usr/local/package/jdk-8u121-linux-x64.tar.gz -C /usr/local/
echo '
JAVA_HOME=/usr/local/jdk1.8.0_121
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
' >>/etc/profile
source /etc/profile
  • 安装并配置zookeeeper
tar xzvf kafka_2.11-2.1.0.tgz -C /usr/local/
将原配置文件中打开的内容注释掉
sed -i 's/^[^#]/#&/' /usr/local/kafka_2.11-2.1.0/config/zookeeper.properties
使用vim在配置文件中添加以下内容 
vim /usr/local/kafka_2.11-2.1.0/config/zookeeper.properties 

dataDir=/opt/data/zookeeper/data 
dataLogDir=/opt/data/zookeeper/logs
clientPort=2181 
tickTime=2000 
initLimit=20 
syncLimit=10 
server.1=192.168.246.231:2888:3888             //kafka集群IP:Port
server.2=192.168.246.234:2888:3888
server.3=192.168.246.235:2888:3888

创建在配置文件中设置的相应目录

 mkdir -p /opt/data/zookeeper/{data,logs}
设置myid号,kafka集群中zookeeper的第一台设置1,第二台就设置为2。以此类推

echo 1 > /opt/data/zookeeper/data/myid
在zookeeper.properties中添加的配置文件含义:

* dataDir ZK数据存放目录。
* dataLogDir  ZK日志存放目录。
* clientPort  客户端连接ZK服务的端口。
* tickTime        ZK服务器之间或客户端与服务器之间维持心跳的时间间隔。
* initLimit       允许follower连接并同步到Leader的初始化连接时间,当初始化连接时间超过该值,则表示连接失败。
* syncLimit   Leader与Follower之间发送消息时如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。
* server.1=172.16.244.31:2888:3888    2888是follower与leader交换信息的端口,3888是当leader挂了时用来执行选举时服务器相互通信的端口
  • 配置Kafka
注释掉原配置文件中打开的内容

sed -i 's/^[^#]/#&/' /usr/local/kafka_2.11-2.1.0/config/server.properties
在kafka配置文件中添加如下内容

vim /usr/local/kafka_2.11-2.1.0/config/server.properties  #在最后添加
broker.id=1         #kafka集群中的第一台就设置id为1.第二台为2,以此类推
listeners=PLAINTEXT://192.168.246.231:9092 #监听的本机地址和端口号9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
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
zookeeper.connect=192.168.246.231:2181,192.168.246.234:2181,192.168.246.235:2181 #zookeeper连接地址和端口2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

创建配置文件中的相关目录

mkdir -p /opt/data/kafka/logs
**kafka配置文件相关含义:**

#每个server需要单独配置broker id,如果不配置系统会自动配置。
broker.id  

#监听地址,格式PLAINTEXT://IP:端口。
listeners  

#处理网络请求的线程数量,也就是接收消息的线程数。
num.network.threads	

#消息从内存中写入磁盘是时候使用的线程数量。
num.io.threads	

#发送套接字的缓冲区大小
socket.send.buffer.bytes 

#当消息的尺寸不足时,server阻塞的时间,如果超时,
#消息将立即发送给consumer
socket.receive.buffer.bytes	

服务器将接受的请求的最大大小(防止OOM)
socket.request.max.bytes  

日志文件目录。
log.dirs    

#topic在当前broker上的分片个数
num.partitions

#用来设置恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir 


offsets.topic.replication.factor

#超时将被删除
log.retention.hours

#日志文件中每个segment的大小,默认为1G
log.segment.bytes

#上面的参数设置了每一个segment文件的大小是1G,那么
#就需要有一个东西去定期检查segment文件有没有达到1G,
#多长时间去检查一次,就需要设置一个周期性检查文件大小
#的时间(单位是毫秒)
log.retention.check.interval.ms 

#ZK主机地址,如果zookeeper是集群则以逗号隔开
zookeeper.connect  

#连接到Zookeeper的超时时间。
zookeeper.connection.timeout.ms
  • 启动并验证zookeeper集群

启动

cd /usr/local/kafka_2.11-2.1.0/

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &

验证

查看端口
netstat -lntp | grep 2181

验证端口能否联通
telnet 127.0.0.1 2181

启动并验证kfaka集群

启动

cd /usr/local/kafka_2.11-2.1.0/

nohup bin/kafka-server-start.sh config/server.properties &

验证

在其中一台kafka节点创建一个topic为testtopic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testtopic
去其他节点查看有没有名为testtopic的topic

bin/kafka-topics.sh --zookeeper 192.168.246.231:2181 --list

kafka和zookeeper没有问题之后去logstash配置相关的输入输出文件

cd /usr/local/logstash-6.5.4/etc/conf.d/

vim wxm.conf
input {
kafka {               #指定kafka服务
    type => "nginx_log"
    codec => "json"        #通用选项,用于输入数据的编解码器
    topics => "nginx"        #这里定义的topic
    decorate_events => true  #此属性会将当前topic、group、partition等信息也带到message中
    bootstrap_servers => "192.168.246.234:9092, 192.168.246.231:9092, 192.168.246.235:9092"  #kafka集群IP和端口号9092
  }
}
output{ #输出插件,将事件发送到特定目标
elasticsearch { #输出到es
hosts => ["192.168.246.234:9200"] #指定es服务的ip加端口
index => ["%{type}-%{+YYYY.MM.dd}"] #引用input中的type名称,定义输出的格式
}
}

启动logstash

注意:如果logstash正在运行,则需要杀掉重启logstash

cd /usr/local/logstash-6.5.4/

nohup bin/logstash -f etc/conf.d/  --config.reload.automatic &

filebeat部署

filebeat简单介绍:

隶属于Beats,轻量级数据收集引擎。基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 Agent 的第一选择,目前Beats包含四种工具:

  • Packetbeat(搜集网络流量数据).
  • Metricbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据。)
  • Filebeat(搜集文件数据)
  • Winlogbeat(搜集 Windows 日志数据)

下载安装

下载

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-linux-x86_64.tar.gz

解压

tar xzvf filebeat-6.5.4-linux-x86_64.tar.gz -C /usr/local/

修改配置

mv filebeat.yml filebeat.yml.bak #可以先将原配置文件做个备份,以防万一

vim filebeat.yml # 再创建一个新的配置文件并添加以下内容,这里以收集本机的nginx日志为例

#以下内容为需要添加的内容:
filebeat.prospectors:
- input_type: log        #指定输入的类型
  paths:
    -  /var/log/nginx/*.log      #日志的路径
  json.keys_under_root: true
  json.add_error_key: true
  json.message_key: log

output.kafka:
  hosts: ["192.168.246.234:9092","192.168.246.231:9092","192.168.246.235:9092"]   #kafka服务器集群
  topic: 'nginx'        #输出到kafka中的topic

Filebeat 6.0 之后一些配置参数变动比较大,具体还需要去官方查看使用手册

启动

nohup ./filebeat -e -c filebeat.yml &

tail -f nohup.out #监控输出文件

验证
验证kafka是否生成logstash定义的topic

cd /usr/local/kafka_2.11-2.1.0/

bin/kafka-topics.sh --zookeeper 192.168.246.231:2181 --list #注意这里的ip是需要验证的kafka主机ip加zookeeper端口号2181.

验证成功无误之后就可以去kibana上添加索引。索引号为在logstash收集日志的配置文件中定义的类型名

完整架构展示:
elk+filebeat+kafka架构
注:整理收集不易,转载请注明出处,欢迎批评指正,谢谢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章