分表后需要注意的二三事

5d012e6a6fd7729354.jpg

前言

本篇是上一篇《一次分表踩坑實踐的探討》,所以還沒看過的朋友建議先看上文。

還是先來簡單回顧下上次提到了哪些內容:

  • 分表策略:哈希、時間歸檔等。
  • 分表字段的選擇。
  • 數據遷移方案。

而本篇文章的背景是在我們上線這段時間遇到的一些問題并嘗試解決的方案。

問題產生

之前提到在分表應用上線前我們需要將原有表的數據遷移到新表中,這樣才能保證業務不受影響。

5d0126128f1e678414.jpg

所以我們單獨寫了一個遷移應用,它負責將大表中的數據遷移到 64 張分表,而再遷移過程中產生的數據畢竟是少數,最后在上線當晚再次遷移過去即可。

一切想的很美好,當這個應用上線后卻發現沒這么簡單。

數據庫負載升高

首先第一個問題是數據庫自己就頂不住了,在我們上這個遷移程序之前數據庫的壓力本身就比較大,這個應用一上去就成了最后一根稻草。

最后導致的結果是:所有連接了數據庫的程序大部分的操作都出現超時,獲取不到數據庫連接等一系列的異常。

最后沒辦法我們只能把這個應用放到凌晨執行,但其實后面觀察發現依然不行。

雖說凌晨的業務量下降,但依然有少部分的請求過來,也會出現各種數據庫異常。

再一個是遷移程序的效率也非常低下,按照這樣是速度,我們預估了一下遷移時間,大約需要 10 幾天才能把三張最大的表(3、4億的數據)遷移到分表中。

于是我們換了一個方案,將這個遷移程序在從庫中運行,最后再用運維的方法將分表直接導入進主庫。

因為從庫的壓力要比主庫小很多,對業務的影響很小,同時遷移的效率也要快很多。

即便是這樣也花了一晚上+一個白天的時間才將一張 1億的數據遷移完成,但是業務上的壓力越來越大,數據量再不斷新增,這個效率依然不夠。

兼容方案

最終沒辦法只有想一個不遷移數據的方案,但是新產生的數據還是往分表里寫,至少保證大表的數據不再新增。

但這樣對于以前的數據咋辦呢?總不能不讓看了吧。

其實對于數據的操作無非就分為增刪改查,就這四種操作來看看如何兼容。

新增

5d012612de57f13422.jpg

新增最簡單,所有的數據根據分表規則直接寫入新表,這樣可以保證老表的數據不再新增。

刪除

刪除就要比新增稍微復雜一些,比如用戶想要刪除他個人產生的一條信息(比如說是訂單數據),有可能這個數據在新表也可能在老表。

5d01261336daf24547.jpg

所以刪除時優先刪除新表(畢竟新產生的數據訪問的頻次越高),如果刪除失敗再從老表刪除一次。

修改

5d01261380d6599845.jpg

而修改同理,同樣的會不確定數據存在于哪里,所以先要修改新表,失敗后再次修改老表。

查詢

查詢相對就要復雜一些了,因為這些大表的數據大部分都是存放一個用戶產生的多條記錄(比如一個用戶的訂單信息)。

這時在頁面上通常都會有分頁,并且按照時間進行排序。

麻煩的地方就出在這里:既然是要分頁那就有可能出現要查詢一部分分表數據和原來的大表數據做組合。

所以這里的查詢其實分為三種情況。

5d012613da28015150.jpg

  • 首先查詢的時候要計算這個用戶所在分表中的數據可以分為幾頁。
  • 第一步首先判斷當前頁是否可以在分表中全部獲取,如果可以則直接從分表中取出數據返回(假設分頁中總共可以查詢 2 頁數據,當前為第 1 頁,那就全部取分表數據)。
  • 如果不可以就要判斷當前頁數在分表中是否取不到任何一條數據,如果是則直接取老表數據(比如現在要取第 5 頁的數據,分表中一共才只有 2 頁數據,所以第 5 頁數據只能全部從老表中獲取)。
  • 但如果分表和老表都存在一部分數據時,則需要同時取兩張表然后做一個匯總再返回。

這種邏輯只適用于根據分表字段進行查詢分頁的前提下


我想肯定會有朋友提出這樣是否會有性能問題?

同時如果在計算分表分頁數量時出現并發寫入的情況,導致分頁數量不準從而對后續的查詢出現影響該怎么處理?

首先第一個性能問題:

其實這個要看怎么取舍,為了這樣的兼容目的其實會比常規查詢多出幾個步驟:

  • 判斷當前頁是否可以在分表中查詢。
  • 當新老表中都有數據時候需要額外多查詢一張大表。

第一個判斷邏輯其實是在內存中計算,這個損耗我覺得完全可以忽略不計。

至于第二步確實會有損耗,畢竟多查了一張表。

但在分表之前所有的數據都是從老表中獲取的,當時的業務也沒有出現問題;現在多的只是查詢分表而已,但分表的數據量肯定要比大表小的多,而且有索引,所以這個效率也不會慢多少。

而且根據局部性原理及用戶的使用習慣來看,老表中的數據很少會去查詢,隨著時間的推移所有的數據肯定都會從分表中獲取,逐漸老表就會成為歷史表。

而第二個并發帶來的問題我覺得影響也不大,一定要這個分頁準的前提肯定得是加鎖了,但為了這樣一個不癢的小問題卻帶來性能的下降,我覺得是不劃算的。

而且后續我們也可以慢慢的將老表的數據遷移到新表,這樣就可以完全去掉這個兼容邏輯了,所有的數據都從分表中獲取。

總結

還是之前那句話,這里的各種操作、方法不適合所有人,畢竟脫離場景都是耍牛氓。

比如分表搞的早,業務上允許一定的時間將數據遷移到分表那就不會有這次的兼容處理。

甚至一開始業務規劃合理、團隊架構師看的長遠,一來就將關鍵數據分表存儲那根本就不會有數據遷移這個流程(大廠有經驗的團隊可能,小公司小作坊都得靠自己摸索)。

這段期間也被數據庫折騰慘了,數據庫是最后一根稻草果然也不是瞎說的。

你的點贊與分享是對我最大的支持

轉載于:https://www.cnblogs.com/crossoverJie/p/11013769.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393284.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DNS 原理

阮老師的作品,非常精彩,轉載! DNS 是互聯網核心協議之一。不管是上網瀏覽,還是編程開發,都需要了解一點它的知識。 本文詳細介紹DNS的原理,以及如何運用工具軟件觀察它的運作。我的目標是,讀完此…

leetcode1169. 查詢無效交易

如果出現下述兩種情況,交易 可能無效: 交易金額超過 1000 或者,它和另一個城市中同名的另一筆交易相隔不超過 60 分鐘(包含 60 分鐘整) 每個交易字符串 transactions[i] 由一些用逗號分隔的值組成,這些值分…

銷售員/學員/講師系統

前言: 今晚寫一篇關于學員/講師/銷售員CRM系統。這個小項目是27號開始做的,大概搞了一星期不到。我把一些知識點總結下,還寫下當時克服的BUG。 Django練習小項目:學員管理系統設計開發 帶著項目需求學習是最有趣和效率最高的,今天…

Linux內核啟動

1 內核編譯 解壓縮&#xff1a;tar xjf linux-2.6.22.6.tar.bz2打補丁&#xff1a; path -p1 < ../linux-2.6.22.6_jz2440.patch(其中p1是忽略補丁文件中的一級目錄)配置&#xff1a; 方法一&#xff1a;使用make menuconfig逐項配置方法二&#xff1a;使用默認配置&#xf…

node.js使用手冊_權威的Node.js手冊

node.js使用手冊Developer and freeCodeCamp camper Flavio Copes has published his entire Node.js Handbook online for free - both on freeCodeCamps Medium publication and as a .pdf file. You can read it here.開發人員和freeCodeCamp營員Flavio Copes在freeCodeCamp…

自動化運維之saltstack(二)states深入理解

深入了解SLS的可以參考這篇博文&#xff1a;http://www.ituring.com.cn/article/42238 個人覺得這篇文章翻譯的不錯&#xff0c;所以轉載過來。 Salt Sates 眾多強大而有力的涉及都是建立在簡單的原則之上。Salt SLS系統也是努力想K.I.S.S看齊。&#xff08;Keep It Stupidly …

java里面的 |運算符_Java 中 | ^ 運算符的簡單使用

背景今天碰到了代碼中的按位與運算&#xff0c;復習一下&#xff0c;先列一個各個進制數據表。順便復習一下十進制轉二進制的計算方式&#xff1a;接下來解釋下這三個運算符&#xff1a;&  按位與&#xff0c;都轉為二進制的情況下&#xff0c;同為1則為1&#xff0c;否則…

leetcode915. 分割數組

給定一個數組 A&#xff0c;將其劃分為兩個不相交&#xff08;沒有公共元素&#xff09;的連續子數組 left 和 right&#xff0c; 使得&#xff1a; left 中的每個元素都小于或等于 right 中的每個元素。 left 和 right 都是非空的。 left 要盡可能小。 在完成這樣的分組后返回…

徹底理解正向代理、反向代理、透明代理

套用古龍武俠小說套路來說&#xff0c;代理服務技術是一門很古老的技術&#xff0c;是在互聯網早期出現就使用的技術。一般實現代理技術的方式就是在服務器上安裝代理服務軟件&#xff0c;讓其成為一個代理服務器&#xff0c;從而實現代理技術。常用的代理技術分為正向代理、反…

使用showMessageDialog顯示消息框

-----------------siwuxie095 工程名&#xff1a;TestJOptionPane 包名&#xff1a;com.siwuxie095.showdialog 類名&#xff1a;TestMessageDialog.java 工程結構目錄如下&#xff1a; 代碼&#xff1a; package com.siwuxie095.showdialog; import java.awt.BorderLayout;…

將Javascript帶到邊緣設備

Smart devices today are very similar to labour-saving gadgets a generation ago: Where previously everything got a power cord, now everything gets a chip. 如今的智能設備與上一代的省力小工具非常相似&#xff1a;以前所有設備都配有電源線&#xff0c;而現在所有設…

java 泛型 父子_使用通配符和泛型:完成父子類關系的List對象的類型匹配

泛型和通配符使用泛型和通配符都可以讓一個方法所表示的算法邏輯適應多種類型。Java中具備繼承關系的類A、B(A extends B)它們的集合List和List之間是沒有繼承關系的&#xff0c;可以使用泛型或通配符來讓一個方法支持同時接受List和List。代碼場景這里分別定義類Animal、Dog和…

重定向描述符

文件描符 縮寫 描述 0 STDIN 標準輸入 1 STDOUT 標準輸出 2 STDERR 標準錯誤 1、重定向錯誤和數據 1234[rootlogicserver tmp]# ls -al data1 haha 2> qingyun.txt 1&g…

NodeJS學習筆記(一)——搭建開發框架Express,實現Web網站登錄驗證

目錄 開發環境  1、建立工程  2、目錄結構  3、Express配置文件  4、Ejs模板  5、安裝常用庫及頁面分離  6、路由  7、session  8、頁面訪問控制及提示JS是腳本語言&#xff0c;腳本語言都需要一個解析器才能運行。對于寫在HTML頁面里 的JS&#xff0c;瀏覽器充…

LeetCode-208 Implement Trie (Prefix Tree)

題目描述 Implement a trie with insert, search, and startsWith methods. 題目大意 實現對一棵樹的插入、搜索以及前序查找操作。 &#xff08;樹的每個節點代表一個小寫字母&#xff0c;從根節點到葉節點代表一個完整的單詞&#xff09; 示例 E Trie trie new Trie();trie.…

react組件生命周期_React組件生命周期-掛鉤/方法介紹

react組件生命周期React components have several lifecycle methods that you can override to run your code at a particular time in the process.React組件具有幾種生命周期方法&#xff0c;您可以重寫它們以在流程中的特定時間運行代碼。 In this video, Nick Karnik de…

(馬世龍)Linux下CACTI完全搭建技術文檔二

續&#xff08;馬世龍&#xff09;Linux下CACTI完全搭建技術文檔一 6.完成cacti的安裝1. 首先檢查一下rra/下面&#xff0c;有沒有數據2. snmpwalk -v 2c -c public ServerIP if 用來測試被控對象(serverIP)是否開啟了SNMP服務3. snmpwalk -v 2c ServerIP -c public .1.3.6.1.4…

項目經理如何管理情緒?這三本書管理書籍你必須要看

本文主要是介紹三本管理的書籍&#xff0c;需要全部書籍的可以加Q群375508415去拿走。里面很多大神的PMP資料。 大家有沒有覺得項目經理有時像個政委&#xff0c;做員工思想工作&#xff1b; 有時像個HR&#xff0c;操心員工的穩定和發展&#xff1b; 有時像個咨詢顧問&#xf…

java 外部接口調用 設計模式_《Java設計模式》之接口模式

-----------模式是思想的體現&#xff0c;而非具體的實現。抽象的講&#xff0c;類的接口是類允許其他類對象訪問的方法與字段集。接口通常代表一種承諾&#xff0c;即方法需要實現接口方法名表示的操作&#xff0c;遵循代碼注釋和其他文檔說明&#xff0c;類的實現就是方法體中…

BFS(廣度優先搜索)

Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer …