前提:首先要安装 Java8,因为 Logstash和ES都是Java写的
一、Elasticsearch的安装和启动
安装:
官方链接为:https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html(包含ES、Logstash、Kibana)
可能的问题:可能需要翻墙才可访问这个网址,在服务器上无法下载或者很慢,笔者的做法是直接在自己的可翻墙 的笔记本上直接访问以下地址下载,完成后再从自己本地拷贝到服务器内
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.0-linux-x86_64.tar.gz
解压命令
tar -zxvf elasticsearch-7.0.0-linux-x86_64.tar.gz
启动ES
注意:ES不允许在root账户启动 解决方法为:在root用户下,将 文件夹的权限赋给 非root账号,命令如下
chown -R {用户名} {es的路径}
然后切换到有权限的用户下 执行以下命令启动
./bin/elasticsearch -d
-d 为在后台启动,可以先不加 -d 查看启动过程是否有错误,没有异常之后再 ctrl + c停止服务,重新加上
-d 参数后台运行
验证
ES以 Restful API的形式提供服务,所以我们在linux内执行以下命令访问 ES服务
curl http://127.0.0.1:9200/
看到如下返回则 成功
{
"name" : "caring",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "IdlOUUlQSVGWlPSm0AWbyg",
"version" : {
"number" : "7.0.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "b7e28a7",
"build_date" : "2019-04-05T22:55:32.697037Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.7.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
二、Logstash的安装,以及插件 logstash-input-jdbc的安装和配置
我的安装方式和 通ES的安装,依然沿用有VPN的笔记本下载和上传服务器的方式,地址如下:
https://artifacts.elastic.co/downloads/logstash/logstash-7.0.0.tar.gz
安装 logstash-input-jdbc插件,Logstash通过这个插件连接Mysql获取数据,安装命令如下
logstash-7.0.0/bin/logstash-plugin install logstash-input-jdbc
等一会儿就安装成功啦,不能成功的话参考这篇:https://blog.youkuaiyun.com/yeyuma/article/details/50240595#quote,我反正直接成功了,hiahiahia
三、我的Mysql建表方式 和 对应的 Logstash配置和运行方法
同步原理简述:我们在需要同步的表中 建一个 update_time 字段, 类型为 timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 这个配置的意思是 插入和更新的时候,数据库会自动刷新这个字段的值为 当前时间,之后同步的时候,我们为Logstash提供的SQL策略为 where update_time > = :sql_last_value, sql_last_value后面会看到是 Logstash内置变量,我们需要自己设置它的值为每次查出的数据中 最后一条数据的update_time值,这样下次查询 就从上一次的更新时间开始查,实现增量更新。
Mysql表中加一个字段 update_time timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
Logstash配置文件:新建 jdbc.conf , 内容如下
input{
jdbc{
jdbc_connection_string=>"jdbc:mysql://127.0.0.1:3306/es"
jdbc_user=>""
jdbc_password=>""
#数据库驱动目录
jdbc_driver_library=>"/home/es/mysql-connector-java-5.1.47.jar"
jdbc_driver_class=>"com.mysql.jdbc.Driver"
#分页配置 设置一次返回的最大数量为 50000条数据
jdbc_paging_enabled=>"true"
jdbc_page_size=>"50000"
#sql_last_value 配置
use_column_value => true
#sql_last_value 保存哪一列的值
tracking_column => "update_time"
tracking_column_type => timestamp
record_last_run => true
#不同的输入 需要配置不同的 记录文件,不然 大家都用同一个会相互覆盖,造成混乱
last_run_metadata_path => "/home/es/logstash-7.0.0/test_last_run.txt"
#提取数据的sql文件路径
statement_filepath=>"/home/es/jdbc/jdbc.sql"
# 每隔15秒 同步一次 日志的表述可以验证这点
schedule=>"0,15,30,45 0-59 0-23 * * *"
type=>"jdbc"
}
}
output{
elasticsearch{
hosts=>"127.0.0.1:9200"
index=>"test_index"
document_type=>"test"
#使用mysql的主键作为 document_id 这样重复获取的数据会覆盖而不是新增
document_id=>"%{id}"
}
}
jdbc.sql 文件如下:
SELECT
id,
title,
content,
update_time # tracking_column 指定的追踪列需要在结果集中返回 以更新 sql_last_value
FROM
test
WHERE
update_time >= : sql_last_value
注意:以上 jdbc.conf 配置文件格式需要注意,换行后 严格使用 Tab键来控制缩进,不可以夹杂空格,否则会报如下错误:
Expected one of #, if, \", ', } at line 2, column 1 (byte 9) after input {\n
这种就只能自己努力去调整格式了,我的方法是 退格删除空格,之后在换行、使用Tab键
使用编辑好的配置启动 Logstash, 命令如下
/home/es/logstash-7.0.0/bin/logstash -f /home/es/jdbc/jdbc.conf -w 10 -l /var/log/
-w 指定线程数量 默认为cpu核数
-l 指定日志目录
后台运行使用 nohup + &
没有报错即运行成功
四、验证
在Mysql对应表中插入数据和更新数据,然后查询ES看是否查询到对应数据即可,ES的API参照 https://es.xiaoleilu.com/010_Intro/00_README.html
over