通過(guò)CCR跨集群復(fù)制解決跨集群容災(zāi)場(chǎng)景
Elasticsearch(簡(jiǎn)稱ES)集群出現(xiàn)災(zāi)難性事件,例如,硬件故障、軟件錯(cuò)誤、數(shù)據(jù)中心故障、自然災(zāi)害或其他導(dǎo)致服務(wù)中斷的情況,可使用跨集群復(fù)制CCR(Cross Cluster Replication)實(shí)現(xiàn)跨地域或跨資源的容災(zāi)能力,本文分別介紹新老網(wǎng)絡(luò)架構(gòu)下ES實(shí)現(xiàn)CCR的過(guò)程。
背景信息
CCR是開(kāi)源ES在platinum版本中發(fā)布的一個(gè)商業(yè)特性。購(gòu)買(mǎi)阿里云ES實(shí)例后,您無(wú)需額外付費(fèi),只需要簡(jiǎn)單配置,即可使用CCR功能。
CCR用于容災(zāi)恢復(fù)場(chǎng)景,對(duì)于分布在同VPC下不同可用區(qū)的ES集群,可以通過(guò)CCR進(jìn)行數(shù)據(jù)備份。當(dāng)其中一個(gè)集群(如遠(yuǎn)程集群)發(fā)生故障時(shí),通過(guò)訪問(wèn)其他集群(本地集群)來(lái)獲取故障集群的數(shù)據(jù)進(jìn)行恢復(fù),保證數(shù)據(jù)不丟失。
使用CCR功能,需要準(zhǔn)備兩種類型的集群。一個(gè)是遠(yuǎn)程集群,即提供源數(shù)據(jù)(Leader index)的集群;一個(gè)是本地集群,即訂閱數(shù)據(jù)(Follower index)的集群。該功能為被動(dòng)復(fù)制,即所有復(fù)制任務(wù)都是由本地集群執(zhí)行。同時(shí)支持批量實(shí)時(shí)遷移數(shù)據(jù),更多詳情請(qǐng)參見(jiàn)Cross-cluster replication。
場(chǎng)景應(yīng)用
依據(jù)您的業(yè)務(wù)場(chǎng)景選擇解決方案:
實(shí)例環(huán)境 | 場(chǎng)景應(yīng)用 |
兩個(gè)阿里云ES集群均創(chuàng)建于新網(wǎng)絡(luò)架構(gòu)下。 說(shuō)明 僅支持7.7版本以上的阿里云ES實(shí)例。 | |
兩個(gè)阿里云ES集群均創(chuàng)建于舊網(wǎng)絡(luò)架構(gòu)下,且處于同一VPC。 說(shuō)明 僅支持6.7.0及以上版本的單可用區(qū)的阿里云ES實(shí)例。 |
CCR在不同實(shí)例網(wǎng)絡(luò)環(huán)境的使用方案也適用于CCS功能在類似場(chǎng)景下的應(yīng)用。更多信息,請(qǐng)參見(jiàn)modules-cross-cluster-search 。
阿里云ES實(shí)例不支持與自建ES實(shí)例進(jìn)行跨集群復(fù)制。
2020年10月之前創(chuàng)建的ES集群屬于舊網(wǎng)絡(luò)架構(gòu),2020年10月及之后創(chuàng)建的ES集群屬于新網(wǎng)絡(luò)架構(gòu)。
通過(guò)NLB和PrivateLink實(shí)現(xiàn)跨集群CCR
準(zhǔn)備工作
創(chuàng)建兩個(gè)7.7及以上版本的阿里云ES實(shí)例,且兩個(gè)ES實(shí)例在相同地域和可用區(qū)下。
說(shuō)明兩個(gè)ES實(shí)例分別作為:
遠(yuǎn)程集群Leader Cluster: 指原始數(shù)據(jù)所在的集群。
本地集群Follower Cluster: 從Leader cluster中的一個(gè)或多個(gè)索引復(fù)制數(shù)據(jù)。
實(shí)現(xiàn)兩個(gè)ES實(shí)例間私網(wǎng)互通。具體操作,請(qǐng)參見(jiàn)通過(guò)NLB和PrivateLink實(shí)現(xiàn)阿里云ES實(shí)例間私網(wǎng)互通。
說(shuō)明通過(guò)NLB掛載Leader集群的域名IP,將Follower通過(guò)私網(wǎng)連接到Leader集群。
在Leader集群中創(chuàng)建待遷移的索引。
登錄Leader集群的Kibana控制臺(tái)。具體操作,請(qǐng)參見(jiàn)登錄Kibana控制臺(tái)。
在頁(yè)面左上角單擊圖標(biāo),選擇Management > 開(kāi)發(fā)工具(Dev Tools)。
執(zhí)行以下命令,在Leader集群中創(chuàng)建待遷移的索引。
PUT /leader-new { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" } } } }
場(chǎng)景一:針對(duì)具體索引實(shí)現(xiàn)跨集群復(fù)制
步驟一:連接Leader集群
登錄Follower集群的Kibana控制臺(tái)。具體操作,請(qǐng)參見(jiàn)登錄Kibana控制臺(tái)。
在頁(yè)面左上角單擊圖標(biāo),選擇
。在管理(Management)頁(yè)面的左側(cè)導(dǎo)航欄,單擊遠(yuǎn)程集群(Remote Clusters)。
單擊添加遠(yuǎn)程集群(Add a remote cluster)。
在添加遠(yuǎn)程集群頁(yè)面中,輸入Leader集群信息。
名稱(Name):Leader集群的名稱,不可重復(fù)。
連接模式(Connection mode):打開(kāi)使用代理模式(Use proxy mode)開(kāi)關(guān)。
代理地址(Proxy address):代理服務(wù)器地址,格式為
終端節(jié)點(diǎn)域名:9300
,終端節(jié)點(diǎn)域名即PrivateLink終端節(jié)點(diǎn)服務(wù)下的終端節(jié)點(diǎn)ID的域名。說(shuō)明由于CCR功能是Kibana通過(guò)數(shù)據(jù)節(jié)點(diǎn)之間的TCP端口(9300)訪問(wèn)數(shù)據(jù)節(jié)點(diǎn)IP的形式來(lái)進(jìn)行網(wǎng)絡(luò)互通,因此不支持HTTP端口(9200)訪問(wèn)。
單擊保存。
保存后,系統(tǒng)會(huì)自動(dòng)連接Leader集群。連接成功后,連接狀態(tài)顯示連接(Connected)。
API示例
PUT /_cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"<remote_cluster>": {
"mode": "PROXY",
"proxy_address": "終端節(jié)點(diǎn)域名:9300"
}
}
}
}
}
參數(shù) | 說(shuō)明 |
persistent | 設(shè)置會(huì)持久保存,即使在集群重啟后也會(huì)保留。 |
<remote_cluster> | 替換為想要連接的遠(yuǎn)程集群的名稱。 |
mode | 僅支持proxy模式。本地集群通過(guò)配置的代理地址來(lái)訪問(wèn)遠(yuǎn)程集群。所有的遠(yuǎn)程請(qǐng)求都會(huì)發(fā)送到這個(gè)代理地址,并由代理服務(wù)器轉(zhuǎn)發(fā)到遠(yuǎn)程集群的合適節(jié)點(diǎn)。 |
proxy_address | 代理服務(wù)器地址,格式為 說(shuō)明 本文CCR/CCS使用的是Elasticsearch的傳輸層(Transport layer),需要使用9300端口進(jìn)行通訊。 |
步驟二:配置跨集群復(fù)制
在Follower集群Kibana控制臺(tái)的管理(Management)頁(yè)面,在左側(cè)導(dǎo)航欄單擊跨集群復(fù)制(Cross-Cluster Replication)。
單擊創(chuàng)建Follower索引(Create a follower index)。
配置跨集群復(fù)制。
參數(shù)
說(shuō)明
Remote cluster
選擇您已連接的遠(yuǎn)程集群。
Leader index
待遷移的索引。
Follower index
遷移數(shù)據(jù)生成的索引。索引名稱不可重復(fù)。
單擊創(chuàng)建(Create)。
創(chuàng)建成功后,索引狀態(tài)顯示為Active。
API示例:
創(chuàng)建Follower集群索引時(shí),必須引用Leader集群以及在Leader集群中創(chuàng)建的領(lǐng)導(dǎo)者索引。
PUT /leader-old-copy/_ccr/follow
{
"remote_cluster": "es-leader",
"leader_index": "leader-old"
}
參數(shù) | 說(shuō)明 |
remote_cluster | 連接的Follower集群的名稱,與步驟一的參數(shù)對(duì)應(yīng)。 |
leader_index | Leader集群索引名稱。 |
步驟三:驗(yàn)證數(shù)據(jù)備份結(jié)果
在Leader集群的Kibana控制臺(tái),執(zhí)行如下命令,在Leader集群的索引中插入數(shù)據(jù)。
POST leader-new/_doc/ { "name":"Jack", "age":40 }
在Follower集群的Kibana控制臺(tái),執(zhí)行如下命令,驗(yàn)證數(shù)據(jù)是否遷移成功。
GET leader-new-copy/_search
返回結(jié)果如下,Leader集群的Leader索引(leader-new)中的數(shù)據(jù),已通過(guò)CCR功能復(fù)制到了Follower集群的Follower索引(leader-new-copy)中。
在Leader集群中,重新插入一條數(shù)據(jù),驗(yàn)證增量數(shù)據(jù)是否實(shí)時(shí)同步。
POST leader-new/_doc/ { "name":"Pony", "age":50 }
數(shù)據(jù)插入后,在Follower集群中執(zhí)行如下命令。
GET leader-new-copy/_search
從查詢結(jié)果可以看到,通過(guò)CCR可以實(shí)現(xiàn)增量數(shù)據(jù)的實(shí)時(shí)同步。
場(chǎng)景二:指定索引模式實(shí)現(xiàn)批量跨集群復(fù)制
步驟一:連接Leader集群
登錄Follower集群的Kibana控制臺(tái)。具體操作,請(qǐng)參見(jiàn)登錄Kibana控制臺(tái)。
在頁(yè)面左上角單擊圖標(biāo),選擇
。在管理(Management)頁(yè)面的左側(cè)導(dǎo)航欄,單擊遠(yuǎn)程集群(Remote Clusters)。
單擊添加遠(yuǎn)程集群(Add a remote cluster)。
在添加遠(yuǎn)程集群頁(yè)面中,輸入Leader集群信息。
名稱(Name):Leader集群的名稱,不可重復(fù)。
連接模式(Connection mode):打開(kāi)使用代理模式(Use proxy mode)開(kāi)關(guān)。
代理地址(Proxy address):代理服務(wù)器地址,格式為
終端節(jié)點(diǎn)域名:9300
,終端節(jié)點(diǎn)域名即PrivateLink終端節(jié)點(diǎn)服務(wù)下的終端節(jié)點(diǎn)ID的域名。說(shuō)明由于CCR功能是Kibana通過(guò)數(shù)據(jù)節(jié)點(diǎn)之間的TCP端口(9300)訪問(wèn)數(shù)據(jù)節(jié)點(diǎn)IP的形式來(lái)進(jìn)行網(wǎng)絡(luò)互通,因此不支持HTTP端口(9200)訪問(wèn)。
單擊保存。
保存后,系統(tǒng)會(huì)自動(dòng)連接Leader集群。連接成功后,連接狀態(tài)顯示連接(Connected)。
API示例
PUT /_cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"<remote_cluster>": {
"mode": "PROXY",
"proxy_address": "終端節(jié)點(diǎn)域名:9300"
}
}
}
}
}
參數(shù) | 說(shuō)明 |
persistent | 設(shè)置會(huì)持久保存,即使在集群重啟后也會(huì)保留。 |
<remote_cluster> | 替換為想要連接的遠(yuǎn)程集群的名稱。 |
mode | 僅支持proxy模式。本地集群通過(guò)配置的代理地址來(lái)訪問(wèn)遠(yuǎn)程集群。所有的遠(yuǎn)程請(qǐng)求都會(huì)發(fā)送到這個(gè)代理地址,并由代理服務(wù)器轉(zhuǎn)發(fā)到遠(yuǎn)程集群的合適節(jié)點(diǎn)。 |
proxy_address | 代理服務(wù)器地址,格式為 說(shuō)明 本文CCR/CCS使用的是Elasticsearch的傳輸層(Transport layer),需要使用9300端口進(jìn)行通訊。 |
步驟二:配置跨集群復(fù)制
在Follower集群Kibana控制臺(tái)的管理(Management)頁(yè)面,在左側(cè)導(dǎo)航欄單擊跨集群復(fù)制(Cross-Cluster Replication)。
單擊自動(dòng)跟隨模式(Auto-follow patterns)頁(yè)簽。
單擊創(chuàng)建自動(dòng)跟隨模式(Create auto-follow pattern)。
配置跨集群復(fù)制。
參數(shù)
說(shuō)明
Remote cluster
選擇您已連接的遠(yuǎn)程集群。
Index patterns
遠(yuǎn)程集群中待遷移的索引模式。
API示例
PUT /_ccr/auto_follow/beats
{
"remote_cluster": "es-leader",
"leader_index_patterns":
[
"leader-*"
],
"follow_index_pattern": "{{leader_index}}-copy"
}
參數(shù) | 說(shuō)明 |
remote_cluster | 連接的遠(yuǎn)程集群的名稱,與步驟一參數(shù)對(duì)應(yīng)。 |
leader_index_patterns | 匹配遠(yuǎn)程集群中哪些索引需要被復(fù)制。 |
follow_index_pattern | 指定在Follower集群中創(chuàng)建的索引的名稱模式,CCR將依據(jù)之后按照索引模式創(chuàng)建的新索引進(jìn)行跨集群復(fù)制。 |
步驟三:驗(yàn)證數(shù)據(jù)備份結(jié)果
在Leader集群的Kibana控制臺(tái),執(zhí)行以下命令,在Leader集群中添加索引。
PUT /leader-new { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" } } } }
在Follower集群的Kibana控制臺(tái),執(zhí)行如下命令,驗(yàn)證新索引是否成功遷移到Follower集群中。
get _cat/indices?v
通過(guò)配置實(shí)例網(wǎng)絡(luò)互通實(shí)現(xiàn)跨集群CCR
準(zhǔn)備工作
準(zhǔn)備兩個(gè)相同版本(6.7及以上)的阿里云ES實(shí)例,且兩個(gè)ES實(shí)例在同一專有網(wǎng)絡(luò)和虛擬交換機(jī)下。
說(shuō)明兩個(gè)ES實(shí)例分別作為:
遠(yuǎn)程集群Leader Cluster:原始數(shù)據(jù)所在的集群。
本地集群Follower Cluster:從Leade集群中的一個(gè)或多個(gè)索引復(fù)制數(shù)據(jù)。
如果遠(yuǎn)程集群上已經(jīng)上傳了同義詞文件,本地集群中也需要上傳一致的同義詞文件。
在遠(yuǎn)程集群中添加需要進(jìn)行網(wǎng)絡(luò)互通的本地集群。具體操作,請(qǐng)參見(jiàn)通過(guò)配置實(shí)例網(wǎng)絡(luò)互通使用跨集群搜索功能。
在Leader集群中創(chuàng)建待遷移的索引。
登錄Leader集群的Kibana控制臺(tái)。具體操作,請(qǐng)參見(jiàn)登錄Kibana控制臺(tái)。
在頁(yè)面左上角單擊圖標(biāo),選擇Management > 開(kāi)發(fā)工具(Dev Tools)。
執(zhí)行以下命令,在Leader集群中創(chuàng)建待遷移的索引。
PUT myindex { "settings": { "index.soft_deletes.retention.operations": 1024, "index.soft_deletes.enabled": true } }
說(shuō)明對(duì)于7.0及以下版本的Elasticsearch實(shí)例,在創(chuàng)建索引時(shí),需要開(kāi)啟soft_deletes屬性,否則會(huì)報(bào)錯(cuò)。您可以通過(guò)
GET /<yourIndexName>/_settings?pretty
命令,查看是否開(kāi)啟了soft_deletes屬性。開(kāi)啟時(shí),您可以在返回結(jié)果中看到soft_deletes屬性的配置。如果您需要遷移已創(chuàng)建的索引,需要通過(guò)重建索引來(lái)開(kāi)啟soft_deletes屬性。
關(guān)閉待遷移的索引的物理復(fù)制功能。
說(shuō)明對(duì)于6.7.0版本的阿里云Elasticsearch實(shí)例,系統(tǒng)會(huì)默認(rèn)為新建索引開(kāi)啟物理復(fù)制功能。使用CCR功能時(shí),需要先關(guān)閉物理復(fù)制功能。
關(guān)閉索引。
POST myindex/_close
更新索引settings,關(guān)閉物理復(fù)制功能。
PUT myindex/_settings { "index.replication.type" : null }
打開(kāi)索引。
POST myindex/_open
步驟一:連接遠(yuǎn)程集群
登錄本地集群的Kibana控制臺(tái)。具體操作,請(qǐng)參見(jiàn)登錄Kibana控制臺(tái)。
在頁(yè)面左上角單擊圖標(biāo),選擇
。在管理(Management)頁(yè)面的左側(cè)導(dǎo)航欄,單擊遠(yuǎn)程集群(Remote Clusters)。
單擊添加遠(yuǎn)程集群(Add a remote cluster)。
在添加遠(yuǎn)程集群頁(yè)面中,輸入Leader集群信息。
名稱(Name):遠(yuǎn)程集群的名稱,不可重復(fù)。
代理地址(Proxy address):需要配置為
遠(yuǎn)程集群的節(jié)點(diǎn)的IP地址:9300
。遠(yuǎn)程集群的節(jié)點(diǎn)的IP地址,可在遠(yuǎn)程集群的Kibana控制臺(tái)中,使用GET /_cat/nodes?v
命令獲取。所配置的節(jié)點(diǎn)中必須包含主節(jié)點(diǎn),建議您配置多個(gè)子節(jié)點(diǎn),確保當(dāng)主節(jié)點(diǎn)不可用時(shí),可以繼續(xù)使用跨集群復(fù)制功能。說(shuō)明由于CCR功能是Kibana通過(guò)數(shù)據(jù)節(jié)點(diǎn)之間的TCP端口(9300)訪問(wèn)數(shù)據(jù)節(jié)點(diǎn)IP的形式來(lái)進(jìn)行網(wǎng)絡(luò)互通,因此不支持HTTP端口(9200)訪問(wèn)。
單擊保存。
保存后,系統(tǒng)會(huì)自動(dòng)連接遠(yuǎn)程集群。連接成功后,連接狀態(tài)顯示連接(Connected)。
步驟二:配置跨集群復(fù)制
在本地集群Kibana控制臺(tái)的Management頁(yè)面,在左側(cè)導(dǎo)航欄單擊跨集群復(fù)制(Cross-Cluster Replication)。
單擊創(chuàng)建Follower索引(Create a follower index)。
配置跨集群復(fù)制。
參數(shù)
說(shuō)明
Remote cluster
選擇您已連接的遠(yuǎn)程集群。
Leader index
待遷移的索引。本文使用準(zhǔn)備工作中創(chuàng)建的myindex索引。
Follower index
遷移數(shù)據(jù)生成的索引。索引名稱不可重復(fù)。
單擊創(chuàng)建(Create)。
創(chuàng)建成功后,索引狀態(tài)顯示為Active。
步驟三:驗(yàn)證數(shù)據(jù)備份結(jié)果
在遠(yuǎn)程集群的Kibana控制臺(tái),執(zhí)行如下命令,在遠(yuǎn)程集群中插入數(shù)據(jù)。
POST myindex/_doc/ { "name":"Jack", "age":40 }
在本地集群的Kibana控制臺(tái),執(zhí)行如下命令,驗(yàn)證數(shù)據(jù)是否遷移成功。
GET myindex_follow/_search
返回結(jié)果如下。遠(yuǎn)程集群的Leader索引(myindex)中的數(shù)據(jù),已通過(guò)CCR功能復(fù)制到了本地集群的Follower索引(myindex_follow)中。
說(shuō)明Follower索引為只讀狀態(tài),如果需要和普通索引一樣寫(xiě)入數(shù)據(jù),需要先轉(zhuǎn)換成普通索引。詳細(xì)信息,請(qǐng)參見(jiàn)使用Elasticsearch跨集群復(fù)制進(jìn)行跨數(shù)據(jù)中心復(fù)制。
在遠(yuǎn)程集群中,重新插入一條數(shù)據(jù),驗(yàn)證增量數(shù)據(jù)是否實(shí)時(shí)同步。
POST myindex/_doc/ { "name":"Pony", "age":50 }
數(shù)據(jù)插入后,在本地集群中進(jìn)行查看,結(jié)果如下。
從以上結(jié)果可以看到,通過(guò)CCR可以實(shí)現(xiàn)增量數(shù)據(jù)的實(shí)時(shí)同步。
說(shuō)明您也可以通過(guò)CCR功能的API,進(jìn)行跨集群復(fù)制相關(guān)操作。詳細(xì)信息,請(qǐng)參見(jiàn)Cross-cluster replication APIs。
常見(jiàn)問(wèn)題
Q:為什么在添加遠(yuǎn)程集群時(shí),可以使用9300端口。但是通過(guò)域名訪問(wèn)Elasticsearch集群時(shí),只能使用9200端口?
A:9300端口實(shí)際上是開(kāi)放的。因?yàn)樯婕暗疆a(chǎn)品的安全策略,在SLB端口校驗(yàn)過(guò)程中,外網(wǎng)訪問(wèn)Elasticsearch域名的時(shí)候,只開(kāi)放了9200端口。
Q:如何查看CCR同步狀態(tài)?
A:在Kibana中執(zhí)行命令
GET /_ccr/stats
,查看failed分片數(shù)量,即number_of_failed_follow_indices
的值。如果failed分片數(shù)量為0,則同步是正常的。
如果failed分片數(shù)量不是0,可在follow集群執(zhí)行以下命令恢復(fù)同步:
POST /<follower_index>/_ccr/pause_follow POST /<follower_index>/_ccr/resume_follow