在windows上安装和启动ELK + Mysql数据同步

在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语句则是表示运行成功:
在这里插入图片描述

注意:如果说一遍过的话,那就恭喜你,如果报错的话我这里呢有几个建议:

  1. jdbc.conf 的编码格式一定要 UTF-8
  2. 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层捞过来。
如果有更好的方案的话可以一起分享下…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值