Redis企業(yè)版實(shí)例間的雙向同步
本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。
數(shù)據(jù)傳輸服務(wù)DTS(Data Transmission Service)支持Redis企業(yè)版實(shí)例間的雙向同步,適用于異地多活、數(shù)據(jù)容災(zāi)等多種應(yīng)用場(chǎng)景,本文介紹數(shù)據(jù)同步作業(yè)的配置流程。
本文通過(guò)控制臺(tái)來(lái)完成配置,您也可以通過(guò)調(diào)用OpenAPI來(lái)完成配置,詳情請(qǐng)參見(jiàn)調(diào)用OpenAPI配置Redis企業(yè)版實(shí)例間單向或雙向數(shù)據(jù)同步。
前提條件
源和目標(biāo)實(shí)例為Tair(企業(yè)版)實(shí)例(5.0版本)。
云數(shù)據(jù)庫(kù)Tair(兼容Redis)企業(yè)版(容量存儲(chǔ)型)不支持作為源數(shù)據(jù)庫(kù),只能作為目標(biāo)數(shù)據(jù)庫(kù)。
云數(shù)據(jù)庫(kù)Tair(兼容Redis)為企業(yè)版(持久內(nèi)存型)為源數(shù)據(jù)庫(kù)時(shí),需要用戶開(kāi)啟appendonly參數(shù)。
架構(gòu)類型不限制,即支持集群版、標(biāo)準(zhǔn)版和讀寫(xiě)分離版。
注意事項(xiàng)
雙向數(shù)據(jù)同步時(shí),正向數(shù)據(jù)同步作業(yè)會(huì)執(zhí)行全量數(shù)據(jù)初始化和增量數(shù)據(jù)同步,反向數(shù)據(jù)同步作業(yè)僅執(zhí)行增量數(shù)據(jù)同步。
警告雙向數(shù)據(jù)同步作業(yè)運(yùn)行期間,請(qǐng)勿在兩端數(shù)據(jù)庫(kù)同時(shí)對(duì)同一個(gè)key執(zhí)行修改或?qū)懭氩僮鳎駝t可能會(huì)導(dǎo)致數(shù)據(jù)不一致。
DTS在執(zhí)行全量數(shù)據(jù)初始化時(shí)將占用源庫(kù)和目標(biāo)庫(kù)一定的資源,可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器負(fù)載上升。如果數(shù)據(jù)庫(kù)業(yè)務(wù)量較大或服務(wù)器規(guī)格較低,可能會(huì)加重?cái)?shù)據(jù)庫(kù)壓力,甚至導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)不可用。建議您在執(zhí)行數(shù)據(jù)遷移前謹(jǐn)慎評(píng)估,在業(yè)務(wù)低峰期執(zhí)行數(shù)據(jù)同步。
請(qǐng)勿在源實(shí)例中執(zhí)行
FLUSHDB
和FLUSHALL
命令,否則將導(dǎo)致源和目標(biāo)的數(shù)據(jù)不一致。若目標(biāo)數(shù)據(jù)庫(kù)內(nèi)存不足,觸發(fā)數(shù)據(jù)逐出時(shí),由于云數(shù)據(jù)庫(kù) Tair(兼容 Redis)的默認(rèn)數(shù)據(jù)逐出策略(maxmemory-policy)為volatile-lru,會(huì)導(dǎo)致目標(biāo)庫(kù)與源庫(kù)數(shù)據(jù)不一致的情況,但不會(huì)影響任務(wù)的正常運(yùn)行。
為避免該情況發(fā)生,建議將目標(biāo)庫(kù)的數(shù)據(jù)逐出策略設(shè)置為noeviction,當(dāng)目標(biāo)庫(kù)內(nèi)存不足時(shí),數(shù)據(jù)會(huì)寫(xiě)入失敗,同時(shí)任務(wù)也會(huì)失敗,但目標(biāo)庫(kù)不會(huì)因?yàn)閿?shù)據(jù)逐出而丟失數(shù)據(jù)。
說(shuō)明關(guān)于數(shù)據(jù)逐出策略詳情,請(qǐng)參見(jiàn)Redis數(shù)據(jù)逐出策略介紹。
如果源庫(kù)中的某些Key使用了過(guò)期(expire)策略,由于可能存在Key已過(guò)期但未被及時(shí)刪除的情況,所以在目標(biāo)庫(kù)中查看到的Key數(shù)量(例如通過(guò)info命令查看)會(huì)比源庫(kù)的Key數(shù)量少。
說(shuō)明源和目標(biāo)庫(kù)中,未設(shè)置過(guò)期策略或未過(guò)期的Key數(shù)量是一致的。
如果目標(biāo)Redis實(shí)例沒(méi)有開(kāi)通直連訪問(wèn),DTS將采用代理轉(zhuǎn)發(fā)模式將數(shù)據(jù)寫(xiě)入目標(biāo)實(shí)例。
說(shuō)明關(guān)于直連訪問(wèn)的開(kāi)通方法,請(qǐng)參見(jiàn)開(kāi)通直連訪問(wèn)。
同步期間,如源和目標(biāo)Redis實(shí)例發(fā)生擴(kuò)縮容(如增加或者減少分片)、規(guī)格變配(如擴(kuò)大內(nèi)存)、則您需重新配置任務(wù)。且為保障數(shù)據(jù)一致性,在重新配置任務(wù)前,建議先清空已同步至源和目標(biāo)Redis的數(shù)據(jù)。
同步期間,如源和目標(biāo)Redis實(shí)例的連接地址變化(如遷移可用區(qū)、經(jīng)典網(wǎng)絡(luò)切換專有網(wǎng)絡(luò)),則您需要重新配置任務(wù)。
源庫(kù)單機(jī)版Redis同步到目標(biāo)庫(kù)集群版Redis的操作限制:由于集群cluster只允許單個(gè)命令操作單個(gè)slot,若在源庫(kù)執(zhí)行多Key操作時(shí),Key不在同一個(gè)slot或涉及多個(gè)slot,則會(huì)出現(xiàn)以下報(bào)錯(cuò):
CROSSSLOT Keys in request don't hash to the same slot
建議在DTS同步過(guò)程中僅執(zhí)行單Key操作,以免導(dǎo)致鏈路中斷。
若目標(biāo)實(shí)例的架構(gòu)類型為集群版且某一個(gè)分片達(dá)到了內(nèi)存上限,或目標(biāo)實(shí)例的存儲(chǔ)空間不足時(shí),DTS任務(wù)會(huì)因內(nèi)存溢出(Out of Memory)而失敗。
若源或目標(biāo)實(shí)例已開(kāi)啟透明數(shù)據(jù)加密TDE功能,則暫不支持通過(guò)DTS同步數(shù)據(jù)。
雙向同步實(shí)例包含正向和反向同步任務(wù),在配置或重置雙向同步實(shí)例時(shí),若其中一個(gè)任務(wù)的目標(biāo)對(duì)象是另一個(gè)任務(wù)待同步的對(duì)象:
僅允許其中一個(gè)任務(wù)同步全量和增量數(shù)據(jù),另一個(gè)任務(wù)僅支持同步增量數(shù)據(jù)。
當(dāng)前任務(wù)的源數(shù)據(jù)僅支持同步到當(dāng)前任務(wù)的目標(biāo)端,同步過(guò)來(lái)的數(shù)據(jù)不會(huì)作為另一個(gè)任務(wù)的源數(shù)據(jù)繼續(xù)同步。
費(fèi)用說(shuō)明
同步類型 | 鏈路配置費(fèi)用 |
庫(kù)表結(jié)構(gòu)同步和全量數(shù)據(jù)同步 | 不收費(fèi)。 |
增量數(shù)據(jù)同步 | 收費(fèi),詳情請(qǐng)參見(jiàn)計(jì)費(fèi)概述。 |
支持的同步命令
APPEND
BITOP、BLPOP、BRPOP、BRPOPLPUSH
DECR、DECRBY、DEL
EVAL、EVALSHA、EXEC、EXPIRE、EXPIREAT
GEOADD、GETSET
HDEL、HINCRBY、HINCRBYFLOAT、HMSET、HSET、HSETNX
INCR、INCRBY、INCRBYFLOAT
LINSERT、LPOP、LPUSH、LPUSHX、LREM、LSET、LTRIM
MOVE、MSET、MSETNX、MULTI
PERSIST、PEXPIRE、PEXPIREAT、PFADD、PFMERGE、PSETEX
RENAME、RENAMENX、RPOP、RPOPLPUSH、RPUSH、RPUSHX
SADD、SDIFFSTORE、SELECT、SET、SETBIT、SETEX、SETNX、SETRANGE、SINTERSTORE、SMOVE、SPOP、SREM、SUNIONSTORE
UNLINK、ZADD、ZINCRBY、ZINTERSTORE、ZREM、ZREMRANGEBYLEX、ZUNIONSTORE、ZREMRANGEBYRANK、ZREMRANGEBYSCORE
SWAPDB(當(dāng)源或目標(biāo)實(shí)例的架構(gòu)為集群版時(shí)不支持)
不支持同步PUBLISH命令。
對(duì)于通過(guò)EVAL或者EVALSHA調(diào)用Lua腳本,在增量數(shù)據(jù)同步時(shí),由于目標(biāo)端在執(zhí)行腳本時(shí)不會(huì)明確返回執(zhí)行結(jié)果,DTS無(wú)法確保該類型腳本能夠執(zhí)行成功。
對(duì)于List,由于DTS在調(diào)用sync或psync進(jìn)行重傳時(shí),不會(huì)對(duì)目標(biāo)端已有的數(shù)據(jù)進(jìn)行清空,可能導(dǎo)致出現(xiàn)重復(fù)數(shù)據(jù)。
數(shù)據(jù)庫(kù)賬號(hào)的權(quán)限要求
數(shù)據(jù)庫(kù) | 權(quán)限及授權(quán)方式 |
源Redis實(shí)例 | 讀寫(xiě)權(quán)限,關(guān)于授權(quán)方式,請(qǐng)參見(jiàn)創(chuàng)建與管理賬號(hào)。 |
目標(biāo)Redis實(shí)例 |
操作步驟
購(gòu)買(mǎi)數(shù)據(jù)同步作業(yè),詳情請(qǐng)參見(jiàn)購(gòu)買(mǎi)流程。
重要購(gòu)買(mǎi)時(shí)選擇源實(shí)例為Redis、目標(biāo)實(shí)例為Redis,并選擇同步拓?fù)錇?b data-tag="uicontrol" id="uicontrol-2w7-icd-1y2" class="uicontrol">雙向同步。
- 說(shuō)明
若數(shù)據(jù)傳輸控制臺(tái)自動(dòng)跳轉(zhuǎn)至數(shù)據(jù)管理DMS控制臺(tái),您可以在右下角的中單擊,返回至舊版數(shù)據(jù)傳輸控制臺(tái)。
在左側(cè)導(dǎo)航欄,單擊數(shù)據(jù)同步。
在同步作業(yè)列表頁(yè)面頂部,選擇同步的目標(biāo)實(shí)例所屬地域。
配置正向同步作業(yè)。
定位至已購(gòu)買(mǎi)的數(shù)據(jù)同步實(shí)例,單擊該實(shí)例下第一個(gè)同步作業(yè)操作列的配置同步鏈路。
重要一個(gè)雙向數(shù)據(jù)同步實(shí)例會(huì)包含兩個(gè)同步作業(yè),需要分別進(jìn)行配置。在配置反向同步作業(yè)時(shí),定位至第二個(gè)同步作業(yè),單擊操作列的配置同步鏈路。
配置同步作業(yè)的源實(shí)例及目標(biāo)實(shí)例信息。
類別
配置
說(shuō)明
無(wú)
同步作業(yè)名稱
DTS會(huì)自動(dòng)生成一個(gè)同步作業(yè)名稱,建議配置具有業(yè)務(wù)意義的名稱(無(wú)唯一性要求),便于后續(xù)識(shí)別。
源實(shí)例信息
實(shí)例類型
選擇Redis實(shí)例。
實(shí)例地區(qū)
購(gòu)買(mǎi)數(shù)據(jù)同步實(shí)例時(shí)選擇的源實(shí)例地域,不可變更。
實(shí)例ID
選擇源Redis實(shí)例ID。
重要稍后配置反向同步作業(yè)時(shí),此處需選擇為正向同步作業(yè)里的目標(biāo)Redis實(shí)例ID。
數(shù)據(jù)庫(kù)密碼
填入Redis實(shí)例的數(shù)據(jù)庫(kù)賬號(hào)密碼。賬號(hào)權(quán)限,請(qǐng)參見(jiàn)數(shù)據(jù)庫(kù)賬號(hào)的權(quán)限要求 。
重要數(shù)據(jù)庫(kù)密碼格式為<user>:<password>。例如,Redis實(shí)例自定義的用戶名為admin,密碼為Rp829dlwa,則此處填入的數(shù)據(jù)庫(kù)密碼為admin:Rp829dlwa。
目標(biāo)實(shí)例信息
實(shí)例類型
選擇Redis實(shí)例。
實(shí)例地區(qū)
購(gòu)買(mǎi)數(shù)據(jù)同步實(shí)例時(shí)選擇的目標(biāo)實(shí)例地域,不可變更。
實(shí)例ID
選擇目標(biāo)Redis實(shí)例ID。
重要稍后配置反向同步作業(yè)時(shí),此處需選擇為正向同步作業(yè)里的源Redis實(shí)例ID。
數(shù)據(jù)庫(kù)密碼
填入Redis實(shí)例的數(shù)據(jù)庫(kù)賬號(hào)密碼。 賬號(hào)權(quán)限,請(qǐng)參見(jiàn)數(shù)據(jù)庫(kù)賬號(hào)的權(quán)限要求 。
重要數(shù)據(jù)庫(kù)密碼格式為<user>:<password>。例如,Redis實(shí)例自定義的用戶名為admin,密碼為Rp829dlwa,則此處填入的數(shù)據(jù)庫(kù)密碼為admin:Rp829dlwa。
單擊頁(yè)面右下角的授權(quán)白名單并進(jìn)入下一步。
說(shuō)明如果源或目標(biāo)數(shù)據(jù)庫(kù)是阿里云數(shù)據(jù)庫(kù)實(shí)例(例如RDS MySQL、云數(shù)據(jù)庫(kù)MongoDB版等)或ECS上的自建數(shù)據(jù)庫(kù),DTS會(huì)自動(dòng)將對(duì)應(yīng)地區(qū)DTS服務(wù)的IP地址添加到阿里云數(shù)據(jù)庫(kù)實(shí)例的白名單或ECS的安全規(guī)則中,您無(wú)需手動(dòng)添加,請(qǐng)參見(jiàn)DTS服務(wù)器的IP地址段。
DTS任務(wù)完成或釋放后,建議您手動(dòng)刪除添加的DTS服務(wù)器IP地址段。
配置同步策略和同步對(duì)象。
類別
配置
說(shuō)明
同步策略
沖突修復(fù)策略
Overwrite(遇到?jīng)_突,直接覆蓋目標(biāo)實(shí)例中的沖突記錄)
當(dāng)數(shù)據(jù)同步期間遇到Key相同但值不同時(shí),Key的值更新時(shí)間晚的數(shù)據(jù)會(huì)覆蓋沖突的記錄。
目標(biāo)已存在表的處理模式
預(yù)檢查并報(bào)錯(cuò)攔截:檢查目標(biāo)庫(kù)是否為空。如果待同步的目標(biāo)庫(kù)為空,則通過(guò)該檢查項(xiàng)目;如果不為空,則在預(yù)檢查階段提示錯(cuò)誤,數(shù)據(jù)同步作業(yè)不會(huì)被啟動(dòng)。
忽略報(bào)錯(cuò)并繼續(xù)執(zhí)行:跳過(guò)目標(biāo)庫(kù)是否為空的檢查項(xiàng)。
警告選擇為忽略報(bào)錯(cuò)并繼續(xù)執(zhí)行后,如果在同步初始化期間遇到目標(biāo)庫(kù)中的Key與源庫(kù)中的Key相同,會(huì)將源庫(kù)的數(shù)據(jù)覆蓋寫(xiě)入目標(biāo)庫(kù)中,請(qǐng)謹(jǐn)慎選擇。
選擇同步對(duì)象
無(wú)
在源庫(kù)對(duì)象框中單擊待同步的數(shù)據(jù)庫(kù),然后單擊將其移動(dòng)到已選擇對(duì)象框。
同步對(duì)象的選擇粒度為庫(kù),暫不支持Key粒度的選擇。
映射名稱更改
無(wú)
不支持更改映射名稱。
源表DMS_ONLINE_DDL過(guò)程中是否復(fù)制臨時(shí)表到目標(biāo)庫(kù)
無(wú)
如源庫(kù)使用數(shù)據(jù)管理DMS(Data Management)執(zhí)行Online DDL變更,您可以選擇是否同步Online DDL變更產(chǎn)生的臨時(shí)表數(shù)據(jù)。
是:同步Online DDL變更產(chǎn)生的臨時(shí)表數(shù)據(jù)。
說(shuō)明Online DDL變更產(chǎn)生的臨時(shí)表數(shù)據(jù)過(guò)大,可能會(huì)導(dǎo)致同步任務(wù)延遲。
否:不同步Online DDL變更產(chǎn)生的臨時(shí)表數(shù)據(jù),只同步源庫(kù)的原始DDL數(shù)據(jù)。
說(shuō)明該方案會(huì)導(dǎo)致目標(biāo)庫(kù)鎖表。
源、目標(biāo)庫(kù)無(wú)法連接重試時(shí)間
無(wú)
當(dāng)源、目標(biāo)庫(kù)無(wú)法連接時(shí),DTS默認(rèn)重試720分鐘(即12小時(shí)),您也可以自定義重試時(shí)間。如果DTS在設(shè)置的時(shí)間內(nèi)重新連接上源、目標(biāo)庫(kù),同步任務(wù)將自動(dòng)恢復(fù)。否則,同步任務(wù)將失敗。
說(shuō)明由于連接重試期間,DTS將收取任務(wù)運(yùn)行費(fèi)用,建議您根據(jù)業(yè)務(wù)需要自定義重試時(shí)間,或者在源和目標(biāo)庫(kù)實(shí)例釋放后盡快釋放DTS實(shí)例。
上述配置完成后,單擊頁(yè)面右下角的下一步。
配置同步初始化的選項(xiàng)。
當(dāng)前固定為包含全量數(shù)據(jù)+增量數(shù)據(jù),DTS會(huì)將源Redis實(shí)例中同步對(duì)象的存量數(shù)據(jù)初始化至目標(biāo)Redis實(shí)例,并同步增量數(shù)據(jù)。
重要在配置反向同步作業(yè)時(shí),如果同步對(duì)象已經(jīng)初始化至目標(biāo)實(shí)例,則直接同步增量數(shù)據(jù)。
如果跳出版本相關(guān)的報(bào)錯(cuò)提示,請(qǐng)您按照提示將源Redis實(shí)例升級(jí)至指定版本。關(guān)于升級(jí)版本方式,請(qǐng)參見(jiàn)升級(jí)大版本和升級(jí)小版本與代理版本。
上述配置完成后,單擊頁(yè)面右下角的預(yù)檢查并啟動(dòng)。
說(shuō)明在同步作業(yè)正式啟動(dòng)之前,會(huì)先進(jìn)行預(yù)檢查。只有預(yù)檢查通過(guò)后,才能成功啟動(dòng)同步作業(yè)。
如果預(yù)檢查失敗,單擊具體檢查項(xiàng)后的,查看失敗詳情。
您可以根據(jù)提示修復(fù)后重新進(jìn)行預(yù)檢查。
如無(wú)需修復(fù)告警檢測(cè)項(xiàng),您也可以選擇確認(rèn)屏蔽、忽略告警項(xiàng)并重新進(jìn)行預(yù)檢查,跳過(guò)告警檢測(cè)項(xiàng)重新進(jìn)行預(yù)檢查。
在預(yù)檢查對(duì)話框中顯示預(yù)檢查通過(guò)后,關(guān)閉預(yù)檢查對(duì)話框,正向同步作業(yè)將正式開(kāi)始。
等待正向同步作業(yè)完成初始化,直至處于同步中狀態(tài)。
您可以在數(shù)據(jù)同步頁(yè)面,查看數(shù)據(jù)同步作業(yè)的狀態(tài)。
配置反向同步作業(yè)。
定位至第二個(gè)同步作業(yè),單擊配置同步鏈路。
重復(fù)步驟5中的配置步驟,完成反向同步作業(yè)的配置。
執(zhí)行結(jié)果
等待一段時(shí)間后,兩個(gè)同步作業(yè)的鏈路狀態(tài)均會(huì)處于同步中。