elasticsearch之jdbc同步

     由于es官网叫停river类的导入插件,因此原始的elasticsearch-jdbc-river变更为elasticsearch-jdbc,成为一个独立的导入工具。官方提到的同类型工具还有logstash,个人觉得logstash在做数据库同步的时候并不是很好用,有太多坑要填。

插件的github地址 https://github.com/jprante/elasticsearch-jdbc/

必须按照es的相应的版本安选择jdbc的版本

125951_wu4p_2408834.png

http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/<version>/elasticsearch-jdbc-<version>-dist.zip

下载时将<version>替换成相应的版本即可。

  1. 解压下载的压缩包

  2. 修改 bin下面的相应的命令文件,比如 windows有一个mysql-simple-example.bat

  3. 启动即可

jdbc本身有个坑是如果mysql中某个字段的值本身就是一个json格式的话就会报错,例如:

org.elasticsearch.index.mapper.MapperParsingException: failed to parse [page]

因此需要使用mysql的拼接函数来解决。

   CONCAT('(',HomePage,')') as `page`

报错信息:

java.net.MalformedURLException: unknown protocol: c


目前使用mysql导入数据到elasticsearch的方法常用方法如下:
elasticsearch-jdbc(早期的elasticsearch-river-jdbc)

https://github.com/jprante/elasticsearch-jdbc (推荐)


elasticsearch-river-mysql 

 https://github.com/scharron/elasticsearch-river-mysql

go-mysql-elasticsearch

https://github.com/siddontang/go-mysql-elasticsearch

logstash导入插件 

https://github.com/elastic/logstash


常用配置说明:

  "schedule" : "0 0/60 0-23 ? * *", 

  type: "jdbc", 

  jdbc: {

    url: "jdbc:mysql://127.0.0.1:3306/test", 

    user: "root", 

    password: "root", 

    sql : [

            {

                "statement" : "select id as _id  ... from ... where a = ?, b = ?, c = ?",

                "parameter" : [ "value for a", "value for b", "value for c" ]

            }

    ],

    locale: "zh_CN", 

    index: "创建的索引名", 

    type: "创建的type名", 

    index_settings: {

      index: {

        number_of_shards: "3"

      }

    }, 

    type_mapping: {

      "type名": {

        dynamic: true, 

        properties: {

          "field名": {

            type: "string", 

            analyzer: "ik", 

            indexAnalyzer: "ik", 

            searchAnalyzer: "ik"

          }, 

          "field名": {

            type: "string", 

            analyzer: "ik", 

            indexAnalyzer: "ik",

            searchAnalyzer: "ik"

          }, 

          "field名": {

            type: "string", 

            analyzer: "ik", 

            indexAnalyzer: "ik",

            searchAnalyzer: "ik"

          }, 

          "field名": {

            type: "string", 

            analyzer: "ik", 

            indexAnalyzer: "ik",

            searchAnalyzer: "ik"

          },   

          "LOCATIONS": {

            type: "geo_point"

          }

        }

      }

    }

  }

}



常用介绍:

获取一个表,select * from table可以使用查询。 查询从数据库选择数据的简单的变体。 他们转储表成Elasticsearch逐行。 如果没有_id列名,IDs将自动生成。

id as _id 这样的话可以增量同步,_id是es的默认id命名

"interval":"1800", 这里是同步数据的频率 1800s,半小时,可以按需要设成 1s或其它

"schedule" : "0 0/60 0-23 ? * *",   同步数据任务  60分钟一次

"flush_interval" : "5s",    刷新间隔为5S

sql.parameter——绑定SQL语句参数(按顺序)。 可以使用一些特殊的值具有以下含义:

    $now——当前时间戳

    $state——国家之一:BEFORE_FETCH,取回,AFTER_FETCH,无所事事,例外

    $metrics.counter——一个计数器

    $lastrowcount——从最后一条语句的行数

    $lastexceptiondate- SQL时间戳的例外

    $lastexception——完整的堆栈跟踪的例外

    $metrics.lastexecutionstart——最后一次执行SQL时间戳的时候开始

    $metrics.lastexecutionend- SQL时间戳的时候最后一次执行结束

    $metrics.totalrows——总获取的行数

    $metrics.totalbytes——获取的字节总数

    $metrics.failed——失败的SQL执行的总数

    $metrics.succeeded


删除river:


curl -XDELETE  localhost:9200/_river/_meta

http:// localhost:9200/_river/_meta   delete请求


参数名的介绍:


locale默认语言环境(用于解析数值,浮点的性格。 推荐的值是“en_US”)

timezone——JDBC的时区setTimestamp()调用绑定参数时的时间戳值

rounding——舍入模式解析数值。 可能的值“天花板”,“下”,“地板”,“halfdown”、“halfeven”,“halfup”、“不必要的”,“上”

scale——解析数值的精度

autocommit- - - - - -true如果每个语句应该被自动执行。 默认是false

fetchsize——fetchsize大型结果集,大多数司机使用这个控制行缓冲的数量而遍历结果集

max_rows——声明限制获取的行数,其余的行被忽略

max_retries——重试的次数(重新)连接到一个数据库

max_retries_wait——时间价值的时间应重试之间等。 

resultset_type- JDBC结果集类型,可以TYPE_FORWARD_ONLY TYPE_SCROLL_SENSITIVE TYPE_SCROLL_INSENSITIVE。 默认是TYPE_FORWARD_ONLY

resultset_concurrency- JDBC结果集并发性,可以CONCUR_READ_ONLY CONCUR_UPDATABLE。 默认是CONCUR_UPDATABLE

ignore_null_values——如果NULL值构建JSON文档时应该被忽略。 默认是false

detect_geo——如果geo多边形/分在SQL列构造时应解析JSON文档。 默认是true

detect_json——如果json结构构建json文档时应该解析SQL列。 默认是true

prepare_database_metadata——如果司机元数据作为参数要准备好。 默认是false

prepare_resultset_metadata——如果结果集元数据应该准备作为参数。 默认是false

column_name_map——地图的别名应该用作替代数据库的列名称。 对于Oracle 30 char列名称限制。 默认是null

query_timeout——第二个价值多长时间允许SQL语句被执行之前被认为是输了。 默认是1800

connection_properties——地图的连接属性用于创建驱动程序连接。 默认是null

schedule——一个单一的或cron表达式列表计划执行。 语法是相当于 石英cron表达式格式语法(见下文)

threadpoolsize——计划执行的线程池的大小schedule参数。 如果设置为1,所有工作将连续执行。 默认是4。

interval——两个运行之间的延迟时间值(默认值:不设置)

elasticsearch.cluster——Elasticsearch集群名称

elasticsearch.host——一系列Elasticsearch主机(主机名或规范host:port)

elasticsearch.port——Elasticsearch主机

elasticsearch.autodiscover——如果true、JDBC进口国将尝试连接到所有集群节点。 默认是false

max_bulk_actions每个批量索引请求提交的长度(默认值:10000)

max_concurrrent_bulk_requests并发大量请求的最大数量(默认值:2 * CPU核的数量)

max_bulk_volume——一个字节大小参数允许的最大体积的大部分请求(默认值:10米)

max_request_wait——时间价值的最大等待时间响应大部分请求

flush_interval——时间价值区间段冲洗索引文档批量操作(默认值:“5 s”)

index——Elasticsearch指数用于索引

type——Elasticsearch用于索引的索引类型

index_settings-可选设置Elasticsearch指数

type_mapping-可选为Elasticsearch指数类型映射

statefile——文件的名称JDBC进口国读写状态信息

metrics.lastexecutionstart——开始的UTC日期/时间的最后一次执行一个获取

metrics.lastexecutionend——最后的UTC日期/时间的最后一次执行一个获取

metrics.counter——一个计数器度量,将每一个获取后增加

metrics.enabled——如果true启用日志记录,指标。 默认是false

metrics.interval——度量日志之间的时间间隔。 默认是30秒。

metrics.logger.plain——如果true纯文本格式的日志消息,写指标。 默认是false

metrics.logger.json——如果true、写度量JSON格式的日志消息。 默认是false


博客地址:http://my.oschina.net/wangnian

转载于:https://my.oschina.net/wangnian/blog/659250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Elasticsearch与MySQL同步可以通过以下几种方式实现: 1. 使用Logstash:Logstash是一个开源的数据收集引擎,可以从MySQL中读取数据并将其同步Elasticsearch中。 2. 使用ElasticsearchJDBC插件:ElasticsearchJDBC插件可以直接从MySQL中读取数据并将其同步Elasticsearch中。 3. 使用Canal:Canal是阿里巴巴开源的一款基于MySQL数据库增量日志解析和同步的工具,可以将MySQL中的数据同步Elasticsearch中。 以上三种方式都可以实现Elasticsearch与MySQL的同步,具体选择哪种方式取决于实际需求和环境。 ### 回答2: Elasticsearch是一个基于Lucene的分布式搜索引擎,它能够高效地存储、搜索和分析海量数据。而MySQL是一个广泛使用的关系型数据库,它也是很多应用程序的核心数据存储方案。为了将这两个技术应用到实际的项目中,需要进行elasticsearch与mysql同步。 实现elasticsearch与mysql同步的一种常见方法是使用elasticsearch river插件。River插件以“河流”作为自己的核心概念,用于将不同的数据源与elasticsearch实例进行连接和同步。在这种情况下,MySQL将充当数据源,并通过elasticsearch river插件将数据同步elasticsearch中。 首先,需要安装并启用elasticsearch river插件。然后,在MySQL中选择需要同步的表,并利用插件配置生成对应的elasticsearch mapping,该mapping定义了将来在elasticsearch中索引的数据结构。最后,通过在elasticsearch中创建一个名为River的river对象并指定数据源细节(例如MySQL的IP地址、数据库名和表名)来启动同步过程。 该方法适用于一些对数据同步时效性要求不高的场景,但对于需要实时同步的操作,需要使用更为高效的数据同步方法。这时可以考虑使用消息队列,比如Kafka或者RabbitMQ,将MySQL的数据更快地同步elasticsearch中。 总之,elasticsearch与mysql同步是实现应用程序高效数据存储、搜索和分析的关键步骤。利用elasticsearch river插件或者消息队列等方法,可以在合理的成本范围内完成数据同步,并提高应用程序的响应速度和数据可用性。 ### 回答3: elasticsearch(简称ES)和MySQL是目前非常流行的两个开源数据库,它们都有自己的优势和适用场景。ES是一个分布式搜索引擎,具备实时全文搜索、分析和处理功能;MySQL是一个关系型数据库管理系统,可用于存储和管理结构化数据。在实际开发过程中,我们可能需要实现ES和MySQL之间的同步,比如将MySQL的数据实时同步到ES中,以便快速检索和分析。 实现ES和MySQL之间的同步主要有两种方式:基于定时同步和基于实时同步。 基于定时同步:它的实现方式是定期将MySQL中的数据导出到ES中,通常借助一些工具来实现,如Logstash、DataX等,这种方式适用于数据体量不是很大的场景,可以设置定时任务来定时执行同步操作。但是由于同步间隔时间比较长,数据也无法做到实时同步。 基于实时同步:这种方式就要用到MySQL的binlog和ES的river插件。binlog是MySQL的日志文件,记录了MySQL中的所有操作,包括插入、修改和删除等。river插件可以监听MySQL binlog文件的变化,并将变化实时同步到ES中,这种方式的同步精度非常高,可以做到真正的实时同步。但是由于该方案会对MySQL产生一定的压力,因此需要谨慎使用。 综上所述,对于同步需求不是很高的场景,我们可以选择定时同步的方式,而对于需要实时同步的场景,我们可以选择基于实时同步的方案。无论采用何种方式,都需要在实际应用中根据自己的需要做出正确的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值