WebApp之教你delta-import详细配置
白羽 2018-06-08 来源 :网络 阅读 493 评论 0

摘要:本文将带你了解 WebApp之教你delta-import详细配置,希望本文对大家学WEBAPP有所帮助。


Solr Replication

solr的主从其实是他的replication集群,从本质上说是通过ReplicationHandler来实现的,除了solr server之间可以互相同步之外,每个solr实例内部的core之间也是可以实现同步的,而能自身同步自身的实例称为Repeater,它的存在是为了分担master的同步开销,即由它来同步master里需要向外同步的core,然后所有的slave都从Repeater处同步相应的core。

 

具体配置方面,master的solrconfig.xml里的requestHandler配置为:

<requestHandler name="/replication" class="solr.ReplicationHandler">

<lst name="master">

<str name="replicateAfter">startup</str>

<str name="replicateAfter">commit</str>

<str name="backupAfter">optimize</str>

<str name="confFiles">schema.xml,stopword.dic,db-data-config.xml,dataimport.properties</str>

<str name="commitReserveDuration">00:01:00</str>

</lst>

</requestHandler>

在confFiles里可以指定在同步过程中,slave需要一并同步过去的文件。slave端 solrconfig.xml里的配置为:

<requestHandler name="/replication" class="solr.ReplicationHandler">

<lst name="slave">

<str name="masterUrl">//yf-rd-crm-cdc-db06.yf01.baidu.com:8888/solr/core0/replication</str>

<str name="pollInterval">00:00:20</str>

<str name="compression">internal</str>

<str name="httpConnTimeout">5000</str>

<str name="httpReadTimeout">10000</str>

</lst>

</requestHandler>

其中pollInterval是发出同步请求的间隔时间,上述配置为每20s会去sync一次。后面的http参数都是默认值。对slave和master来说,主要的配置不同就在这个handler里,其他部分可以一致。我的solr主从比较简单,大致如下。

 

如果对solr的搜索还有分片和负载均衡的要求,可以参考下solr4.0之后支持的SolrCloud,适合 high scale, fault tolerant, distributed indexing and search capabilities。我没有选择SolrCloud,主要原因是数据量也不是很大,不需要分片。本来想参考SolrCloud,看能不能为请求的负载均衡提供些什么优势,后来还是放弃了,负载这块在solrj的搜索服务里简单做了下轮训。网上看到也有人用Nginx为多个Tomcat容器做负载均衡,不过这个出发点和架构上的层次又有些不一样。

 

Solr DataImportHandler

DataImportHandler可以为solr的索引配置数据源,我的数据源是mysql,基本配置可以参考SolrDoc里的内容。不重复。

主要的坑在需要在web.xml里添加下面这个配置

<listener>

   <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>

</listener>

但是这个类并不存在于solr的主要几个包里,需要额外导入,包下载链接在这里。需要在webapps/solr.war下的WEB-INF/lib里添加这个包,还要添加下dist下的两个dataimporthandler有关的两个jar。此外把上面的listener配置添加到WEB-INF/web.xml内。特别注意的是,需要jdk7才能正常启动,否则会报错。

具体DIH相关的配置再详细列一下,首先在solrconfig.xml里配置Handler:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

<lst name="defaults">

<str name="config">db-data-config.xml</str>

</lst>

</requestHandler>

具体db-data-config.xml里是sql逻辑和映射field,放在core/conf内,

<dataConfig>

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://ip:port/db_name"

user="root" password="root" />

<document name="tb_core">

<entity name="tb_core_table" pk="table_id"

query="select table_id, code, name, description, freq_id, bytes, first_date, owner, secret_level, charset_id, field_term,

                            line_term, null_format, subj_id, gmt_modify from tb_core_table"

deltaQuery="select table_id, code, name, description, freq_id, bytes, first_date, owner, secret_level, charset_id, field_term,

                            line_term, null_format, subj_id, gmt_modify from tb_core_table where gmt_modify > '${dataimporter.last_index_time}'">

<field column="table_id" name="table_id" />

<field column="code" name="code" />

<field column="name" name="name" />

<field column="description" name="description" />

<field column="description" name="subject_path" />

<field column="freq_id" name="freq_id" />

<field column="bytes" name="bytes" />

<field column="first_date" name="first_date" />

<field column="owner" name="owner" />

<field column="secret_level" name="secret_level" />

<field column="charset_id" name="charset_id" />

<field column="field_term" name="field_term" />

<field column="line_term" name="line_term" />

<field column="null_format" name="null_format" />

<field column="subj_id" name="subj_id" />

<field column="gmt_modify" name="entity_modify" />

<entity name="tb_core_column" pk="col_id"

query="select col_id, table_id, code, name, description, gmt_modify from tb_core_column where table_id='${tb_core_table.table_id}'"

deltaQuery="select col_id, table_id, code, name, description, gmt_modify from tb_core_column where gmt_modify > '${dataimporter.last_index_time}'"

parentDeltaQuery="select table_id, code, name, description, freq_id, bytes, first_date, owner, secret_level, charset_id, field_term,

                                    line_term, null_format, subj_id, gmt_modify from tb_core_table where table_id = ${tb_core_column.table_id}">

<field column="col_id" name="column_id" />

<field column="code" name="column_code" />

<field column="name" name="column_name" />

<field column="description" name="column_description" />

<field column="gmt_modify" name="column_modify" />

</entity>

</entity>

</document>

</dataConfig>

上面的逻辑里,table和column是一对多的关系,而两个table内都有最近更新时间字段(gmt_modify),任何一方的更新都要触发整个索引的增量更新,所以这是一个嵌套的例子。在SolrDoc里也有类似的嵌套写法,相对而言属于delta-import稍微高级些的写法。大家可以参考下。

<dataConfig>

    <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" />

    <document>

            <entity name="item" pk="ID" query="select * from item"

                deltaImportQuery="select * from item where ID=='${dih.delta.id}'"

                deltaQuery="select id from item where last_modified > '${dih.last_index_time}'">

                <entity name="feature" pk="ITEM_ID"

                    query="select DESCRIPTION as features from FEATURE where ITEM_ID='${item.ID}'"

                    deltaQuery="select ITEM_ID from FEATURE where last_modified > '${dih.last_index_time}'"

                    parentDeltaQuery="select ID from item where ID=${feature.ITEM_ID}"/>

            <entity name="item_category" pk="ITEM_ID, CATEGORY_ID"

                    query="select CATEGORY_ID from item_category where ITEM_ID='${item.ID}'"

                    deltaQuery="select ITEM_ID, CATEGORY_ID from item_category where last_modified > '${dih.last_index_time}'"

                    parentDeltaQuery="select ID from item where ID=${item_category.ITEM_ID}">

                <entity name="category" pk="ID"

                        query="select DESCRIPTION as cat from category where ID = '${item_category.CATEGORY_ID}'"

                        deltaQuery="select ID from category where last_modified > '${dih.last_index_time}'"

                        parentDeltaQuery="select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}"/>

            </entity>

        </entity>

    </document>

</dataConfig>

最重要的是,在solr_home/conf内需要一个负责调度的文件:dataimport.properties(不同于core/conf下的dataimport.properties,那个dataimport.properties会自动生成,记录的是最近一次更新的时间)


#       dataimport scheduler properties         #


 

#  是否同步功能

#  1 - 开启 ; 否则不开启

syncEnabled=1

 

# 需要同步的solr core

syncCores=core0

 

#  solr server名称或ip地址

#  默认为localhost

server=localhost

 

#  solr server端口

#  默认80

port=8888

 

# webapp name

webapp=solr

 

#  application context

# webapp=metadata-search

 

#  同步URL参数

params=/dataimport?command=delta-import&clean=false&commit=true

 

#  调度区间

#  默认30分钟

interval=1

这部分就需要开头讲的

org.apache.solr.handler.dataimport.scheduler.ApplicationListener

的配置,否则启动后,之前的xml是不生效的。

 

Solr Server服务架构

结合Solr更新、主从和内部的一些主要模块,画了一个服务架构图如下。

 

 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之WebApp频道

 


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程