在windows上安装和启动ELK + Mysql数据同步
我真的是想哭,所有的配置搞了好久了哦。真的,这里面的配置简直不要太坑了, 所以我在这个记录下来,希望可以帮助到初学这个ES的童靴们,哎 , 太不容易,如果觉得不错,打赏几个再走.!
1. 安装Elasticsearch-head-master(ES集群节点管理器)
先把这个集群管理的东西安装好,直接在该目录下面输入 grunt server运行
浏览器访问 (http://localhost:9100/):
2. 安装ES
如果单个Es根本不用配置,直接开箱即用,点击bin目录下面的elasticsearch.bat运行
在config下面的elasticsearch.yml文件中配置跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
2. 安装ES集群
注意这个Es集群的配置文件尽量自己手敲,不然会出现很多意想不到的错误(文件格式不正确)
我们这里需要复制三个ES文件
同样配置,分别修改在config下面的elasticsearch.yml文件
节点一:
##集群名称,保证唯一
cluster.name: my-elasticsearch
##节点名称
node.name: node-1
##本机IP地址
network.host: 127.0.0.1
##服务端口
http.port: 9200
##集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9300
##设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9301", "127.0.0.1:9302"]
节点二:
##集群名称,保证唯一
cluster.name: my-elasticsearch
##节点名称
node.name: node-2
##本机IP地址
network.host: 127.0.0.1
##服务端口
http.port: 9201
##集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9301
##设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9301", "127.0.0.1:9302"]
节点三:
##集群名称,保证唯一
cluster.name: my-elasticsearch
##节点名称
node.name: node-3
##本机IP地址
network.host: 127.0.0.1
##服务端口
http.port: 9202
##集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9302
##设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9301", "127.0.0.1:9302"]
分别启动elasticsearch.bat 运行效果:
3. 接下来安装logstash
我发现logstash的版本号一定要大于ES的版本号,不一定要相等,这里先不记录展示到Kibana里面,直接说mysql + logstash + es 的数据同步, 这也是本文的重头戏,我可是看了很久的!!!!!
logstash7.x版本里面已经内嵌好了插件,不要再次安装
步骤一:在logstash/bin目录下新建文件夹mysql
步骤二:把数据库链接文件丢进入,并新建jdbc.conf文件
编辑该配置文件如下:
input {
jdbc {
##链接串里面一定要有serverTimezone=UTC,不然会链接不上的
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/essearch?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
jdbc_driver_class => "com.mysql.jdbc.Driver"
##驱动的路径
jdbc_driver_library => "mysql-connector-java-8.0.12.jar"
#数据库用户名
jdbc_user => root
#数据库密码
jdbc_password => ""
#分页
jdbc_paging_enabled => true
#分页大小
jdbc_page_size => 100000
#流式获取数据,每次取10000
jdbc_fetch_size => 10000
#Maximum number of times to try connecting to database
connection_retry_attempts => 3
#Number of seconds to sleep between connection attempts
connection_retry_attempts_wait_time => 1
#超时时间
jdbc_pool_timeout => 5
#是否强制字段为小写的形式
lowercase_column_names => true
#防止中文乱码
codec => plain {charset => "UTF-8"}
#启用数据库字段记录增量
use_column_value => true
#没有采用读取binlog的读取方式
tracking_column => update_time
#递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
tracking_column_type => "timestamp"
##保存上次运行记录,增量提取数据时使用
record_last_run => true
#记录上次的同步点,需要事先创建好,重启时会读取这个文件,这个文件可以手动修改
last_run_metadata_path => "jdbc-position.txt"
#是否清除last_run_metadata_path的记录,如果是true,则从头开始查询所有的数据库记录
clean_run => false
#也可指定SQL文件
#statement_filepath => "jdbc.sql"
statement => "select * from article where update_time >= :sql_last_value order by update_time desc"
schedule => "* * * * *"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
date{
match => ["update_time","yyy-MM-dd HH:mm:ss"]
}
}
output {
stdout{ codec => json_lines }
elasticsearch {
document_id => "%{id}"
document_type => "article_boc"
index => "article"
hosts => ["http://127.0.0.1:9200"]
}
}
步骤三:先什么都不用说,先跑起来看看,输入命令行
logstash -f mysql/jdbc.conf
运行成功,出现Sql语句则是表示运行成功:
注意:如果说一遍过的话,那就恭喜你,如果报错的话我这里呢有几个建议:
- jdbc.conf 的编码格式一定要 UTF-8
- jdbc.sql 的编码格式一定要 UTF-8
3.报这个错误的话
[2019-12-02T20:31:55,669][WARN ][logstash.config.source.multilocal] Ignoring the ‘pipelines.yml’ file because modules or command line options are specified
解决方案1. 尝试修改文件 config/pipelines.yml
– pipeline.id: main
path.config: “F:\ELK\logstash-7.4.2\bin\mysql\jdbc.conf”
pipeline.workers: 3
解决方案2. 删除data文件夹下面的 .lock 文件
4.删掉配置文件中的中文注释
4. 同步多张表的数据
可能有些小伙伴要提出疑问了,为什么只能够同步一张表,可以同步多张表吗? 肯定可以的啊 ,安排!
直接修改配置文件就好了
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/essearch?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_driver_library => "mysql-connector-java-8.0.12.jar"
jdbc_user => root
jdbc_password => ""
codec => plain {charset => "UTF-8"}
use_column_value => true
tracking_column => update_time
tracking_column_type => "timestamp"
record_last_run => true
last_run_metadata_path => "jdbc-position.txt"
statement => "select * from article where update_time >= :sql_last_value order by update_time desc"
schedule => "* * * * *"
add_field => { "[@metadata][indextype]" => "data1" }
}
jdbc {
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/essearch?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_driver_library => "mysql-connector-java-8.0.12.jar"
jdbc_user => root
jdbc_password => ""
jdbc_paging_enabled => true
jdbc_page_size => 100000
jdbc_fetch_size => 10000
connection_retry_attempts => 3
connection_retry_attempts_wait_time => 1
jdbc_pool_timeout => 5
lowercase_column_names => true
codec => plain {charset => "UTF-8"}
use_column_value => true
tracking_column => UpdateTime
tracking_column_type => "timestamp"
record_last_run => true
last_run_metadata_path => "jdbc-buildingbaseinfos.txt"
clean_run => false
statement => "select * from xkj_fy_buildingbaseinfos where UpdateTime >= :sql_last_value order by UpdateTime desc"
schedule => "* * * * *"
add_field => { "[@metadata][indextype]" => "data2" }
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
date{
match => ["update_time","yyy-MM-dd HH:mm:ss"]
}
}
output {
stdout{ codec => json_lines }
if [@metadata][indextype] == "data1" {
elasticsearch {
document_id => "%{id}"
document_type => "article_boc"
index => "article"
hosts => ["http://127.0.0.1:9200"]
}
}
if [@metadata][indextype] == "data2" {
elasticsearch {
document_id => "%{id}"
document_type => "buildingbaseinfos_type"
index => "xkj_fy_buildingbaseinfos"
hosts => ["http://127.0.0.1:9200"]
}
}
}
运行效果:
在浏览器中查看
好啦,先写在这儿~
2019-12-04更新:
我又去查询了一下这中同步方式的缺点,由于还没有用于实际业务,据说:
logstash感觉用起来不够灵活,脚本没办法动态传参,只能通过:sql_last_value要么以时间戳,要么以自增列来勉强实现动态效果。而且使用enable_paging时,其是直接将原sql语句作为子查询,拼接offset和limit来实现。当查询出的结果集较大时存在深度分页瓶颈,数据的抽取效率会越来越慢。现在基本都快弃用logstash了
解决方案:
如果面临大数据量的同步。初步的想法是使用阿里开源的datax以及kafka,connect来进行数据的全量同步,以及基于时间戳的增量同步。如果实时性要求较高的话,最好使用canal来进行增量订阅与消费。当然了如果你们公司已经有大数据平台,事先已经将数据同步到hbase层了,可以直接使用官网提供的elastic-hadoop组件直接将数据从hbase或hive层捞过来。
如果有更好的方案的话可以一起分享下…