分庫分表小結-論QA的自我修養

iTesting2019-08-23 02:03:41

iTesting,愛測試,愛分享


前幾天有小夥伴在微信羣裏吐槽説,自己面試碰見面試官不問測試技術,一直關注代碼和工具的底層實現,甚至問到了分庫分表的實現原理,面試的結果呢當然是“今天的面試到此結束,如果合適的話後續會有通知”。 本着“有什麼不開心的事説出來,讓大家開心開心的原則”, 羣裏的小夥伴們紛紛出言獻策,YY着要是自己面試會怎麼回答。

隨着互聯網技術的演進,可以説,軟件測試行業也進入了深水區,整個行業對QA的要求也越來越高,去QE的趨勢特別明顯,代碼實現邏輯,設計模式這些以往問開發的問題也越來越常規的出現在QA的面試裏,作為一名QA,靠”點點點“搗糨糊混江湖的日子一去不復返了,就我自己來説,面試中也越來越看重候選人對技術的深入是停留於表面還是鍥而不捨的追宗溯源。 

在日常的測試裏,QA免不了跟數據庫打交道,那麼知道分庫分表的原理並以此來設計你的測試用例,必然對你的測試結果有增效作用。

本着QA的自我修養精神,我總結了分庫分表的知識點,供大家參考。

1. 為什麼要分庫分表?

因為服務器承受不住了啊

隨着業務的發展到一定程度,如果數據庫沒有采用分庫分表,那麼必然出現單位時間內的訪問海量增加,導致的後果是同樣的SQL語句返回結果變慢,性能變差,出現甚至無響應的情況,接着CPU或者IO出現瓶頸。如果不想線上出事故導致今年白乾一年,分庫分表就變成了必要操作。

需要注意的是,分庫和分表是業務發展到一定階段才會面臨的問題。 

分庫和分表是兩個操作,可以只分庫不分表,也可以只分表不分庫,還可以分庫又分表。 

2. 分庫分表的方式?

目前業界的方式有兩種:水平劃分和垂直劃分。

水平切分

把一個表的數據分散到多個表裏去,達到的效果:

  • 每個結構都一樣;

  • 每個數據都不一樣,沒有交集;

  • 所有並集是全量數據;

水平切分的優點:

  • 不存在單庫數據量過大、高併發的性能瓶頸,提升系統穩定性和負載能力

  • 應用端改造較小,不需要拆分業務模塊

缺點:

  • 跨分片的事務一致性難以保證

  • 跨庫的join關聯查詢性能較差

  • 數據多次擴展難度和維護量極大

 水平切分的具體實現方法:

    1、根據數值範圍

    按照時間區間或ID區間來切分。

    這樣的優點在於:

  • 單表大小可控

  • 天然便於水平擴展,後期如果想對整個分片集羣擴容時,只需要添加節點即可,無需對其他分片的數據進行遷移

  • 使用分片字段進行範圍查找時,連續分片可快速定位分片進行快速查詢,有效避免跨分片查詢的問題。

    缺點:

  • 熱點數據成為性能瓶頸。連續分片可能存在數據熱點,例如按時間字段分片,有些分片存儲最近時間段內的數據,可能會被頻繁的讀寫,而有些分片存儲的歷史數據,則很少被查詢。

    2、根據數值取模

    一般採用hash取模mod的切分方式,例如:餘數為0的放到第一個庫,餘數為1的放到第二個庫,以此類推。這樣同一個用户的數據會分散到同一個庫中。

    優點:

  • 數據分片相對比較均勻,不容易出現熱點和併發訪問的瓶頸

    缺點:

  • 後期分片集羣擴容時,需要遷移舊的數據(使用一致性hash算法能較好的避免這個問題)

  • 容易面臨跨分片查詢的複雜問題。比如上例中,如果頻繁用到的查詢條件中不帶cusno時,將會導致無法定位數據庫,從而需要同時向4個庫發起查詢,再在內存中合併數據,取最小集返回給應用,分庫反而成為拖累。

    

垂直切分

垂直分庫:基本的思路就是按照業務模塊來劃分出不同的數據庫,而不是像早期一樣將所有的數據表都放到同一個數據庫中。

垂直分表:

  • "大表拆小表",每個結構都不一樣;

  • 每個數據也不一樣,一般來説,每個表的字段至少有一列交集,一般是主鍵,用於關聯數據;

  • 所有並集是全量數據

    垂直切分的優點:

  • 解決業務系統層面的耦合,業務清晰

  • 與微服務的治理類似,也能對不同業務的數據進行分級管理、維護、監控、擴展等

  • 高併發場景下,垂直切分一定程度的提升IO、數據庫連接數、單機硬件資源的瓶頸

    缺點:

  • 部分表無法join,只能通過接口聚合方式解決,提升了開發的複雜度

  • 分佈式事務處理複雜

  • 依然存在單表數據量過大的問題(需要水平切分)

    

    3. 分庫分表的工具?

  • cobar

  • TDDL

  • atlas

  • sharding-jdbc

  • mycat

##以上內容直接引用,少量修改瞭如下文章及公號,致謝!

##感覺文章對您有用,請直接讚賞:)。

數據庫架構:分庫分表-垂直?水平?》,公號:搜雲庫技術團隊。

數據庫分庫分表思路》, 公號:後端技術精選。

其餘有價值參考資料(直接搜):
數據庫分庫分表,何時分?怎樣分?》,方誌朋。
分庫分表的幾種常見形式以及可能遇到的難題》,InfoQ。



 -   -  時人莫小池中水, 淺處不妨有卧龍  -  -

作者:

Kevin Cai, 江湖人稱蔡老師。

兩性情感專家,非著名測試開發。

技術路線的堅定支持者,始終相信Nobody can be somebody。      

                     

· 猜你喜歡的文章 ·

阿里巴巴測試左移和開發賦能分享

有些話我想對你説

自研測試框架ktest介紹(適用於UI和API)

https://hk.wxwenku.com/d/201205519