ElasticSearch是一款基于Lucene的功能强大的开源分布式搜索与数据分析引擎,它具有高性能、易于扩展的优点,不仅可以从海量数据中快速找到相关信息,还被广泛运用于大数据近实时的分析,包括日志分析、指标监控、信息安全等多个领域。
相关链接:
常听的ELK,即ElasticSearch、Logstash、Kibana,可以搭建一个完整的数据采集、存储、可视化的平台,这里来先动手实践,对其流程有一个感官的理解,后面再慢慢去深入了解ElasticSearch的各种高级用法。首先,需要下载ELK三件套,注意,这三者的版本必须一致,否则无法正常进行数据采集,我这里采用的是7.5.0版本的:
另外还需要注意的是,安装之前需要JDK环境的支持,JAVA_HOME的配置这里就不多说了。
安装ElasticSsearch
下载ES压缩包,解压后目录结构如下所示:
目录说明:
bin | ES的各种功能的脚本文件 |
config | elasticsearch.yml文件重点关注,配置ES的,另外还有登录用户的配置文件 |
data | ES节点存储数据文件的目录 |
jdk | 7.x版本后自带JDK依赖,方便配置环境 |
lib | Java类库 |
logs | 运行日志输出的目录 |
modules | 包含的ES模块 |
plugins | 包含ES已安装的插件 |
配置elasticsearch.yml:
配置jvm.options:
还有一点要注意,上面值得设置不要超过30GB大小。
配置完成后,运行bin目录下的脚本文件:
检查确认启动成功:
注意这里,cluster_name,是ES集群的名称,这里只是单机的一个实例,单一个集群有多个节点时,需要确保集群名称一样,可以通过如下方式在本机启动一个集群的多个节点:
elasticsearch.bat -E node.name=linjk_1 -E cluster.name=linjk -E path.data=xxx -E http.port=3358
elasticsearch.bat -E node.name=linjk_2 -E cluster.name=linjk -E path.data=xxx -E http.port=3359
elasticsearch.bat -E node.name=linjk_3 -E cluster.name=linjk -E path.data=xxx -E http.port=3360
然后可通过URL查看当前集群有多少个节点:
为了后面方便,这里安装了IK中文分词器:
elasticsearch-plugin.bat install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip
安装完成后,重启ES,查看安装的插件:
ES配置用户名密码:
提示需要配置X-Pack,配置如下:
重启ES,重新配置密码:(这里我都用了一个密码`ljk121`)
这是再访问http://localhost:3358,就会弹出登录对话框了:
安装Kibana
上面是通过浏览器去调用ES提供的一些API,但是只能发GET请求,后面需要发POST请求去查询一些数据就不方便了,这里可以借助Kibana这个工具,启动Kibana很简单,修改其配置文件,然后执行bin目录下的bat或sh脚本即可,注意,ES首先需要启动,在这里ES是服务端,Kibana是客户端。
修改配置文件kibana.yml:
启动:
圈住的Dev Tools很有用,如下所示:
可以很方便运行ES提供的一些API函数。这里暂时就用到Kibana的Dev Tools,其他功能后面再慢慢探索。
安装Logstash
有了存储数据的ES和可视化工具Kibana,现在就需要从数据库导入数据到ES了,这里从MySQL导入数据到ES,以借助ES强大的搜索和分析能力去进一步实现后面的业务功能。
新建一个测试库和测试表:
新建Logstash导入数据的配置文件:
input {
jdbc {
jdbc_driver_library => "D:\\usr\\pathvar\\kettle\\lib\\mysql-connector-java-5.1.47.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3308/es_test"
jdbc_user => "root"
jdbc_password => "xxxxx"
schedule => "* * * * *"
statement => "SELECT * FROM t_user_account WHERE update_time >= :sql_last_value"
# statement_filepath => "./config/jdbc.sql"
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "update_time"
last_run_metadata_path => "syncpoint_table"
}
}
output {
elasticsearch {
# ES的IP地址及端口
# hosts => ["localhost:3358", "localhost:3359"]
hosts => "http://localhost:3358"
# 索引名称
index => "es_test"
# 关联的数据库中有一个id字段,对应类型中的id,无则ES自己生成
document_id => "%{id}"
document_type => "user"
}
stdout {
# JSON格式输出
codec => json_lines
}
}
编写后最好测试一下配置文件是否有语法问题:
没问题,启动:
报错:
解决:
下载安装插件:
https://github.com/logstash-plugins/logstash-input-jdbc/releases/tag/v4.3.19
然后安装:(生成gem文件这一步需要先安装Ruby)
再次启动,可以看到,在执行数据同步了:
去ES查询验证一下:
可以看到,在ES可以看到了,接下来,在MySQL修改这条数据,看是否也能同步更新ES的数据,同步的时间最小粒度是1分钟,可以看到,数据也变化了。
好了,从采集数据到存储到ES的链路走通了,后面学习再记录了。