纯本地搭建 EFK 管理远程服务器日志

纯本地搭建 EFK 管理远程服务器日志

项目staging环境日志难以搜索,计划搭建EFK管理日志,但是EFK内存消耗太大,再新增云服务器不划算,打算搭建在本地(16G内存)。

什么是 EFK

EFK不是一个软件,而是一套解决方案,并且都是开源软件,其中 ELasticsearch 负责日志保存和搜索,FileBeat 负责收集日志,Kibana 负责界面。

  1. Elasticsearch
    Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  2. FileBeat
    Filebeat 隶属于 Beats,搜集日志数据并上载到 ElasticsearchLogstashRedis 等平台。
  3. Kibana
    Kibana 提供日志分析的友好 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

环境现状

  1. 本地环境:Windows 10,Intel(R) Core(TM) i5-7500 CPU,内存 16G
  2. 远程环境:SUSE Linux Enterprise Server 11,可用内存不足 1G
  3. 本地可以启虚拟机,但没钱买额外的云服务器。

最初想法

目前有3种思路:

  1. 本地启动Elasticsearch、Kibana、Filebeat,服务器启动FTP,并映射到本地网络驱动器,Filebeat配置从网络驱动器读取log。
  2. 本地启动Elasticsearch、Kibana,用反向代理工具FRP暴露Elasticsearch的9200端口到公网(注意配置鉴权),远程启动Filebeat,输出到本地的Elasticsearch。
  3. 本地启动Elasticsearch、Kibana,Logstash,远程启动Filebeat、Redis,远程的Filebeat输出到Redis,本地的Logstash从Redis上读取,转发给Elasticsearch。

方案确定

以上的三种方案都存在阻力:

  1. 不能稳定映射,经常断开,且I/O速度太慢
  2. 反向代理工具不能在公司中使用
  3. 配置较复杂

睡一觉之后产生了第4种方案:

  1. 本地启动Elasticsearch、Kibana、Filebeat,循环执行rsync命令,SSH连接到服务器并把log增量同步到本地,本地Filebeat就可以畅快地读取了

动手搭建

Elasticsearch、Kibana由于资源消耗大,决定在Windows环境下启动
rsync 由于是 Linux 下的,只能在虚拟 Ubuntu 下启动
Filebeat 由于 log 在 Ubuntu 下,为了I/O效率,也在 Ubuntu 下启动

启动 E & K

安装 Kibana

https://www.elastic.co/guide/en/kibana/current/windows.html

安装 Elasticsearch

https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-install.html

请参考官方安装文档进行安装,本教程所用配置如下:

elasticsearch.yml
1
2
network.host: [_local_, _site_]
http.port: 9200
kibana.yml
1
2
3
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"

启动虚拟机

这里使用Vagrant启动,安装Virtualbox和Vagrant,创建Vagrantfile如下

Vagrantfile
1
2
3
4
5
6
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.provider "virtualbox" do |vb|
vb.memory = "8192"
end
end

同目录下执行 vagrant up,然后 vagrant ssh 连接上虚拟机。

启动 Filebeat

安装Filebeat

1
2
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.2-amd64.deb
sudo dpkg -i filebeat-6.3.2-amd64.deb

配置Filebeat

1
sudo vim /etc/filebeat/filebeat.yml

这是common的配置,请按照自己项目的log格式配置相应的插件。
10.0.2.2 代表宿主机,如果你用的也是Virtualbox + Vagrant,不要改动。

filebeat.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/vagrant/logs/*
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
host: "10.0.2.2:5601"
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
output.elasticsearch:
hosts: ["10.0.2.2:9200"]
index: "filebeat-%{+yyyy.MM.dd}"

确保前面已经启动Elasticsearch和Kibana,然后启动Filebeat,sudo service filebeat start

从server端增量同步log

首先服务器必须开启ssh_key登录,在Ubuntu下生成ssh配置到服务器的 authorized_keys 中。

执行 byobu,这会开一个终端 session,在此执行的命令不会因为终端退出而终止。

快捷键 作用
F2 新建一个窗口
F3 切换到上一个窗口
F4 切换到上一个窗口
F7 浏览当前窗口的历史打印信息
F6 让 byobu 到后台去
Ctrl + F6 关闭当前窗口

修改以下命令,并执行实现增量同步:

1
while true;do rsync -rtv --include "**.log" --exclude "*.*" --append -e "ssh -p <服务器SSH端口号>" <服务器登录用户名>@<服务器地址>:/var/logs /home/vagrant;sleep 5;done;

这个命令很长,所以给出命令解释:

  1. while true 循环执行
  2. -rtv r代表递归目录,t代表保留待同步文件的修改时间,v代表啰嗦模式,输出更多同步信息(可以-vv更啰嗦模式)
  3. --include "**.log" --exclude "*.*" 只同步log文件
  4. --append 增量同步,会比较文件大小,只同步多出来的部分
  5. -e "ssh -p <服务器SSH端口号>" 自定义SSH程序命令行,自定义端口
  6. /var/logs /home/vagrant 同步服务器的 /var/logs 目录到本地的 /home/vagrant 下
  7. sleep 5 同步每次结束后休息5秒,避免过多占用服务器带宽

有兴趣的童鞋可以到这里学习rsync命令的更多用法:
https://www.cnblogs.com/f-ck-need-u/p/7221713.html

撒花

按F6把循环进程切到后台,稍等片刻后访问 http://localhost:5601/,看看能否查询到 log 了

如果历史log量很大,首次启动后会处理大量的log,短时间内查出大量的log是正常现象。

# devops

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×