知识点
相关文章
更多最近更新
更多Solr集群架构概述及delta-import详细配置
2019-03-27 01:21|来源: 网路
背景
由于项目原因,重新熟悉了下Solr,版本为3.6,搭建了主从Solr服务,并使用DIH从RDBMS数据源增量更新索引。
其实也没什么技术含量,就是简单做个总结,分别从部署架构和增量更新两个方面说明下。
Solr Replication
solr的主从其实是他的replication集群,从本质上说是通过ReplicationHandler来实现的,除了solr server之间可以互相同步之外,每个solr实例内部的core之间也是可以实现同步的,而能自身同步自身的实例称为Repeater,它的存在是为了分担master的同步开销,即由它来同步master里需要向外同步的core,然后所有的slave都从Repeater处同步相应的core。
具体配置方面,master的solrconfig.xml里的requestHandler配置为:
[html] view plaincopy
<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里的配置为:
[html] view plaincopy
<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="slave">
<str name="masterUrl">http://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里添加下面这个配置
[html] view plaincopy
<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:
[html] view plaincopy
<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内,
[html] view plaincopy
<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稍微高级些的写法。大家可以参考下。
[html] view plaincopy
<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会自动生成,记录的是最近一次更新的时间)
[html] view plaincopy
#################################################
# #
# 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
这部分就需要开头讲的
[html] view plaincopy
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
的配置,否则启动后,之前的xml是不生效的。
Solr Server服务架构
结合Solr更新、主从和内部的一些主要模块,画了一个服务架构图如下。
(全文完)
转自:http://my.oschina.net/sunzy/blog/215089
相关问答
更多-
赶星老师Linux开源集群架构安装配置调试系列视频教程[2023-05-13]
赶星老师Linux开源集群架构安装配置调试系列视频教程 这是赶星老师一部力作,本系列视频教程从基础讲起,首先介绍使用Linux强大的虚拟化功能搭建linux集群实验 环境,再从集群的基本概念着手,让初学者从基础的概念了解什么是集群。而后从国人开发的Linux开源集群软件 LVS讲起。介绍Linux环境下使用开源软件架设集群环境,实例演示常见开源集群软件的安装、配置、调试及软件 之间的组合,实现多集群混合架构使用。 教程目录: 第一章:XEN与KVM虚拟化实战(共7小节) XEN虚拟化概 ... -
oracle 是数据库,可以安装在UNIX系统和Linux系统中,当然也有windows系统的版本。 数据库集群技术,是oracle数据库集群的体现。 我只是知道SUN公司的solaris里面总是装ORACLE,IBM公司的AIX系统一般使用的数据库是DB2。因为是配套的。 我觉得你说的集群架构是指数据库的双机,及分布式数据库,使用的数据库是oracle。 oracle数据库一般我用的是oracle 10g.我觉得oracle数据库里面的安装,使用,备份,恢复,RAC等内容很强大。 卢韬旭
-
赶星老师Linux开源集群架构安装配置调试系列视频教程[2022-02-25]
赶星老师Linux开源集群 架构安装配置调试系列视频教程 这是赶星老师一部力作,本系列视频教程从 基础讲起,首先介绍使用Linux强大的虚拟化功能搭建linux集群实验 环境,再从集群的基本 概念着手,让 初学者从基础的概念了解什么是集群。而后从国人开发的Linux开源集群 软件 LVS讲起。介绍Linux环境下使用开源软件架设集群环境, 实例演示常见开源集群软件的安装、配置、调试及软件 之间的组合,实现多集群混合架构使用。 教程目录: 第一章:XEN与KVM虚拟化 实战(共7小节) ... -
如文档中所述 : 增量导入 用于增量导入和更改检测。 只有SqlEntityProcessor支持delta导入。 所以你需要: 移动到索引与一些Java代码(使用Solrj)和滚动你自己的增量输入下游 或者为FileListEntityProcessor实现所有delta变量(并希望将其推入Solr),那么可以使用SqlEntityProcessor代码作为指导。 As mentioned in the docs: delta-import For incremental imports and chan ...
-
Cassandra集群架构(Cassandra Cluster Architecture)[2023-03-07]
这取决于你想要做什么,或试图找出答案。 为了获得最佳性能和可用性,您应该使用真实节点,而不是虚拟化节点。 但虚拟节点可能更便于实验,特别是如果您想经常擦除和重新配置它们。 另一种可能性是使用云VM,这使您可以根据需要轻松扩展。 您没有说明您需要什么样的性能和存储。 考虑您是否需要集群,或者单个节点是否足以进行实验。 显然,这不会在磁盘故障等情况下提供弹性。单个机器上的单个节点可能会在同一硬件上超出虚拟化节点,因为磁盘争用较少等。 也可以看看: Cassandra硬件维基页面 规划集群部署 It rather ... -
我注意到,在您的deltaImportQuery您引用了id (在您的deltaQuery中不存在)而不是group_id 。 在这一行中: ...and group_id=${dataimporter.delta.id}" 由于deltaQuery中的PK是group_id,查询的这一部分应该如下所示: ...and group_id=${dataimporter.delta.group_id}" 我有同样的问题,因为'我不明白${dataimporter.delta}实际上代表了deltaQuery ...
-
在solr admin - > your core - > dataimport中,有一个Clean选项,如果选中则会在导入之前先清理数据(对于完全导入和delta-import)。 另一个提示是,solr DIH总是使用UTC作为导入时间戳,那么你的时区是多少? 首先将数据库中的datetime列转换为utc,然后再将其与dih.last_index_time进行比较。 In solr admin -> your core -> dataimport, there is a Clean option, i ...
-
solr delta-import在“处理”之前“获取”所有数据?(solr delta-import “fetches” all data before “processing”?)[2023-11-16]
一种解决方案可能是在data-config.xml设置batchSize 。 以下是如何执行此操作的示例:此示例取自以下链接: DataImportHandler - ... -
如果要处理确切的秒,则只需检查等于或大于上次修改时间的记录。 无论如何,如果记录已经存在(由唯一键标识),它将被覆盖。 Solr将默认更新记录,因此不会创建重复项。 If it is to handle the exact second, you just check for the records equal to or greater then the last modified time. Anyways if the the record already exists (identified by ...
-
这就是我解决问题的方法。 我使用Camel-Http组件而不是Camel-Solr组件,并调用Solr数据导入处理程序来执行delta导入。 路线: from("quartz2://SolrUpdateHandlerTimer?trigger.repeatCount=-1&trigger.repeatInterval=300000") .to("direct:start"); from("direct:start") .setHeader(Exchange. ...