上文說到將ODL DataStore中數據都備份出來後,如何進行恢復?
控制器目錄創建clustered-datastore-restore並將備份文件拷貝其中
恢復文件的入口
通過DistributedDataStoreFactory#createInstance中,藉助DatastoreSnapshotRestore
通過其反序列化備份文件並讀取配置庫和操作數的Snapshot
對於分片數據,最終需要寫入DataStore中動作,否則依賴數據庫變更動作的邏輯無法觸發
下面舉例說明如何恢復Operational庫中數據:
前提:Netconf的節點上線,通過寫config的變更通知觸發的。如果沒有寫庫這一動作,那麼節點狀態則無法更新。(第一次註冊數據庫變更通知時,會有初始事件發出)
DistributedDataStore中創建ShardManager
之後會創建Shard
RaftActorSnapshotMessageSupport SaveSnapshotSuccess
最終恢復的調用進入ShardSnapshotCohort中的applySnapshot中,對Snapshot中數據進行寫庫操作
同樣創建讀寫事務,進入InMemoryDataTreeModification執行寫操作
其中包含了備份中用到的InMemoryDataTreeSnapshot,最終的數據都要存儲進InMemoryDataTreeSnapshot中的DataTree中,newModification
ShardSnapshotCohort.java 開始寫數據
transaction.getSnapshot().write(DATASTORE_ROOT, node);
注意到node即從文件中找到的對應分片的數據
通過this.logId可以判斷分片
則ImmutableContainerNode則為最終的分片數據了(此時數據理論上應該是完整的)
但還有步提交,提交完成,數據才會真正寫入到InMemoryDataTree中去
ShardSnapshotCohort-------syncCommitTransaction
SimpleShardDataTreeCohort-----commit
具體的提交操作,參考InMemeoryDataTree的commit
通過notifyListeners觸發數據庫的變更通知
閱讀更多 SDN界的小學生 的文章