搭建ELK+KAFKA+ZK+FILEBEAT日志收集系统

需求:
给线上微服务各节点搭建日志收集系统

思路:
filebeat 收集本地系统日志,写入 kafka,logstash 从 kafka 中读取数据并传给 elasticsearch,从而 kibana 进行展示
初次搭建均为standalone单节点模式,以后可以按需进行拓展节点,整个架构都支持高可用高并发

实现步骤:

配置并启动standalone模式zookeeper

3.1.1安装zookeeper和kafka
tar xf zookeeper-3.4.14.tar.gz
移动至/usr/local/zookeeper文件夹下
tar xf kafka_2.12-2.1.0.tgz
移动至/usr/local/kafka文件夹下

3.1.2创建zk数据目录和日志
/usr/local/zookeeper/data
/usr/local/zookeeper/logs

3.1.3zookeeper配置文件
cp zoo_sample.cfg zoo.cfg

tickTime=2000 
initLimit=10 
syncLimit=5 
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
autopurge.snapRetainCount=3 
autopurge.purgeInterval=1 
clientPort=2181 
server.0=127.0.0.1:2888:3888 

3.1.4配置zk编号
echo 0 > /usr/local/zookeeper/data/myid #三台zk编号不同,此处为0,其余两台为1、2,与配置中的server.x有关
3.1.5配置zk全局变量

echo 'ZK_HOME=/usr/local/zookeeper' > /etc/profile.d/zk.sh 
echo 'PATH=$ZK_HOME/bin:$PATH' >> /etc/profile.d/zk.sh 
source /etc/profile.d/zk.sh

3.1.6启动standalone模式zk

zkServer.sh start 
zkServer.sh status 
zkCli.sh -server localhost:2181 #客户端连接验证

配置并启动standalone模式kafka

3.2.1创建kafka数据目录和日志
/usr/local/kafka/data
/usr/local/kafka/logs
3.2.2修改kafka配置文件
cp server.properties server.properties_bak

broker.id=1 #每一个broker在集群中的唯一表示,要求是正数
listeners=PLAINTEXT://localhost:9092 #监控的kafka端口 
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=/usr/local/kafka/logs #kafka数据的存放地址,多个地址用逗号分割,多个目录分布在不同磁盘上可以提高读写性能 
num.partitions=3 #设置partitions 的个数 
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 #数据文件保留多长时间,此处为168h,粒度还可设置为分钟,或按照文件大小 
log.segment.bytes=1073741824 #topic的分区是以一堆segment文件存储的,这个控制每个segment的大小,会被topic创建时的指定参数覆盖 
log.retention.check.interval.ms=300000 
zookeeper.connect=localhost:2181 #zookeeper集群地址 
zookeeper.connection.timeout.ms=6000 #kafka连接Zookeeper的超时时间 
group.initial.rebalance.delay.ms=0

3.2.3配置全局变量

echo 'KFK_HOME=/opt/kafka' > /etc/profile.d/kfk.sh 
echo 'PATH=$KFK_HOME/bin:$PATH' >> /etc/profile.d/kfk.sh 
source /etc/profile.d/kfk.sh

3.2.4启动kafka

kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

3.2.5验证kafka

zkCli.sh -server localhost:2181

注: kafka节点默认需要的内存为1G,在工作中可能会调大该参数,可修改kafka-server-start.sh的配置项。找到KAFKA_HEAP_OPTS配置项,例如修改为:export KAFKA_HEAP_OPTS="-Xmx2G -Xms2G"。

3.2.6新增ADX的kafka Topic
新增topic

.\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic adsense-adx

3.3安装Elasticsearch
3.3.1解压Elasticsearch并创建日志数据目录
tar xf elasticsearch-6.8.7.tar.gz
并移动至/usr/local/elasticsearch
创建数据目录
/usr/local/elasticsearch/data
创建日志目录
/usr/local/elasticsearch/logs
3.3.2配置Elasticsearch
配置yml
cp elasticsearch.yml elasticsearch.yml_bak

cluster.name: adsense#集群名称,一定要一致,当集群内节点启动的时候,默认使用组播(多播),寻找集群中的节点 
node.name: adx1 #节点名称 
path.data: /usr/local/elasticsearch/data #数据目录 
path.logs: /usr/local/elasticsearch/logs #日志目录 
bootstrap.memory_lock: true #启动时锁定内存 
network.host: 0.0.0.0 #监听IP 
transport.tcp.port: 9300 #集群内通信端口,默认9300 
http.port: 9200 #服务监听端口,默认9200 
cluster.initial_master_nodes: ["adx1"]

Yml中添加head插件的参数放通head插件的连接

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, X-User"

调整jvm.options

-Xms1g 
-Xmx1g

Linux添加用户

useradd adsense-adx #elasticsearch 5.0后不能使用root启动 
echo "#edcVFR4" | passwd --stdin adsense-adx 
chown -R adsense-adx:adsense-adx /usr/local/elasticsearch/

调整系统虚拟内存,否则会启动不了
/etc/sysctl.conf

vm.max_map_count=262144

修改用户可使用最大文件描述符 ,锁定内存,修改/etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* hard memlock unlimited
* soft memlock unlimited

修改/etc/systemd/system.conf

DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity

3.3.3切换用户并启动

su - adsense-adx
./elasticsearch -d 
curl http://localhost:9200/_cat/nodes 

#查看集群节点信息,*号为集群master

安装Elasticsearch-head(可选)

3.4.1安装NodeJs

wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.gz

tar -zxvf node-v10.9.0-linux-x64.tar.gz
移动解压之后的文件夹到/usr/local
mv node-v10.9.0-linux-x64 /usr/local/nodejs

创建软链接,让npm和node命令全局生效

ln -s /usr/local/nodejs/bin/node /usr/bin/node
ln -s /usr/local/nodejs/bin/npm /usr/bin/npm

查看nodejs是否安装成功

node -v
npm -v

3.4.2安装 elasticsearch-head
解压zip文件
unzip elasticsearch-head-master.zip
进入elasticsearch-head文件夹

因为npm安装非常非常慢,所以在这里先安装淘宝源地址,命令如下:

npm install cnpm -g --registry=https://registry.npm.taobao.org

创建cnpm软链接,不然执行下面执行命令会报错

ln -s /usr/local/nodejs/bin/cnpm /usr/local/bin/cnpm

使用cnpm命令下载安装项目所需要的插件

cnpm install

修改配置信息

vim _site/app.js

将localhost改为本机ip
换完之后,在elasticsearch-head目录下,输入如下命令,进入启动目录

cd node_modules/grunt/bin
nohup ./grunt server --allow-root &

3.5安装Logstash
3.5.1解压
tar xf logstash-6.8.3.tar.gz
并移动至/usr/local/logstash
3.5.2配置并启动Logstash
从kafka中input,到es中output

input {

  kafka {
         bootstrap_servers => "localhost:9092"  #kafka集群地址
         group_id => "logstash" #此消费者所属的组的标识符,消费者组是由多个处理器组成的单个逻辑订阅服务器,主题中的消息将分发给具有相同group_id的所有Logstash实例
         auto_offset_reset => "earliest"    #如果Kafka中没有初始偏移量,或者偏移量超出范围,自动重置偏移量到最早的偏移量
         decorate_events => true   #在输出消息的时候会输出自身的信息包括:消费消息的大小,topic 来源以及 consumer 的 group 信息
         topics => ["adsense-adx"]              #哪个topics取数据
         type => "messages"               #用于其他插件进行判断
        }
}

output {
if [type] == "messages" {
  elasticsearch {
     hosts => ["localhost:9200"]
    index => "adsense-adx-%{+YYYY-MM-dd}"
   # index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
 }
}
nohup ./logstash -f /usr/local/logstash/config/logstash.conf &

安装Kibana

3.6.1解压
tar xf kibana-6.8.7-linux-x86_64.tar.gz
并移动到/usr/local/kibana
3.6.2配置并启动Kibana
cp kibana.yml kibana.yml_bak

server.port: 5601
elasticsearch.hosts: ["http://localhost:9200/"]
server.host: "0.0.0.0"
server.name: "kibana-1"
nohup ../bin/kibana &

将ELK写入环境变量

echo 'ES_HOME=/usr/local/elasticsearch' > /etc/profile.d/elk.sh 
echo 'LS_HOME=/usr/local/logstash' >> /etc/profile.d/elk.sh 
echo 'KB_HOME=/usr/local/kibana' >> /etc/profile.d/elk.sh 
echo 'PATH=$ES_HOME/bin:$LS_HOME/bin:$KB_HOME/bin:$PATH' >> /etc/profile.d/elk.sh 
source /etc/profile.d/elk.sh

Filebeat轻量级日志采集

3.8.1解压
tar xf filebeat-7.10.1-linux-x86_64.tar.gz
并移动到/usr/local/kibana
3.8.2配置并启动Filebeat
filebeat.yml
配置收集路径 以及输出到kafka

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/adsense/logs/*.log
output.kafka:                                   #收集的数据写到哪里去
          hosts: ["localhost:9092"]
          topic: adsense-adx                #写到哪个topics
          keep_alive: 10s
nohup ./filebeat -e -c filebeat.yml &

配置Kibana可视化界面

按需求进行配置

4服务器指标收集
4.1启动系统性能监控
4.1.1安装metricbeat
Tar xf metricbeat-7.10.1-linux-x86_64.tar.gz

并移动到/usr/local/metricbeat

4.1.2配置并启动metricbeat
Vim metricbeat.yml
setup.kibana:
host: “ip:5601”
output.elasticsearch:
hosts: [“ip:9200”]
username: “elastic”
password: “pass”

nohup ./metricbeat -c metricbeat.yml -e &
4.1.3配置磁盘IO监控
vim ./modules.d/system.yml
metricsets:
- cpu
- load
- memory
- network
- process
- process_summary
- socket_summary
- diskio #开启磁盘IO监控
4.1.4导入dashboard模板
./metricbeat setup

遇到的问题

es启动memory locking requested for elasticsearch process but memory is not locked内存不能锁定
https://blog.csdn.net/weixin_40392053/article/details/105172673
https://blog.csdn.net/cbuy888/article/details/103166008
2. 修改文件/etc/security/limits.conf,最后添加以下内容。

* soft nofile 65536

* hard nofile 65536

* soft nproc 32000

* hard nproc 32000

* hard memlock unlimited

* soft memlock unlimited
  1. 修改文件 /etc/systemd/system.conf ,分别修改以下内容。
DefaultLimitNOFILE=65536

DefaultLimitNPROC=32000

DefaultLimitMEMLOCK=infinity

elasticsearch-head 集群健康值: 未连接
https://blog.csdn.net/majunzhu/article/details/100105290

http.cors.enabled: true
http.cors.allow-origin: “*”
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: “X-Requested-With, Content-Type, Content-Length, X-User”
kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing
https://www.cnblogs.com/miaoying/p/11639437.html
经过一波操作之后,发现需要将 url 换成 hosts,配置文件需要设置为如下所示:

需要用: elasticsearch.hosts, 而不是: elasticsearch.url

server.port: 5601
server.host: "127.0.0.1"
server.name: tanklog
elasticsearch.hosts: ["http://localhost:9200/"] # elasticsearch.url: "http://localhost:9200"

解决filebeat启动报错 more than one namespace configured accessing ‘output‘
应该明确一个input output
https://blog.csdn.net/qq_42697109/article/details/108092418
安装head插件
https://mp.weixin.qq.com/s?__biz=MzkzODE3OTI0Ng==&mid=2247490896&idx=1&sn=882371d0624fe38bc3b463e13f6d8fd5&source=41#wechat_redirect
https://www.freesion.com/article/775958324/
docker日志配置log\syslog
https://blog.csdn.net/zzb7728317/article/details/90371559
https://www.jianshu.com/p/038738073103
解决Docker容器 iptables问题—docker: Error response from daemon: driver failed programming external connectivity on endpoint quizzical_thompson (c2b238f6b003b1f789c989db0d789b4bf3284ff61152ba40dacd0e01bd984653): (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.3 --dport 24224 -j ACCEPT: iptables: No chain/target/match by that name.

https://blog.csdn.net/weixin_30919235/article/details/101665464

1.kill掉docker所有进程

[root@node-11 ~]# pkill docker 
2.清空nat表的所有链

[root@node-11 ~]# iptables -t nat -F
3.停止docker默认网桥docker0

[root@node-11 ~]# ifconfig docker0 down
4.删除docker0网桥

[root@node-11 ~]# brctl delbr docker0
5.重启docker服务

[root@node-11 ~]# systemctl restart docker

添加密码
https://my.oschina.net/liuyuantao/blog/4761742
REFERENCES:
https://blog.csdn.net/rightlzc/article/details/106638231

你可能感兴趣的:(JAVA,日志系统,ELK)