ELK由Elasticsearch、Logstash和Kibana三部分组件组成。
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
简单来说,他是个全文搜索引擎,可以快速地储存、搜索和分析海量数据。
Elastic也可以理解为是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。以文档方式存储数据,和mangoDB类似。Elasticsearch、MongoDB和Hadoop比较 这篇文章将Elasticsearch和mongoDB做了比较,可以参考一下
Logstash是一个完全开源的工具,它可以把分散的、多样化的日志日志,或者是其他数据源的数据信息进行收集、分析、处理,并将其存储供以后使用。
kibana 是一个开源和免费的工具,它可以为Logstash和 ElasticSearch提供的日志分析友好的Web界面,可以帮助您汇总、分析和搜索重要数据日志。
其实,简单来说,ELK的核心是Elasticsearch,logstash和kibana都是为Elasticsearch服务的。使用logstash能够很方便的将其他来源的数据,比如:日志文件、数据库等方便的导入到Elasticsearch中。使用kibana可以直观清晰的展示Elasticsearch中存储的数据,生成图表,帮助分析,同时提供控制台来操作Elasticsearch。
所以说没有logstash和kibana,Elasticsearch也是能够正常使用的,只是用的没那么方便高效而已。
我们可以从官网获取安装包。其实官网很棒,还有中文主页。官网的文档很容易理解,例子也很好实现。
elastic官网
Elasticsearch、logstash、kibana下载页面
历史版本下载页面Past Releases
在官网下载自己需要的版本即可,但是最好是三者的版本保持一致,Elasticsearch作为一个版本多,变化大的恢弘巨作,我认为是一群善变的程序员开发出来的。
Mac(linux)、jdk1.8
解压之后,首先进行配置。配置文件路径:/config/elasticsearch.yml。
主要配置:
- cluster.name:集群名称,默认则会自动分配
- node.name是节点名称,默认则会自动分配
- http.port是访问端口,默认9200。
我的配置如下:
cluster.name: my-application
node.name: node-1
执行以下语句即可启动Elasticsearch。其中,-d是通过守护进程启动。
./bin/elasticsearch
./bin/elasticsearch -d
检测是否启动成功:
curl 'http://localhost:9200/?pretty'
或者直接在浏览器访问这个地址,就可以显示类似如下的返回结果:
{
"name" : "node-1",
"cluster_name" : "my-application",
"cluster_uuid" : "Q79rR5mCTICI7UfEcwmDnA",
"version" : {
"number" : "5.0.1",
"build_hash" : "080bb47",
"build_date" : "2016-11-11T22:08:49.812Z",
"build_snapshot" : false,
"lucene_version" : "6.2.1"
},
"tagline" : "You Know, for Search"
}
这样,我们的Elasticsearch就成功启动了。
解压kibana之后,首先进行配置。配置文件路径:config/kibana.yml
主要配置:
我的配置如下:
server.host: "localhost"
elasticsearch.url: "http://localhost:9200"
kibana.index: ".kibana"
server.port: 5601
启动方式和Elasticsearch一样:
./bin/kibana
浏览器访问http://localhost:9200即可进入kibana首页。
解压logstash之后,首先进行配置(怎么还是这句话……)。哦不能首先配置,我们得先来了解一下logstash的工作原理和具体配置。
Logstash使用管道方式进行日志的搜集处理和输出,从输入到输出,整个过程包括了三个阶段:输入input –> 处理filter(不是必须的) –> 输出output,每个阶段都可以选择很多的插件配合工作,比如file、elasticsearch、redis;也可以指定多种方式,比如输出到Elasticsearch或者输出控制台。
配置格式要包括整个阶段的三部分,所以标准格式如下:
input {...}
filter {...}
output {...}
每一部分可以指定多个方式,比如输入要从控制台和数据库输入,按照如下配置:
input {
stdin {
}
jdbc {
...
}
}
输出如果是输出控制台或者Elasticsearch,按照如下配置:
output {
elasticsearch {
hosts => "localhost:9200"
index => "mysql_accept"
document_type => "accept"
}
stdout {
codec => json_lines
}
}
因为filter的配置不是必须的,所以这里暂时不表,等后续需要再讲解。
-f指定Logstash的配置文件,根据配置文件配置logstash并进行启动:
./logstash -f logstash.conf
-e字符串当做配置启动,”“则默认控制台输入控制台输出
./logstash -e ""
-t测试配置文件是否正确并退出
./logstash -t logstash.conf
上文已经讲解了logstash的基本配置以及启动命令。不过如果我们的logstash只是做从控制台输入再从控制台输出的工作实在是太没有意义了。一般的业务需求中,是需要将海量的数据从数据库中索引到Elasticsearch中的,所以这里主要介绍一下如何从MySQL和oracle将数据保存到Elasticsearch。Jdbc input plugin是官方文档对于jdbc插件的介绍,感兴趣的话可以看一看,毕竟官方文档是最权威的。
jdbc的input配置中,以下几项是比较重要的:
以下几项是增量更新的配置。logstash对于数据库的增两个更新有两种控制方式,一种是根据时间,一种是根据自增判断。执行完一次同步后,logstash会将最后同步的那条记录的时间或者自增值记录到文件中,下次同步时则从最新记录那里开始执行,记录值在sql语句中用:sql_last_value作为替代。
如果是用时间做控制,则sql语句这样写:
select * from tablename where update_time>:sql_last_value
如果不配置,则每次都会全量更新,这样比较浪费资源,所以建议配置:
对于output到Elasticsearch的配置,最好是配置好数据索引到Elasticsearch的index、type和文档的id。下面是一个简单的配置:
output {
elasticsearch {
hosts => "localhost:9200"
index => "my_index"
document_type => "my_type"
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
其中,index为同步数据时要保存到的索引,document_type为要保存到的type,document_id则配置保存成单个文档的id,%{id}中的id对应sql语句中的主键id字段名,同时数据也会输出到控制台。
下面是我的一个配置:
input {
jdbc {
jdbc_driver_library => "/Users/tinybye/Documents/elk/logstash-5.0.1/lib/mysql-connector-java-5.1.10-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/mysql_logstash"
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *"
statement => "SELECT id,name,age from person_table where update_time > :sql_last_value"
last_run_metadata_path => "./logstash_jdbc_last_run"
use_column_value => false
tracking_column => "submit_time"
}
jdbc {
jdbc_driver_library => "/Users/tinybye/Documents/elk/logstash-5.0.1/lib/ojdbc6.jar"
jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
jdbc_connection_string => "jdbc:oracle:thin:test/test@//127.0.0.1:1521/orcl"
jdbc_user => "test"
jdbc_password => "test"
schedule => "* * * * *"
statement_filepath => "/Users/tinybye/Documents/elk/logstash-5.0.1/bin/logstash_sql/select.sql"
last_run_metadata_path => "./logstash_jdbc_last_run_oracle"
use_column_value => false
tracking_column => "submit_time"
}
}
# filter {
# }
output {
elasticsearch {
hosts => "localhost:9200"
index => "mysql_logstash"
document_type => "person"
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
执行以下命令,就可以将数据同步到之前配置好的Elasticsearch中了:
./logstash -f logstash.conf
ELK日志分析系统
Logstash使用详解
logstash-input-jdbc 同步原理及相关问题解读