一直都很奇怪,為什麼Google沒有為App Engine提供官方支援的備份工具呢?雖然Google一貫的做法是若有成熟的開源方案,就直接拿該方案來用,但唯一一套的gaebar有近半年以上沒有更新,跟新版SDK也不兼容,那為什麼仍未有動作呢?而且開源方案也實在太少了。
為了這個問題,做了些許的研究,發覺……原來又是BigTable的問題。
BigTable跟一般SQL的關聯式資料庫的概念非常之不同,那是分散式的資料庫,所以用法跟SQL相去甚遠。
例如說一項記錄的ID,BigTable有三種不同的表達方法,頭二種是numeric ID及key name,key name是由用戶設定的文字,在模組中是唯一的存在,而當記錄沒有被賦予key name時,BigTable就會為記錄加入numeric ID,故名思義那是一個數字,但這個數字的值並不連貫,所以也不能用來計算有多少記錄存在。
無論是numeric ID還是key name,最後都可以編碼成為最後一種表達方法 - 一個50位元的字串,那才是真正的ID。
問題是出於numeric ID,那是資料庫賦予的,用戶沒有辦法指派numeric ID予新建的記錄,就算有那個50位元字串也不能,唯一例外的是key_name。那麼使用了numerc ID的記錄,在備份後,是沒有辦法還原至原來的numeric ID的,那麼備份系統亦無法建立……
gaebar的解決方法是把numeric ID轉成key name(在numeric ID前面加入"id"字串),但這造成二個問題
1) 備份系統會修改資料庫內容,或許會令網站無法使用。
2) numeric ID及key name衝突又如何解決呢?(在Deployment server上應該不會發生,但development server是一定會的)
怎樣才可以設計出GAE合用的備份工具呢?頭痛啊。
沒有留言:
發佈留言