ODL資料庫備份恢復之恢復 bakcup

上文說到將ODL DataStore中數據都備份出來後,如何進行恢復?

控制器目錄創建clustered-datastore-restore並將備份文件拷貝其中

恢復文件的入口

ODL數據庫備份恢復之恢復 bakcup_datastore

通過DistributedDataStoreFactory#createInstance中,藉助DatastoreSnapshotRestore

ODL數據庫備份恢復之恢復 bakcup_datastore

通過其反序列化備份文件並讀取配置庫和操作數的Snapshot

對於分片數據,最終需要寫入DataStore中動作,否則依賴數據庫變更動作的邏輯無法觸發

下面舉例說明如何恢復Operational庫中數據:

前提:Netconf的節點上線,通過寫config的變更通知觸發的。如果沒有寫庫這一動作,那麼節點狀態則無法更新。(第一次註冊數據庫變更通知時,會有初始事件發出)

DistributedDataStore中創建ShardManager

ODL數據庫備份恢復之恢復 bakcup_datastore

之後會創建Shard

RaftActorSnapshotMessageSupport SaveSnapshotSuccess

最終恢復的調用進入ShardSnapshotCohort中的applySnapshot中,對Snapshot中數據進行寫庫操作

ODL數據庫備份恢復之恢復 bakcup_datastore

同樣創建讀寫事務,進入InMemoryDataTreeModification執行寫操作

其中包含了備份中用到的InMemoryDataTreeSnapshot,最終的數據都要存儲進InMemoryDataTreeSnapshot中的DataTree中,newModification

ODL數據庫備份恢復之恢復 bakcup_datastore

ShardSnapshotCohort.java 開始寫數據

transaction.getSnapshot().write(DATASTORE_ROOT, node);

ODL數據庫備份恢復之恢復 bakcup_datastore

注意到node即從文件中找到的對應分片的數據

ODL數據庫備份恢復之恢復 bakcup_datastore

通過this.logId可以判斷分片

則ImmutableContainerNode則為最終的分片數據了(此時數據理論上應該是完整的)

但還有步提交,提交完成,數據才會真正寫入到InMemoryDataTree中去

ShardSnapshotCohort-------syncCommitTransaction

SimpleShardDataTreeCohort-----commit

具體的提交操作,參考InMemeoryDataTree的commit

通過notifyListeners觸發數據庫的變更通知


分享到:


相關文章: