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收集日志的配置文件中定义的类型名
完整架构展示:
注:整理收集不易,转载请注明出处,欢迎批评指正,谢谢!