本文介紹如何將Amazon OpenSearch Service中的Elasticsearch(以下簡稱ES)索引資料移轉到Elasticsearch中。
方案說明
該方案不局限雲端服務廠商,均依賴ES快照機制實現。例如,使用阿里雲線上遷移(遷移實施)將儲存在Amazon OpenSearch Service或騰訊雲COS的ES快照資料移轉到阿里雲OSS,參考阿里雲ES快照恢複OSS倉庫快照資料。具體操作,請參見手動備份與恢複。
ES快照遷移僅支援低版本向高版本或同版本遷移恢複,詳見快照相容性。
背景資訊
本次Elasticsearch索引遷移方案的參考架構如下。
相關概念
Elasticsearch:一個分布式的RESTful風格的搜尋與分析引擎,適用於各種應用情境。作為Elastic Stack的核心,Elasticsearch可以集中儲存您的資料,並對資料進行搜尋分析。
Kibana:您可以使用Kibana對Elasticsearch資料進行可視化搜尋分析。
Amazon OpenSearch Service:原Amazon Elasticsearch Service,2021年9月更名為Amazon OpenSearch Service。是AWS的一項託管服務,提供了各種便於使用的Elasticsearch API和即時分析功能,還可以實現生產工作負載需要的可用性、可擴充性和安全性。您可以使用Amazon OpenSearch Service輕鬆部署、保護、操作和擴充Elasticsearch,以便進行日誌分析、全文檢索搜尋和應用程式監控等工作。
Elasticsearch服務: 提供基於開源Elasticsearch服務,致力於資料分析、資料搜尋等情境服務。在開源Elasticsearch基礎上提供企業級許可權管控、安全監控警示、自動報表產生等功能。
快照和恢複(Snapshot and Restore):您可以使用快照和恢複功能,在遠程存放庫(如共用檔案系統、S3或HDFS)中,建立各個索引或整個叢集的快照。建立後的快照可以被恢複到對應版本的Elasticsearch中。
在5.x中建立的索引快照可以恢複到6.x。
在2.x中建立的索引快照可以恢複到5.x。
在1.x中建立的索引快照可以恢複到2.x。
解決方案概述
您可以通過以下步驟來遷移索引資料:
建立基準索引。
建立一個快照存放庫,並將其與Amazon Simple Storage Service (Amazon S3)儲存空間相關聯。
為要遷移的索引建立第一個完整的快照。
該快照會自動儲存在步驟一中建立的Amazon S3儲存空間中。
在阿里雲側建立一個Object Storage Service服務OSS(Object Storage Service)儲存空間,並將其註冊到Elasticsearch執行個體的快照存放庫中。
使用OSS Import工具將Amazon S3儲存空間中的資料提取到阿里雲OSS儲存空間中。
將此完整快照恢複到Elasticsearch執行個體。
定期處理增量快照 。
重複以上步驟處理增量快照並進行恢複。
確定最終快照,進行服務切換。
停止可能會修改索引資料的服務。
建立Amazon OpenSearch Service執行個體的最終增量快照。
將最終增量快照遷移至OSS,然後恢複到Elasticsearch執行個體中。
進行服務切換,在Elasticsearch執行個體中,查看遷移成功的資料。
前提條件
您已完成以下操作:
建立Amazon OpenSearch Service(原Amazon Elasticsearch Service)域,版本號碼為Elasticsearch 5.5.2,地區為新加坡。
具體操作步驟請參見建立Amazon OpenSearch Service域。
建立Elasticsearch執行個體,版本號碼為5.5.3,地區為杭州。
具體操作步驟請參見建立Elasticsearch執行個體。
建立OSS Bucket。
本文建立的Bucket地區為華東1(杭州)、儲存類型為標準儲存、讀寫權限為私人,其他參數保持預設,具體操作步驟請參見控制台建立儲存空間。
準備待遷移的索引,樣本索引名稱為
movies
。
在AWS中建立手動快照的前提條件
Amazon OpenSearch Service每天會自動為一個域中的主要索引分區建立快照,並將這些快照儲存在預配置的Amazon S3儲存空間中。這些快照會保留14天,您無需額外付費。此外,您還可以使用這些快照來恢複域,但是這些自動快照不能被遷移到新域。如果要遷移,您必須使用儲存在自己的存放庫(S3儲存空間)中的手動快照。手動快照將收取標準S3費用。
您需要使用Amazon Identity and Access Management(IAM)和Amazon S3才能手動建立和恢複索引快照。建立快照之前,請確保已滿足以下條件。
前提條件 | 描述 |
建立Amazon S3儲存空間 | 儲存Amazon OpenSearch Service域的手動快照。 |
建立IAM角色 | 為Amazon OpenSearch Service授權。在給該角色添加信任關係時,必須在 |
建立IAM策略 | 指定IAM角色可以對S3儲存空間執行的操作。該策略必須添加給為Amazon OpenSearch Service授權的IAM角色。您需要在該策略的Resource語句中指定S3儲存空間。 |
建立S3儲存空間
建立一個Amazon S3儲存空間來儲存手動快照,並記錄其Amazon資源名稱(ARN)。該ARN在以下情境中會用到:
用於IAM角色添加IAM策略的Resource語句。
用於註冊快照存放庫的Python用戶端。
Amazon S3儲存空間的ARN樣本如下。
arn:aws:s3:::eric-es-index-backups
建立IAM角色
確保已經建立了一個IAM角色,且在其信任關係中的
Service
語句中指定該角色的服務類型為Amazon OpenSearch Service(es.amazonaws.com),如下所示。{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
您可以在IAM控制台查看信任關係的詳細資料。
說明在IAM控制台建立AWS服務角色時,Select role type下拉式清單中不包含Amazon OpenSearch Service。 但是,您可以先選擇Amazon EC2,按照提示完成角色建立,然後將
ec2.amazonaws.com
修改為es.amazonaws.com
。建立IAM策略
建立IAM策略,並將IAM策略添加給IAM角色。該策略指定儲存Amazon OpenSearch Service域的S3儲存空間。以下樣本指定了儲存空間
eric-es-index-backups
的ARN。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::eric-es-index-backups" ] }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::eric-es-index-backups/*" ] } ] }
將策略內容複寫到編輯策略地區。
檢查策略是否正確。
為IAM角色添加IAM策略。
步驟一:註冊手動快照存放庫
您必須通過Amazon OpenSearch Service註冊快照存放庫後,才能建立手動索引快照。建立手動索引快照前,需要先為IAM角色的信任關係中指定的使用者或角色簽發您的AWS請求,詳情請參見在AWS中建立手動快照的前提條件。
由於curl命令不支援AWS請求籤名,因此不能使用curl命令註冊快照存放庫。請使用樣本Python用戶端註冊您的快照存放庫。
下載樣本Python用戶端檔案。
修改樣本Python用戶端檔案。
修改檔案中標黃的值,填入實際匹配的值。修改完成後,複製樣本Python用戶端檔案中的內容至Python檔案中,並命名為snapshot.py。
樣本Python用戶端檔案中的參數說明如下。
變數名
描述
region
建立快照存放庫所在的AWS地區。
host
Amazon OpenSearch Service域的訪問地址。
aws_access_key_id
IAM憑證ID。
aws_secret_access_key
IAM憑證Key。
path
快照存放庫的路徑。
data
必須包含上文在AWS中建立手動快照的前提條件中,為IAM角色建立的S3儲存空間的名字和ARN。
重要如果要為快照存放庫啟用S3託管密鑰的伺服器端加密,請將
"server_side_encryption": true
添加到settings JSON中。如果S3儲存空間在ap-southeast-1地區,請使用
"endpoint": "s3.amazonaws.com"
替代"region": "ap-southeast-1"
。
安裝Amazon Web Services Library boto-2.48.0。
上文的樣本Python用戶端,需要您在註冊快照存放庫的電腦上安裝boto軟體包的2.x版本。
# wget https://pypi.python.org/packages/66/e7/fe1db6a5ed53831b53b8a6695a8f134a58833cadb5f2740802bc3730ac15/boto-2.48.0.tar.gz#md5=ce4589dd9c1d7f5d347363223ae1b970 # tar zxvf boto-2.48.0.tar.gz # cd boto-2.48.0 # sudo python setup.py install
執行Python用戶端,註冊快照存放庫。
# python snapshot.py
進入對應Amazon OpenSearch Service的Kibana控制台,在Dev Tools頁面的Console中,執行以下命令,查看請求結果。
GET _snapshot
步驟二:建立首次快照並恢複
在Amazon OpenSearch Service上手動建立快照。
說明以下命令可在Kibana控制台上執行,也可以在Linux或者Mac OSX命令列中使用curl命令來執行。
為在
eric-snapshot-repository
存放庫中的movies
索引,建立名稱為snapshot_movies_1
的快照。PUT _snapshot/eric-snapshot-repository/snapshot_movies_1 { "indices": "movies" }
查看快照狀態。
GET _snapshot/eric-snapshot-repository/snapshot_movies_1
在Amazon S3控制台中,查看快照檔案。
從Amazon S3提取快照資料至阿里雲OSS。
詳細操作方法請參見從Amazon S3上的應用無縫切換至OSS。
資料提取後,在OSS控制台中查看儲存的快照資料。
還原快照至Elasticsearch執行個體。
建立快照存放庫。
進入目標Elasticsearch執行個體的Kibana控制台(登入Kibana控制台),在Dev Tools頁面的Console中,執行如下命令建立一個同名的快照存放庫。
PUT _snapshot/eric-snapshot-repository { "type": "oss", "settings": { "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com", "access_key_id": "your AccessKeyID", "secret_access_key": "your AccessKeySecret ", "bucket": "eric-oss-aws-es-snapshot-s3", "compress": true } }
查看名稱為
snapshot_movies_1
的快照狀態。GET _snapshot/eric-snapshot-repository/snapshot_movies_1
說明請記錄此快照操作的起始時間和結束時間。當您使用阿里雲OssImport遷移工具遷移增量快照資料時,此記錄會被用到。例如:
“start_time_in_millis”: 1519786844591
“end_time_in_millis”: 1519786846236
恢複快照。
POST _snapshot/eric-snapshot-repository/snapshot_movies_1/_restore { "indices": "movies" }
執行以下命令,查看
movies
索引的可用性。GET movies/_recovery
執行成功後,可以看到
movies
索引中存在三組資料,且與Amazon OpenSearch Service域中的資料相同。
步驟三:建立末次快照並恢複
在Amazon OpenSearch Service的
movies
索引中插入資料。movies
索引中已存在三組資料,您還需插入另兩組資料。使用
GET movies/_count
命令,可查看索引資料量。手動建立另一個快照。
執行以下命令手動建立快照,詳情請參見上文的在Amazon OpenSearch Service上手動建立快照步驟。
PUT _snapshot/eric-snapshot-repository/snapshot_movies_2 { "indices": "movies" }
建立成功後,執行以下命令查看快照狀態。
GET _snapshot/eric-snapshot-repository/snapshot_movies_2
查看S3儲存空間中列出的檔案。
從Amazon S3提取增量快照資料至阿里雲OSS。
您可以使用OSSImport工具從Amazon S3遷移資料至阿里雲OSS。目前有兩個快照檔案儲存體在S3儲存空間裡,可以通過修改設定檔local_job.cfg中的
isSkipExistFile
變數來遷移新的檔案。isSkipExistFile
表示資料移轉期間是否跳過現有對象,為布爾類型,預設值為false。如果設定為true,則根據size
和LastModifiedTime
跳過對象;如果設定為false,則覆蓋現有對象。當jobType
設定為audit
時,此選項無效。遷移工作完成後,您可以看到新的檔案已被遷移至OSS中。
恢複增量快照。
恢複增量快照詳細步驟請參見上文的步驟二:建立首次快照並恢複章節中的恢複快照步驟。但是首先需要關閉
movies
索引,然後再恢複快照。快照恢複後可以再次開啟movies
索引。關閉
movies
索引POST /movies/_close
查看
movies
索引狀態GET movies/_stats
恢複增量快照
POST _snapshot/eric-snapshot-repository/snapshot_movies_2/_restore { "indices": "movies" }
開啟
movies
索引POST /movies/_open
恢複快照步驟完成後,可以看到
movies
索引中文檔數量為5
,與Amazon OpenSearch Service域中的文檔數量相同。
總結
您可以通過建立和恢複快照的方法,將Amazon OpenSearch Service中的Elasticsearch索引資料移轉至Elasticsearch索引中。此方案要求先關閉需要遷移的叢集索引,以防止遷移期間的寫入和請求。
相關文檔:
常見問題
Q:阿里雲ES從OSS上做快照恢複索引資料時報錯,為什嗎?
A:可能是因為OSS上快照的檔案名稱為符號,例如檔案名稱為正斜線(/)。
阿里雲ES從OSS上做快照恢複索引資料時,不支援OSS上快照的檔案名稱為符號。解決方案為通過用圖形化管理工具ossbrowser快速入門,將OSS的快照資料移到正常的檔案夾下。