SolrCloud查詢路由和讀取容錯(cuò)

2018-12-26 14:14 更新
SolrCloud在讀取和寫入中具有高度的可用性和容錯(cuò)性。

讀取側(cè)容錯(cuò)

在SolrCloud集群中,每個(gè)單獨(dú)的節(jié)點(diǎn)負(fù)載平衡在集合中的所有副本之間平衡讀取請求。您仍然需要一個(gè)與集群交談的“外部”負(fù)載平衡器,或者您需要一個(gè)智能客戶端,了解如何讀取ZooKeeper中的Solr元數(shù)據(jù)并與其交互,并只請求ZooKeeper集合的地址開始發(fā)現(xiàn)它應(yīng)該到達(dá)哪個(gè)節(jié)點(diǎn)發(fā)送請求。(Solr提供了一個(gè)稱為CloudSolrClient的智能Java SolrJ客戶端。)

即使在集群中的某些節(jié)點(diǎn)處于離線狀態(tài)或無法訪問,Solr 節(jié)點(diǎn)也能夠正確響應(yīng)搜索請求,只要它可以與每一個(gè)碎片的至少一個(gè)副本進(jìn)行通信,或每個(gè)相關(guān)碎片的一個(gè)副本,如果用戶碎片通過shards或_route_參數(shù)限制搜索。每個(gè)分片越多的副本,Solr集群就越有可能在發(fā)生節(jié)點(diǎn)故障時(shí)處理搜索結(jié)果。

zkConnected

只要Solr節(jié)點(diǎn)能夠與所知道的每個(gè)碎片的至少一個(gè)副本進(jìn)行通信,就會(huì)返回搜索請求的結(jié)果,即使它在收到請求時(shí)不能與ZooKeeper進(jìn)行通信。從容錯(cuò)的角度來看,這通常是首選的行為,但如果對該節(jié)點(diǎn)尚未通過ZooKeeper通知的集合結(jié)構(gòu)有重大更改,則可能會(huì)導(dǎo)致過時(shí)或不正確的結(jié)果(即碎片可能已被添加或刪除,或分割成分片)

每個(gè)搜索響應(yīng)中都包含一個(gè)zkConnected標(biāo)題,指示處理請求的節(jié)點(diǎn)是否與ZooKeeper在以下時(shí)間連接:

Solr響應(yīng)與部分結(jié)果

{
  "responseHeader": {
    "status": 0,
    "zkConnected": true,
    "QTime": 20,
    "params": {
      "q": "*:*"
    }
  },
  "response": {
    "numFound": 107,
    "start": 0,
    "docs": [ "..." ]
  }
}

shards.tolerant

如果查詢的一個(gè)或多個(gè)碎片完全不可用,則Solr的默認(rèn)行為是使請求失敗。但是,有很多用例可以接受部分結(jié)果,所以Solr提供了一個(gè)布爾shards.tolerant參數(shù)(默認(rèn)值false)。

如果shards.tolerant=true,那么部分結(jié)果可能會(huì)被返回。如果返回的響應(yīng)不包含所有合適的碎片的結(jié)果,那么響應(yīng)頭部包含一個(gè)稱為partialResults的特殊的調(diào)用標(biāo)志。

客戶端可以指定shards.info以及shards.tolerant參數(shù)以檢索更多 fine-grained 的詳細(xì)信息。

將partialResults標(biāo)志設(shè)置為“true”的示例響應(yīng):

Solr響應(yīng)與部分結(jié)果:

{
  "responseHeader": {
    "status": 0,
    "zkConnected": true,
    "partialResults": true,
    "QTime": 20,
    "params": {
      "q": "*:*"
    }
  },
  "response": {
    "numFound": 77,
    "start": 0,
    "docs": [ "..." ]
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)