参考资料:
https://wiki.apache.org/solr/FrontPage
http://docs.spring.io/spring-data/solr/docs/current/reference/html/
http://projects.spring.io/spring-data-solr/#quick-start
solr中国:http://www.solr.cc/blog/
动态查询:https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-dynamic-queries/
介绍:https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-introduction-to-solr/
用maven构建solr:https://www.petrikainulainen.net/programming/maven/running-solr-with-maven/
配置:https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-configuration/
https://myjeeva.com/solrcloud-cluster-single-collection-deployment.html#deploying-solrcloud
全教程参考链接:
http://lies-joker.iteye.com/blog/2093818
数据导入:
http://www.2cto.com/kf/201602/489972.html
问题:
一.solr是什么?
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时 ==实现了可配置、可扩展,并对索引、搜索性能进行了优化==。
sorl 与lucene的区别
Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。
Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。
二.sorl有什么?
Solr 可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr==索引的实现方法很简单==,++用 POST 方法向Solr服务器发送一个描述Field及其内容的XML文档,Solr根据xml文档添加、删除、更新索引++ 。Solr搜索只需要发送HTTP GET请求,然后对Solr返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况
2.1 solr的数据模型(与关系型数据库对应关系(相似性))
solr | mysql |
---|---|
index(索引) | table(表) |
document(文档) | row(一条记录) |
field(字段) | column(列) |
三.solr怎么用?
3.1 下载
从Solr官方网站(http://lucene.apache.org/solr/ )下载Solr4.10.3,根据Solr的运行环境,Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。
Solr使用指南可参考:https://wiki.apache.org/solr/FrontPage。
下载solr-4.10.3.tar并解压:
bin:solr的运行脚本
contrib:solr的一些贡献软件/插件,用于增强solr的功能。
dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
docs:solr的API文档
example:solr工程的例子目录:
- example/solr:
该目录是一个包含了默认配置信息的Solr的Core目录。
- example/multicore:
该目录包含了在Solr的multicore中设置的多个Core目录。
- example/webapps:
该目录中包括一个solr.war,该war可作为solr的运行实例工程。
licenses:solr相关的一些许可信息
3.2 运行环境
solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),也可以使用Tocmat作为Servlet容器,
现使用环境如下:
Solr:Solr4.10.3
Jdk:jdk1.7.0_72
Tomcat:apache-tomcat-7.0.53
3.3 部署solr
1)将solr-4.10.3.tgz解压,
2)将solr-4.10.3/example/solr目录拷贝到自定义目录下,重命名为solrHome
3)找到solr-4.10.3/example/webapp/solr.war
4)将solr.war拷贝到tomcat/webapps/目录下
5)解压到当前目录下(启动tomcat会自动将war包解压)
6)将solr.war删除
7)修改tomcat/webapps/solr/WEB-INF/web.xml ,将以下配置注释去掉,指定env-entry-value为solrHome的绝对路径
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/put/your/solr/home/here</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
8)复制solr-4.10.3/example/lib/ext下所有jar包到tomcat/lib下
9)复制solr-4.10.3/example/resources/log4j.properties到tomcat/webapps/solr/WEB-INF/classes目录下,如果classes目录不存在,先创建
10)启动tomcat,在浏览器访问localhost:port/solr
3.4 配置solr
1.配置solr/conf(可以针对每个core的conf,也可以将conf单独放置进行配置,上传到zookeeper)
3.5 配置IK分词器
1.需要的jar
IK+Analyzer+2012FF_hf1/IKAnalyzer2012FF_u1.jar
将jar放在tomcat/webapps/solr/WEB-INF/lib下,重启tomcat
2.需要的配置文件
IK+Analyzer+2012FF_hf1/IKAnalyzer.cfg.xml
IK+Analyzer+2012FF_hf1/stopword.dic
将以上配置文件放在slor/conf下
3.修改solr/conf/schema.xml
添加fieldType和field定义
<!-- IK field -->
<!-- IK fieldType -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name="ik_name" type="text_ik" indexed="true" stored="true" multiValued="false" />
3.6 配置dataimport
1.从关系型数据库导入数据
1)需要的jar
solr-4.10.3/dist/目录下的solr-dataimporthandler-4.10.3.jar和solr-dataimporthandler-extras-4.10.3.jar
另外需要数据库驱动jar,这里用的mysql的mysql-connector-java-5.1.30.jar
将以上jar包放在tomcat/webapps/solr/WEB-INF/lib下,重启tomcat
2)配置solr/conf
在solrconfig.xml中进行以下配置
<!-- dataimport -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<!-- xml名称自定义 -->
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
创建data-config.xml
内容见2.增量更新示例
在schema.xml中添加对应的field(在schema.xml中不存在的field)
<field name="goods_id" type="int" indexed="true" stored="true" docValues="true" />
2.配置增量更新
参考: http://www.jianshu.com/p/c0b06643a467
参考示例:solr-4.10.3/example/example-DIH/solr/db/conf/db-data-config.xml (里面有具体的配置可以参考)
配置data-config.xml(以下配置可以完成增量更新,具体配置看业务需求)
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/ecmall" user="root" password=""/>
<document name="goodsDoc">
<!--query 全量查询语句-->
<!--deltaImportQuery 增量导入语句-->
<!--deletedPkQuery 被删除的文档主键查询-->
<!--deltaQuery 被更新的文档主键查询-->
<entity name="cloudGoods" pk="goods_id" transformer="DateFormatTransformer"
query="select * from cloud_goods "
deltaImportQuery="SELECT * FROM cloud_goods WHERE goods_id = ${dih.delta.goods_id}"
deletedPkQuery="SELECT * cloud_goods where is_delete = 1"
deltaQuery="SELECT goods_id FROM cloud_goods where FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i:%S') > '${dataimporter.last_index_time}'"
>
<field name="id" column="goods_id" />
<field name="cloud_user_id" column="cloud_user_id" />
<field name="goods_name" column="goods_name" />
<field name="sku" column="sku" />
<!-- 必须使用date类型? -->
<!-- <field name="last_index_time" column="last_index_time" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/> -->
</entity>
</document>
</dataConfig>
特别注意:
此处cloud_goods表中的create_time为int类型的unix时间,需要转换后进行比较
field的column建议使用大写,否则会出现无数据情况
执行增量更新命令:
全导入:
http://127.0.0.1:9080/solr/collection1/dataimport?command=full-import&commit=ture
增量导入:
http://127.0.0.1:9080/solr/collection1/deltaimport?command=delta-import&clean=false&commit=ture
查看导入状态
http://127.0.0.1:9080/solr/collection1/dataimport?command=status
3.配置定时增量更新(全量更新需要删除原索引,最好只在第一次同步数据时使用)
参考:http://www.jianshu.com/p/c0b06643a467
http://www.cnblogs.com/chenying99/archive/2012/08/10/2631680.html
jar包:http://code.google.com/p/solr-data-import-scheduler/ (内有dataimport.properties)
1)将jar包导入到tomcat/lib
2)配置tomcat/webapps/solr/WEB-INF/web.xml,添加监听
<!-- dataimport scheduler -->
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
3)在solrHome/conf下创建dataimport.properties(jar包里有),用户配置dataimport
参数配置:
#设置开始同步,1为开启
syncEnabled=1
#设置同步的core
syncCores=core1,core2
#设置同步的节点服务器ip或域名
server=127.0.0.1
#设置同步节点solr应用所在的端口,默认为80
port=8080
#设置同步节点solr应用的应用名称(一般就是tomcat/webapps/solr 对应这里,如果web.xml有指定,以最终应用名称为准)
webapp=solr
#配置同步命令执行url,dataimport固定(如果做其他用途可以单独修改),
#注意/dataimport后接?不是&
#command指明执行的命令,这里可以为delta-import(增量导入)和full-import(全量导入)
#clean表示是否清除索引,commit表示执行完成后是否提交
params=/dataimport?command=delta-import&clean=false&commit=true
#间隔时间,默认为30,单位:分钟
interval=1
遇到的问题:
因为使用zookeeper统一管理solr配置文件
而定时增量更新需要在solr节点上配置监听器,读取当前节点solrHome/conf/dataimport.propertise
现在暂无办法使单节点solr读取zookeeper管理的dataimport.propertise文件
另外,每个节点的ip、port和webapp都可能不相同,dataimport.propertise配置还需要进一步了解
暂定解决方案:
在单节点配置定时增量更新,利用solr集群主从复制的功能进行数据同步
弊端:如果只在一个节点配置定时,如果该节点宕机,则无法进行定时增量更新
如果每个节点都配置定时,配置规则待定,更新内容应该是一致的,或者考虑每个节点更新部分数据
扩展:研究solr主从复制相关配置,进一步调优
扩展方法:
使用linux crontab设置定时任务,指定自定义脚本来完成
脚本内容(可以扩展输入的ip,port和webapp):
curl "http://ip:port/webapp/dataimport?command=delta-import&clean=false&commit=true"
四.进阶
4.1搭建zookeeper集群
1)下载zookeeper
2)解压到指定目录
3)配置zookeeper
在zookeeper_home/下创建data和logs目录
重命名zookeeper_home/conf/zoo_sample.cfg 为zoo.cfg
配置zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#指定data目录
dataDir=/Users/bjlx/Work/otherServer/zooServer/zookeeper7218/data
##指定dataLogDir
dataLogDir=/Users/bjlx/Work/otherServer/zooServer/zookeeper7218/logss
# the port at which the clients will connect
clientPort=7281
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#申明zookeeper serer
#格式:server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口
server.1=127.0.0.1:7118:7128
server.2=127.0.0.1:7218:7228
server.3=127.0.0.1:7318:7328
4)启动zookeeper:
zookeeper_home bin $ ./zkServer.sh start ../conf/zoo.cfg
单机配置多个zookeeper时(伪集群),每个zk启动时指明使用的zoo.cfg,通过zoo.cfg的配置区分各个监听端口
查看zookeeper_home/zookeeper.out检查日志
刚启动时报错是正常的,等所有zookeeper server启动后,会自动进行选举
查看zookeeper状态:
zookeeper_home bin $ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /Users/bjlx/Work/otherServer/zooServer/zookeeper7218/bin/../conf/zoo.cfg
Mode: leader
5)使用客户端接入
zookeeper_home$ sh bin/zkCli.sh –server localhost:2181
6)查看zookeeper状态
echo mntr | nc localhost `clientPort`
报错:
Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
参考资料
http://blog.csdn.net/hengyunabc/article/details/41450003
http://blog.csdn.net/sangyongjia/article/details/50372670
原因:
zookeeper服务没有正常启动,要在单机启动zookeeper伪集群,需要在启动zookeeper时指定使用的zoo.cfg,方便区分各自的监听端口(包括客户端访问端口,与leader服务器交换信息端口和选举leader服务器端口)
解决:
4.2 将zookeeper于tomcat关联
4.3搭建solr集群
参考:http://www.tuicool.com/articles/JNFjii
1、搭建单机solr
参见3.3 部署solr
2、集群搭建(http://blog.csdn.net/xyls12345/article/details/27504965)
1)整合tomcat和zookeeper
修改solr(集群需要每个都修改)所在的tomcat/bin/catalina.sh文件,加入以下配置
#将zookeeper集群中的主机id和client端口配置进来
#主tomcat需要指定Dbootstrap_confdir,其他从tomcat只需要指定DzkHost即可
#配置在 #-------- Excute The Request Command -----------------------------下面
#JAVA_OPTS="-DzkHost=zookeeper1:clientport1,192.168.0.6:2181,192.168.0.7:2181"
JAVA_OPTS="$JAVA_OPTS -Dbootstrap_confdir=/Users/bjlx/Work/dataDir/solrHome9080/collection1/conf -Dcollection.configName=solrCloudConf -DzkHost=127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381"
报错:
12213 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – waiting to find shard id in clusterstate for collection1
12213 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Check for collection zkNode:collection1
12214 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Creating collection in ZooKeeper:collection1
12215 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Looking for collection configName
12217 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Could not find collection configName - pausing for 3 seconds and trying again - try: 1
15220 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Could not find collection configName - pausing for 3 seconds and trying again - try: 2
18223 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Could not find collection configName - pausing for 3 seconds and trying again - try: 3
21228 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Could not find collection configName - pausing for 3 seconds and trying again - try: 4
24230 [coreLoadExecutor-6-thread-1] INFO org.apache.solr.cloud.ZkController – Could not find collection configName - pausing for 3 seconds and trying again - try: 5
27232 [coreLoadExecutor-6-thread-1] ERROR org.apache.solr.cloud.ZkController – Could not find configName for collection collection1
27234 [coreLoadExecutor-6-thread-1] ERROR org.apache.solr.core.CoreContainer – Error creating core [collection1]: Could not find configName for collection collection1 found:null
org.apache.solr.common.cloud.ZooKeeperException: Could not find configName for collection collection1 found:null
at org.apache.solr.cloud.ZkController.getConfName(ZkController.java:1319)
at org.apache.solr.cloud.ZkController.createCollectionZkNode(ZkController.java:1245)
at org.apache.solr.cloud.CloudConfigSetService.createCoreResourceLoader(CloudConfigSetService.java:36)
at org.apache.solr.core.ConfigSetService.getConfig(ConfigSetService.java:58)
at org.apache.solr.core.CoreContainer.create(CoreContainer.java:489)
at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:255)
at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:249)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
27240 [localhost-startStop-1] INFO org.apache.solr.servlet.SolrDispatchFilter – user.dir=/Users/bjlx/Work/webServer/tomcat8_solr_9080
27240 [localhost-startStop-1] INFO org.apache.solr.servlet.SolrDispatchFilter – SolrDispatchFilter.init() done
27-Mar-2017 10:54:51.388 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /Users/bjlx/Work/webServer/tomcat8_solr_9080/webapps/solr has finished in 30,122 ms
27-Mar-2017 10:54:51.397 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-9080"]
27-Mar-2017 10:54:51.405 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-9089"]
27-Mar-2017 10:54:51.406 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 31914 ms
27543 [http-nio-9080-exec-3] ERROR org.apache.solr.servlet.SolrDispatchFilter – null:org.apache.solr.common.SolrException: SolrCore 'collection1' is not available due to init failure: Could not find configName for collection collection1 found:null
at org.apache.solr.core.CoreContainer.getCore(CoreContainer.java:745)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:347)
问题分析及解决:
待定
2)配置solr collection配置文件
solrHome/solr.xml:配置hostport为tomcat的服务端口;配置zkHhost。
<solr>
<solrcloud>
<str name="host">${host:}</str>
<int name="hostPort">8080</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:15000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
<str name="zkHost">127.0.0.1:7181,hadoop.datanode3.com:4181,hadoop.datanode5.com:4181</str>
</solrcloud>
<shardHandlerFactory name="shardHandlerFactory"
class="HttpShardHandlerFactory">
<int name="socketTimeout">${socketTimeout:0}</int>
<int name="connTimeout">${connTimeout:0}</int>
</shardHandlerFactory>
</solr>
solrHome/collection1/core.properties:删除该文件(这样集群启动后就没有collection)
solrHome/collection1/conf/solrconfig.xml:修改如下配置项:
<dataDir>${solr.data.dir:/data_solr/example-collection}</dataDir>
将所有的这些配置同步到各个节点上。(TODO solr配置的主机地址和端口是否修改???)
3)上传solr配置文件(使用solrhomt/{core}/conf)到zookeeper中
参考资料:http://lies-joker.iteye.com/blog/2094953
扩展资料:http://kb.cnblogs.com/page/86827/
可以全部上传,也可以单独上传
lzh@bjlxdeMacBook-Pro cloud-scripts $ pwd
/Users/bjlx/Downloads/developSoft/Solr/solr-4.10.3/example/scripts/cloud-scripts
lzh@bjlxdeMacBook-Pro cloud-scripts $ ll
total 24
drwxr-xr-x@ 5 lzh staff 170 12 10 2014 ./
drwxr-xr-x@ 5 lzh staff 170 3 27 10:59 ../
-rw-r--r--@ 1 lzh staff 317 12 1 2014 log4j.properties
-rw-r--r--@ 1 lzh staff 707 12 1 2014 zkcli.bat
-rwxr-xr-x@ 1 lzh staff 485 12 1 2014 zkcli.sh*
lzh@bjlxdeMacBook-Pro cloud-scripts $ ./zkcli.sh -zkhost 127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381 -cmd upconfig -confdir /Users/bjlx/Work/dataDir/solrHome9080/collection1/conf -confname solrCloudConf
命令解析:
使用的只solr下载包/example/scripts/cloud-scripts/zkcli.sh 脚本
命令说明 :
-zkhost zookeeperserverIp:clientPort,zookeeperserverIp2:clientPort2,...
-cmd upconfig 固定命令 说明功能
-confdir 指定上传配置文件的目录(使用sorlhome/{core}/conf目录即可)
-confname 指定配置名称
单文件上传:
lzh@bjlxdeMacBook-Pro cloud-scripts $./zkcli.sh -zkhost hadoop34:2181,hadoop35:2181,hadoop36:2181 -cmd putfile /configs/alpha_wenuser/schema.xml conf/schema.xml
./zkcli.sh -zkhost 127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381 -cmd putfile /configs/myconf/schema.xml /Users/bjlx/Work/dataDir/solr-config-files/schema.xml
putfile命令是用来上传单个文件的,所以需要先rmr删除zookeeper上的文件(/configs/alpha_wenuser/schema.xml),在提交这条命令,不然会报错:KeeperErrorCode = NodeExists for /configs/investor/schema.xml
说明:
putfile 后跟zookeeper上配置文件路径 后跟本地配置文件路径
效果:
查看zookeeper配置:
lzh@bjlxdeMacBook-Pro bin $ pwd
/Users/bjlx/Work/otherServer/zooServer/zookeeper7118/bin
lzh@bjlxdeMacBook-Pro bin $ ./zkCli.sh -server 127.0.0.1:7181
[zk: 127.0.0.1:7181(CONNECTED) 0] ls /
[configs, zookeeper, overseer, aliases.json, live_nodes, collections, overseer_elect, clusterstate.json]
[zk: 127.0.0.1:7181(CONNECTED) 1] ls /configs
[solrCloudConf]
[zk: 127.0.0.1:7181(CONNECTED) 2] ls /live_nodes
[127.0.0.1:9060_solr, 127.0.0.1:9080_solr, 127.0.0.1:9070_solr]
[zk: 127.0.0.1:7181(CONNECTED) 7] ls /configs/solrCloudConf
[currency.xml, mapping-FoldToASCII.txt, protwords.txt, scripts.conf, synonyms.txt, stopwords.txt, _schema_analysis_synonyms_english.json, velocity, admin-extra.html, update-script.js, _schema_analysis_stopwords_english.json, solrconfig.xml, admin-extra.menu-top.html, elevate.xml, schema.xml, clustering, _rest_managed.json, mapping-ISOLatin1Accent.txt, spellings.txt, xslt, lang, admin-extra.menu-bottom.html]
[zk: 127.0.0.1:7181(CONNECTED) 8]
3、 通过集群api 管理集群(Core Admin)(创建collection和core)
参考:https://www.zhihu.com/question/41870519
http://eksliang.iteye.com/blog/2124078
有两种方式:一种是创建collection,自动分配shard和replica;另一种是创建collection,手动分配shard和replica。推荐后者,因为可控性强。
方式一:
curl
'http://localhost:9080/solr/admin/collections?action=CREATE&name=cloud_collection&numShards=3&replicationFactor=3&maxShardsPerNode=3'
这样会出来一个collection,它有3个shard,每个shard有1个数据节点,2个备份节点,即该collection共有9个core
缺点:不灵活,不能选择适合的节点,不能选择数据存放路径,不能选择实例存放路径
方式二:
curl 'http://localhost:9080/solr/admin/cores?action=CREATE&name=cz_collection-shard1-replica1&instanceDir=/usr/solr/cz_collection-shard1-replica1&dataDir=/data_solr/cz_collection-shard1-replica1&collection=cz_collection&shard=shard1'
curl 'http://localhost:8080/solr/admin/cores?action=CREATE&name=cz_collection-shard1-replica2&instanceDir=/usr/solr/cz_collection-shard1-replica2&dataDir=/data_solr/cz_collection-shard1-replica2&collection=cz_collection&shard=shard1'
这样可以创建出一个collection,并自己指定该collection的shard和replica的所有配置项。还可以继续接着创建。
以上两种方式的具体api调用,请参看solr官方文档。
附加:
删除不用的Collection。
http://192.168.25.154:8180/solr/admin/collections?action=DELETE&name=collection1
4、集群运维
a.集群会发生变化的就是collection的配置,因此当collection的配置文件发生变化后就应该使用命令更新zookeeper中配置文件信息,solr很好提供了运维工具:
详见上文:上传solr配置文件(使用solrhomt/{core}/conf)到zookeeper中
b.对于collection,shard,core运维使用api接口即可
实践:
1.主从tomcat的tomcat/bin/catalina.sh 中 JAVA_OPTS使用相同配置(只指定-Dzk即可)
2.单独指定一个solr-config目录,目录下放sorl-4.10.x/example/solr/collection1/conf目录下所有文件(不需要做任何修改)
3.使用solr-4.10.3/example/scripts/cloud-scripts/zkCli.sh 上传solr-config配置文件
./zkcli.sh -cmd upconfig -zkhost 127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381 -confdir /Users/bjlx/Work/dataDir/solr-config-files/ -confname myconf
4.使用solr api创建collection
http://localhost:9080/solr/admin/collections?action=CREATE&name=cloud_collection&numShards=3&replicationFactor=3&maxShardsPerNode=3
后续可以研究使用方法二:单独指定collection和core的目录等
注意:出现错误时,可以清除zookeeper配置文件等(详见上文),恢复集群状态
4.4 solrJ使用
4.5 solr优化
> 参考:http://www.solr.cc/blog/?p=58
五.问题:
Solr错误:sorry, no dataimport-handler defined!
原因是:apache-tomcat-6.0.35\webapps\solr\WEB-INF\lib没有导入
solr-dataimporthandler-4.1.0.jar
solr-dataimporthandler-extras-4.1.0.jar
解决:
1.导入以上3各jar包
2.在solrHome/{core}/conf/下创建data-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/ecmall?useUnicode=true&characterEncoding=UTF-8" user="root" password=""/>
<document name="goodsDoc">
<entity name="cloud_goods" query="select * from cloud_goods where status = 1 " >
<field name="id" column="id" />
<field name="goods_id" column="goods_id" />
<field name="cloud_user_id" column="cloud_user_id" />
<field name="goods_name" column="goods_name" />
<field name="sku" column="sku" />
</entity>
</document>
</dataConfig>
3.在schema.xml中配置对应的字段(如果存在则不用)
4.在solrconfig.xml中引入data-config.xml
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
5.重启tomcat?
使用solr api创建collection或core
Caused by: Lock obtain timed out: NativeFSLock@/Users/bjlx/Work/dataDir/solrHome9080/collection1/dat
solr集群启动报错
> solr 集群启动没有选举出leader,报错index lock
参考:http://stackoverflow.com/questions/17444493/caused-by-org-apache-solr-common-solrexception-index-locked-for-write-for-core
报错:
13973 [coreLoadExecutor-5-thread-3] INFO org.apache.solr.core.CachingDirectoryFactory – looking to close /Users/bjlx/Work/dataDir/solrHome9070/europe-collection_shard3_replica1/data/index [CachedDir<<refCount=0;path=/Users/bjlx/Work/dataDir/solrHome9070/europe-collection_shard3_replica1/data/index;done=false>>]
13973 [coreLoadExecutor-5-thread-3] INFO org.apache.solr.core.CachingDirectoryFactory – Closing directory: /Users/bjlx/Work/dataDir/solrHome9070/europe-collection_shard3_replica1/data/index
13973 [coreLoadExecutor-5-thread-3] ERROR org.apache.solr.core.CoreContainer – Error creating core [europe-collection_shard3_replica1]: Index locked for write for core europe-collection_shard3_replica1
org.apache.solr.common.SolrException: Index locked for write for core europe-collection_shard3_replica1
at org.apache.solr.core.SolrCore.<init>(SolrCore.java:881)
at org.apache.solr.core.SolrCore.<init>(SolrCore.java:654)
at org.apache.solr.core.CoreContainer.create(CoreContainer.java:491)
at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:255)
at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:249)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.lucene.store.LockObtainFailedException: Index locked for write for core europe-collection_shard3_replica1
at org.apache.solr.core.SolrCore.initIndex(SolrCore.java:516)
at org.apache.solr.core.SolrCore.<init>(SolrCore.java:785)
... 8 more
解决:
停止该节点
删除对应core/data/index/write.lock
重启该节点
solr集群启动没有选举leader
参考:http://mt.sohu.com/20170321/n484043744.shtml
查看tomcat进行发现有一个tomcat进程卡死了,kill掉之后,重启集群后,自动选举了leader
定时增量更新报错:missing mandatory uniqueKey field: id
错误日志:
0616 [Thread-9] INFO org.apache.solr.handler.dataimport.JdbcDataSource – Time taken for getConnection(): 17
60621 [Thread-9] WARN org.apache.solr.handler.dataimport.SolrWriter – Error creating document : SolrInputDocument(fields: [cloud_price=12.10, cloud_cateName=, cloud_cateId1=0, cloud_sku=1312314131313, cloud_skuString=1312314131313, cloud_brand=蒙牛1, cloud_cateId2=0, cloud_goodsName=测试数据1, cloud_specName1=, cloud_specName2=, cloud_createTime=1490870769, cloud_goodsId=22210, cloud_tags=, cloud_defaultImage=, cloud_status=1, description=测试数据1, cloud_updateTime=1490870769, cloud_userId=1, cloud_storeId=0, cloud_normalGoodsId=2, cloud_orderCanUse=0])
org.apache.solr.common.SolrException: Document is missing mandatory uniqueKey field: id
at org.apache.solr.update.AddUpdateCommand.getIndexedId(AddUpdateCommand.java:93)
at org.apache.solr.update.processor.DistributedUpdateProcessor.versionAdd(DistributedUpdateProcessor.java:939)
at org.apache.solr.update.processor.DistributedUpdateProcessor.processAdd(DistributedUpdateProcessor.java:692)
at org.apache.solr.update.processor.LogUpdateProcessor.processAdd(LogUpdateProcessorFactory.java:100)
at org.apache.solr.handler.dataimport.SolrWriter.upload(SolrWriter.java:71)
at org.apache.solr.handler.dataimport.DataImportHandler$1.upload(DataImportHandler.java:265)
at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:511)
at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:415)
at org.apache.solr.handler.dataimport.DocBuilder.doDelta(DocBuilder.java:364)
at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:224)
at org.apache.solr.handler.dataimport.DataImporter.doDeltaImport(DataImporter.java:444)
at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:482)
at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:461)
60622 [Thread-9] INFO org.apache.solr.handler.dataimport.DocBuilder – Delta Import completed successfully
60623 [Thread-9] INFO org.apache.solr.handler.dataimport.DocBuilder – Time taken = 0:0:0.401
60623 [Thread-9] INFO org.apache.solr.update.processor.LogUpdateProcessor – [collection1] webapp=/solr path=/dataimport params={commit=true&clean=false&command=delta-import} status=0 QTime=24 {} 0 24
问题原因:
data-config.xml中配置的query、deltaImportQuery、deletedPkQuery查询内容不一致,query中查询出了id对应的column值,在另外两个参数的sql中没有id对应的column(类型和字段一致)
id在原schema.xml中定义为string类型
定时增量更新报错
报错:
120181 [Thread-10] INFO org.apache.solr.handler.dataimport.DocBuilder – Starting delta collection.
120182 [Thread-10] INFO org.apache.solr.handler.dataimport.DocBuilder – Running ModifiedRowKey() for Entity: cloud_goods_stock
120183 [http-nio-9080-exec-2] ERROR org.apache.solr.servlet.SolrDispatchFilter – null:org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393)
原因:
未知,未影响增量更新