MongoDB和Solr的整合以及实现数据同步功能

Java开源 10/05 阅读 903 views次 人气 0
摘要:

从功能上来看MongoDB的数据形式相比oracle或mysql更加兼容solr,但是solr的数据导入不支持NOSQL的数据库。

使用mongo-connector实现mongodb与solr数据同步:

1、solr搭建。这个我有记录,可以去找,这里不说了。(此次采用solr版本为4.7)

2、mongo搭建,要搭建集群,就是副本采集形式,我记录中有。

3、安装python。

4、安装pip

5、安装mongo-connector,命令: pip install mongo-connector, 自动会安装相应的组件,例如pysolr,pymongo。

6、验证 http://localhost:8080/solr/collection1/admin/luke?show=schema&wt=json 是否能返回json数据

7、 python connector.py -m localhost:27111 -t http://localhost:8080/solr/collection1/ -o oplog_progress.txt -n test.test -u _id -d solr_doc_manager

-m : 要同步mongodb地址,这里强调一下,必须是集群。

-o : 记录oplog处理时间戳的文件。

-n : mongodb的数据库名及collection名。

-u : 这个没什么好说的,solr唯一id。

-d : 主要文件,用于处理doc。

8、连接成功后,登录数据库,想里面添加数据,在solr可以查询到。


接下来说细节:

1、去solr的服务上修改配置文件,首先改,schema这个文件,对这里面放的是solr的字段,因为mongodb的唯一id即主键是字段 _id  而solr则是 id。

因此将 字段 id 改为 _id , 还要改 <uniqueKey>_id</uniqueKey> 这样solr就会把 _id 作为主键 就是连接是 -u 后的参数。

继续添加字段如下:

<field name="_id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="_ts" type="long" indexed="true" stored="true" />
<field name="ns" type="string" indexed="true" stored="true" />

2、即使这样当你访问http://localhost:8080/solr/collection1/admin/luke?show=schema&wt=json时候会报错,这不难理解,当你写web路径时,你没有添加映射怎么会给你跳转,因此编辑solrconfig.xml文件自己找类似添加如下代码:

<requestHandler name="/admin/luke" class="org.apache.solr.handler.admin.LukeRequestHandler" />	

其实这段代码是被注释掉的,解开即可。

3、这时候即使你运行成功不报错,你会发现solr还是没有同步数据,那是因为solr配置中,默认把自动同步给关闭了。

编辑solrconfig.xml文件,根据需要,照着如下修改

<autoCommit>	
	<maxTime>300000</maxTime>		
	<maxDocs>10000</maxDocs>		
	<openSearcher>true</openSearcher>		
	</autoCommit>		
	<!-- softAutoCommit is like autoCommit except it causes a
	'soft' commit which only ensures that changes are visible
	but does not ensure that data is synced to disk. This is
	faster and more near-realtime friendly than a hard commit.
	-->		
	<autoSoftCommit>		
	<maxDocs>1000</maxDocs>	
	<maxTime>60000</maxTime>		
</autoSoftCommit>

最后一个小技巧: 当你连接后会发现,只要关闭shell程序就无法运行,这时候有一个技巧在命令前加setsid。


原理:

我们知道,当用户注销(logout)或者网络断开时,终端会收到HUP(hangup)信号从而关闭其所有子进程。

因此,我们的解决办法就有两种途径:要么让进程忽略HUP信号。


要么让进程运行在新的会话里从而成为不属于此终端的子进程

1、nohup

nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号

2、setsid

nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,

如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。

3、&

这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,

从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。

当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。

4、disown

场景:

我们已经知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。

但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?

用disown -h jobspec来使某个作业忽略HUP信号。

用disown -ah 来使所有的作业都忽略HUP信号。

用disown -rh 来使正在运行的作业忽略HUP信号。

需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,

但是依然能够用ps -ef查找到它。


评论

该文章不支持评论!

分享到: