文档章节

Solr集群架构概述及delta-import详细配置

空_明
 空_明
发布于 2014/04/01 14:41
字数 1476
阅读 5699
收藏 12

背景

由于项目原因,重新熟悉了下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在CODE上查看代码片派生到我的代码片

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

  2.     <lst name="master">  

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

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

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

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

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

  8.     </lst>  

  9. </requestHandler>  

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片

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

  2.     <lst name="slave">  

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

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

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

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

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

  8.     </lst>  

  9. </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在CODE上查看代码片派生到我的代码片

  1. <listener>  

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

  3. </listener>  

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

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片

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

  2.     <lst name="defaults">  

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

  4.     </lst>  

  5. </requestHandler>  

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <dataConfig>  

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

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

  4.         user="root" password="root" />  

  5.     <document name="tb_core">  

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

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

  8.                             line_term, null_format, subj_id, gmt_modify from tb_core_table"  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  37.             </entity>  

  38.         </entity>  

  39.     </document>  

  40. </dataConfig>  

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <dataConfig>  

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

  3.     <document>  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  19.             </entity>  

  20.         </entity>  

  21.     </document>  

  22. </dataConfig>  

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. #################################################  

  2. #                                               #  

  3. #       dataimport scheduler properties         #  

  4. #                                               #  

  5. #################################################  

  6.   

  7. #  是否同步功能  

  8. #  1 - 开启 ; 否则不开启  

  9. syncEnabled=1  

  10.   

  11. # 需要同步的solr core  

  12. syncCores=core0  

  13.   

  14. #  solr server名称或ip地址  

  15. #  默认为localhost  

  16. server=localhost  

  17.   

  18. #  solr server端口  

  19. #  默认80  

  20. port=8888  

  21.   

  22. # webapp name  

  23. webapp=solr  

  24.   

  25. #  application context  

  26. webapp=metadata-search  

  27.   

  28. #  同步URL参数   

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

  30.   

  31. #  调度区间  

  32. #  默认30分钟  

  33. interval=1  

这部分就需要开头讲的

[html] view plaincopy在CODE上查看代码片派生到我的代码片

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

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


Solr Server服务架构

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



(全文完)


本文转载自:http://blog.csdn.net/pelick/article/details/17397973

空_明
粉丝 35
博文 92
码字总数 71993
作品 0
东城
高级程序员
私信 提问
Import data from a database into Solr.

Data Import This tutorial uses Mysql database import data into Solr。 Create table node table: node table has tens of thousands of records, test uses only 300. Full-Import Cre......

Nathans
2016/09/13
42
0
基于Solr DIH实现MySQL表数据全量索引和增量索引

实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data ImportHandler)组件,对data-config.xml进行简单的修改即可。SolrDIH组件的实现类为...

Zero零_度
2015/09/05
87
0
solrcloud分布式集群部署及索引操作实例

一、前期准备工作 相关工具: 1.虚拟机(VMware) 2.tomcat7 64位 下载地址:http://tomcat.apache.org/download-70.cgi 3.centos6.4 64位 4.linux下的64位jdk安装包,版本为6或以上 5. sol...

张升强
2014/04/28
5.5K
0
Solr6.3服务并从Mysql上导入数据

安装好solr6.3服务,我安装在centos7系统中,在/opt目录下 步骤1: 创建一个core,这里用hubin为例 步骤2: 把mysql所需的jar包(mysql驱动包mysql-connector-java-5.1.38.jar)和solr-6.3....

binhu
2016/11/18
157
1
Solr搜索引擎 — 通过mysql配置数据源

上一节我们已经通过两种方式运行了solr,本节演示怎么配置solr的mysql数据源 附上: 喵了个咪的博客:http://w-blog.cn Solr官网:http://lucene.apache.org/solr/ > PS:8.0.0版本已经发布,...

喵了_个咪
2019/05/21
32
0

没有更多内容

加载失败,请刷新页面

加载更多

Python如何实现单例模式?其他23中设计模式python如何实现?

单例模式主要有四种方法:new、共享属性、装饰器、import。 # __ new__方法:class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): ......

每天学Python
25分钟前
71
0
在正则表达式的上下文中,“懒惰”和“贪婪”是什么意思?

有人可以用一种可以理解的方式解释这两个术语吗? #1楼 贪婪意味着您的表情将匹配尽可能大的组,懒惰意味着它将匹配最小的组。 对于此字符串: abcdefghijklmc 这个表达式: a.*c 贪婪的匹...

技术盛宴
29分钟前
80
0
springboot web 大文件上传源代码

一、 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传; 支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输...

东方雨
30分钟前
78
0
这五类人最适合转Web前端,有你吗?

互联网的高速发展促使互联网企业对于网站等页面的用户体验要求也越来越高,导致网站开发难度越来越大,于是一个新兴职业应运而生——web前端工程师。 因为互联网时代的高速发展,公司企业的迫...

梦想编程
37分钟前
96
0
vue打包后静态资源图片失效&&vue动态设置img的src不生效

vue打包后静态资源图片失效: 老版本中需要找到config/index.js,找build打包对象里的assetsPublicPath属性,默认值为/,更改为./就好了; 新版本中只有手动更改vue.config.js, 在里面配置p...

liulunsheng
50分钟前
57
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部