风蚀之月

Elasticsearch环境安装使用笔记

31 May 2021

想要作一些简单的数据分析,看kibana界面似乎很好用的样子,于是尝试安装了一下。

实际操作环境:windows10和ubuntu20.04。

本次的目标是,通过ELK框架对在Mysql中的数据进行分析。

ELK安装

基础的安装部分比较简单,可以参考网上的其他文章。Ubuntu系统上的安装可以参考DigitalOcean的这篇,基本上就是使用apt命令就可以了。windows上的就更加单纯一些,只要下载对应的bat文件然后解压就可以了。

不过由于很多工具都是linux上的,而且windows安装jdk的mysql包之类的会很麻烦,最后切换到ubuntu上了。

另外,如果是在云服务器上进行安装的话,需要注意主机的配置。实际测试,在腾讯云上这个配置:

1核 2GB 1Mbps

系统盘:高性能云硬盘

无法正常的运行,只要一启动logstash,就会导致Elasticsearch挂掉。

指令备忘

使用时注意开启服务:

sudo systemctl start elasticsearch
sudo systemctl start kibana

可以使用下面的指令检查elasticsearch是否成功开启

curl -X GET "localhost:9200"

kibana直接在本地访问就好:http://localhost:5601。如果是在服务器上可能需要额外的配置端口开放或者用nginx作反向代理,可以参考上面的digitalocean的文档进行。

如果需要服务常驻的话可以打开:

sudo systemctl enable elasticsearch
sudo systemctl enable kibana

Logstash使用

ELK里面,其实Elasticsearch和Kibana一开始只需要安装好就可以了,主要的是Logstash配置好,将数据推送过去。

LogStash其实官方的这篇就很好用了:Stashing Your First Event

这边稍微记录下有用的内容,对于找不到LogStash的路径的话,可以使用指令

whereis logstash

logstash最基本的功能测试,可以用于检查功能是否正常

cd logstash-7.12.1
bin/logstash -e 'input { stdin { } } output { stdout {} }'

官方有个FileBeat教程,使用logstash接入filebeat来分析apache的日志,基本照着做就可以了。

要测试一个配置文件是否正确:

sudo bin/logstash –config.test_and_exit -f first.conf

Mysql连接

Logstash使用mysql需要额外的安装Mysql连接用套件。windows版可以在这里下载连接套件

input {
  jdbc {
    jdbc_driver_library => "C://Program Files (x86)//MySQL//Connector J 8.0//mysql-connector-java-8.0.25.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    jdbc_connection_string =>  "jdbc:mysql://localhost:3306/awesome_database"
    jdbc_user => "your_awesome_mysql_user"
    jdbc_password =>  "your_awesome_password"
    statement =>  "SELECT * from awseome_table_name"
  }
}

output{
  stdout { codec => rubydebug { metadata => true } }
}


jdbc_driver_library 这里需要指向安装目录中对应的连接套件的jar文件。其他的配置项都比较明了。

ubuntu下也需要对应的安装一些连接套件:

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.46.zip

然后解压

unzip mysql-connector-java-5.1.46.zip

将解压后内部的jar路径填到logstash配置的input部分

input {
  jdbc {
    jdbc_driver_library => "usr/share/logstash/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar"
    jdbc_driver_class =>"com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/awesome_database_name"
    jdbc_user => "your_awesome_mysql_user"
    jdbc_password => "your_awesome_password"
    statement =>  "SELECT * from awseome_table_name"
  }
}

output{
  stdout { codec => rubydebug { metadata => true } }
}

输入到Elastic

需要将配置中的output改到对应的elastic

output{
  # stdout { codec => rubydebug { metadata => true } }
  elasticsearch {
        hosts => [ "localhost:9200" ]
        index => "kibana-index"
    }
   # stdout { codec => dots }
}

加入到index后,kibana中需要创建新的index parten才能正确看到。

如果是本地的话,使用这个网址就可以了:http://localhost:5601/app/management/kibana/indexPatterns/

Mysql推送数据多次推送的情况下,会出现很多重复的数据,可以通过在output这边添加配置解决:

output{
  #stdout { codec => rubydebug { metadata => true } }
  elasticsearch {
       hosts => [ "localhost:9200" ]
       index => "productinfo"
       document_id => "%{productid}"
  }
   # stdout { codec => dots }
}

其中,productid就是mysql这边的主键。

对于更加复杂的情况,可以在input这边处理,比较简单的处理方式是使用jdbc input提供的预定义配合时间戳来进行。详细的可以看[官方文档]。

比较简单的用法:

input {
  jdbc {
    statement => "SELECT id, mycolumn1, mycolumn2 FROM my_table WHERE id > :sql_last_value"
    use_column_value => true
    tracking_column => "id"
    # ... other configuration bits
  }
}

这边用的是id来避免input的时候重复,如果ID不是自增的,可以用timestamp来代替,其实默认sql_last_value就是时间戳形式的。更加复杂的情况需要结合last_run来进行,可以进一步参考文档。

一时半会没看到自动根据主键来避免重复的input配置方式。这边暂时在output那边控制下就可以了,不纠结了。