01 前言
ELK在生产环境使用默认需要配置一个中间件,用于异步模式收集日志。我们选用kafka,它可以为数据提供一个统一的、高吞吞量、低延迟的收集平台,这将解决logstash没有消息队列缓存,存在数据丢失隐患的缺点。
官方建议使用Redis做中间件,这个具体看个人收集的数据完整性,kafka对比Redis的话数据比较安全。
本文转自我个人的公众号:天目星 ,请大家多多关注。
一、使用的软件与架构图
linux:CentOS 7.5.1804
Kafka:kafka_2.11-2.2.0
Zookeeper:zookeeper-3.4.14
二、安装软件
前提条件:需要安装java,建议使用java8
1、安装zookeeper
我们使用3台主机搭建zookeeper集群
解压:tar xvf zookeeper-3.4.14.tar.gz
安装路径:cp zookeeper-3.4.14 /usr/local/zookeeper
zookeeper的配置文件zoo_sample.cfg需要重命名为zoo.cfg
修改配置文件(三台主机配置一致)
# vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000 # 心跳时间单位
initLimit=10 # follower超时时间,表示10*2000=20秒
syncLimit=5 # leader与follower的应答时间,5*2000=10秒
dataDir=/data/zookeeper # 数据保存路径,建议规划好
dataLogDir=/data/zookeeper/log # 日志路径
clientPort=2181 # 客户端访问Zookeeper服务器的端口
# server.A=B:C:D中的A是一个数字,表示这个是第几号服务器;B是这个服务器的IP地址;
# C是集群中的leader服务器交换信息的端口;
# D是在leader挂掉时专门用来进行选举leader所用的端口。
server.1=localhost:2888:3888
server.2=localhost:2888:3889
server.3=localhost:2888:3890
创建ServerID标识
zookeeper集群模式需要配置一个myid文件,这个文件需要放在dataDir目录下,里面的值就是zoo.cfg配置文件中server.A=B:C:D中A的值。
# 三台服务器都需要配置,A值根据zoo.cfg情况配置
echo "1" > /data/zookeeper/myid
配置环境变量:
配置变量方便后期启动服务
cat >>/etc/profile <<EOF
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH={$PATH}:{$ZOOKEEPER_HOME}/bin
EOF
2、安装kafka
安装好zookeeper后继续在每台主机上安装kafka
解压:tar xvf kafka_2.11-2.2.0.tgz
安装路径:cp kafka_2.11-2.2.0 /usr/local/kafka
修改配置文件
# vim /usr/local/kafka/config/server.properties
broker.id=1 # 集群唯一ID,另外l两台机依次设置为2,3
listeners=PLAINTEXT://:9092 #监听的端口
num.network.threads=3 #broker处理消息的最大线程数
num.io.threads=8 #broker处理磁盘IO的线程数,数值最好大于机器的硬盘数
socket.send.buffer.bytes=102400 #socket的发送缓冲区大小
socket.receive.buffer.bytes=102400 #socket的接受缓冲区
socket.request.max.bytes=104857600 #socket请求的最大数值
log.dirs=/tmp/kafka-logs #kafka存放日志的路径
num.partitions=1 #每个topic的分区个数
num.recovery.threads.per.data.dir=1 #启动时日志恢复的每个数据目录中的线程数
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168 #数据存储的最大时间
log.segment.bytes=1073741824 #topic的分区大小
log.retention.check.interval.ms=300000 #文件大小检查的周期时间
zookeeper.connect=localhost:2181 #zookeeper集群的地址,多个之间用逗号分割
zookeeper.connection.timeout.ms=6000 #ZooKeeper的连接超时时间
group.initial.rebalance.delay.ms=0 #组织协调时间,生产用建议设置等于3
delete.topic.enable=true
三、启动与测试
1、编写启动脚本
zookeeper集群启动脚本
#!/bin/bash
# Auther: Gordon Luo
# Date: 2019-4-25 11:30
# Function: 用于zookeeper集群启动使用
#### zookeeper_cluster.sh ####
APPHOME="/usr/local/zookeeper"
ZKS="node1 node2 node3"
APP_NAME="zookeeper"
if [ $# -ne 1 ];then
echo "Usage zookeeper.sh {start|stop|status}"
exit 1
fi
#echo OK
for i in $ZKS;do
echo "Start ${APP_NAME} on ${i}"
ssh ${i} "source /etc/profile; sh ${APPHOME}/bin/zkServer.sh $1"
if [ $? -ne 0 ];then
echo "Start ${APP_NAME} on ${i} is ok"
fi
done
echo ALL ${ZKS} are $1
exit 0
kafka集群启动脚本
#!/bin/bash
# Auther: Gordon Luo
# Date: 2019-4-25 15:32
# Function: 用于Kafka集群启动使用
#### kafka_cluster.sh ####
APP_HOME="/usr/local/kafka"
KAFKAS="node1 node2 node3"
APP_NAME="kafka"
function kafka_start()
{
for i in ${KAFKAS};do
ssh ${i} "source /etc/profile;${APP_HOME}/bin/kafka-server-start.sh -daemon ${APP_HOME}/config/server.properties"
done
}
function kafka_stop()
{
for i in ${KAFKA_CFGNAME};do
ssh localhost " source /etc/profile;${APP_HOME}/bin/kafka-server-stop.sh"
done
}
case $1 in
start)
kafka_start
;;
stop)
kafka_stop
;;
*)
echo "Usage: kafka.sh {start|stop}"
esac
2、启动服务
启动zookeeper与kafka集群
sh zookeeper_cluster.sh start
sh kafka_cluster.sh start
关闭集群
sh zookeeper_cluster.sh stop
sh kafka_cluster.sh stop
3、测试kafka生产与消费
创建topic
kafka-topics.sh --create --zookeeper node1:2181,node2:2181,node3:2181 --replication-factor 3 --partitions 2 --topic hadoop
参数说明:
–-zookeeper:指定连接zk的服务器,
–-replication-factor:指定副本数量
–-partitions:指定分区数量
–-topic:主题名称
查看已创建的topic列表
kafka-topics.sh --list --zookeeper node1:2181
查看某个topic详细信息
kafka-topics.sh --describe --zookeeper node1:2181 --topic hadoop
启动某个主题的生产者
kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic hadoop
#弹出以下箭头后输入数据
>Hello World
>welcome to kafka
启动某个主题的消费者
kafka-console-consumer.sh --bootstrap-server node1:9092 --topic hadoop --from-beginning
# --from-beginning:从最开始消费数据,没有该参数表示只会消费新产生的数据。
Hello World
welcome to kafka
完毕