mysql集群 solr_Solr集群架构概述及delta

背景

由于项目原因,重新熟悉了下Solr,版本为3.6,搭建了主从Solr服务,并使用DIH从RDBMS数据源增量更新索引。

其实也没什么技术含量,就是简单做个总结

,分别从    部署架构

和    增量更新

两个方面说明下。

Solr Replication

solr的主从其实是他的    replication

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

37944179_1.jpg

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

startup

commit

optimize

schema.xml,stopword.dic,db-data-config.xml,dataimport.properties

00:01:00

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

http://yf-rd-crm-cdc-db06.yf01.baidu.com:8888/solr/core0/replication

00:00:20

internal

5000

10000

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

37944179_2.jpg

如果对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里添加下面这个配置

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

但是这个类并不存在于solr的主要几个包里,需要额外导入,包  下载链接在这里

。需要在webapps/solr.war下的WEB-INF/lib里添加这个包,还要添加下dist下的两个dataimporthandler有关的两个jar。此外把上面的listener配置添加到WEB-INF/web.xml内。特别注意的是,  需要jdk7

才能正常启动,否则会报错。

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

db-data-config.xml

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

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

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

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}'">

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}">

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

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

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

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}"/>

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}">

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}"/>

最重要的是,在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更新、主从和内部的一些主要模块,画了一个服务架构图如下。

37944179_3.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值