用LogStash同步MySQL数据至ES

本文介绍如何使用LogStash工具同步MySQL数据至Elasticsearch,并覆盖单表同步、多表同步及自定义mapping等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  LogStash是一款用来同步数据至ES的工具。往ES中放置的数据体量都比较大。
  在MySQL的应用场景里,也会存在数据体量到达一定程度——–>此时MySQL自身的‘like’类查询并不能很好的支持查询要求,甚至可能会导致崩溃的情况。
  这种时候,ES的作用就凸显出来了。它是专治庞大数据场景下的理想存在。
  当你学会es的基本使用后,同步你所用数据库中的数据至ES也必将成为需要习得的一门重要技能!
  好的,接下来就说说,我在学习这门技能的过程中遇到的问题和趟过之后的总结:
  环境说明: windows7+elasticsearch 5.5.0+LogStash 5.5.0
  前提说明:进入到了elasticsearch安装目录的bin目录下,运行(手动双击或者在cmd命令行下)elasticsearch.bat,运行的成功的话,在浏览器的地址栏中输入:localhost:9200
你会得到一段返回的json结果。
  然后进入到logstash的bin目录下,输入下方提及的命令。

  ①:单表同步

  单表同步的操作非常简单。
 在logStash的bin目录下创建xxx.conf配置文件。然后运行命令 logstash.bat -f xxx.conf
 如果在cmd的窗口中看到了select * xxxx 之类的json输出语句,则说明同步是成功了的。可以借助es的header插件,开启header插件后,去查看同步的数据(header插件的具体安装方法,请自己搜索)。
 以我的为例:
 文件名:mysql-logstash.conf

input {
 stdin { }
    jdbc {
        #需要同步的数据库
        jdbc_connection_string => "jdbc:mysql://localhost:3306/sakila"

        jdbc_user => "root"

        jdbc_password => "123456"
        #本地jar包
        jdbc_driver_library => "E:/TomcatServer/apache-tomcat-8.0.43/123/iserm_server/WEB-INF/lib/mysql-connector-java-5.1.41.jar"

        jdbc_driver_class => "com.mysql.jdbc.Driver"

        jdbc_paging_enabled => "true"

        jdbc_page_size => "50000"
        #获取到记录的SQL查询语句
        statement => "SELECT * FROM category"
        #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
        schedule => "* * * * *"
    }
 }

 output {
     stdout {
        codec => json_lines
    }
    elasticsearch {
        #ESIP地址与端口
        hosts => "localhost:9200"
        #ES索引名称(自己定义的)
        index => "category2-test"
        #文档类型
        document_type => "category"
        #文档类型id,%{category_id}意思是取查询出来的category_id的值,并将其映射到es中_id字段中
        document_id => "%{category_id}"
    }
}

  然后在bin目录下运行 logstash.bat -f mysql-logstash.conf即可。

  ②:多表同步

  多表同步的方法其实跟单标同步的差不多,只是多了一个type而已
  同样以我自己的为例,文件名:mySQL-logStash-MultiTable.conf

input {
 stdin { }
    jdbc {
        type => "tongbu01"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/sakila"

        jdbc_user => "root"

        jdbc_password => "123456"

        jdbc_driver_library => "E:/TomcatServer/apache-tomcat-8.0.43/123/iserm_server/WEB-INF/lib/mysql-connector-java-5.1.41.jar"

        jdbc_driver_class => "com.mysql.jdbc.Driver"

        jdbc_paging_enabled => "true"
        #添加增量类配置
        record_last_run => "true"
        use_column_value => "true"
        tracking_column => "actor_id"
        tracking_column_type => numeric
        clean_run => "false"

        jdbc_page_size => "50000"
        #获取到记录的SQL查询语句
        statement => "SELECT * FROM actor"
        #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
        schedule => "* * * * *"
    }

    jdbc {

        type => "tongbu02"

        jdbc_connection_string => "jdbc:mysql://localhost:3306/sakila"

        jdbc_user => "root"

        jdbc_password => "123456"

        jdbc_driver_library => "E:/TomcatServer/apache-tomcat-8.0.43/123/iserm_server/WEB-INF/lib/mysql-connector-java-5.1.41.jar"

        jdbc_driver_class => "com.mysql.jdbc.Driver"

        jdbc_paging_enabled => "true"
        #添加增量类配置
        record_last_run => "true"
        use_column_value => "true"
        tracking_column => "country_id"
        tracking_column_type => numeric
        clean_run => "false"

        jdbc_page_size => "50000"
        #获取到记录的SQL查询语句
        statement => "SELECT * FROM country"
        #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
        schedule => "* * * * *"
    }
 }

 output {
     stdout {
        codec => json_lines
    }

    if[type]=="tongbu01"{
        elasticsearch {
          #ESIP地址与端口
          hosts => "localhost:9200"
          #ES索引名称(自己定义的)
          index => "tongbu01-test-increment"
          #文档类型
          document_type => "tongbu01"
          #文档类型id
          document_id => "%{actor_id}"
      }
    }

    if[type]=="tongbu02"{
        elasticsearch {
          #ESIP地址与端口
          hosts => "localhost:9200"
          #ES索引名称(自己定义的)
          index => "tongbu02-test-increment"
          #文档类型
          document_type => "tongbu02"
          #文档类型id
          document_id => "%{country_id}"
      }
  }

}

  然后在bin目录下运行 logstash.bat -f mySQL-logStash-MultiTable.conf即可。

  ③:自定义mapping

  关于mapping:
  摘自:http://blog.csdn.net/lvhong84/article/details/23936697

   一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。
   总的来说,mapping就是借助自身的(或用户自定义)的过滤器和分析规则把你传给它的数据解析出来,呈现给你。mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。

  
  这里需要注意的是,如果是需要以别名的方式(驼峰命名法那种)同步数据的,记得要在上述的conf文件中加入一句配置说明:
小写声明
  如果不那样做的,logstash会全部给你映射成小写的列。从而导致你在映射id时出错。
  与其相对应的SQL语句可以设定为:
  在SQL中把别名给改好,直接映射
  如果上述的方法都不能满足你要求的,还可以考虑用mapping,es支持自定义mapping。
  自定义mapping
  下方是代码片段参考

/*创建索引*/
CreateIndexRequestBuilder cib=client.admin().indices().prepareCreate(article);
/*添加映射*/
XContentBuilder mapping = XContentFactory.jsonBuilder()
        .startObject()
        .startObject("properties") //设置之定义字段
        .startObject("Author")
        .field("type","string") //设置数据类型
        .endObject()

  最终的结果:
  自定义mapping(正常情况下)
  自定义mapping
  大小写区分:
  有驼峰
  想查看更多的自定义mapping细节,请看下方链接:
  elasticsearch__1__java操作之连接es,创建Mapping,保存数据 - CSDN博客
  http://blog.csdn.net/xiaohulunb/article/details/37572763

  ④:集群健康值

  我自己是在黄色的状态下同步的数据,红色状态下还没尝试过。但是,红色状态并非是个好的状态,需要去调整。如果有需要的,请看这里-->http://blog.csdn.net/laoyang360/article/details/78443006

  ------分-----------割----------线--------
  写在最后:  
  如果是遇到了问题,先别着急。静下心来切看(实际上,你着急也没什么卵用,只会自乱阵脚)。
  先自己思考下,然后再去搜相关的解决方案,你会更有收获的。

  写的不是很好,若是有能帮到你的地方,那即是我莫大荣幸!
  

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值