Logstash 同步Mysql数据到 Elasticsearch(包含Logstash、ES的安装、配置和Mysql建表方法,从头开始的简单教程)

本文详细介绍如何在服务器上安装并配置Elasticsearch、Logstash和Kibana,包括使用Logstash的jdbc插件实现Mysql数据的增量同步至Elasticsearch的方法。

前提:首先要安装 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值