雲栖号資訊:【 點選檢視更多行業資訊】
在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!
一.分分合合
說過很多次,不要拘泥于某一個技術的一點,技術是相通的。重要的是程式設計思想,思想是最重要的。
當資料量大的時候,需要具有分的思想去細化粒度。當資料量太碎片的時候,需要具有合的思想來粗化粒度。
1.1 分
很多技術都運用了分的程式設計思想,這裡來舉幾個例子,這些都是分的思想
- 集中式服務發展到分布式服務
- 從Collections.synchronizedMap(x)到1.7ConcurrentHashMap再到1.8ConcurrentHashMap,細化鎖的粒度的同時依舊保證線程安全
- 從AtomicInteger到LongAdder,ConcurrentHashMap的size()方法。用分散思想,減少cas次數,增強多線程對一個數的累加
- JVM的G1 GC算法,将堆分成很多Region來進行記憶體管理
- Hbase的RegionServer中,将資料分成多個Region進行管理
- 平時開發是不是線程池都資源隔離
2.2 合
很多技術也運用到了合的程式設計思想,這裡舉幾個例子,這些都是合的思想
- TLAB(Thread Local Allocation Buffers),線程本地配置設定緩存。避免多線程沖突,提高對象配置設定效率
- 逃逸分析,将變量的執行個體化記憶體直接在棧裡配置設定,無需進入堆,線程結束棧空間被回收。減少臨時對象在堆内配置設定數量
- CMS GC算法下,雖然使用标記清除,但是也有配置支援整理記憶體碎片。如:-XX:UseCMS-CompactAtFullCollection(FullGC後是否整理,Stop The World會變長)和-XX:CMSFullGCs-BeforeCompaction(幾次FullGC之後進行壓縮整理)
- 鎖粗化,當JIT發現一系列連續的操作都是對同一對象反複加鎖和釋放鎖,會加大鎖同步的範圍
- kafka的網絡資料傳輸有一些資料配置,減少網絡開銷。如:batch.size和linger.ms等等
- 平時開發是不是都個叫批量擷取接口
二.分區
本文一切基于MySql InnoDB
說了這麼多,接下來說主體,先說分區,因為之前部落客寫過一篇MySql分區的部落格是以這裡不會多費筆墨來寫
2.1 實作方式
具體如何實作上面連結裡有寫,這裡隻需記住如果表中存在主鍵或唯一索引時,分區列必須是唯一索引的一個組成部分。
這個是資料庫分的,應用透明,代碼無需修改任何東西。
2.2 内部檔案
先去data目錄,如果不知道目錄位置的可以執行:
接下來看下内部檔案:
從上圖我們可以看出,有2中類型的檔案,.frm檔案和.ibd檔案
- .frm檔案:表結構檔案
- .ibd檔案:InnoDB中,索引和資料都在同個檔案.ibdata(你的執行結果可能是.MYD索引檔案和.MYI資料檔案,沒關系,這是MyIsAm存儲引擎,對應着InnoDB的.ibd檔案)。因為Order這張表分為5個區,是以有5個這樣的檔案
- .par檔案:你執行的結果可能有.par檔案也可能沒有。注意:從MySql 5.7.6開始,不再建立.par分區定義檔案。分區定義存儲在内部資料字典中。
2.3 資料處理
分區表後,提高了MySql性能。如果一張表的話,那就隻有一個.ibd檔案,一顆大的B+樹。如果分表後,将按分區規則,分成不同的區,也就是一個大的B+樹,分成多個小的樹。
讀的效率肯定提升了,如果走分區鍵索引的話,先走對應分區的輔助索引B+樹,再走對應分區的聚集索引B+樹。
如果沒有走分區鍵,将會在所有分區都會執行一次。會造成多次邏輯IO!
平時開發如果想檢視sql語句的分區查詢可以使用explain partitons select xxxxx語句。可以看到一句select語句走了幾個分區。
mysql> explain partitions select * from TxnList where startTime>'2016-08-25 00:00:00' and startTime<'2016-08-25 23:59:00';
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | ClientActionTrack | p20160825 | ALL | NULL | NULL | NULL | NULL | 33868 | Using where |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
row in set (0.00 sec)
三.分庫分表
當一張表随着時間和業務的發展,庫裡表的資料量會越來越大。資料操作也随之會越來越大。
一台實體機的資源有限,最終能承載的資料量、資料的處理能力都會受到限制。這時候就會使用分庫分表來承接超大規模的表,單機放不下的那種。
差別于分區的是,分區一般都是放在單機裡的,用的比較多的是時間範圍分區,友善歸檔。隻不過分庫分表需要代碼實作,分區則是mysql内部實作。分庫分表和分區并不沖突,可以結合使用。
3.1 實作
3.1.1 分庫分表标準
- 存儲占用100G+
- 資料增量每天200w+
- 單表條數1億條+
3.1.2 分庫分表字段
分庫分表字段取值非常重要
1.在大多數場景該字段是查詢字段
2.數值型
一般使用userId,可以滿足上述條件
3.2 分布式資料庫中間件
分布式資料庫中間件分為兩種,proxy和用戶端式架構。proxy模式有MyCat、DBProxy等,用戶端式架構有TDDL、Sharding-JDBC等。
那麼proxy和用戶端式架構有何差別呢?各自有什麼優缺點呢?其實看一張圖便可知曉。
proxy模式的話我們的select和update語句都是發送給代理,由這個代理來操作具體的底層資料庫。是以必須要求代理本身需要保證高可用,否則資料庫沒有當機,proxy挂了,那就走遠了。
用戶端模式通常在連接配接池上做了一層封裝,内部與不同的庫連接配接,sql交給smart-client進行處理。通常僅支援一種語言,如果其他語言要使用,需要開發多語言用戶端。
各自的優缺點如下:
3.3 内部檔案
找了一個分庫分表+分區的例子,基本上和分區表的差不多,隻是多了多了很多表的.ibd檔案,上面有檔案的解釋:
[miaojiaxing@Grim testmydata]# ls | grep 'base_info'
base_info_00.frm
base_info_00#P#p_2018.ibd
base_info_00#P#p_2019.ibd
base_info_00#P#p_2020.ibd
base_info_00#P#p_2021.ibd
base_info_00#P#p_init.ibd
base_info_00#P#p_max.ibd
base_info_01.frm
base_info_01#P#p_2018.ibd
base_info_01#P#p_2019.ibd
base_info_01#P#p_2020.ibd
base_info_01#P#p_2021.ibd
base_info_01#P#p_init.ibd
base_info_01#P#p_max.ibd
base_info.frm
base_info.ibd
3.4 問題
3.4.1 事務問題
既然分庫分表了,那麼肯定涉及到分布式事務,如何保證插入到不同庫的多條記錄能夠要麼同時成功,要麼同時失敗。
有些同學可能想到XA,XA性能差而且不需要使用mysql5.7。柔性事務是目前主流的方案,TCC模式就屬于柔性事務。
對于分布式事務問題每家公司有自己的實作,華為用saga,阿裡用TXC,螞蟻用DTX,支援FMT模式和TCC模式。
3.4.2 join問題
tddl、MyCAT等都支援跨分片join。但是盡力避免跨庫join,比如通過字段備援的方式等。
如果出現了這種情況且中間件支援分片join,那麼可以這樣使用。如果不支援可以手工查詢。
四.總結
分表和在用途上不一樣,分表是為了承接超大規模的表,單機放不下那種。分區的話則一般都是放在單機裡的,用的比較多的是時間範圍分區,友善歸檔。
性能穩定上的話都是一個個子表,差不多,差別應該是分區表是mysql内部實作的,會比分表方案少一點資料互動。
【雲栖号線上課堂】每天都有産品技術專家分享!
課程位址:
https://yqh.aliyun.com/zhibo立即加入社群,與專家面對面,及時了解課程最新動态!
【雲栖号線上課堂 社群】
https://c.tb.cn/F3.Z8gvnK
原文釋出時間:2020-04-23
本文作者:GrimMjx
本文來自:“
網際網路架構師 微信公衆号”,了解相關資訊可以關注“
網際網路架構師”