solr是apache下的一個用於作搜索引擎的高級項目,使用它能夠知足絕大部分應用的搜索需求。html
Linux:centos6.5java
JDK:1.8node
solr:7.3.0mysql
zookeeper:3.4.8linux
mmseg4j-solr:2.4.0git
使用三臺虛擬機模擬建立solr集羣github
IP | 名稱 | |
---|---|---|
192.168.245.128 | APP1 | |
192.168.245.129 | APP2 | |
192.168.245.130 | APP3 |
下載solr-7.3.0.tgzweb
下載地址1: http://mirror.bit.edu.cn/apache/lucene/solr/7.3.0/sql
下載地址2:https://github.com/apache/lucene-solr/releases/tag/releases%2Flucene-solr%2F7.3.0數據庫
將包上傳到linux主機上,執行命令提取安裝腳本
--將壓縮包中的install_solr_service.sh提取出來 tar xzf solr-7.3.0.tgz solr-7.3.0/bin/install_solr_service.sh --strip-components=2
執行安裝腳本(必須安裝JDK)
sudo bash ./install_solr_service.sh solr-7.3.0.tgz -i /home/solr/proc/solr -d /home/solr/data/solr -u solr -s solr -p 8983
-i: solr安裝目錄
-d:solr實時文件目錄
-u:爲solr建立的操做系統用戶名
-s:開機啓動服務名稱
-p:監聽端口
若是安裝並設置了環境變量後還報JAVA_HOME找不到的話能夠參考以下步驟操做,不然忽略這一步:
#使用root用戶編輯/etc/profile,在文件最後添加jdk相關的信息 export JAVA_HOME=/home/jionsvolk/proc/jdk1.8.0_65 export JAVA_BIN=$JAVA_HOME/bin export PATH=$PATH:$JAVA_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH #在當前用戶主目錄下編輯.bashrc文件 vi .bashrc 添加:alias sudo='sudo env PATH=$PATH' #修改sudo默認配置 sudo visudo # Defaults env_reset # 註釋掉原有配置 # Defaults env_keep=」…」 # 註釋掉指定的變量保持 Defaults !env_reset # 修改成不重置環境 或者 Defaults env_reset Defaults env_keep="JAVA_HOME"
重啓主機,再次執行solr安裝腳本install_solr_service.sh
由於solr自帶有jetty容器,就沒有部署到tomcat中了,並且也已經設置爲開機啓動。若是想部署到tomcat能夠將solr安裝目錄下/server/solr-webapp/下面的內容複製過去
下載zookeeper-3.4.8
下載地址1:http://mirror.bit.edu.cn/apache/zookeeper/
下載地址2:https://github.com/apache/zookeeper/releases
上傳到linux主機,並解壓
tar -xf zookeeper-3.4.8
修改配置文件
cd /home/solr/proc/zookeeper-3.4.8/conf cp zoo_sample.conf zoo.conf
# 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. dataDir=/home/solr/data/zookeeper # the port at which the clients will connect clientPort=2181 # 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 server.1 = 192.168.245.128:2888:3888 server.2 = 192.168.245.129:2888:3888 server.3 = 192.168.245.130:2888:3888
其中dataDir 和 server.x 須要修改,clientPort=2181端口是solr在down和upload配置文件時使用的端口
在各個主機上的zookeeper數據文件目錄下建立一個myid文件,裏面存放對應主機的server.x中的x數字,好比server.1 = 192.168.245.128:2888:3888,那麼192.168.245.128主機上myid文件中就寫1
每臺機器上啓動zookeeper和solr
#在solr用戶下操做 cd /home/solr/proc/zookeeper-3.4.8/bin ./zkServer.sh start ./zkServer.sh status #在root用戶下操做 service solr stop service solr start
若是看到Leader或者Follower字樣就表示zookeeper集羣建立成功
備註:建議修改這部分設置
*** [WARN] *** Your open file limit is currently 10240. It should be set to 65000 to avoid operational disruption. If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh *** [WARN] *** Your Max Processes Limit is currently 1024. It should be set to 65000 to avoid operational disruption. If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh Waiting up to 180 seconds to see Solr running on port 8983 [\] Started Solr server on port 8983 (pid=6011). Happy searching!
上面的warning能夠在/etc/security/limits.conf中修改打開文件數限制爲
* soft nofile 65000 * hard nofile 65000
或者根據上面的建議,在solr.in.sh中設置SOLR_ULIMIT_CHECKS=false
在上面的步驟設置完以後,每次重啓虛擬機只有solr是啓動了的,而後本身手工再啓動zookeeper,solr是不能訪問的,要求zookeeper集羣先於solr集羣啓動,所以在設置zookeeper集羣開機啓動前要先查看solr開機啓動的優先級
查看solr開機啓動的優先級
在執行這一步操做時,有興趣的老鐵能夠先看 Linux開機啓動一些知識點 的一片文章,瞭解rcx.d文件目錄的做用
cd /etc/rc3.d ls *solr*
"S50solr"分析:
S:表明啓動
50:表明啓動的順序,值越小越先啓動
solr:服務名字,就是/etc/init.d中的文件名
因zookeeper要先於solr啓動,因此它的啓動順序對應的值應該小於50
設置zookeeper開機啓動
cd /etc/init.d touch zookeeper vim zookeeper
將下面的內容粘貼到zookeeper文件中
#!/bin/bash #chkconfig:2345 20 90 #description:zookeeper #processname:zookeeper export JAVA_HOME=/home/jionsvolk/proc/jdk1.8.0_65 export ZOO_LOG_DIR=/home/solr/data/zookeeper/logs case $1 in start) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh start;; stop) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh stop;; status) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh status;; restart) su solr /home/solr/proc/zookeeper-3.4.8/bin/zkServer.sh restart;; *) echo "require start|stop|status|restart" ;; esac
其中chkconfig:2345 20 90很是重要
2345:爲主機運行的級別,表示主機運行在二、三、四、5個級別時都會啓動zookeeper,而0 、一、6級別時中止zookeeper
20:開機啓動的優先級,要比solr的50大
90:關機中止的順序
通常設置時,先啓動,則後中止,注意不要把啓動值設置得過小,不然可能一些系統核心服務尚未啓動起來,致使你的應用沒法啓動
JAVA_HOME是必須的
ZOO_LOG_DIR是可選的,用於保存zookeeper啓動時的日誌文件,我把它指定到了自定義目錄,不然你得使用root用戶啓動zookeeper或者給root用戶根目錄的寫權限授予給zookeeper的啓動用戶
chmod +x zookeeper
啓動zookeeper
service zookeeper start
設置爲開機啓動
chkconfig --add zookeeper
而後去/etc/rc3.d中查看zookeeper的啓動順序
查看zookeeper的中止順序
重啓主機,驗證solr的瀏覽器控制檯是否能夠訪問
./solr create -c mycloud -n mycloud -shards 4 -replicationFactor 2 -p 8983
在8983這個solr實例上建立一個鏈接mycloud,有四個shards(分片) ,每一個shards有兩個replicationFactor(複製品)
能夠看到下圖
還能夠點擊tree,查看zookeeper中的關於solr的配置信息,這些配置信息是從默認的配置文件目錄中讀取的
/home/solr/proc/solr/solr-7.3.0/server/solr/configsets/_default
./solr zk downconfig -z 192.168.245.130:2181 -n mycloud -d /home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf
到對應目錄下查看已導出的文件,只須要在一臺機器上導出來,修改再上傳便可
例如在managed-schema.xml(solr雲的配置文件)或者schema.xml(單實例solr的配置文件)裏面添加中文分詞器mmseg4j或者ik-analyzer
<fieldtype name="textComplex" class="solr.TextField" positionIncrementGap="100"> <analyzer> <!-- 中文分詞器 其中dicPath是指定自定義分詞的目錄 1.默認目錄爲啓動命令所在目錄下的data/wordsxxx.dic文件 2.絕對路徑下的wordsxxx.dic文件 3.solr_home下的wordsxxx.dic文件 --> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="/home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf"/> </analyzer> </fieldtype> <fieldtype name="textMaxWord" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" /> </analyzer> </fieldtype> <fieldtype name="textSimple" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple"/> </analyzer> </fieldtype> <!-- myname是document對象中的字段名,表示doc中myname使用textComplex字段類型,該類型使用mmseg4j中文分詞器,indexed=true 表示須要創建索引 stored=true 表示須要存儲到索引文件中 --> <field name="myname" type="textComplex" indexed="true" stored="true"></field>
增長了中文分詞器,必定要將相應的jar包上傳到solr_install_home下的server/solr-webapp/webapp/WEB-INF/lib目錄中,好比我添加的是mmseg4j分詞器,那麼須要將mmseg4j-core-1.10.0.jar和mmseg4j-solr-2.4.0.jar添加該目錄中
注:中文分詞器跟不上solr的更新速度,因此使用的時候最好去對應的分詞器官博或者githup上看看適配狀況,好比mmseg4j的githup上目前適配到的solr最高版本爲6.3.0(通過測試目前的7.3.0也是支持的)。
地址:https://github.com/chenlb/mmseg4j-solr
對schema.xml的全部配置能夠參考官方文檔https://lucene.apache.org/solr/guide/7_3/documents-fields-and-schema-design.html,裏面很是有用的CopyingField和DynamicField等等
在solrconfig.xml中添加中文分詞器動態加載handler
<requestHandler name="/mmseg4j/reloadwords" class="com.chenlb.mmseg4j.solr.MMseg4jHandler"> <lst name="defaults"> <!-- 若是solrcloud是多臺機器須要注意相同的配置目錄 --> <str name="dicPath">/home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf</str> <str name="check">true</str> <str name="reload">true</str> </lst> </requestHandler>
須要重啓solr
service solr stop
service solr start
能夠經過瀏覽器控制頁面查看從新加載前的配置文件內容
執行命令從新加載文件
./solr zk upconfig -z 192.168.245.130:2181 -n mycloud -d /home/solr/proc/solr/solr-7.3.0/myconfig/mycloud/conf
在瀏覽器中從新查看配置文件是否有變化
能夠看到中文分詞器的設置已經加載成功
寫一段代碼測試中文分詞器
@Test public void test3() throws Exception { final String solrUrl = "http://192.168.245.130:8983/solr/mycloud"; HttpSolrClient client = new HttpSolrClient(solrUrl); FieldAnalysisRequest request = new FieldAnalysisRequest(); request.addFieldName("myname");// 字段名,隨便指定一個支持中文分詞的字段 request.setFieldValue("");// 字段值,能夠爲空字符串,可是須要顯式指定此參數 request.setQuery("能夠看到中文分詞器的設置已經加載成功"); FieldAnalysisResponse response = request.process(client); Iterator<AnalysisPhase> it = response.getFieldNameAnalysis("myname").getQueryPhases().iterator(); while(it.hasNext()) { AnalysisPhase pharse = (AnalysisPhase)it.next(); List<TokenInfo> list = pharse.getTokens(); for (TokenInfo info : list) { System.out.println(info.getText()); } } }
輸出結果:
分詞結果中沒有「分詞器」這個詞語,可使用mmseg4j的自定義分詞功能
Dictionary.java中的loadDic方法部份內容
File[] words = listWordsFiles(); //只要 wordsXXX.dic的文件 if(words != null) { //擴展詞庫目錄 for(File wordsFile : words) { loadWord(new FileInputStream(wordsFile), dic, wordsFile); addLastTime(wordsFile); //用於檢測是否修改 } }
因此/home/solr/proc/solr/solr/mydic建立一個words_1.dic,裏面添加"分詞器"三個字,一個詞一行
動態加載分詞
使用curl在執行語句,一臺物理機有一條語句便可,不須要每一個shard-replica都要照顧到:
其中mycloud_shard1_replica1的規則是:鏈接名稱-shard名稱-replica名稱,參考下圖中粗框圈出來的內容
curl 'http://192.168.245.129:8983/solr/mycloud_shard1_replica1/mmseg4j/reloadwords?wt=json'
curl 'http://192.168.245.130:8983/solr/mycloud_shard1_replica3/mmseg4j/reloadwords?wt=json'
curl 'http://192.168.245.128:8983/solr/mycloud_shard2_replica4/mmseg4j/reloadwords?wt=json'
最好在到主機上執行一次該命令,讓自定義分詞當即生效
curl 'http://192.168.245.128:8983/solr/admin/collections?action=RELOAD&name=mycloud'
再驗證結果:
鏈接192.168.245.128,使用solrj客戶端API將數據添加到集羣中
測試代碼:
public void test2() throws Exception { final String solrUrl = "http://192.168.245.128:8983/solr"; HttpSolrClient client = new HttpSolrClient(solrUrl); final SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("myname", "梅西又當爹了,兒子還叫C羅"); final UpdateResponse updateResponse = client.add("mycloud", doc); //NamedList<?> ns = updateResponse.getResponse(); // Indexed documents must be committed client.commit("mycloud"); }
鏈接192.168.245.130,使用瀏覽器查詢數據
http://192.168.245.130:8983/solr/mycloud/select?q=*:*
請C羅球迷不要多想
鏈接192.168.245.129,使用瀏覽器查詢數據
http://192.168.245.129:8983/solr/mycloud/select?q=*:*
請C羅球迷不要多想
從測試結果看,不管 鏈接那臺機器,查詢的結果都是一致的
在solrconfig.xml最後添加以下配置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <!-- 數據源配置文件名自定義 --> <str name="config">mysql_db_import_config.xml</str> </lst> </requestHandler>
配置mysql_db_import_config.xml
<?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.245.1:3306/study" user="root" password="12340101"/> <document> <entity name="account" query="select * from account"> <field column="acct_id" name="acct_id_i" /> <field column="acct_name" name="acct_name_t" /> <field column="cust_id" name="cust_id_i" /> </entity> </document> </dataConfig>
其中的acct_id_id規則是xxxx_xx_i,其實就是manage-schema中的動態屬性dynamicField,如:
<dynamicField name="*_i" type="pint" indexed="true" stored="true"/>
這是solr默認給咱們配置的一些可用屬性
重要1:將solr_home/dist/下的solr-dataimporthandler-7.3.0.jar複製到solr_home/server/solr-webapp/webapp/WEB-INF/lib目錄下
重要2:將修改後的配置文件上傳到集羣中一臺主機,而後執行配置上傳命令
重要3:重啓solr,若是有報錯的話,把zookeeper和solr前後重啓一遍
打開瀏覽器控制檯
點擊「Execute」
或者使用curl執行
curl "http://192.168.245.130:8983/solr/dataimport?command=full-import&clean=true&offset=0&length=10000&indent=on"
執行到這一步的時候可能會失敗:好比你數據庫配置有誤,或者網絡不通、防火牆沒有關閉、MYSQL的非本機訪問沒有打開之類的問題。
在實際生產中,本身用solrj簡單寫一個框架(好比像mybatis配合jpa所採用的方式)來導入數據庫中的各類表比上面的方式更方便靈活
建立目錄
[root@node004 ]# mkdir -p /usr/local/solrCloud
複製單節點
[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr1 -rf
[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr2 -rf
[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr3 -rf
[root@node004 ~]# cp /usr/local/solr /usr/local/solrCloud/solr4 -rf
注意:刪除每一個solrhome實例目錄下的core.properties
[root@node004 ~]# rm /usr/local/solrCloud/solr1/home/jonychen/core.properties -rf[root@node004 ~]# rm /usr/local/solrCloud/solr2/home/jonychen/core.properties -rf[root@node004 ~]# rm /usr/local/solrCloud/solr3/home/jonychen/core.properties -rf[root@node004 ~]# rm /usr/local/solrCloud/solr4/home/jonychen/core.properties -rf
solr.xml
[root@node004 ~]# vi /usr/local/solrCloud/solr1/home/solr.xml
[root@node004 ~]# vi /usr/local/solrCloud/solr2/home/solr.xml [root@node004 ~]# vi /usr/local/solrCloud/solr3/home/solr.xml [root@node004 ~]# vi /usr/local/solrCloud/solr4/home/solr.xml
server.xml
[root@node004 ~]# vi /usr/local/solrCloud/solr1/apache-tomcat-8.5.24/conf/server.xml
[root@node004 ~]# vi /usr/local/solrCloud/solr2/apache-tomcat-8.5.24/conf/server.xml [root@node004 ~]# vi /usr/local/solrCloud/solr3/apache-tomcat-8.5.24/conf/server.xml [root@node004 ~]# vi /usr/local/solrCloud/solr4/apache-tomcat-8.5.24/conf/server.xml
web.xml
[root@node004 ~]# vi /usr/local/solrCloud/solr1/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml
[root@node004 ~]# vi /usr/local/solrCloud/solr2/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml [root@node004 ~]# vi /usr/local/solrCloud/solr3/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml [root@node004 ~]# vi /usr/local/solrCloud/solr4/apache-tomcat-8.5.24/webapps/solr/WEB-INF/web.xml
catalina.sh
[root@node004 ~]# vi /usr/local/solrCloud/solr1/apache-tomcat-8.5.24/bin/catalina.sh
[root@node004 ~]# vi /usr/local/solrCloud/solr2/apache-tomcat-8.5.24/bin/catalina.sh [root@node004 ~]# vi /usr/local/solrCloud/solr3/apache-tomcat-8.5.24/bin/catalina.sh [root@node004 ~]# vi /usr/local/solrCloud/solr4/apache-tomcat-8.5.24/bin/catalina.sh
調用solr解壓目錄zkCli.sh上傳配置文件
[root@node004 ~]# cd /root/solr-7.2.0/server/scripts/cloud-scripts/ [root@node004 cloud-scripts]# ls log4j.properties snapshotscli.sh zkcli.bat zkcli.sh [root@node004 cloud-scripts]# ./zkcli.sh -zkhost 192.168.178.161:2181,192.168.178.161:2182,192.168.178.161:2183 -cmd upconfig -confdir /usr/local/s olrCloud/solr1/home/jonychen/conf/ -confname jonychen
查看是否上傳成功
[root@node001 ~]# /usr/local/zkCluster/zk1/bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /usr/local/zkCluster/zk1/bin/../conf/zoo.cfgMode: follower[root@node001 ~]# /usr/local/zkCluster/zk1/bin/zkCli.sh
有configs則說明上傳成功
[zk: localhost:2181(CONNECTED) 1] quitQuitting...
啓動4個tomcat
爲方便查看日誌,複製四個窗口進行操做,分別切換到各自對應的目錄
[root@node004 ~]# cd /usr/local/solrCloud/solr1[root@node004 solr1]# lsapache-tomcat-8.5.24 home logs[root@node004 solr1]# ./apache-tomcat-8.5.24/bin/startup.sh && tailf ./apache-tomcat-8.5.24/logs/catalina.out
啓動成功界面
建立集羣
可使用瀏覽器控制檯,也能夠在後臺使用./solr create 命令建立