還是先來簡單回顧下上次提到了哪些內容:
而本篇文章的背景是在我們上線這段時間遇到的一些問題並嘗試解決的方案。
之前提到在分表應用上線前我們需要將原有表的資料遷移到新錶中,這樣才能保證業務不受影響。
所以我們單獨寫了乙個遷移應用,它負責將大表中的資料遷移到 64 張分表,而再遷移過程中產生的資料畢竟是少數,最後在上線當晚再次遷移過去即可。
一切想的很美好,當這個應用上線後卻發現沒這麼簡單。
首先第乙個問題是資料庫自己就頂不住了,在我們上這個遷移程式之前資料庫的壓力本身就比較大,這個應用一上去就成了最後一根稻草。
最後導致的結果是:所有連線了資料庫的程式大部分的操作都出現超時,獲取不到資料庫連線等一系列的異常。
最後沒辦法我們只能把這個應用放到凌晨執行,但其實後面觀察發現依然不行。
雖說凌晨的業務量下降,但依然有少部分的請求過來,也會出現各種資料庫異常。
再乙個是遷移程式的效率也非常低下,按照這樣是速度,我們預估了一下遷移時間,大約需要 10 幾天才能把三張最大的表(3、4億的資料)遷移到分表中。
於是我們換了乙個方案,將這個遷移程式在從庫中執行,最後再用運維的方法將分表直接匯入進主庫。
因為從庫的壓力要比主庫小很多,對業務的影響很小,同時遷移的效率也要快很多。
即便是這樣也花了一晚上+乙個白天的時間才將一張 1億的資料遷移完成,但是業務上的壓力越來越大,資料量再不斷新增,這個效率依然不夠。
最終沒辦法只有想乙個不遷移資料的方案,但是新產生的資料還是往分表裡寫,至少保證大表的資料不再新增。
但這樣對於以前的資料咋辦呢?總不能不讓看了吧。
其實對於資料的操作無非就分為增刪改查,就這四種操作來看看如何相容。
新增最簡單,所有的資料根據分表規則直接寫入新錶,這樣可以保證老表的資料不再新增。
刪除就要比新增稍微複雜一些,比如使用者想要刪除他個人產生的一條資訊(比如說是訂單資料),有可能這個資料在新錶也可能在老表。
所以刪除時優先刪除新錶(畢竟新產生的資料訪問的頻次越高),如果刪除失敗再從老表刪除一次。
而修改同理,同樣的會不確定資料存在於**,所以先要修改新錶,失敗後再次修改老表。
查詢相對就要複雜一些了,因為這些大表的資料大部分都是存放乙個使用者產生的多條記錄(比如乙個使用者的訂單資訊)。
這時在頁面上通常都會有分頁,並且按照時間進行排序。
麻煩的地方就出在這裡:既然是要分頁那就有可能出現要查詢一部分分表資料和原來的大表資料做組合。
所以這裡的查詢其實分為三種情況。
這種邏輯只適用於根據分表字段進行查詢分頁的前提下
我想肯定會有朋友提出這樣是否會有效能問題?
同時如果在計算分表分頁數量時出現併發寫入的情況,導致分頁數量不准從而對後續的查詢出現影響該怎麼處理?
首先第乙個效能問題:
其實這個要看怎麼取捨,為了這樣的相容目的其實會比常規查詢多出幾個步驟:
第乙個判斷邏輯其實是在記憶體中計算,這個損耗我覺得完全可以忽略不計。
至於第二步確實會有損耗,畢竟多查了一張表。
但在分表之前所有的資料都是從老表中獲取的,當時的業務也沒有出現問題;現在多的只是查詢分表而已,但分表的資料量肯定要比大表小的多,而且有索引,所以這個效率也不會慢多少。
而且根據區域性性原理及使用者的使用習慣來看,老表中的資料很少會去查詢,隨著時間的推移所有的資料肯定都會從分表中獲取,逐漸老表就會成為歷史表。
而第二個併發帶來的問題我覺得影響也不大,一定要這個分頁準的前提肯定得是加鎖了,但為了這樣乙個不癢的小問題卻帶來效能的下降,我覺得是不划算的。
而且後續我們也可以慢慢的將老表的資料遷移到新錶,這樣就可以完全去掉這個相容邏輯了,所有的資料都從分表中獲取。
還是之前那句話,這裡的各種操作、方法不適合所有人,畢竟脫離場景都是耍牛氓。
比如分表搞的早,業務上允許一定的時間將資料遷移到分表那就不會有這次的相容處理。
甚至一開始業務規劃合理、團隊架構師看的長遠,一來就將關鍵資料分表儲存那根本就不會有資料遷移這個流程(大廠有經驗的團隊可能,小公司小作坊都得靠自己摸索)。
這段期間也被資料庫折騰慘了,資料庫是最後一根稻草果然也不是瞎說的。
分表後需要注意的二三事
還是先來簡單回顧下上次提到了哪些內容 而本篇文章的背景是在我們上線這段時間遇到的一些問題並嘗試解決的方案。之前提到在分表應用上線前我們需要將原有表的資料遷移到新錶中,這樣才能保證業務不受影響。所以我們單獨寫了乙個遷移應用,它負責將大表中的資料遷移到 64 張分表,而再遷移過程中產生的資料畢竟是少數,...
oracle的rename操作需要注意事項
1 檢視測試表oracle test物件資訊 3 建立乙個臨時表oracle temp,和表oracle test的表結構一樣 4 檢視該錶上的使用者許可權資訊 5 重新命名表oracle test為oracle bak,表oracle temp為oracle test alter table sc...
在ubuntu下安裝ruby需要注意的事情
這裡說的是通過apt get安裝ruby,自己編譯的情況就免了。首先,在安裝ruby本身時一定要把ruby和ruby dev全安裝了。現在的版本是1.8,因此應該執行如下命令 code sudo apt get install ruby1.8 ruby1.8 dev rubygems code 這是...