Solr集羣架構概述及delta-import詳細配置

背景html

因爲項目緣由,從新熟悉了下Solr,版本爲3.6,搭建了主從Solr服務,並使用DIH從RDBMS數據源增量更新索引。mysql

其實也沒什麼技術含量,就是簡單作個總結,分別從部署架構增量更新兩個方面說明下。web


Solr Replicationsql

solr的主從實際上是他的replication集羣,從本質上說是經過ReplicationHandler來實現的,除了solr server之間能夠互相同步以外,每一個solr實例內部的core之間也是能夠實現同步的,而能自身同步自身的實例稱爲Repeater,它的存在是爲了分擔master的同步開銷,即由它來同步master裏須要向外同步的core,而後全部的slave都從Repeater處同步相應的core。apache


具體配置方面,master的solrconfig.xml裏的requestHandler配置爲:架構

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片app

  1. <requestHandler name="/replication" class="solr.ReplicationHandler">  負載均衡

  2.     <lst name="master">  webapp

  3.         <str name="replicateAfter">startup</str>  google

  4.         <str name="replicateAfter">commit</str>  

  5.         <str name="backupAfter">optimize</str>  

  6.         <str name="confFiles">schema.xml,stopword.dic,db-data-config.xml,dataimport.properties</str>  

  7.         <str name="commitReserveDuration">00:01:00</str>  

  8.     </lst>  

  9. </requestHandler>  

在confFiles裏能夠指定在同步過程當中,slave須要一併同步過去的文件。slave端 solrconfig.xml裏的配置爲:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <requestHandler name="/replication" class="solr.ReplicationHandler">  

  2.     <lst name="slave">  

  3.         <str name="masterUrl">http://yf-rd-crm-cdc-db06.yf01.baidu.com:8888/solr/core0/replication</str>  

  4.         <str name="pollInterval">00:00:20</str>  

  5.         <str name="compression">internal</str>  

  6.         <str name="httpConnTimeout">5000</str>  

  7.         <str name="httpReadTimeout">10000</str>  

  8.     </lst>  

  9. </requestHandler>  

其中pollInterval是發出同步請求的間隔時間,上述配置爲每20s會去sync一次。後面的http參數都是默認值。對slave和master來講,主要的配置不一樣就在這個handler裏,其餘部分能夠一致。個人solr主從比較簡單,大體以下。


若是對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裏添加下面這個配置

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <listener>  

  2.    <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>  

  3. </listener>  

可是這個類並不存在於solr的主要幾個包裏,須要額外導入,包下載連接在這裏。須要在webapps/solr.war下的WEB-INF/lib裏添加這個包,還要添加下dist下的兩個dataimporthandler有關的兩個jar。此外把上面的listener配置添加到WEB-INF/web.xml內。特別注意的是,須要jdk7才能正常啓動,不然會報錯。

具體DIH相關的配置再詳細列一下,首先在solrconfig.xml裏配置Handler:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  

  2.     <lst name="defaults">  

  3.         <str name="config">db-data-config.xml</str>  

  4.     </lst>  

  5. </requestHandler>  

具體db-data-config.xml裏是sql邏輯和映射field,放在core/conf內,

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <dataConfig>  

  2.     <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"  

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

  4.         user="root" password="root" />  

  5.     <document name="tb_core">  

  6.         <entity name="tb_core_table" pk="table_id"  

  7.             query="select table_id, code, name, description, freq_id, bytes, first_date, owner, secret_level, charset_id, field_term,   

  8.                             line_term, null_format, subj_id, gmt_modify from tb_core_table"  

  9.             deltaQuery="select table_id, code, name, description, freq_id, bytes, first_date, owner, secret_level, charset_id, field_term,   

  10.                             line_term, null_format, subj_id, gmt_modify from tb_core_table where gmt_modify > '${dataimporter.last_index_time}'">  

  11.             <field column="table_id" name="table_id" />  

  12.             <field column="code" name="code" />  

  13.             <field column="name" name="name" />  

  14.             <field column="description" name="description" />  

  15.             <field column="description" name="subject_path" />  

  16.             <field column="freq_id" name="freq_id" />  

  17.             <field column="bytes" name="bytes" />  

  18.             <field column="first_date" name="first_date" />  

  19.             <field column="owner" name="owner" />  

  20.             <field column="secret_level" name="secret_level" />  

  21.             <field column="charset_id" name="charset_id" />  

  22.             <field column="field_term" name="field_term" />  

  23.             <field column="line_term" name="line_term" />  

  24.             <field column="null_format" name="null_format" />  

  25.             <field column="subj_id" name="subj_id" />  

  26.             <field column="gmt_modify" name="entity_modify" />  

  27.             <entity name="tb_core_column" pk="col_id"  

  28.                 query="select col_id, table_id, code, name, description, gmt_modify from tb_core_column where table_id='${tb_core_table.table_id}'"  

  29.                 deltaQuery="select col_id, table_id, code, name, description, gmt_modify from tb_core_column where gmt_modify > '${dataimporter.last_index_time}'"  

  30.                 parentDeltaQuery="select table_id, code, name, description, freq_id, bytes, first_date, owner, secret_level, charset_id, field_term,   

  31.                                     line_term, null_format, subj_id, gmt_modify from tb_core_table where table_id = ${tb_core_column.table_id}">  

  32.                 <field column="col_id" name="column_id" />  

  33.                 <field column="code" name="column_code" />  

  34.                 <field column="name" name="column_name" />  

  35.                 <field column="description" name="column_description" />  

  36.                 <field column="gmt_modify" name="column_modify" />  

  37.             </entity>  

  38.         </entity>  

  39.     </document>  

  40. </dataConfig>  

上面的邏輯裏,table和column是一對多的關係,而兩個table內都有最近更新時間字段(gmt_modify),任何一方的更新都要觸發整個索引的增量更新,因此這是一個嵌套的例子。在SolrDoc裏也有相似的嵌套寫法,相對而言屬於delta-import稍微高級些的寫法。你們能夠參考下。

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <dataConfig>  

  2.     <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" />  

  3.     <document>  

  4.             <entity name="item" pk="ID" query="select * from item"  

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

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

  7.                 <entity name="feature" pk="ITEM_ID"  

  8.                     query="select DESCRIPTION as features from FEATURE where ITEM_ID='${item.ID}'"  

  9.                     deltaQuery="select ITEM_ID from FEATURE where last_modified > '${dih.last_index_time}'"  

  10.                     parentDeltaQuery="select ID from item where ID=${feature.ITEM_ID}"/>  

  11.             <entity name="item_category" pk="ITEM_ID, CATEGORY_ID"  

  12.                     query="select CATEGORY_ID from item_category where ITEM_ID='${item.ID}'"  

  13.                     deltaQuery="select ITEM_ID, CATEGORY_ID from item_category where last_modified > '${dih.last_index_time}'"  

  14.                     parentDeltaQuery="select ID from item where ID=${item_category.ITEM_ID}">  

  15.                 <entity name="category" pk="ID"  

  16.                         query="select DESCRIPTION as cat from category where ID = '${item_category.CATEGORY_ID}'"  

  17.                         deltaQuery="select ID from category where last_modified > '${dih.last_index_time}'"  

  18.                         parentDeltaQuery="select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}"/>  

  19.             </entity>  

  20.         </entity>  

  21.     </document>  

  22. </dataConfig>  

最重要的是,在solr_home/conf內須要一個負責調度的文件:dataimport.properties(不一樣於core/conf下的dataimport.properties,那個dataimport.properties會自動生成,記錄的是最近一次更新的時間)

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. #################################################  

  2. #                                               #  

  3. #       dataimport scheduler properties         #  

  4. #                                               #  

  5. #################################################  

  6.   

  7. #  是否同步功能  

  8. #  1 - 開啓 ; 不然不開啓  

  9. syncEnabled=1  

  10.   

  11. # 須要同步的solr core  

  12. syncCores=core0  

  13.   

  14. #  solr server名稱或ip地址  

  15. #  默認爲localhost  

  16. server=localhost  

  17.   

  18. #  solr server端口  

  19. #  默認80  

  20. port=8888  

  21.   

  22. # webapp name  

  23. webapp=solr  

  24.   

  25. #  application context  

  26. webapp=metadata-search  

  27.   

  28. #  同步URL參數   

  29. params=/dataimport?command=delta-import&clean=false&commit=true  

  30.   

  31. #  調度區間  

  32. #  默認30分鐘  

  33. interval=1  

這部分就須要開頭講的

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

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

的配置,不然啓動後,以前的xml是不生效的。


Solr Server服務架構

結合Solr更新、主從和內部的一些主要模塊,畫了一個服務架構圖以下。



(全文完)

相關文章
相關標籤/搜索