前言
適用版本:【8.2.1.210及以上】
當(dāng)前數(shù)倉(cāng)承載的客戶業(yè)務(wù)越來(lái)越多,從而導(dǎo)致客戶對(duì)于數(shù)倉(cāng)的可靠性要求不斷增加。尤其在金融領(lǐng)域,容災(zāi)備份機(jī)制是信息系統(tǒng)必須提供的能力之一。本文介紹了在云上環(huán)境的雙集群(不跨Region不跨VPC)后臺(tái)手動(dòng)部署并使用細(xì)粒度容災(zāi)的主要步驟,使得用戶能快速方便得搭建起細(xì)粒度容災(zāi)。
2. 細(xì)粒度容災(zāi)簡(jiǎn)介
對(duì)于MPPDB集群的容災(zāi)而言,目前業(yè)界的常見(jiàn)方案要么是部署兩套規(guī)格配置同等的集群,要么通過(guò)邏輯雙加載方式去實(shí)現(xiàn),這兩個(gè)方案缺點(diǎn)比較明顯,存在架構(gòu)復(fù)雜、建設(shè)成本高等問(wèn)題,不僅使得災(zāi)備部署難度增大,還導(dǎo)致資源浪費(fèi)。在此背景下,GaussDB(DWS)基于列存表實(shí)現(xiàn)細(xì)粒度容災(zāi)能力,既滿足核心分析型業(yè)務(wù)在極端場(chǎng)景的業(yè)務(wù)連續(xù)性要求,同時(shí)也能大幅降低容災(zāi)方案的建設(shè)成本,而且容災(zāi)架構(gòu)輕量化,容災(zāi)系統(tǒng)易運(yùn)維、易操作、易演練,從而幫助用戶迅捷、經(jīng)濟(jì)、按需構(gòu)建核心業(yè)務(wù)的容災(zāi)系統(tǒng)。
相比于傳統(tǒng)的容災(zāi)方案,細(xì)粒度容災(zāi)有以下優(yōu)勢(shì):
主集群和備集群雙活(Active-Active)(備集群除災(zāi)備表只讀外,其余表可讀寫(xiě))
主備集群只需滿足DN整數(shù)倍關(guān)系,降低備集群建設(shè)資源,方便靈活部署
利用列存表的數(shù)據(jù)和元數(shù)據(jù)分離的特點(diǎn),通過(guò)元數(shù)據(jù)邏輯同步 + 數(shù)據(jù)物理同步的方式,同步增量,結(jié)合UDF的增量抽取/回放接口,保障表級(jí)數(shù)據(jù)一致性
粒度可控,支持表級(jí)、schema級(jí)、庫(kù)級(jí)容災(zāi)
支持表DDL,部分DCL元數(shù)據(jù)同步,達(dá)到切換可用
細(xì)粒度容災(zāi)示意圖
3. 容災(zāi)前準(zhǔn)備
3.1 配置互信
前提條件
確保ssh服務(wù)打開(kāi)。
確保ssh端口不會(huì)被防火墻關(guān)閉。
確保所有機(jī)器節(jié)點(diǎn)間網(wǎng)絡(luò)暢通。
配置互信
依次登錄主備集群各節(jié)點(diǎn)沙箱外,執(zhí)行步驟2-4。
將主集群和備集群所有節(jié)點(diǎn)ip和hostname添加到/home/Ruby/.ssh/authorized_keys和/var/chroot/home/Ruby/.ssh/authorized_keys的from列表中。
將主集群和備集群所有節(jié)點(diǎn)ip和hostname的映射添加到/etc/hosts和/var/chroot/etc/hosts文件中。
遍歷主集群和備集群所有節(jié)點(diǎn)ip和hostname,執(zhí)行以下命令。
ssh-keyscan -t rsa -T 120 ${ip/hostname} >> /home/Ruby/.ssh/known_hosts ssh-keyscan -t rsa -T 120 ${ip/hostname} >> /var/chroot/home/Ruby/.ssh/known_hosts
校驗(yàn)互信
從主集群任一節(jié)點(diǎn)能免密ssh到備集群任一節(jié)點(diǎn)且從備集群任一節(jié)點(diǎn)能免密ssh到主集群任一節(jié)點(diǎn),即代表互信已配置成功。
3.2 配置容災(zāi)配置文件
Ruby用戶分別登錄主備集群主節(jié)點(diǎn)沙箱內(nèi)。
創(chuàng)建容災(zāi)目錄,假設(shè)目錄為/DWS/data2/finedisaster。mkdir -p /DWS/data2/finedisaster
在/DWS/data2/finedisaster目錄下,創(chuàng)建容災(zāi)配置文件backupRestore.ini和主備集群倒換配置文件sw_backupRestore.ini。
注意:
細(xì)粒度容災(zāi)的容災(zāi)備份過(guò)程支持與物理細(xì)粒度備份業(yè)務(wù)并行執(zhí)行。可通過(guò)以下措施隔離:
兩個(gè)備份任務(wù)指定不同的metadata目錄和media目錄,實(shí)現(xiàn)備份數(shù)據(jù)隔離。容災(zāi)備份目錄通過(guò)容災(zāi)配置文件(backupRestore.ini和sw_backupRestore.ini)中的參數(shù)primary-media-destination和primary-metadata-destination指定。
細(xì)粒度容災(zāi)的容災(zāi)備份端口與物理細(xì)粒度備份的master-port指定為不同的值,實(shí)現(xiàn)備份進(jìn)程端口的隔離。容災(zāi)的備份端口通過(guò)容災(zāi)配置文件(backupRestore.ini和sw_backupRestore.ini)中的參數(shù)backup-port指定。
容災(zāi)配置文件backupRestore.ini
以下是backupRestore.ini文件示例,可根據(jù)具體業(yè)務(wù)場(chǎng)景修改配置參數(shù)值。
# Configuration file for SyncDataToStby tool # The backup life cycle life-cycle=10m # The table that records backups info backuprestoreinfo-file=backuprestoreinfo.csv # The cluster user name for cluster username=Ruby # The primary cluster env set primary-env= # The standby cluster env set standby-env= # Time interval between each full backup, uint: min full-backup-exec-time-interval=N/A # Time interval between each backup backup-exec-time-interval=2 # One of the backup hosts primary-host-ip=XXX.XXX.XXX.XX # The media type that restore backup files, DISK media-type=disk # The number of process that should be used. Range is (1~32) parrallel-process=4 # The compression level that should be used for backup. Range(0~9) compression-level=1 compression-type=2 # Media destination where the backup must be stored primary-media-destination=/DWS/data2/finedisaster/mediadata # Metadata destination where the metadata must be stored primary-metadata-destination=/DWS/data2/finedisaster/metadata # The master-port in which the backup must be executed backup-port=XXXX # Logging level for the log contents of backup:FATAL,ERROR,INFO,DEBUG primary-cluster-logging-level=INFO # Time interval between each restore, uint: min restore-interval=2 # One of the restore hosts restore-host-ip=XXX.XXX.XXX.XX # Media destination where the backup contents must be stored in the standby cluster restore-media-destination=/DWS/data2/finedisaster/mediadata # Metadata destination where the backup contents must be stored in the standby cluster restore-metadata-destination=/DWS/data2/finedisaster/metadata # The master-port in which the restore must be executed restore-port=XXXX # Logging level for the log contents of restore standby-cluster-logging-level=INFO # The maximum number of log files that should be created. Range is (5~1024). log-file-count=50 # The retry times of checking cluster balance for resuem backup or double clusters check-balance-retry-times=0 # cluster id primary-cluster-id=11111111-1111-1111-1111-111111111111 standby-cluster-id=22222222-2222-2222-2222-222222222222 # Processes tables for which fine-grained disaster recovery is no longer performed # Value should be 'none', 'log-desync-table', 'drop-desync-table' desync-table-operation=drop-desync-table # Number of CPU cores that can be used by each DR process. Range is (1~1024). cpu-cores=8 # The max number of rch files that can be reserved on master cluster before sent to standby cluster. 0 means no limit. local-reserve-file-count=160
主備集群倒換配置文件sw_backupRestore.ini相比于backupRestore.ini只需顛倒下列參數(shù)
primary-host-ip / restore-host-ip
backup-port / restore-port
primary-media-destination / restore-media-destination
primary-metadata-destination / restore-metadata-destination
primary-cluster-id / standby-cluster-id
配置文件主要參數(shù)說(shuō)明
參數(shù)名 | 參數(shù)含義 |
---|---|
username | 執(zhí)行雙集群腳本的OS用戶,設(shè)置成GaussDB(DWS)集群相同的OS用戶 |
primary-env | 主集群的環(huán)境變量存儲(chǔ)文件的絕對(duì)路徑 |
standby-env | 備集群的環(huán)境變量存儲(chǔ)文件的絕對(duì)路徑 |
backup-exec-time-interval | 增量備份周期 |
primary-host-ip | 主集群執(zhí)行備份的節(jié)點(diǎn)ip |
compression-type | 備份文件的壓縮算法類(lèi)型 |
compression-level | 備份文件的壓縮級(jí)別 |
primary-media-destination | 主集群上存放備份文件的絕對(duì)路徑 |
primary-metadata-destination | 主集群上備份元數(shù)據(jù)的絕對(duì)路徑 |
backup-port | Roach主代理備份進(jìn)程的執(zhí)行端口 |
restore-interval | 恢復(fù)周期 |
restore-host-ip | 備集群執(zhí)行恢復(fù)的節(jié)點(diǎn)ip |
restore-media-destination | 備集群存放主集群同步的備份文件的路徑 |
restore-metadata-destination | 備集群存放主集群同步的元數(shù)據(jù)信息的路徑 |
restore-port | 恢復(fù)進(jìn)程執(zhí)行端口 |
primary-cluster-id | 指定主集群的UUID |
standby-cluster-id | 指定備集群的UUID |
new-disaster-recovery-suppressed-time-windows | 指定主集群不發(fā)起新一輪備份的時(shí)間窗口 |
desync-table-operation | 指定不再進(jìn)行細(xì)粒度容災(zāi)的表,在備集群上的處理方式 |
cpu-cores | 指定容災(zāi)每個(gè)進(jìn)程能使用的cpu核數(shù) |
local-reserve-file-count | 在發(fā)送到備用群集之前,可以在主群集上保留的最大rch文件數(shù)。0表示無(wú)限制。 |
3.3 主備集群準(zhǔn)備
Ruby用戶登錄主集群主節(jié)點(diǎn)沙箱內(nèi)。
設(shè)置集群GUC參數(shù)。
local-dn-num為本集群DN數(shù),remote-dn-num為對(duì)方集群DN數(shù),可替換為實(shí)際值。
python3 $GPHOME/script/DisasterFineGrained.py -t prepare --local-dn-num 6 --remote-dn-num 3 --config-file /DWS/data2/finedisaster/backupRestore.ini
3.4 容災(zāi)表數(shù)據(jù)準(zhǔn)備
主集群連接數(shù)據(jù)庫(kù),準(zhǔn)備容災(zāi)表數(shù)據(jù)。
新建容災(zāi)表
create table schema1.table_1(id int, name text) with (orientation = column, colversion="2.0", enable_disaster_cstore="on", enable_delta=false) DISTRIBUTE BY hash(id);
存量表(非容災(zāi)表)轉(zhuǎn)為容災(zāi)表
alter table schema1.table_1 set (enable_disaster_cstore='on'); --查詢(xún)表的分布方式 select pclocatortype from pg_catalog.pgxc_class where pcrelid = 'schema1.table_1'::oid limit 1; --若表的分布方式為H(HASH分布),獲取一個(gè)hash表的分布列,后續(xù)以'id'列分布為例 select pg_catalog.getdistributekey('schema1.table_1'); --對(duì)表做重分布 alter table schema1.table_1 DISTRIBUTE BY HASH(id); --若表的分布方式為N(ROUNDROBIN分布),對(duì)表做重分布 alter table schema1.table_1 DISTRIBUTE BY ROUNDROBIN; --若表的分布方式為R(REPLICATION分布),對(duì)表做重分布 alter table schema1.table_1 DISTRIBUTE BY REPLICATION;
4. 細(xì)粒度容災(zāi)操作
4.1 定義發(fā)布
Ruby用戶登錄主集群主節(jié)點(diǎn)沙箱,以下操作均在沙箱內(nèi)進(jìn)行。
連接數(shù)據(jù)庫(kù),通過(guò)發(fā)布語(yǔ)法指定需要容災(zāi)的主表,語(yǔ)法如下:
--發(fā)布所有表 CREATE PUBLICATION _pub_for_fine_dr FOR ALL TABLES; --發(fā)布schema CREATE PUBLICATION _pub_for_fine_dr FOR ALL TABLES IN SCHEMA schema1, schema2; --發(fā)布表和schema CREATE PUBLICATION _pub_for_fine_dr FOR ALL TABLES IN SCHEMA schema1, TABLE schema2.table_1; --增加一個(gè)發(fā)布表 ALTER PUBLICATION _pub_for_fine_dr ADD TABLE schema1.table_1; --增加發(fā)布SCHEMA ALTER PUBLICATION _pub_for_fine_dr ADD ALL TABLES IN SCHEMA schema2;
定義發(fā)布后,將容災(zāi)publication放到參數(shù)文件中,以dbname.pubname形式,例如:
echo 'dbname._pub_for_fine_dr' > /DWS/data2/finedisaster/pub.list
若需要解除發(fā)布,通過(guò)DisasterFineGrained.py腳本下發(fā)cancel-publication命令
# 1、創(chuàng)建需要取消的容災(zāi)對(duì)象列表文件 # 解除發(fā)布表 echo 'db_name.schema_name.table_name' > /DWS/data2/finedisaster/config/disaster_object_list.txt # 解除發(fā)布SCHEMA echo 'db_name.schema_name' > /DWS/data2/finedisaster/config/disaster_object_list.txt # 2、下發(fā)cancel-publication命令 python3 $GPHOME/script/DisasterFineGrained.py -t cancel-publication --disaster-object-list-file /DWS/data2/finedisaster/config/disaster_object_list.txt --config-file /DWS/data2/finedisaster/backupRestore.ini # 3、取消全部發(fā)布 python3 $GPHOME/script/DisasterFineGrained.py -t cancel-publication --config-file /DWS/data2/finedisaster/backupRestore.ini --all-cancel
4.2 啟動(dòng)容災(zāi)
注意:
云上集群沙箱內(nèi)無(wú)法啟動(dòng)crontab任務(wù),需要在主備集群沙箱外手動(dòng)添加定時(shí)備份恢復(fù)任務(wù)
HCS 8.3.0及以上環(huán)境,沙箱外crontab設(shè)置ssh到沙箱內(nèi)的定時(shí)任務(wù),為了防止沙箱逃逸,ssh前需要加上"sudo python3 /rds/datastore/dws/XXXXXX/sudo_lib/checkBashrcFile.py && source /etc/profile && source ~/.bashrc && ",否則定時(shí)任務(wù)不生效。checkBashrcFile.py文件路徑與版本號(hào)有關(guān)。
主集群主節(jié)點(diǎn)沙箱外設(shè)置定時(shí)任務(wù),crontab -e。注意替換主節(jié)點(diǎn)IP。
*/1 * * * * nohup ssh XXX.XXX.XXX.XXX "source /etc/profile;if [ -f ~/.profile ];then source ~/.profile;fi;source ~/.bashrc;nohup python3 /opt/dws/tools/script/SyncDataToStby.py -t backup --config-file /DWS/data2/finedisaster/backupRestore.ini --disaster-fine-grained --publication-list /DWS/data2/finedisaster/pub.list >>/dev/null 2>&1 &" >>/dev/null 2>&1 &
備集群主節(jié)點(diǎn)沙箱外設(shè)置定時(shí)任務(wù),crontab -e。注意替換主節(jié)點(diǎn)IP。
*/1 * * * * nohup ssh XXX.XXX.XXX.XXX "source /etc/profile;if [ -f ~/.profile ];then source ~/.profile;fi;source ~/.bashrc;nohup python3 /opt/dws/tools/script/SyncDataToStby.py -t restore --config-file /DWS/data2/finedisaster/backupRestore.ini --disaster-fine-grained >>/dev/null 2>&1 &" >>/dev/null 2>&1 &
成功啟動(dòng)備份確認(rèn)。
Ruby用戶分別登錄主備集群主節(jié)點(diǎn)沙箱,查詢(xún)SyncDataToStby.py進(jìn)程是否存在。
ps ux | grep SyncDataToStby | grep -v grep
Ruby用戶登錄主/備集群主節(jié)點(diǎn)沙箱,使用roach的show-progress監(jiān)控工具,查看備份/恢復(fù)進(jìn)度。show-progress命令提供主備集群備份恢復(fù)進(jìn)度等信息, 顯示結(jié)果為json格式,各字段含義請(qǐng)參考產(chǎn)品文檔。
python3 $GPHOME/script/SyncDataToStby.py -t show-progress --config-file /DWS/data2/finedisaster/backupRestore.ini
系統(tǒng)回顯:
{ "primary cluster": { "key": "20231109_212030", "priorKey": "20231109_211754", "actionType": "Backup", "progress": "100.00%", "backupRate": { "producerRate": "0MB/s", "compressRate": "0MB/s", "consumerRate": "0MB/s" }, "currentStep": "FINISH", "unrestoreKeys": "N/A", "failedStep": "INIT", "errorMsg": "", "errorCode": "", "actionStartTime": "2023-11-09 2128", "actionEndTime": "2023-11-09 2149", "updateTime": "2023-11-09 2150" }, "standby cluster": { "key": "20231109_175002", "priorKey": "N/A", "actionType": "Restore", "progress": "100.00%", "backupRate": { "producerRate": "0MB/s", "compressRate": "0MB/s", "consumerRate": "0MB/s" }, "currentStep": "FINISH", "unrestoreKeys": "20231109_211754,20231109_212030", "failedStep": "INIT", "errorMsg": "", "errorCode": "", "actionStartTime": "2023-11-09 1707", "actionEndTime": "2023-11-09 1715", "updateTime": "2023-11-09 1715" }, "apply": { "backupState": "waiting", "restoreState": "waiting", "backupSuccessTime": "2023-11-09 2124", "restoreSuccessTime": "2023-11-09 1755" }, "latestBarrierTime": "", "recovery point objective": "317", "failover recovery point time": "" }
show-progress命令顯示的主要字段釋義如下
priorKey:該備份集是基于這個(gè)backup key生成的。
actionType:備份集當(dāng)前的操作類(lèi)型。
取值包括如下:
Backup,表示備份階段。
Restore,表示恢復(fù)階段。
progress:備份或恢復(fù)操作的進(jìn)度。
currentStep:備份或恢復(fù)正在執(zhí)行的步驟。
unrestoreKeys:待恢復(fù)的key列表。
failedStep:備份或恢復(fù)失敗的步驟,初始值默認(rèn)為INIT。
errorMsg:備份或恢復(fù)失敗的錯(cuò)誤信息,如果成功,該字段則顯示成功的信息。
errorCode:備份或恢復(fù)的錯(cuò)誤碼,該字段為預(yù)留字段,暫未使用。
actionStartTime:當(dāng)前操作的開(kāi)始時(shí)間。
actionEndTime:當(dāng)前操作的結(jié)束時(shí)間。
updateTime:當(dāng)前操作進(jìn)度的刷新時(shí)間。
backupState:當(dāng)前備份狀態(tài)(backuping/stopped/waiting/abnormal)。
restoreState:當(dāng)前恢復(fù)狀態(tài)(restoring/stopped/waiting/abnormal)。
backupSuccessTime:上次成功備份結(jié)束的時(shí)間。
restoreSuccessTime:上次成功恢復(fù)結(jié)束的時(shí)間。
latestBarrierTime:上次主備集群一致點(diǎn)時(shí)間。
recovery point objective:rpo時(shí)間(當(dāng)前主集群時(shí)間到最后一個(gè)恢復(fù)成功的備份集備份開(kāi)始時(shí)間)。
failover recovery point time:failover未同步時(shí)間點(diǎn)。
4.3 結(jié)果驗(yàn)證
4.3.1 功能驗(yàn)證
同步前后進(jìn)行數(shù)據(jù)一致性校驗(yàn),主表、備表數(shù)據(jù)進(jìn)行checksum校驗(yàn),檢查是否同步正確(需排除由于接入業(yè)務(wù)導(dǎo)致的差異)。
4.3.2 性能驗(yàn)證
通過(guò)show-progress監(jiān)控工具可以看到最近一次備份、恢復(fù)耗時(shí)。
5. 解除容災(zāi)
5.1 停止容災(zāi)
# 主備集群取消沙箱外的定時(shí)容災(zāi)任務(wù),在備份/恢復(fù)任務(wù)前添加注釋符“#”,取消定時(shí)任務(wù) crontab -e # 主集群Ruby用戶登錄主節(jié)點(diǎn)沙箱,停止備份 python3 $GPHOME/script/SyncDataToStby.py -t stop-backup --config-file /DWS/data2/finedisaster/backupRestore.ini --disaster-fine-grained # 備集群Ruby用戶登錄主節(jié)點(diǎn)沙箱,停止恢復(fù) python3 $GPHOME/script/SyncDataToStby.py -t stop-restore --config-file /DWS/data2/finedisaster/backupRestore.ini --disaster-fine-grained
5.2 刪除容災(zāi)
警告
當(dāng)不再需要容災(zāi)任務(wù)的時(shí)候,可以解除主備關(guān)系,恢復(fù)備集群的讀寫(xiě)能力。刪除容災(zāi)前需要先停止容災(zāi)。
Ruby用戶登錄主集群主節(jié)點(diǎn)的沙箱內(nèi)。
python3 $GPHOME/script/SyncDataToStby.py -t set-independent --config-file /DWS/data2/finedisaster/backupRestore.ini --disaster-fine-grained
系統(tǒng)回顯:
Delete csv file. Delete roachbackup file from XXX.XXX.XXX.XX Delete roachbackup file from XXX.XXX.XXX.XX Clear cluster disaster state.
6. 總結(jié)
本文介紹了在云上環(huán)境的雙集群(不跨Region不跨VPC)后臺(tái)手動(dòng)部署并使用細(xì)粒度容災(zāi)的主要步驟,分為容災(zāi)前準(zhǔn)備、細(xì)粒度容災(zāi)操作和解除容災(zāi),使得用戶能快速方便得搭建起細(xì)粒度容災(zāi)。
審核編輯:黃飛
-
容災(zāi)系統(tǒng)
+關(guān)注
關(guān)注
0文章
4瀏覽量
5341
原文標(biāo)題:詳解如何在數(shù)倉(cāng)中搭建細(xì)粒度容災(zāi)應(yīng)用
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論