Elasticsearch集群实时同步数据库数据(mysql)

帮助文档:
jdbc输入插件
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html
实时同步
https://www.elastic.co/cn/blog/logstash-jdbc-input-plugin#
https://segmentfault.com/a/1190000014387486
输出插件:
https://www.elastic.co/guide/en/logstash/current/output-plugins.html#output-plugins

实现低延迟的检索到ES中的数据或者进行其他数据分析处理。

logstash mysql 准实时同步到 elasticsearch
mysql 作为成熟稳定的数据持久化解决方案,广泛地应用在各种领域,但是在数据分析方面稍有不足,而 elasticsearch 作为数据分析领域的佼佼者,刚好可以弥补这项不足,而我们要做的只需要将 mysql 中的数据同步到 elasticsearch 中即可,而 logstash 刚好就可以支持,所有你需要做的只是写一个配置文件而已.

安装logstash:
这里我用的es集群式6.0.1所以logstash也是6.0.1

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.1.zip
unzip logstash-6.2.3.zip && cd logstash-6.0.1

安装jdbc和elasticsearch插件

bin/logstash-plugin install logstash-input-jdbc
bin/logstash-plugin install logstash-output-elasticsearch

获取 jdbc mysql 驱动
地址:https://dev.mysql.com/downloads/connector/j/3.1.html

wget https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-5.1.46.zip
unzip mysql-connector-java-5.1.46.zip

编辑配置文件:
在logstash的config目录下
使用 logstash-input-jdbc 插件读取 mysql 的数据,这个插件的工作原理比较简单,就是定时执行一个 sql,然后将 sql 执行的结果写入到流中,增量获取的方式没有通过 binlog 方式同步,而是用一个递增字段作为条件去查询,每次都记录当前查询的位置,由于递增的特性,只需要查询比当前大的记录即可获取这段时间内的全部增量,一般的递增字段有两种,AUTO_INCREMENT 的主键 id 和 ON UPDATE CURRENT_TIMESTAMP 的 update_time 字段,id 字段只适用于那种只有插入没有更新的表,update_time 更加通用一些,建议在 mysql 表设计的时候都增加一个 update_time 字段

input {
    
    
  jdbc {
    
    
    jdbc_driver_library => "/usr/local/mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.2.16:3306/user?useSSL=false"
    jdbc_user => "root"
    jdbc_password => "Zksw@2019"
    schedule => "* * * * *"
    statement => "SELECT * FROM contacts"
    #statement => "SELECT * FROM table WHERE update_time >= :sql_last_value"
    jdbc_validate_connection => true
    #use_column_value => true
    #tracking_column_type => "timestamp"
    #tracking_column => "t_user"
    #last_run_metadata_path => "syncpoint_table"
  }
}
output {
    
    
       #stdout { codec => json_lines }
       elasticsearch {
    
    
                hosts => "0.0.0.0:9200"
                document_type => "contact"
                #user => "elasticsearch"
                #password => "123456"
                index => "contacts"
                document_id => "%{uid}"
        }
}

字段解释:
jdbc_driver_library: jdbc mysql 驱动的路径。
jdbc_driver_class: 驱动类的名字,mysql 填 com.mysql.jdbc.Driver 就好了
jdbc_connection_string: mysql 地址
jdbc_user: mysql 用户
jdbc_password: mysql 密码
schedule: 执行 sql 时机,类似 crontab 的调度
statement: 要执行的 sql,以 “:” 开头是定义的变量,可以通过 parameters 来设置变量,这里的 sql_last_value 是内置的变量,表示上一次 sql 执行中 update_time 的值。
use_column_value: 使用递增列的值
tracking_column_type: 递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
tracking_column: 递增字段的名称,这里使用 update_time 这一列,这列的类型是 timestamp
last_run_metadata_path: 同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以手动修改
jdbc_validate_connection:连接池配置。使用前验证连接。
OUPUT:
hosts: es 集群地址
user: es 用户名
password: es 密码
index: 导入到 es 中的 index 名。
document_id: 导入到 es 中的文档(更新的主键id) id,这个需要设置成主键,否则同一条记录更新后在 es 中会出现两条记录,%{id} 表示引用 mysql 表中 id 字段的值
document_type:类型事件,被用于设置输出文档的tpye类型。默认log

创建的数据库叫user,表叫做contacts:

create table contacts (
    uid serial,
    email VARCHAR(80) not null,
    first_name VARCHAR(80) NOT NULL,
    last_name VARCHAR(80) NOT NULL
);
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Jim', 'Smith');
INSERT INTO contacts(email, first_name, last_name) VALUES(null, 'John', 'Smith');
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Carol', 'Smith');
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Sam', null);

运行:
注意不要使用root用户去运行。

../bin/logstash -f ./sync_table.cfg

在这里插入图片描述
es查看:
在这里插入图片描述
测试更新和插入,看es是否实时同步数据库:

UPDATE contacts SET last_name = 'Smith' WHERE email = '[email protected]';
UPDATE contacts SET email = '[email protected]' WHERE uid = 3;
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'New', 'Smith');

多表同步:
一个 logstash 实例可以借助 pipelines 机制同步多个表,只需要写多个配置文件就可以了,假设我们有两个表 table1 和 table2,对应两个配置文件 sync_table1.cfg 和 sync_table2.cfg

在 config/pipelines.yml 中配置
- pipeline.id: table1
  path.config: "config/sync_table1.cfg"
- pipeline.id: table2
  path.config: "config/sync_table2.cfg"
直接 bin/logstash 启动即可

@timestamp 字段
默认情况下 @timestamp 字段是 logstash-input-jdbc 添加的字段,默认是当前时间,这个字段在数据分析的时候非常有用,但是有时候我们希望使用数据中的某些字段来指定这个字段,这个时候可以使用 filter.date, 这个插件是专门用来设置 @timestamp 这个字段的
比如我有我希望用字段 timeslice 来表示 @timestamp,timeslice 是一个字符串,格式为 %Y%m%d%H%M

filter {
    
    
  date {
    
    
    match => [ "timeslice", "yyyyMMddHHmm" ]
    timezone => "Asia/Shanghai"
  }
}

把这一段配置加到 sync_table.cfg 中,现在 @timestamp 和 timeslice 一致了

在kibana中搜索数据:
将部分数据迁移到Elasticsearch的一个重要功能是能够使用Kibana生成具有洞察力的出色可视化效果。
安装帮助文档:https://www.elastic.co/guide/cn/kibana/current/targz.html#targz-configuring
配置帮助文档:https://www.elastic.co/guide/cn/kibana/current/settings.html
kibana帮助文档:https://www.elastic.co/guide/cn/kibana/current/createvis.html
下载并安装:

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-linux-x86_64.tar.gz
sha1sum kibana-6.0.1-linux-x86_64.tar.gz
tar -zxf kibana-6.0.1-linux-x86_64.tar.gz 
cd kibana-6.0.1-linux-x86_64/

下载darwin包
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-darwin-x86_64.tar.gz
tar -zxf kibana/kibana-6.0.1-darwin-x86_64.tar.gz
cd kibana/kibana-6.0.1-darwin-x86_64/

从命令行启动kibana

./bin/kibana

默认 Kibana 在前台启动,打印日志到标准输出 (stdout),可以通过 Ctrl-C 命令终止运行。

.tar.gz 文件目录
.tar.gz 整个包是独立的。默认情况下,所有的文件和目录都在 $KIBANA_HOME — 解压包时创建的目录下。这样非常方便,因为您不需要创建任何目录来使用 Kibana,卸载 Kibana 就是简单地删除 $KIBANA_HOME 目录。但还是建议修改一下配置文件和数据目录,这样就不会删除重要数据。

home
Kibana home 目录或 $KIBANA_HOME 。
解压包时创建的目录
bin
二进制脚本,包括 kibana 启动 Kibana 服务和 kibana-plugin 安装插件。
$KIBANA_HOME\bin
config
配置文件,包括 kibana.yml 。
$KIBANA_HOME\config
data
Kibana 和其插件写入磁盘的数据文件位置。
$KIBANA_HOME\data
optimize
编译过的源码。某些管理操作(如,插件安装)导致运行时重新编译源码。
$KIBANA_HOME\optimize
plugins
插件文件位置。每一个插件都有一个单独的二级目录。
$KIBANA_HOME\plugins

配置kibana配置文件:
Kibana 默认情况下从 $KIBANA_HOME/config/kibana.yml 加载配置文件。
在这里插入图片描述
server.port: 5601 kibana 打开的端口
server.host: “0.0.0.0” kibana 侦听的地址
elasticsearch.url: “http://192.168.10.181:9200” 和 elasticsearch 建立联系
kibana.index: “.kibana” 在 elasticsearch 中添加.kibana 索引

浏览器登陆:http://ip地址:5621
第一次登录需要添加一个 elasticsearch 索引
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ZhanBiaoChina/article/details/105430871