備份與還原
如果您擔心資料遺失,而且您當然應該擔心,您需要一種備份 Solr 索引的方法,以便在發生災難性故障時可以快速復原。
Solr 提供兩種備份和還原 Solr 核心或集合的方法,具體取決於您執行 Solr 的方式。如果您執行 SolrCloud 叢集,您將使用集合 API。如果您執行使用者管理叢集或單節點安裝,您將使用複製處理器。
備份(和快照)會擷取已硬提交的資料。使用 同樣地,使用 |
SolrCloud 叢集
SolrCloud 中對備份的支援是透過集合 API提供的。這允許跨多個分片產生備份,並還原到與原始集合相同數量的分片和副本。
SolrCloud 備份/還原需要在所有節點上以相同路徑掛載的共用檔案系統,或 HDFS。 |
支援四種不同的 API 命令
使用者管理叢集和單節點安裝
備份和還原使用 Solr 的複製處理器。Solr 預設包含對複製的隱式支援,因此可以使用此 API。但是,可以透過在 solrconfig.xml
中定義您自己的複製處理器來自訂複製處理器的組態。有關設定複製處理器的詳細資訊,請參閱設定 ReplicationHandler一節。
備份 API
backup
API 需要將命令傳送到 /replication
處理器以備份系統。
您可以使用如下所示的 HTTP 命令觸發備份(將「gettingstarted」替換為您正在使用的核心名稱)
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
操作是否已完成,如下例所示
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
操作的狀態,如下例所示
https://127.0.0.1:8983/solr/gettingstarted/replication?command=restorestatus&wt=xml
<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
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
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
備份/還原儲存儲存庫
Solr 提供儲存庫抽象概念,允許使用者將資料備份和還原到各種不同的儲存系統。例如,在本地檔案系統 (例如,EXT3) 上執行的 Solr 叢集可以將備份資料儲存在相同的磁碟上、遠端網路掛載的磁碟機上、HDFS 中,甚至在某些流行的「雲端儲存」提供者中,這取決於選擇的「儲存庫」實作。Solr 提供多種不同的開箱即用儲存庫實作 (LocalFileSystemRepository
、HdfsBackupRepository
、GCSBackupRepository
和 S3BackupRepository
),並允許使用者根據需要為自己的儲存系統建立外掛程式。也可以建立 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
說明。如果gcsClientMaxRetries
為0
,則會忽略此屬性,因為不會嘗試任何重試。 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
說明。如果gcsClientMaxRetries
為0
,則會忽略此屬性,因為不會嘗試任何重試。 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
中等)。
將
|
以下範例顯示了啟用 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.proxy.url
-
選用
預設值:無
如果需要,S3 客戶端將請求路由通過的 Proxy URL。URL 應包含
<scheme>://<hostname>:<port>
,但是如果遺失,則可以推斷出連接埠和架構。如果使用此選項,它將覆寫任何已設定的系統 Proxy 設定。無需停用
s3.proxy.useSystemSettings
選項。如果您需要使用 Proxyusername
、password
或nonProxyHosts
,請使用下面列出的系統屬性。 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 組態檔案(可能按設定檔)
這些選項包括
-
區域
-
存取金鑰
-
重試
-
重試模式(
LEGACY
、STANDARD
、ADAPTIVE
) -
最大嘗試次數
-