solr实践

作者: 大布兜 | 来源:发表于2017-03-30 21:09 被阅读939次

    参考资料:
    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)
    
    原因:
    未知,未影响增量更新

    相关文章

      网友评论

      本文标题:solr实践

      本文链接:https://www.haomeiwen.com/subject/ilnpottx.html