備份與還原

如果您擔心資料遺失,而且您當然應該擔心,您需要一種備份 Solr 索引的方法,以便在發生災難性故障時可以快速復原。

Solr 提供兩種備份和還原 Solr 核心或集合的方法,具體取決於您執行 Solr 的方式。如果您執行 SolrCloud 叢集,您將使用集合 API。如果您執行使用者管理叢集或單節點安裝,您將使用複製處理器。

備份(和快照)會擷取已硬提交的資料。使用 softCommit=true 提交變更可能會導致在搜尋結果中可見但未包含在後續備份中的變更。

同樣地,使用 openSearcher=false 提交變更可能會導致變更提交到磁碟並包含在後續備份中,即使它們目前在搜尋結果中不可見。

SolrCloud 叢集

SolrCloud 中對備份的支援是透過集合 API提供的。這允許跨多個分片產生備份,並還原到與原始集合相同數量的分片和副本。

SolrCloud 備份/還原需要在所有節點上以相同路徑掛載的共用檔案系統,或 HDFS。

支援四種不同的 API 命令

  • action=BACKUP:此命令會備份 Solr 索引和組態。如需更多資訊,請參閱備份集合一節。

  • action=RESTORE:此命令會還原 Solr 索引和組態。如需更多資訊,請參閱還原集合一節。

  • action=LISTBACKUP:此命令會列出指定位置可用的備份點,並顯示每個備份點的中繼資料。如需更多資訊,請參閱列出備份一節。

  • action=DELETEBACKUP:此命令允許刪除備份檔案或整個備份。如需更多資訊,請參閱刪除備份一節。

使用者管理叢集和單節點安裝

備份和還原使用 Solr 的複製處理器。Solr 預設包含對複製的隱式支援,因此可以使用此 API。但是,可以透過在 solrconfig.xml 中定義您自己的複製處理器來自訂複製處理器的組態。有關設定複製處理器的詳細資訊,請參閱設定 ReplicationHandler一節。

備份 API

backup API 需要將命令傳送到 /replication 處理器以備份系統。

您可以使用如下所示的 HTTP 命令觸發備份(將「gettingstarted」替換為您正在使用的核心名稱)

備份 API 範例
https://127.0.0.1:8983/solr/gettingstarted/replication?command=backup

backup 命令是一個非同步呼叫,它將表示來自最新索引提交點的資料。所有索引和搜尋操作將像往常一樣繼續針對索引執行。

一次只能對一個核心進行一個備份呼叫。在正在進行備份操作時,後續的還原呼叫將會擲回例外。

備份請求還可以採用以下附加參數

location

選用

預設值:無

將建立備份的路徑。如果路徑不是絕對路徑,則備份路徑將相對於 Solr 的實例目錄。

name

選用

預設值:無

快照將在名為 snapshot.<name> 的目錄中建立。如果未指定名稱,則目錄名稱將具有以下格式:snapshot.<_yyyyMMddHHmmssSSS_>

numberToKeep

選用

預設值:無

要保留的備份數量。如果在 solrconfig.xml 中複寫處理器的 maxNumberOfBackups 已被指定,則總是會使用 maxNumberOfBackups,嘗試使用 numberToKeep 將會導致錯誤。此外,如果已指定備份名稱,則此參數不會被考慮。關於 maxNumberOfBackups 的更多資訊,請參閱 設定複寫處理器 章節。

repository

選用

預設值:無

用於備份的儲存庫名稱。如果未指定儲存庫,則會自動使用本機檔案系統儲存庫。

commitName

選用

預設值:無

使用 CREATESNAPSHOT 命令建立快照時使用的 commit 名稱。

備份狀態

可以透過將 details 命令傳送至 /replication 處理器來監控 backup 操作是否已完成,如下例所示

狀態 API 範例
https://127.0.0.1:8983/solr/gettingstarted/replication?command=details&wt=xml
輸出片段
<lst name="backup">
  <str name="startTime">2022-02-11T17:19:33.271461700Z</str>
  <int name="fileCount">10</int>
  <int name="indexFileCount">10</int>
  <str name="status">success</str>
  <str name="snapshotCompletedAt">2022-02-11T17:19:34.363859100Z</str>
  <str name="endTime">2022-02-11T17:19:34.363859100Z</str>
  <str name="snapshotName">my_backup</str>
</lst>

如果失敗,則會在回應中傳送 snapShootException

還原 API

還原備份需要將 restore 命令傳送至 /replication 處理器,後面接著要還原的備份名稱。

您可以使用類似以下的命令從備份還原

範例用法
https://127.0.0.1:8983/solr/gettingstarted/replication?command=restore&name=backup_name

這會將指定的索引快照還原到目前的 core 中。一旦還原完成,搜尋將會開始反映快照資料。

restore 請求可以採用這些額外的參數

location

選用

預設值:無

備份快照檔案的位置。如果未指定,它會在 Solr 的資料目錄中尋找備份。

name

選用

預設值:無

要還原的備份索引快照名稱。如果未提供名稱,它會在位置目錄中尋找 snapshot.<timestamp> 格式的備份。在這種情況下,它會選擇最新的時間戳記備份。

repository

選用

預設值:無

用於備份的儲存庫名稱。如果未指定儲存庫,則會自動使用本機檔案系統儲存庫。

restore 命令是一個非同步呼叫。一旦還原完成,反映的資料將會是已還原的備份索引。

在同一時間,只能對一個 core 發出一個 restore 呼叫。在正在進行還原操作時,後續的還原呼叫將會拋出例外。

還原狀態 API

您也可以透過將 restorestatus 命令傳送至 /replication 處理器來檢查 restore 操作的狀態,如下例所示

狀態 API 範例
https://127.0.0.1:8983/solr/gettingstarted/replication?command=restorestatus&wt=xml
狀態 API 輸出
<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">0</int>
  </lst>
  <lst name="restorestatus">
    <str name="snapshotName">snapshot.<name></str>
    <str name="status">success</str>
  </lst>
</response>

狀態值可以是「In Progress」、「success」或「failed」。如果失敗,則會在回應中傳送「exception」。

CREATE:建立快照

快照功能與備份功能不同,因為索引檔案不會複製到任何地方。索引檔案會在相同的索引目錄中建立快照,並且在進行備份時可以參考它們。

您可以使用類似以下的 HTTP 命令觸發快照命令 (將「techproducts」替換為您正在使用的 core 名稱)

  • V1 API

  • V2 API

curl -X POST https://127.0.0.1:8983/solr/admin/cores?action=CREATESNAPSHOT&core=techproducts&commitName=commit1

使用 v2 API 時,core 和快照名稱是路徑的一部分,而不是查詢參數。

curl -X POST https://127.0.0.1:8983/api/cores/techproducts/snapshots/commit1

CREATE 參數

CREATE 動作允許以下參數

async

選用

預設值:無

追蹤此動作的請求 ID,該動作將會以非同步方式處理。

CREATE 回應

回應將會包含請求的狀態、core 名稱、快照名稱、索引目錄路徑、快照產生以及檔案名稱清單。如果狀態不是「success」,則錯誤訊息將會說明請求失敗的原因。

List:列出特定 Core 的所有快照

您可以使用類似以下的 HTTP 命令觸發列出快照命令 (將「techproducts」替換為您正在使用的 core 名稱)

  • V1 API

  • V2 API

curl https://127.0.0.1:8983/solr/admin/cores?action=LISTSNAPSHOTS&core=techproducts&commitName=commit1

使用 v2 API 時,core 名稱會出現在路徑中,而不是作為查詢參數。

curl https://127.0.0.1:8983/api/cores/techproducts/snapshots

LIST 參數

LIST 動作允許以下參數

async

選用

預設值:無

追蹤此動作的請求 ID,該動作將會以非同步方式處理。

LIST 回應

回應將會包含請求的狀態和 core 的所有現有快照。如果狀態不是「success」,則錯誤訊息將會說明請求失敗的原因。

DELETE:刪除快照

您可以使用類似以下的 HTTP 命令觸發刪除快照 (將「techproducts」替換為您正在使用的 core 名稱)

  • V1 API

  • V2 API

curl https://127.0.0.1:8983/solr/admin/cores?action=DELETESNAPSHOT&core=techproducts&commitName=commit1

使用 v2 API 時,core 和快照名稱是路徑的一部分,而不是查詢參數。

curl -X DELETE https://127.0.0.1:8983/api/cores/techproducts/snapshots/commit1

DELETE 參數

DELETE 動作允許以下參數

async

選用

預設值:無

追蹤此動作的請求 ID,該動作將會以非同步方式處理。

DELETE 回應

回應將會包含請求的狀態、core 名稱以及已刪除的快照名稱。如果狀態不是「success」,則錯誤訊息將會說明請求失敗的原因。

備份/還原儲存儲存庫

Solr 提供儲存庫抽象概念,允許使用者將資料備份和還原到各種不同的儲存系統。例如,在本地檔案系統 (例如,EXT3) 上執行的 Solr 叢集可以將備份資料儲存在相同的磁碟上、遠端網路掛載的磁碟機上、HDFS 中,甚至在某些流行的「雲端儲存」提供者中,這取決於選擇的「儲存庫」實作。Solr 提供多種不同的開箱即用儲存庫實作 (LocalFileSystemRepositoryHdfsBackupRepositoryGCSBackupRepositoryS3BackupRepository),並允許使用者根據需要為自己的儲存系統建立外掛程式。也可以建立 DelegatingBackupRepository,它會委派給另一個 BackupRepository,並在其上新增或修改某些行為。

使用者可以在其 solr.xml 檔案中定義任意數量的儲存庫。上述備份和還原 API 允許使用者透過 repository 參數在執行時選擇要使用哪個定義。當未指定 repository 參數時,會預設使用本機檔案系統儲存庫。

儲存庫由巢狀於 <backup> 父標籤下的 <repository> 標籤定義。所有 <repository> 標籤都必須具有 name 屬性 (定義使用者稍後可以參考以選擇此儲存庫的識別碼) 和 class 屬性 (包含實作儲存庫的完整 Java 類別名稱)。它們也可以具有布林值 default 屬性,該屬性最多可以在一個儲存庫定義上為 true<repository> 標籤下的任何子項都會作為額外組態傳遞至儲存庫,允許儲存庫讀取其自己的實作特定組態。

以下提供有關 Solr 提供的每個儲存庫實作的資訊。

預設情況下,所有儲存庫實作都會在將索引檔案複製到目的地之前驗證其完整性。但是,可以透過設定選用的組態屬性 verifyChecksum 來停用此完整性檢查。

verifyChecksum

選用

預設值:true

定義備份儲存庫是否應在將索引檔案複製到目的地之前檢查其完整性。設定為 false 以停用檢查總和驗證,以便以不同的方式驗證完整性,例如,如果檔案已加密。

LocalFileSystemRepository

LocalFileSystemRepository 將備份檔案儲存和擷取到可存取的檔案系統上的任何位置。檔案可以儲存在「本機」磁碟上,或在對檔案系統而言視為本機的網路掛載磁碟機上。

希望將 LocalFileSystemRepository 與網路磁碟機結合使用的 SolrCloud 管理員應注意,使磁碟機在每個 Solr 節點上的相同位置可用。嚴格來說,掛載只需要存在於執行備份 (或還原) 的節點上,以及目前作為「監督者」的節點上。但是,由於「監督者」角色通常會在叢集中從一個節點移動到另一個節點,因此通常建議將備份磁碟機統一新增至所有節點。

如果任何備份和還原命令未明確提供 repository 參數或在 solr.xml 中指定預設值,則會預設使用 LocalFileSystemRepository 執行個體。

LocalFileSystemRepository 接受以下組態選項

location

選用

預設值:無

用於備份儲存和擷取的有效檔案路徑 (可在本機上由 Solr 存取)。當使用者在其備份或還原 API 命令中未提供 location 參數時,會作為回退使用。

以下可以找到使用此屬性的組態範例。

<backup>
  <repository name="local_repo" class="org.apache.solr.core.backup.repository.LocalFileSystemRepository">
    <str name="location">/solr/backup_data</str>
  </repository>
</backup>

HdfsBackupRepository

從 HDFS 目錄儲存和擷取備份檔案。

這是透過 hdfs Solr 模組提供的,使用前需要啟用。

HdfsBackupRepository 接受以下組態選項

solr.hdfs.buffer.size

選用

預設值:4096 KB

用於在 HDFS 之間傳輸資料的緩衝區大小 (以位元組為單位)。在記憶體允許的情況下,較大的緩衝區通常可以獲得更好的輸送量。

solr.hdfs.home

必要

預設值:無

格式為 hdfs://<host>:<port>/<hdfsBaseFilePath> 的 HDFS URI,它會將 Solr 指向要在其上儲存 (或擷取) 備份檔案的 HDFS 叢集。

solr.hdfs.permissions.umask-mode

選用

預設值:無

在 HDFS 中建立檔案時使用的權限 umask。

location

選用

預設值:無

HDFS 叢集上用於備份儲存和擷取的有效目錄路徑。當使用者在其備份或還原 API 命令中未提供 location 參數時,會作為回退使用。

以下可以找到使用這些屬性的組態範例

<backup>
  <repository name="hdfs" class="org.apache.solr.hdfs.backup.repository.HdfsBackupRepository" default="false">
    <str name="solr.hdfs.home">hdfs://some_hdfs_host:1234/solr/backup/data</str>
    <int name="solr.hdfs.buffer.size">8192</int>
    <str name="solr.hdfs.permissions.umask-mode">0022</str>
    <str name="location">/default/hdfs/backup/location</str>
  </repository>
</backup>

GCSBackupRepository

在 Google Cloud Storage ("GCS") 儲存貯體中儲存和擷取備份檔案。

這是透過 gcs-repository Solr 模組提供的,使用前需要啟用。

GCSBackupRepository 接受以下用於整體組態的選項

gcsBucket

選用

預設值:請參閱說明

要將所有備份檔案讀取和寫入的 GCS 儲存貯體。如果未指定,GCSBackupRepository 將使用 GCS_BUCKET 環境變數的值。如果兩個值都不存在,則將預設使用值 solrBackupsBucket

gcsCredentialPath

選用

預設值:請參閱說明

本機檔案系統上 (可由 Solr 存取) Google Cloud 服務帳戶金鑰檔案的路徑。如果未指定,GCSBackupRepository 將使用 GCS_CREDENTIAL_PATH 環境變數的值。如果兩個值都不存在且 Solr 在 GCP 內執行,則 GCS 用戶端將嘗試使用 GCP 的「運算引擎中繼資料伺服器」或 工作負載身分功能進行驗證。如果兩個值都不存在且 Solr 在 GCP 之外執行,則它將無法驗證身分,並且任何備份或還原操作都會失敗。

location

選用

預設值:無

在給定的 GCS 儲存貯體中用於備份儲存和擷取的有效「目錄」路徑。(GCS 使用平面儲存模型,但 Solr 的備份功能會以近似階層式目錄儲存的方式命名 blob。) 當使用者在其備份或還原 API 命令中未提供 location 參數時,會作為回退使用。

除了這些整體設定的屬性之外,GCSBackupRepository 還讓使用者可以詳細控制用於與 GCS 通訊的客戶端。這些屬性可能不會引起大多數使用者的興趣,但對於那些希望微調效能或受不穩定網路影響的人來說,可能很有價值。

GCSBackupRepository 接受以下進階客戶端設定選項

gcsWriteBufferSizeBytes

選用

預設值:16777216 位元組 (16 MB)

將資料傳送到 GCS 時要使用的緩衝區大小(以位元組為單位)。

gcsReadBufferSizeBytes

選用

預設值:2097152 位元組 (2 MB)

從 GCS 複製資料時要使用的緩衝區大小(以位元組為單位)。

gcsClientHttpConnectTimeoutMillis

選用

預設值:2000 毫秒

GCS 客戶端發出的所有 HTTP 請求的連線逾時時間(以毫秒為單位)。可以使用 0 來請求無限逾時。負整數或完全不指定值將導致使用預設值。

gcsClientHttpReadTimeoutMillis

選用

預設值:20000 毫秒

在已建立的連線上讀取資料的讀取逾時時間(以毫秒為單位)。可以使用 0 來請求無限逾時。負整數或完全不指定值將導致使用預設值。

gcsClientMaxRetries

選用

預設值:10

失敗時重試操作的最大次數。GCS 客戶端將重試操作,直到達到此值,或所有嘗試所花費的時間超過 gcsClientMaxRequestTimeoutMillis。可以使用 0 來指定不應執行任何重試。

gcsClientMaxRequestTimeoutMillis

選用

預設值:30000 毫秒

在失敗操作的所有重試中花費的最大時間量。GCS 客戶端將重試操作,直到達到此逾時時間,或直到 gcsClientMaxRetries 次嘗試失敗。

gcsClientHttpInitialRetryDelayMillis

選用

預設值:1000 毫秒

第一次重試失敗的 HTTP 請求之前要延遲的時間(以毫秒為單位)。此值也會影響後續的重試 - 有關更多資訊,請參閱下面的 gcsClientHttpRetryDelayMultiplier 說明。如果 gcsClientMaxRetries0,則會忽略此屬性,因為不會嘗試任何重試。

gcsClientHttpRetryDelayMultiplier

選用

預設值:1.0

用於縮放每次連續重試失敗的 HTTP 請求之間延遲的浮點乘數。這個數字越大,重試延遲複合和縮放的速度就越快。

Under the covers, the GSC client uses an exponential backoff strategy between retries, governed by the formula: . The first retry will have a delay of , the second a delay of , the third a delay of , and so on.

如果未指定,則預設使用值 1.0,確保每次重試嘗試之間都使用 gcsClientHttpInitialRetryDelayMillis

gcsClientHttpMaxRetryDelayMillis

選用

預設值:30000 毫秒

失敗的 HTTP 請求重試嘗試之間的最大延遲時間(以毫秒為單位)。這通常用於限制多次嘗試中重試延遲的指數增長。有關在不受此最大值限制時如何計算每個延遲的更多資訊,請參閱上面的 gcsClientHttpRetryDelayMultiplier 說明。

gcsClientRpcInitialTimeoutMillis

選用

預設值:10000 毫秒

等待 RPC 請求逾時的時間(以毫秒為單位)。此值也會影響後續的重試 - 有關更多資訊,請參閱下面的 gcsClientRpcTimeoutMultiplier 說明。如果 gcsClientMaxRetries0,則會忽略此屬性,因為不會嘗試任何重試。

gcsClientRpcTimeoutMultiplier

選用

預設值:1.0

用於縮放每次連續嘗試失敗的 RPC 請求逾時時間的浮點乘數。這個數字越大,逾時時間複合和縮放的速度就越快。

Under the covers, the GSC client uses an exponential backoff strategy for RPC timeouts, governed by the formula: . The first retry will have a delay of , the second a delay of , the third a delay of , and so on.

如果未指定,則預設使用值 1.0,確保每次 RPC 嘗試都使用 gcsClientRpcInitialTimeoutMillis

gcsClientRpcMaxTimeoutMillis

選用

預設值:30000 毫秒

失敗的 RPC 請求重試嘗試的最大逾時時間(以毫秒為單位)。這通常用於限制多次嘗試中逾時時間的指數增長。有關在不受此最大值限制時如何計算每個逾時時間的更多資訊,請參閱上面的 gcsClientRpcTimeoutMultiplier 說明。

以下範例顯示了使用整體和 GCS 客戶端屬性的組態

<backup>
  <repository name="gcs_backup" class="org.apache.solr.gcs.GCSBackupRepository" default="false">
    <str name="gcsBucket">solrBackups</str>
    <str name="gcsCredentialPath">/local/path/to/credential/file</str>
    <str name="location">/default/gcs/backup/location</str>

    <int name="gcsClientMaxRetries">5</int>
    <int name="gcsClientHttpInitialRetryDelayMillis">1500</int>
    <double name="gcsClientHttpRetryDelayMultiplier">1.5</double>
    <int name="gcsClientHttpMaxRetryDelayMillis">10000</int>
  </repository>
</backup>

S3BackupRepository

在 Amazon S3 儲存貯體中儲存和擷取備份檔案。

這是透過 s3-repository Solr 模組提供的,該模組需要在使用前啟用。

此外掛程式使用預設 AWS 憑證提供者鏈,因此請確保您的憑證已正確設定(例如,透過環境變數或在 ~/.aws/credentials 中等)。

location 選項與 S3 儲存庫搭配使用有一些細微之處。location 選項指定要儲存備份資訊的子目錄。

位置格式

當使用備份與還原集合 API 呼叫時,location 選項可以透過多種方式呈現

  • dir/in/bucket

  • /dir/in/bucket

  • s3:/dir/in/bucket

  • s3://dir/in/bucket

    以上所有選項都將解析為 S3 儲存貯體中的相同目錄:dir/in/bucket

預先建立

位置必須已存在於您的 S3 儲存貯體中,然後您才能使用該位置執行任何備份操作。

請注意,您在 S3 中建立的目錄不能以 / 開頭,因為 locations 會移除任何 / 前置字元(如「位置格式」中所示)。

空位置

如果您不想使用儲存貯體中的子目錄來儲存備份,則可以使用以下任何位置選項:/s3:/s3://。但是,位置選項是強制性的,如果您在沒有它的情況下嘗試執行備份操作,將會收到錯誤訊息。

以下範例顯示了啟用 S3 備份和還原的組態

<backup>
  <repository name="s3" class="org.apache.solr.s3.S3BackupRepository" default="false">
    <str name="s3.bucket.name">my-s3-bucket</str>
    <str name="s3.region">us-west-2</str>
  </repository>
</backup>

S3BackupRepository 接受以下選項(在 solr.xml 中)進行整體設定

s3.bucket.name

選用

預設值:無

讀取和寫入所有備份檔案的 S3 儲存貯體。可以透過設定 S3_BUCKET_NAME 環境變數來覆寫。

s3.profile

選用

預設值:無

從組態檔案載入 AWS 設定的設定檔。設定檔允許為多個 S3Repository 獨立設定。可以透過設定 AWS_PROFILE 環境變數或 -Daws.profile 系統屬性來覆寫。有關每個設定檔設定組態的更多資訊,請參閱AWS Java SDK 文件

s3.region

選用

預設值:無

您的儲存貯體佈建所在的有效 Amazon S3 區域字串。您必須具有此儲存貯體的讀寫權限。如需區域的完整清單,請參閱S3 文件。可以透過設定 S3_REGION 環境變數或在 AWS 設定檔案中設定區域來覆寫。

s3.endpoint

選用

預設值:無

明確的 S3 端點。當使用 AWS S3 時,在正常操作下不需要此參數(S3 客戶端可以從 s3.region 推斷出端點)。如果您使用模擬 S3 架構並想要明確覆寫 S3 請求的路由位置(例如,當使用 S3Mock 時),則此參數很有幫助。可以透過設定 S3_ENDPOINT 環境變數來覆寫。

您可以使用 s3.endpoint 選項將此 BackupRepository 與相容於 s3 的端點搭配使用。請注意,並非所有相容於 s3 的端點都適用於 S3BackupRepository。Minio 是不適用於 S3BackupRepository 的相容於 s3 端點的範例。S3BackupRepository 僅保證與 AWS S3 和 S3Mock 相容。

s3.proxy.url

選用

預設值:無

如果需要,S3 客戶端將請求路由通過的 Proxy URL。URL 應包含 <scheme>://<hostname>:<port>,但是如果遺失,則可以推斷出連接埠和架構。

如果使用此選項,它將覆寫任何已設定的系統 Proxy 設定。無需停用 s3.proxy.useSystemSettings 選項。如果您需要使用 Proxy usernamepasswordnonProxyHosts,請使用下面列出的系統屬性。

s3.proxy.useSystemSettings

選用

預設值:true

預設情況下,如果設定了系統 Proxy 設定,則在與 S3 伺服器通訊時使用這些設定。支援的 Proxy 系統屬性為

  • http.proxyHost

  • http.proxyPort

  • http.nonProxyHosts

  • http.proxyUser

  • http.proxyPassword

s3.retries.disable

選用

預設值:false

停用所有 S3 操作的重試。不建議這樣做。

S3 客戶端設定

AWS Java SDK 提供許多方法來設定 S3 客戶端的組態。Solr S3Repository 允許透過以下方式設定這些組態

  • 環境變數

  • Java 系統屬性

  • AWS 組態檔案(可能按設定檔)

這些選項包括

  • 區域

  • 存取金鑰

  • 重試

    • 重試模式(LEGACYSTANDARDADAPTIVE

    • 最大嘗試次數