新聞中心
近年來,隨著數(shù)據(jù)領(lǐng)域的不斷發(fā)展和應(yīng)用的不斷擴展,數(shù)據(jù)庫架構(gòu)設(shè)計已成為一個越來越重要的領(lǐng)域。而在數(shù)據(jù)庫架構(gòu)設(shè)計中,設(shè)計原則及其實際應(yīng)用更是至關(guān)重要,因為正確的設(shè)計原則和實際應(yīng)用能夠保證數(shù)據(jù)庫的高效性和可靠性。在本文中,我們將從設(shè)計原則和實際應(yīng)用兩個方面來介紹數(shù)據(jù)庫架構(gòu)設(shè)計。

成都創(chuàng)新互聯(lián)公司主營長春網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App定制開發(fā),長春h5重慶小程序開發(fā)搭建,長春網(wǎng)站營銷推廣歡迎長春等地區(qū)企業(yè)咨詢
一、設(shè)計原則
1. 數(shù)據(jù)庫的規(guī)范化設(shè)計
數(shù)據(jù)庫的規(guī)范化設(shè)計是一種減少數(shù)據(jù)冗余、優(yōu)化數(shù)據(jù)結(jié)構(gòu)的方法,一般包括三個層次:之一層歸納式范式(1NF)、第二層第二范式(2NF)和第三層第三范式(3NF)。
2. 數(shù)據(jù)庫的冗余設(shè)計
數(shù)據(jù)庫的冗余設(shè)計是一種通過復(fù)制數(shù)據(jù)來提高讀取速度、減少數(shù)據(jù)庫訪問量的方法。但是在冗余設(shè)計中必須要注意數(shù)據(jù)的一致性,否則數(shù)據(jù)的錯誤會隨著冗余不斷擴大。
3. 數(shù)據(jù)庫的分區(qū)設(shè)計
數(shù)據(jù)庫的分區(qū)設(shè)計是一種通過將數(shù)據(jù)庫分成多個分區(qū),減少數(shù)據(jù)庫訪問并提高讀寫速度的方法。分區(qū)可以基于數(shù)據(jù)分布、數(shù)據(jù)定位、數(shù)據(jù)類型等多種方式進行劃分,并可以靈活地添加、刪除分區(qū),以適應(yīng)動態(tài)的業(yè)務(wù)需求。
4. 數(shù)據(jù)庫的索引設(shè)計
索引設(shè)計是一種通過索引來優(yōu)化數(shù)據(jù)庫搜索和查詢的方法。索引必須能夠正確地選擇索引列,并考慮索引的大小、文件結(jié)構(gòu)、索引更新等因素。
二、實際應(yīng)用
1. 數(shù)據(jù)庫的安全性
數(shù)據(jù)庫的安全性是設(shè)計數(shù)據(jù)庫時必須考慮的一項重要因素。數(shù)據(jù)庫安全性包括:訪問控制、加密算法、安全存儲以及安全監(jiān)控等。
2. 數(shù)據(jù)庫的備份和恢復(fù)
數(shù)據(jù)庫的備份和恢復(fù)是一項極其重要的工作。備份可以建立數(shù)據(jù)恢復(fù)的保障,而恢復(fù)可以讓數(shù)據(jù)在發(fā)生災(zāi)害時能夠及時恢復(fù)。
3. 數(shù)據(jù)庫的性能優(yōu)化
數(shù)據(jù)庫的性能是一個評價數(shù)據(jù)庫質(zhì)量的重要指標。合理的數(shù)據(jù)庫架構(gòu)設(shè)計可以更大程度地提高數(shù)據(jù)庫的性能,并通過對數(shù)據(jù)庫的性能進行監(jiān)控和調(diào)優(yōu),保證數(shù)據(jù)庫的穩(wěn)定性和高效性。
結(jié)語
在數(shù)據(jù)庫架構(gòu)設(shè)計中,設(shè)計原則和實際應(yīng)用是相輔相成的。設(shè)計原則的正確使用能夠確保數(shù)據(jù)庫的高效性和可靠性,而實際應(yīng)用則能夠能夠保證數(shù)據(jù)庫的實際運用效果。同時,對于不同類型的應(yīng)用場景,數(shù)據(jù)庫架構(gòu)設(shè)計也需要不斷地去適應(yīng)和調(diào)整,以應(yīng)對不斷變化的業(yè)務(wù)需求。
相關(guān)問題拓展閱讀:
- 寫入mysql數(shù)據(jù)庫的數(shù)據(jù)量很大,數(shù)據(jù)庫架構(gòu)該怎么去設(shè)計?
- 數(shù)據(jù)庫架構(gòu)選型與落地,看這篇就夠了
寫入mysql數(shù)據(jù)庫的數(shù)據(jù)量很大,數(shù)據(jù)庫架構(gòu)該怎么去設(shè)計?
1.設(shè)置讀寫分離
2.進行分庫分表,用中間件路由,分攤流量
3.可以先寫入mq,然后慢慢寫入
4.可以使用tidb,tps很高
數(shù)據(jù)庫架構(gòu)選型與落地,看這篇就夠了
隨著時間和業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫中的數(shù)據(jù)量增長是不可控的,庫和表中的數(shù)據(jù)會越來越大,隨之帶來的是更高的
磁盤
、
IO
、
系統(tǒng)開銷
,甚至
性能
上的瓶頸,而單臺服務(wù)器的
資源終究是有限
的。
因此在面對業(yè)務(wù)擴張過程中,應(yīng)用程序?qū)?shù)據(jù)庫系統(tǒng)的
健壯性
,
安全性
,
擴展性
提出了更高的要求。
以下,我從數(shù)據(jù)庫架構(gòu)、選型與落地來讓大家入門。
數(shù)據(jù)庫會面臨什么樣的挑戰(zhàn)呢?
業(yè)務(wù)剛開始我們只用單機數(shù)據(jù)庫就夠了,但隨著業(yè)務(wù)增長,數(shù)據(jù)規(guī)模和用戶規(guī)模上升,這個時候數(shù)據(jù)庫會面臨IO瓶頸、存儲瓶頸、可用性、安全性問題。
為了解決上述的各種問題,數(shù)據(jù)庫衍生了出不同的架構(gòu)來解決不同的場景需求。
將數(shù)據(jù)庫的寫操作和讀操作分離,主庫接收寫請求,使用多個從庫副本負責讀請求,從庫和主庫同步更新數(shù)據(jù)保持數(shù)據(jù)一致性,從庫可以水平擴展,用于面對讀請求的增加。
這個模式也就是常說的讀寫分離,針對的是小規(guī)模數(shù)據(jù),而且存在大量讀操作的場景。
因為主從的數(shù)據(jù)是相同的,一旦主庫宕機的時候,從庫可以
切換為主庫提供寫入
,所以這個架構(gòu)也可以提高數(shù)據(jù)庫系統(tǒng)的
安全性
和
可用性
;
優(yōu)點:
缺點:
在數(shù)據(jù)庫遇到
IO瓶頸
過程中,如果IO集中在某一塊的業(yè)務(wù)中,這個時候可以考慮的就是垂直分庫,將熱點業(yè)務(wù)拆分出去,避免由
熱點業(yè)務(wù)
的
密集IO請求
影響了其他正常業(yè)務(wù),所以垂直分庫也叫
業(yè)務(wù)分庫
。
優(yōu)點:
缺點:
在數(shù)據(jù)庫遇到存儲瓶頸的時候,由于數(shù)據(jù)量過大造成索引性能下降。
這個時候可以考慮將數(shù)據(jù)做水平拆分,針對數(shù)據(jù)量巨大的單張表,按照某種規(guī)則,切分到多張表里面去。
但是這些表還是在同一個庫中,所以庫級別的數(shù)據(jù)庫操作還是有IO瓶頸(單個服務(wù)器的IO有上限)。
所以水平分嘩槐尺表主要還是針對
數(shù)據(jù)量較大
,整體業(yè)務(wù)
請求量較低
的場景。
優(yōu)點:
缺點:
四、分庫分表
在數(shù)據(jù)庫遇到存儲瓶頸和IO瓶頸的時候,數(shù)據(jù)量過大造成索引性能下降,加上同一時間需要處理大規(guī)模的業(yè)務(wù)請求,這個時候單庫的IO上限會限制處理效率。
所以需要將單張表的數(shù)據(jù)切分到多個服務(wù)器上去,每個服務(wù)器具有相應(yīng)的庫與表,只是表中數(shù)據(jù)不同。
分庫分表能夠有效地緩解單機和單庫的
性能瓶頸和壓力
,突破IO、連接數(shù)、硬件資源等的瓶頸。
優(yōu)點:
缺點:
注:分庫還是分表核心關(guān)鍵是有沒有IO瓶頸
。
分片方式都有什么呢?
RANGE(范圍分片)
將業(yè)務(wù)表中的某個
關(guān)鍵字段排序
后,按照順序從0到10000一個表,10001到20230一個表。最常見的就是
按照時間切分
(月表、年表)。
比如將6個月前,甚至一年前的數(shù)據(jù)切出去放到另外的一張表,因為隨著時間流明睜逝,這些表的數(shù)據(jù)被查詢的概率變小,銀行的交易記錄多數(shù)是采用這種方式。
優(yōu)點:
缺點:
HASH(哈希分片)
將訂單作為主表,然后將其相關(guān)的業(yè)務(wù)表作為附表,取用戶id然后
hash取模
,分配到不同的數(shù)據(jù)表或者數(shù)據(jù)庫上。
優(yōu)點:
缺點:
講到這里,我們已經(jīng)知道數(shù)據(jù)庫有哪些架構(gòu),解決的是哪些問題,因此,
我們在日常設(shè)計中需要根據(jù)數(shù)據(jù)的特點,數(shù)據(jù)的傾向性,數(shù)據(jù)的安全性等來選擇不同的架構(gòu)
。
那么,我們應(yīng)該如何選擇數(shù)據(jù)庫架構(gòu)呢?
雖然把上面的架構(gòu)全部組合在一起可以形成一個強大的高可用,高負載的數(shù)據(jù)庫系統(tǒng),但是架構(gòu)選擇合適才是最重要的。
混合架構(gòu)雖然能夠解決所有的場景的問題,但是也會面臨更多的挑戰(zhàn),你以為的完美架構(gòu),背后其實有著更多的坑。
1、對事務(wù)支持
分庫分表后(無論是垂直還是水平拆分亂高),就成了分布式事務(wù)了,如果依賴數(shù)據(jù)庫本身的分布式事務(wù)管理功能去執(zhí)行事務(wù),將付出高昂的性能代價(XA事務(wù));如果由應(yīng)用程序去協(xié)助控制,形成程序邏輯上的事務(wù),又會造成編程方面的負擔(TCC、SAGA)。
2、多庫結(jié)果并
(group by,order by)
由于數(shù)據(jù)分布于不同的數(shù)據(jù)庫中,無法直接對其做分頁、分組、排序等操作,一般應(yīng)對這種多庫結(jié)果并的查詢業(yè)務(wù)都需要采用數(shù)據(jù)清洗、同步等其他手段處理(TIDB、KUDU等)。
3、數(shù)據(jù)延遲
主從架構(gòu)下的多副本機制和水平分庫后的聚合庫都會存在主數(shù)據(jù)和副本數(shù)據(jù)之間的延遲問題。
4、跨庫join
分庫分表后表之間的關(guān)聯(lián)操作將受到限制,我們無法join位于不同分庫的表(垂直),也無法join分表粒度不同的表(水平), 結(jié)果原本一次查詢就能夠完成的業(yè)務(wù),可能需要多次查詢才能完成。
5、分片擴容
水平分片之后,一旦需要做擴容時。需要將對應(yīng)的數(shù)據(jù)做一次遷移,成本代價都極高的。
6、ID生成
分庫分表后由于數(shù)據(jù)庫獨立,原有的基于數(shù)據(jù)庫自增ID將無法再使用,這個時候需要采用其他外部的ID生成方案。
一、應(yīng)用層依賴類(JDBC)
這類分庫分表中間件的特點就是和應(yīng)用強耦合,需要應(yīng)用顯示依賴相應(yīng)的jar包(以Java為例),比如老牌的TDDL、當當開源的
sharding-jdbc
、蘑菇街的TSharding等。
此類中間件的基本思路就是重新實現(xiàn)JDBC的API,通過重新實現(xiàn)
DataSource
、
PrepareStatement
等操作數(shù)據(jù)庫的接口,讓應(yīng)用層在
基本
不改變業(yè)務(wù)代碼的情況下透明地實現(xiàn)分庫分表的能力。
中間件給上層應(yīng)用提供熟悉的JDBC API,內(nèi)部通過
sql解析
、
sql重寫
、
sql路由
等一系列的準備工作獲取真正可執(zhí)行的sql,然后底層再按照傳統(tǒng)的方法(比如數(shù)據(jù)庫連接池)獲取物理連接來執(zhí)行sql,最后把數(shù)據(jù)
結(jié)果合并
處理成ResultSet返回給應(yīng)用層。
優(yōu)點
缺點
二、中間層代理類(Proxy)
這類分庫分表中間件的核心原理是在應(yīng)用和數(shù)據(jù)庫的連接之間搭起一個
代理層
,上層應(yīng)用以
標準的MySQL協(xié)議
來連接代理層,然后代理層負責
轉(zhuǎn)發(fā)請求
到底層的MySQL物理實例,這種方式對應(yīng)用只有一個要求,就是只要用MySQL協(xié)議來通信即可。
所以用MySQL Navicat這種純的客戶端都可以直接連接你的分布式數(shù)據(jù)庫,自然也天然
支持所有的編程語言
。
在技術(shù)實現(xiàn)上除了和應(yīng)用層依賴類中間件基本相似外,代理類的分庫分表產(chǎn)品必須實現(xiàn)標準的MySQL協(xié)議,某種意義上講數(shù)據(jù)庫代理層轉(zhuǎn)發(fā)的就是MySQL協(xié)議請求,就像Nginx轉(zhuǎn)發(fā)的是Http協(xié)議請求。
比較有代表性的產(chǎn)品有開創(chuàng)性質(zhì)的Amoeba、阿里開源的Cobar、社區(qū)發(fā)展比較好的
Mycat
(基于Cobar開發(fā))等。
優(yōu)點
缺點
JDBC方案
:無中心化架構(gòu),兼容市面上大多數(shù)關(guān)系型數(shù)據(jù)庫,適用于開發(fā)高性能的輕量級 OLTP 應(yīng)用(面向前臺)。
Proxy方案
:提供靜態(tài)入口以及異構(gòu)語言的支持,適用于 OLAP 應(yīng)用(面向后臺)以及對分片數(shù)據(jù)庫進行管理和運維的場景。
混合方案
:在大型復(fù)雜系統(tǒng)中存在面向C端用戶的前臺應(yīng)用,也有面向企業(yè)分析的后臺應(yīng)用,這個時候就可以采用混合模式。
JDBC 采用無中心化架構(gòu),適用于 Java 開發(fā)的高性能的輕量級 OLTP 應(yīng)用;Proxy 提供靜態(tài)入口以及異構(gòu)語言的支持,適用于 OLAP 應(yīng)用以及對分片數(shù)據(jù)庫進行管理和運維的場景。
ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由
Sharding-JDBC
、
Sharding-Proxy
和
Sharding-Sidecar
(計劃中)這3款相互獨立的產(chǎn)品組成,他們均提供標準化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫治理功能,可適用于如Java同構(gòu)、異構(gòu)語言、容器、云原生等各種多樣化的應(yīng)用場景。
ShardingSphere提供的核心功能:
Sharding-Proxy
定位為透明化的
數(shù)據(jù)庫代理端
,提供封裝了
數(shù)據(jù)庫二進制協(xié)議的服務(wù)端版本
,用于完成對
異構(gòu)語言的支持
。
目前已提供MySQL版本,它可以使用
任何兼容MySQL協(xié)議的訪問客戶端
(如:MySQL Command Client, MySQL Workbench, Navicat等)操作數(shù)據(jù),對DBA更加友好。
向
應(yīng)用程序完全透明
,可直接當做MySQL使用。
適用于任何兼容MySQL協(xié)議的客戶端。
Sharding-JDBC
定位為
輕量級Java框架
,在Java的JDBC層提供的額外服務(wù)。 它使用客戶端直連數(shù)據(jù)庫,以jar包形式提供服務(wù),無需額外部署和依賴,可理解為
增強版的JDBC驅(qū)動,完全兼容JDBC和各種ORM框架
。
以電商SaaS系統(tǒng)為例,前臺應(yīng)用采用Sharding-JDBC,根據(jù)業(yè)務(wù)場景的差異主要分為三種方案。
分庫(用戶)
問題解析:頭部企業(yè)日活高并發(fā)高,單獨分庫避免干擾其他企業(yè)用戶,用戶數(shù)據(jù)的增長緩慢可以不分表。
拆分維度:企業(yè)ID分庫
拆分策略:頭部企業(yè)單獨庫、非頭部企業(yè)一個庫
分庫分表(訂單)
問題解析:訂單數(shù)據(jù)增長速度較快,在分庫之余需要分表。
拆分維度:企業(yè)ID分庫、用戶ID分表
拆分策略:頭部企業(yè)單獨庫、非頭部企業(yè)一個庫,分庫之后用戶ID取模拆分表
單庫分表(附件)
問題解析:附件數(shù)據(jù)特點是并發(fā)量不大,只需要解決數(shù)據(jù)增長問題,所以單庫IO足以支撐的情況下分表即可。
拆分維度:用戶ID分表
拆分策略:用戶ID取模分表
問題一:分布式事務(wù)
分布式事務(wù)過于復(fù)雜也是分布式系統(tǒng)最難處理的問題,由于篇幅有限,后續(xù)會開篇專講這一塊內(nèi)容。
問題二:分布式ID
問題三:跨片查詢
舉個例子,以用戶id分片之后,需要根據(jù)企業(yè)id查詢企業(yè)所有用戶信息。
sharding針對跨片查詢也是能夠支持的,本質(zhì)上sharding的跨片查詢是采用同時查詢多個分片的數(shù)據(jù),然后聚合結(jié)果返回,這個方式對資源耗費比較大,特別是對數(shù)據(jù)庫連接資源的消耗。
假設(shè)分4個數(shù)據(jù)庫,8個表,則sharding會同時發(fā)出32個SQL去查詢。一下子消耗掉了32個連接;
特別是針對單庫分表的情況要注意,假設(shè)單庫分64個表,則要消耗64個連接。如果我們部署了2個節(jié)點,這個時候兩個節(jié)點同時查詢的話,就會遇到數(shù)據(jù)庫連接數(shù)上限問題(mysql默認100連接數(shù))
問題四:分片擴容
隨著數(shù)據(jù)增長,每個片區(qū)的數(shù)據(jù)也會達到瓶頸,這個時候需要將原有的分片數(shù)量進行增加。由于增加了片區(qū),原先的hash規(guī)則也跟著變化,造成了需要將舊數(shù)據(jù)做遷移。
假設(shè)原先1個億的數(shù)據(jù),hash分64個表,現(xiàn)在增長到50億的數(shù)據(jù),需要擴容到128個表,一旦擴容就需要將這50億的數(shù)據(jù)做一次遷移,遷移成本是無法想象的。
問題五:一致性哈希
首先,求出每個
服務(wù)器的hash值
,將其配置到一個
0~2^n 的圓環(huán)上
(n通常取32)
其次,用同樣的方法求出待
存儲對象的主鍵 hash值
,也將其配置到這個圓環(huán)上。
然后,從數(shù)據(jù)映射到的位置開始順時針查找,將數(shù)據(jù)分布到找到的之一個服務(wù)器節(jié)點上。
一致性hash的優(yōu)點在于加入和刪除節(jié)點時只會影響到在哈希環(huán)中相鄰的節(jié)點,而對其他節(jié)點沒有影響。
所以使用一致性哈希在集群擴容過程中可以減少數(shù)據(jù)的遷移。
好了,這次分享到這里,我們?nèi)粘5膶嵺`可能只會用到其中一種方案,但它不是數(shù)據(jù)庫架構(gòu)的全貌,打開技術(shù)視野,才能更好地把存儲工具利用起來。
老規(guī)矩,一鍵三連,日入兩千,點贊在看,年薪百萬!
本文作者:Jensen
7年Java老兵,小米主題設(shè)計師,手機輸入法設(shè)計師,ProcessOn特邀講師。
曾涉獵航空、電信、IoT、垂直電商產(chǎn)品研發(fā),現(xiàn)就職于某老牌電商企業(yè)。
技術(shù)公眾號
【架構(gòu)師修行錄】
號主,專注于分享日常架構(gòu)、技術(shù)、職場干貨,Java Goals:架構(gòu)師。
交個朋友,一起成長!
設(shè)計數(shù)據(jù)庫架構(gòu)設(shè)計的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于設(shè)計數(shù)據(jù)庫架構(gòu)設(shè)計,數(shù)據(jù)庫架構(gòu)設(shè)計:從設(shè)計原則到實際應(yīng)用,寫入mysql數(shù)據(jù)庫的數(shù)據(jù)量很大,數(shù)據(jù)庫架構(gòu)該怎么去設(shè)計?,數(shù)據(jù)庫架構(gòu)選型與落地,看這篇就夠了的信息別忘了在本站進行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級標準機房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達10T,機柜接入千兆交換機,能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認可。
當前題目:數(shù)據(jù)庫架構(gòu)設(shè)計:從設(shè)計原則到實際應(yīng)用(設(shè)計數(shù)據(jù)庫架構(gòu)設(shè)計)
文章URL:http://www.dlmjj.cn/article/djsgsie.html


咨詢
建站咨詢
