當前位置:首頁 » 操作系統 » 資料庫的選型

資料庫的選型

發布時間: 2023-03-07 20:33:34

❶ 2019數據架構選型必讀:1月資料庫產品技術解析

本期目錄

DB-Engines資料庫排行榜

新聞快訊

一、RDBMS家族

二、Nosql家族

三、NewSQL家族

四、時間序列

五、大數據生態圈

六、國產資料庫概覽

七、雲資料庫

八、推出dbaplus Newsletter的想法

九、感謝名單

為方便閱讀、重點呈現,本期Newsletter(2019年1月)將對各個板塊的內容進行精簡。需要閱讀全文的同學可點擊文末 【閱讀原文】 或登錄https://pan..com/s/13BgipbaHeMfvm0YPtiYviA

進行下載。

DB-Engines資料庫排行榜

以下取自2019年1月的數據,具體信息可以參考http://db-engines.com/en/ranking/,數據僅供參考。

DB-Engines排名的數據依據5個不同的因素:

新聞快訊

1、2018年9月24日,微軟公布了SQL Server2019預覽版,SQL Server 2019將結合Spark創建統一數據平台。

2、2018年10月5日,ElasticSearch在美國紐約證券交易所上市。

3、亞馬遜放棄甲骨文資料庫軟體,導致最大倉庫之一在黃金時段宕機。受此消息影響,亞馬遜盤前股價小幅跳水,跌超2%。

4、2018年10月31日,Percona發布了Percona Server 8.0 RC版本,發布對MongoDB 4.0的支持,發布對XtraBackup測試第二個版本。

5、2018年10月31日,Gartner陸續發布了2018年的資料庫系列報告,包括《資料庫魔力象限》、《資料庫核心能力》以及《資料庫推薦報告》。

今年的總上榜資料庫產品達到了5家,分別來自:阿里雲,華為,巨杉資料庫,騰訊雲,星環 科技 。其中阿里雲和巨杉資料庫已經連續兩年入選。

6、2018年11月初,Neo4j宣布完成E輪8000萬美元融資。11月15日,Neo4j宣布企業版徹底閉源:

7、2019年1月8日,阿里巴巴以1.033億美元(9000萬歐元)的價格收購了Apache Flink商業公司DataArtisans。

8、2019年1月11日早間消息,亞馬遜宣布推出雲資料庫軟體,亞馬遜和MongoDB將會直接競爭。

RDBMS家族

Oracle 發布18.3版本

2018年7月,Oracle Database 18.3通用版開始提供下載。我們可以將Oracle Database 18c視為採用之前發布模式的Oracle Database 12c第2版的第一個補丁集。未來,客戶將不再需要等待多年才能用上最新版Oracle資料庫,而是每年都可以期待新資料庫特性和增強。Database 19c將於2019年Q1率先在Oracle cloud上發布雲版本。

Oracle Database 18c及19c部分關鍵功能:

1、性能

2、多租戶,大量功能增強及改進,大幅節省成本和提高敏捷性

3、高可用

4、數據倉庫和大數據

MySQL發布8.0.13版本

1、賬戶管理

經過配置,修改密碼時,必須帶上原密碼。在之前的版本,用戶登錄之後,就可以修改自己的密碼。這種方式存在一定安全風險。比如用戶登錄上資料庫後,中途離開一段時間,那麼非法用戶可能會修改密碼。由參數password_require_current控制。

2、配置

Innodb表必須有主鍵。在用戶沒有指定主鍵時,系統會生成一個默認的主鍵。但是在主從復制的場景下,默認的主鍵,會對叢庫應用速度帶來致命的影響。如果設置sql_require_primary_key,那麼資料庫會強制用戶在創建表、修改表時,加上主鍵。

3、欄位默認值

BLOB、TEXT、GEOMETRY和JSON欄位可以指定默認值了。

4、優化器

1)Skip Scan

非前綴索引也可以用了。

之前的版本,任何沒有帶上f1欄位的查詢,都沒法使用索引。在新的版本中,它可以忽略前面的欄位,讓這個查詢使用到索引。其實現原理就是把(f1 = 1 AND f2 > 40) 和(f1 = 2 AND f2 > 40)的查詢結果合並。

2)函數索引

之前版本只能基於某個列或者多個列加索引,但是不允許在上面做計算,如今這個限制消除了。

5、SQL語法

GROUP BY ASC和GROUP BY DESC語法已經被廢棄,要想達到類似的效果,請使用GROUP BY ORDER BY ASC和GROUP BY ORDER BY DESC。

6、功能變化

1)設置用戶變數,請使用SET語句

如下類型語句將要被廢棄SELECT @var, @var:=@var+1。

2)新增innodb_fsync_threshold

該變數是控制文件刷新到磁碟的速率,防止磁碟在短時間內飽和。

3)新增會話級臨時表空間

在以往的版本中,當執行SQL時,產生的臨時表都在全局表空間ibtmp1中,及時執行結束,臨時表被釋放,空間不會被回收。新版本中,會為session從臨時表空間池中分配一個臨時表空間,當連接斷開時,臨時表空間的磁碟空間被回收。

4)在線切換Group Replication的狀態

5)新增了group_replication_member_expel_timeout

之前,如果某個節點被懷疑有問題,在5秒檢測期結束之後,那麼就直接被驅逐出這個集群。即使該節點恢復正常時,也不會再被加入集群。那麼,瞬時的故障,會把某些節點驅逐出集群。

group_replication_member_expel_timeout讓管理員能更好的依據自身的場景,做出最合適的配置(建議配置時間小於一個小時)。

MariaDB 10.3版本功能展示

1、MariaDB 10.3支持update多表ORDER BY and LIMIT

1)update連表更新,limit語句

update t1 join t2 on t1.id=t2.id set t1.name='hechunyang' limit 3;

MySQL 8.0直接報錯

MariaDB 10.3更新成功

2)update連表更新,ORDER BY and LIMIT語句

update t1 join t2 on t1.id=t2.id set t1.name='HEchunyang' order by t1.id DESC limit 3;

MySQL 8.0直接報錯

MariaDB 10.3更新成功

參考:

https://jira.mariadb.org/browse/MDEV-13911

2、MariaDB10.3增補AliSQL補丁——安全執行Online DDL

Online DDL從名字上看很容易誤導新手,以為不論什麼情況,修改表結構都不會鎖表,理想很豐滿,現實很骨感,注意這個坑!

有以下兩種情況執行DDL操作會鎖表的,Waiting for table metadata lock(元數據表鎖):

針對第二種情況,MariaDB10.3增補AliSQL補丁-DDL FAST FAIL,讓其DDL操作快速失敗。

例:

如果線上有某個慢SQL對該表進行操作,可以使用WAIT n(以秒為單位設置等待)或NOWAIT在語句中顯式設置鎖等待超時,在這種情況下,如果無法獲取鎖,語句將立即失敗。 WAIT 0相當於NOWAIT。

參考:

https://jira.mariadb.org/browse/MDEV-11388

3、MariaDB Window Functions窗口函數分組取TOP N記錄

窗口函數在MariaDB10.2版本里實現,其簡化了復雜SQL的撰寫,提高了可讀性。

參考:

https://mariadb.com/kb/en/library/window-functions-overview/

Percona Server發布8.0 GA版本

2018年12月21日,Percona發布了Percona Server 8.0 GA版本。

在支持MySQL8.0社區的基礎版上,Percona Server for MySQL 8.0版本中帶來了許多新功能:

1、安全性和合規性

2、性能和可擴展性

3、可觀察性和可用性

Percona Server for MySQL 8.0中將要被廢用功能:

Percona Server for MySQL 8.0中刪除的功能:

RocksDB發布V5.17.2版本

2018年10月24日,RocksDB發布V5.17.2版本。

RocksDB是Facebook在LevelDB基礎上用C++寫的高效內嵌式K/V存儲引擎。相比LevelDB,RocksDB提供了Column-Family,TTL,Transaction,Merge等方面的支持。目前MyRocks,TiKV等底層的存儲都是基於RocksDB來構建。

PostgreSQL發布11版本

2018年10月18日,PostgreSQL 11發布。

1、PostgreSQL 11的重大增強

2、PostgreSQL 插件動態

1)分布式插件citus發布 8.1

citus是PostgreSQL的一款sharding插件,目前國內蘇寧、鐵總、探探有較大量使用案例。

https://github.com/citusdata/citus

2)地理信息插件postgis發布2.5.1

PostGIS是專業的時空資料庫插件,在測繪、航天、氣象、地震、國土資源、地圖等時空專業領域應用廣泛。同時在互聯網行業也得到了對GIS有性能、功能深度要求的客戶青睞,比如共享出行、外賣等客戶。

http://postgis.net/

3)時序插件timescale發布1.1.1

timescale是PostgreSQL的一款時序資料庫插件,在IoT行業中有非常好的應用。github star數目前有5000多,是一個非常火爆的插件。

https://github.com/timescale/timescaledb

4)流計算插件 pipelinedb 正式插件化

Pipelinedb是PostgreSQL的一款流計算插件,使用這個創建可以對高速寫入的數據進行實時根據定義的聚合規則進行聚合(支持概率計算),實時根據定義的規則觸發事件(支持事件處理函數的自定義)。可用於IoT,監控,FEED實時計算等場景。

https://github.com/pipelinedb/pipelinedb

3、PostgreSQL衍生開源產品動態

1)agensgraph發布 2.0.0版本

agensgraph是兼容PostgreSQL、opencypher的專業圖資料庫,適合圖式關系的管理。

https://github.com/bitnine-oss/agensgraph

2)gpdb發布5.15

gpdb是兼容PostgreSQL的mpp資料庫,適合OLAP場景。近兩年,gpdb一直在追趕PostgreSQL的社區版本,預計很快會追上10的PostgreSQL,在TP方面的性能也會得到顯著提升。

https://github.com/greenplum-db/gpdb

3)antdb發布3.2

antdb是以Postgres-XC為基礎開發的一款PostgreSQL sharding資料庫,亞信主導開發,開源,目前主要服務於亞信自有客戶。

https://github.com/ADBSQL/AntDB

4)遷移工具MTK發布52版本

MTK是EDB提供的可以將Oracle、PostgreSQL、MySQL、MSSQL、Sybase資料庫遷移到PostgreSQL, PPAS的產品,遷移速度可以達到100萬行/s以上。

https://github.com/digoal/blog/blob/master/201812/20181226_01.md

DB2發布 11.1.4.4版本

DB2最新發布Mod Pack 4 and Fix Pack 4,包含以下幾方面的改動及增強:

1、性能

2、高可用

3、管理視圖

4、應用開發方面

5、聯邦功能

6、pureScale

NoSQL家族

Redis發布5.0.3版本

MongoDB升級更新MongoDB Mobile和MongoDB Stitch

2018年11月21日,MongoDB升級更新MongoDB Mobile和MongoDB Stitch,助力開發人員提升工作效率。

MongoDB 公司日前發布了多項新產品功能,旨在更好地幫助開發人員在世界各地管理數據。通過利用存儲在移動設備和後台資料庫的數據之間的實時、自動的同步特性,MongoDB Mobile通用版本助力開發人員構建更快捷、反應更迅速的應用程序。此前,這只能通過在移動應用內部安裝一個可供選擇或限定功能的資料庫來實現。

MongoDB Mobile在為客戶提供隨處運行的自由度方面更進了一步。用戶在iOS和安卓終端設備上可擁有MongoDB所有功能,將網路邊界擴展到其物聯網資產范疇。應用系統還可以使用MongoDB Stitch的軟體開發包訪問移動客戶端或後台數據,幫助開發人員通過他們希望的任意方式查詢移動終端數據和物聯網數據,包括本地讀寫、本地JSON存儲、索引和聚合。通過Stitch移動同步功能(現可提供beta版),用戶可以自動對保存在本地的數據以及後台資料庫的數據進行同步。

本期新秀:Cassandra發布3.11.3版本

2018年8月11日,Cassandra發布正式版3.11.3。

Apache Cassandra是一款開源分布式NoSQL資料庫系統,使用了基於Google BigTable的數據模型,與面向行(row)的傳統關系型資料庫或鍵值存儲key-value資料庫不同,Cassandra使用的是寬列存儲模型(Wide Column Stores)。與BigTable和其模仿者HBase不同,數據並不存儲在分布式文件系統如GFS或HDFS中,而是直接存於本地。

Cassandra的系統架構與Amazon DynamoDB類似,是基於一致性哈希的完全P2P架構,每行數據通過哈希來決定應該存在哪個或哪些節點中。集群沒有master的概念,所有節點都是同樣的角色,徹底避免了整個系統的單點問題導致的不穩定性,集群間的狀態同步通過Gossip協議來進行P2P的通信。

3.11.3版本的一些bug fix和改進:

NewSQL家族

TiDB 發布2.1.2版本

2018 年 12 月 22 日,TiDB 發布 2.1.2 版,TiDB-Ansible 相應發布 2.1.2 版本。該版本在 2.1.1 版的基礎上,對系統兼容性、穩定性做出了改進。

TiDB 是一款定位於在線事務處理/在線分析處理( HTAP: Hybrid Transactional/Analytical Processing)的融合型資料庫產品。除了底層的 RocksDB 存儲引擎之外,分布式SQL層、分布式KV存儲引擎(TiKV)完全自主設計和研發。

TiDB 完全開源,兼容MySQL協議和語法,可以簡單理解為一個可以無限水平擴展的MySQL,並且提供分布式事務、跨節點 JOIN、吞吐和存儲容量水平擴展、故障自恢復、高可用等優異的特性;對業務沒有任何侵入性,簡化開發,利於維護和平滑遷移。

TiDB:

PD:

TiKV:

Tools:

1)TiDB-Lightning

2)TiDB-Binlog

EsgynDB發布R2.5版本

2018年12月22日,EsgynDB R2.5版本正式發布。

作為企業級產品,EsgynDB 2.5向前邁進了一大步,它擁有以下功能和改進:

CockroachDB發布2.1版本

2018年10月30日,CockroachDB正式發布2.1版本,其新增特性如下:

新增企業級特性:

新增SQL特性:

新增內核特性:

Admin UI增強:

時間序列

本期新秀:TimescaleDB發布1.0版本

10月底,TimescaleDB 1.0宣布正式推出,官方表示該版本已可用於生產環境,支持完整SQL和擴展。

TimescaleDB是基於PostgreSQL資料庫開發的一款時序資料庫,以插件化的形式打包提供,隨著PostgreSQL的版本升級而升級,不會因為另立分支帶來麻煩。

TimescaleDB架構:

數據自動按時間和空間分片(chunk)

更新亮點:

https://github.com/timescale/timescaledb/releases/tag/1.0.0

大數據生態圈

Hadoop發布2.9.2版本

2018年11月中旬,Hadoop在2.9分支上發布了新的2.9.2版本,該版本進行了204個大大小小的變更,主要變更如下:

Greenplum 發布5.15版本

Greenplum最新的5.15版本中發布了流式數據載入工具。

該版本中的Greenplum Streem Server組件已經集成了Kafka流式載入功能,並通過了Confluent官方的集成認證,其支持的主要功能如下:

國產資料庫概覽

K-DB發布資料庫一體機版

2018年11月7日,K-DB發布了資料庫一體機版。該版本更新情況如下:

OceanBase遷移服務發布1.0版本

1月4日,OceanBase 正式發布OMS遷移服務1.0版本。

以下內容包含 OceanBase 遷移服務的重要特性和功能:

SequoiaDB發布3.0.1新版本

1、架構

1)完整計算存儲分離架構,兼容MySQL協議、語法

計算存儲分離體系以松耦合的方式將計算與存儲層分別部署,通過標准介面或插件對各個模塊和組件進行無縫替換,在計算層與存儲層均可實現自由的彈性伸縮。

SequoiaDB巨杉資料庫「計算-存儲分離」架構詳細示意

用戶可以根據自身業務特徵選擇面向交易的SQL解析器(例如MySQL或PGSQL)或面向統計分析的執行引擎(例如SparkSQL)。眾所周知,使用不同的SQL優化與執行方式,資料庫的訪問性能可能會存在上千上萬倍的差距。計算存儲分離的核心思想便是在數據存儲層面進行一體化存儲,在計算層面則利用每種執行引擎的特點針對不同業務場景進行選擇和優化,用戶可以在存儲層進行邏輯與物理的隔離,將面向高頻交易的前端業務與面向高吞吐量的統計分析使用不同的硬體進行存儲,確保在多類型數據訪問時互不幹擾,以真正達到生產環境可用的多租戶與HTAP能力。

2、其他更新信息

1)介面變更:

2)主要特性:

雲資料庫

本期新秀:騰訊發布資料庫CynosDB,開啟公測

1、News

1)騰訊雲資料庫MySQL2018年重大更新:

2)騰訊雲資料庫MongoDB2018年重大更新:

3)騰訊雲資料庫Redis/CKV+2018年重大更新:

4)騰訊雲資料庫CTSDB2018年重大更新:

2、Redis 4.0集群版商業化上線

2018年10月,騰訊雲資料庫Redis 4.0集群版完成邀測、公測、商業化三個迭代,在廣州、上海、北京正式全量商業化上線。

產品特性:

使用場景:

官網文檔:

https://cloud.tencent.com/document/proct/239/18336

3、騰訊自研資料庫CynosDB發布,開啟公測

2018年11月22日,騰訊雲召開新一代自研資料庫CynosDB發布會,業界第一款全面兼容市面上兩大最主流的開源資料庫MySQL和PostgreSQL的高性能企業級分布式雲資料庫。

本期新秀:京東雲DRDS發布1.0版本

12月24日,京東雲分布式關系型資料庫DRDS正式發布1.0版本。

DRDS是京東雲精心自研的資料庫中間件產品,獲得了2018年 」可信雲技術創新獎」。DRDS可實現海量數據下的自動分庫分表,具有高性能,分布式,彈性升級,兼容MySQL等優點,適用於高並發、大規模數據的在線交易, 歷史 數據查詢,自動數據分片等業務場景,歷經多次618,雙十一的考驗,已經在京東集團內大規模使用。

京東雲DRDS產品有以下主要特性

1)自動分庫分表

通過簡單的定義即可自動實現分庫分表,將數據實際存放在多個MySQL實例的資料庫中,但呈現給應用程序的依舊是一張表,對業務透明,應用程序幾乎無需改動,實現了對資料庫存儲和處理能力的水平擴展。

2)分布式架構

基於分布式架構的集群方案,多個對等節點同時對外提供服務,不但可有效規避服務的單點故障,而且更加容易擴展。

3)超強性能

具有極高的處理能力,雙節點即可支持數萬QPS,滿足用戶超大規模處理能力的需求。

4)兼容MySQL

兼容絕大部分MySQL語法,包括MySQL語法、數據類型、索引、常用函數、排序、關聯等DDL,DML語句,使用成本低。

參考鏈接:

https://www.jdcloud.com/cn/procts/drds

RadonDB發布1.0.3版本

2018年12月26日,MyNewSQL領域的RadonDB雲資料庫發布1.0.3版本。

推出dbaplus Newsletter的想法

dbaplus Newsletter旨在向廣大技術愛好者提供資料庫行業的最新技術發展趨勢,為社區的技術發展提供一個統一的發聲平台。為此,我們策劃了RDBMS、NoSQL、NewSQL、時間序列、大數據生態圈、國產資料庫、雲資料庫等幾個版塊。

我們不以商業宣傳為目的,不接受任何商業廣告宣傳,嚴格審查信息源的可信度和准確性,力爭為大家提供一個純凈的技術學習環境,歡迎大家監督指正。

至於Newsletter發布的周期,目前計劃是每三個月左右會做一次跟進, 下期計劃時間是2019年4月14日~4月25日, 如果有相關的信息提供請發送至郵箱:[email protected]

感謝名單

最後要感謝那些提供寶貴信息和建議的專家朋友,排名不分先後。

往期回顧:

↓↓別忘了點這里下載 2019年1月 完整版Newsletter 哦~

❷ 資料庫數據類型怎麼選擇最優

什麼資料庫?如果是MySQL,就使用varchar類型,定義為varchar(n)。如果是Oracle,就使用varchar2類型,定義為varchar2(n)。這個數據類型的意思是變長度的字元串,括弧中的n是最大長度。如果實際的數據長度小於括弧中的定義長度,則佔用空間為實際數據長度。一般可以把n取的大一些,確保為這個欄位可能的最大長度。

❸ 如何選擇出最適合做網店的資料庫系統

首先,先介紹幾款在網店系統中使用最常見的資料庫。
Access資料庫,在ASP網店系統流行時,是一款應用非常廣泛的資料庫,它最大的特點就是操作、維護簡單,管理方便。但對儲存數據較大的網站,Access在存儲、處理、安全等角度就顯得吃力。隨著ASP技術被微軟淘汰,Access在網店系統中的應用也不在明顯。
Mysql資料庫,由於其主要的管理程序和運行環境都是開源的,因此發展非常迅速,在網店系統中的應用也非常廣泛,特別在PHP網店系統中資料庫無一例外選擇的是Mysql。但Mysql資料庫的介面支持彼此不統一,在資料庫對接上存在一定的困難。
SQL server資料庫,也是目前網店系統行業應用最多的資料庫之一,隨著微軟在互聯網方面的技術投入,11545.html">我們有理由相信它會越來越強大。SQL server的特點是具有很好的伸縮性,可跨越多種平台使用,對Web技術的支持,使用戶能夠很容易地將資料庫中的數據發布到Web頁面上。
Oracle資料庫,在網店系統行業來講是比較高端、安全的資料庫,適合大型網點應用,如金融、國防、政府、世界五百強等網站,都是採用了Oracle資料庫。
筆者近期也研究了幾款國內知名網店系統,像SHOP++、ECSHOP、V5SHOP、SHOPEX等都在研究范圍內。SHOP++是基於JAVA技術的網店系統,支持Mysql、SQL server、Oracle等多種資料庫;ECSHOP和SHOPEX同是PHP技術開發的,同是商派旗下產品,資料庫採用的是Mysql;V5SHOP是.NET技術中的老牌產品,資料庫支持Mysql,若要支持SQL server必需先要獲取資料庫用戶名和密碼。顯然,在網店系統行業若系統能同時支持多種資料庫則會是最佳選擇。
接下來進入正題,分析資料庫在網店系統中的作用
通過我對幾款網店系統的研究,各網店系統正常安裝分為:程序安裝和環境部署,而環境部署過程中就包含了資料庫的安裝。資料庫我們都知道,在網店在主要是存儲功能,如網站的資料、圖片等都是儲存在資料庫上。對於一個有意義的網站來說,資料庫是必不可缺的,我們常見的動態網站就是通過資料庫的存儲、輸出來產生。如果是靜態頁面,就不需要存儲資料、圖片了,更不用使用資料庫。
說到資料庫還有一點是讓站長最勞心的就屬數據的遷移了,若有站長對網站數據的遷移存有疑惑,不防可以參照下面的方法操作:
a.進入網站後台,對數據進行備份,以防發生意外;
b.進入空間將home和image文件用ftp下載到本地;
c.安裝新的網店程序,設置好管理賬戶、資料庫的用戶名和密碼;
d.解析域名;
e.上傳home和image文件;
f.進入後台對備份的數據恢復,更新後台,退出;
g.重新登錄,訪問正常,即遷移成功;
其實,資料庫在網店系統中還有一個非常重要的作用--安全,也是本文的重點:
資料庫的對網店系統有安全一面,可能有網友不解。我們舉一個例子,小偷同時光顧Access資料庫和Oracle資料庫,你會發現小偷在Access資料庫中可以來去自由,資料庫文件不經意間就被任意DOWN走了。而光顧Oracle資料庫,進入「保險庫」大門後,發現還有一個警察拿著槍對著他,相比下使用Oracle的網店系統安全方面就更強。如網頁編輯程序ewebeditor一樣,只因使用了Access資料庫,就造成了數以萬計的站點因為它而被黑客輕輕鬆鬆的黑掉了。所以,資料庫的選擇也關繫到網店系統的安全。

求採納

❹ 如何選擇合適的資料庫

如何選擇資料庫

一般來講,數據分析的查詢不會直接從生產環境的資料庫來讀取數據,一方面是影響線上性能,另一方面是OLTP的表結構設計更多的是面向插入,而不是讀取。如何來選擇合適的資料庫做數據分析呢?本文給出了四方面的考量,拋磚引玉。

1. 客戶要分析什麼樣的數據

2. 客戶分析的數據量是多少

3. 客戶工程師團隊技術背景,運維能力

4. 預期的數據分析的響應時間

客戶要分析什麼樣的數據

上文已簡單介紹了關系型資料庫和非關系型資料庫的區別,這里就不再贅述。下圖是一個簡單的分類。

❺ 資料庫架構選型與落地,看這篇就夠了

隨著時間和業務的發展,資料庫中的數據量增長是不可控的,庫和表中的數據會越來越大,隨之帶來的是更高的 磁碟 IO 系統開銷 ,甚至 性能 上的瓶頸,而單台伺服器的 資源終究是有限 的。

因此在面對業務擴張過程中,應用程序對資料庫系統的 健壯性 安全性 擴展性 提出了更高的要求。

以下,我從資料庫架構、選型與落地來讓大家入門。

資料庫會面臨什麼樣的挑戰呢?

業務剛開始我們只用單機資料庫就夠了,但隨著業務增長,數據規模和用戶規模上升,這個時候資料庫會面臨IO瓶頸、存儲瓶頸、可用性、安全性問題。

為了解決上述的各種問題,資料庫衍生了出不同的架構來解決不同的場景需求。

將資料庫的寫操作和讀操作分離,主庫接收寫請求,使用多個從庫副本負責讀請求,從庫和主庫同步更新數據保持數據一致性,從庫可以水平擴展,用於面對讀請求的增加。

這個模式也就是常說的讀寫分離,針對的是小規模數據,而且存在大量讀操作的場景。

因為主從的數據是相同的,一旦主庫宕機的時候,從庫可以 切換為主庫提供寫入 ,所以這個架構也可以提高資料庫系統的 安全性 可用性

優點:

缺點:

在資料庫遇到 IO瓶頸 過程中,如果IO集中在某一塊的業務中,這個時候可以考慮的就是垂直分庫,將熱點業務拆分出去,避免由 熱點業務 密集IO請求 影響了其他正常業務,所以垂直分庫也叫 業務分庫

優點:

缺點:

在資料庫遇到存儲瓶頸的時候,由於數據量過大造成索引性能下降。

這個時候可以考慮將數據做水平拆分,針對數據量巨大的單張表,按照某種規則,切分到多張表裡面去。

但是這些表還是在同一個庫中,所以庫級別的資料庫操作還是有IO瓶頸(單個伺服器的IO有上限)。

所以水平分表主要還是針對 數據量較大 ,整體業務 請求量較低 的場景。

優點:

缺點:

四、分庫分表

在資料庫遇到存儲瓶頸和IO瓶頸的時候,數據量過大造成索引性能下降,加上同一時間需要處理大規模的業務請求,這個時候單庫的IO上限會限制處理效率。

所以需要將單張表的數據切分到多個伺服器上去,每個伺服器具有相應的庫與表,只是表中數據集合不同。

分庫分表能夠有效地緩解單機和單庫的 性能瓶頸和壓力 ,突破IO、連接數、硬體資源等的瓶頸。

優點:

缺點:

註:分庫還是分表核心關鍵是有沒有IO瓶頸

分片方式都有什麼呢?

RANGE(范圍分片)

將業務表中的某個 關鍵欄位排序 後,按照順序從0到10000一個表,10001到20000一個表。最常見的就是 按照時間切分 (月表、年表)。

比如將6個月前,甚至一年前的數據切出去放到另外的一張表,因為隨著時間流逝,這些表的數據被查詢的概率變小,銀行的交易記錄多數是採用這種方式。

優點:

缺點:

HASH(哈希分片)

將訂單作為主表,然後將其相關的業務表作為附表,取用戶id然後 hash取模 ,分配到不同的數據表或者資料庫上。

優點:

缺點:

講到這里,我們已經知道資料庫有哪些架構,解決的是哪些問題,因此, 我們在日常設計中需要根據數據的特點,數據的傾向性,數據的安全性等來選擇不同的架構

那麼,我們應該如何選擇資料庫架構呢?

雖然把上面的架構全部組合在一起可以形成一個強大的高可用,高負載的資料庫系統,但是架構選擇合適才是最重要的。

混合架構雖然能夠解決所有的場景的問題,但是也會面臨更多的挑戰,你以為的完美架構,背後其實有著更多的坑。

1、對事務支持

分庫分表後(無論是垂直還是水平拆分),就成了分布式事務了,如果依賴資料庫本身的分布式事務管理功能去執行事務,將付出高昂的性能代價(XA事務);如果由應用程序去協助控制,形成程序邏輯上的事務,又會造成編程方面的負擔(TCC、SAGA)。

2、多庫結果集合並 (group by,order by)

由於數據分布於不同的資料庫中,無法直接對其做分頁、分組、排序等操作,一般應對這種多庫結果集合並的查詢業務都需要採用數據清洗、同步等其他手段處理(TIDB、KUDU等)。

3、數據延遲

主從架構下的多副本機制和水平分庫後的聚合庫都會存在主數據和副本數據之間的延遲問題。

4、跨庫join

分庫分表後表之間的關聯操作將受到限制,我們無法join位於不同分庫的表(垂直),也無法join分表粒度不同的表(水平), 結果原本一次查詢就能夠完成的業務,可能需要多次查詢才能完成。

5、分片擴容

水平分片之後,一旦需要做擴容時。需要將對應的數據做一次遷移,成本代價都極高的。

6、ID生成

分庫分表後由於資料庫獨立,原有的基於資料庫自增ID將無法再使用,這個時候需要採用其他外部的ID生成方案。

一、應用層依賴類(JDBC)

這類分庫分表中間件的特點就是和應用強耦合,需要應用顯示依賴相應的jar包(以Java為例),比如知名的TDDL、當當開源的 sharding-jdbc 、蘑菇街的TSharding等。

此類中間件的基本思路就是重新實現JDBC的API,通過重新實現 DataSource PrepareStatement 等操作資料庫的介面,讓應用層在 基本 不改變業務代碼的情況下透明地實現分庫分表的能力。

中間件給上層應用提供熟悉的JDBC API,內部通過 sql解析 sql重寫 sql路由 等一系列的准備工作獲取真正可執行的sql,然後底層再按照傳統的方法(比如資料庫連接池)獲取物理連接來執行sql,最後把數據 結果合並 處理成ResultSet返回給應用層。

優點

缺點

二、中間層代理類(Proxy)

這類分庫分表中間件的核心原理是在應用和資料庫的連接之間搭起一個 代理層 ,上層應用以 標準的MySQL協議 來連接代理層,然後代理層負責 轉發請求 到底層的MySQL物理實例,這種方式對應用只有一個要求,就是只要用MySQL協議來通信即可。

所以用MySQL Navicat這種純的客戶端都可以直接連接你的分布式資料庫,自然也天然 支持所有的編程語言

在技術實現上除了和應用層依賴類中間件基本相似外,代理類的分庫分表產品必須實現標準的MySQL協議,某種意義上講資料庫代理層轉發的就是MySQL協議請求,就像Nginx轉發的是Http協議請求。

比較有代表性的產品有開創性質的Amoeba、阿里開源的Cobar、社區發展比較好的 Mycat (基於Cobar開發)等。

優點

缺點

JDBC方案 :無中心化架構,兼容市面上大多數關系型資料庫,適用於開發高性能的輕量級 OLTP 應用(面向前台)。

Proxy方案 :提供靜態入口以及異構語言的支持,適用於 OLAP 應用(面向後台)以及對分片資料庫進行管理和運維的場景。

混合方案 :在大型復雜系統中存在面向C端用戶的前台應用,也有面向企業分析的後台應用,這個時候就可以採用混合模式。

JDBC 採用無中心化架構,適用於 Java 開發的高性能的輕量級 OLTP 應用;Proxy 提供靜態入口以及異構語言的支持,適用於 OLAP 應用以及對分片資料庫進行管理和運維的場景。

ShardingSphere是一套開源的分布式資料庫中間件解決方案組成的生態圈,它由 Sharding-JDBC Sharding-Proxy Sharding-Sidecar (計劃中)這3款相互獨立的產品組成,他們均提供標准化的數據分片、分布式事務和資料庫治理功能,可適用於如Java同構、異構語言、容器、雲原生等各種多樣化的應用場景。

ShardingSphere提供的核心功能:

Sharding-Proxy

定位為透明化的 資料庫代理端 ,提供封裝了 資料庫二進制協議的服務端版本 ,用於完成對 異構語言的支持

目前已提供MySQL版本,它可以使用 任何兼容MySQL協議的訪問客戶端 (如:MySQL Command Client, MySQL Workbench, Navicat等)操作數據,對DBA更加友好。

應用程序完全透明 ,可直接當做MySQL使用。

適用於任何兼容MySQL協議的客戶端。

Sharding-JDBC

定位為 輕量級Java框架 ,在Java的JDBC層提供的額外服務。 它使用客戶端直連資料庫,以jar包形式提供服務,無需額外部署和依賴,可理解為 增強版的JDBC驅動,完全兼容JDBC和各種ORM框架

以電商SaaS系統為例,前台應用採用Sharding-JDBC,根據業務場景的差異主要分為三種方案。

分庫(用戶)

問題解析:頭部企業日活高並發高,單獨分庫避免干擾其他企業用戶,用戶數據的增長緩慢可以不分表。

拆分維度:企業ID分庫

拆分策略:頭部企業單獨庫、非頭部企業一個庫

分庫分表(訂單)

問題解析:訂單數據增長速度較快,在分庫之餘需要分表。

拆分維度:企業ID分庫、用戶ID分表

拆分策略:頭部企業單獨庫、非頭部企業一個庫,分庫之後用戶ID取模拆分表

單庫分表(附件)

問題解析:附件數據特點是並發量不大,只需要解決數據增長問題,所以單庫IO足以支撐的情況下分表即可。

拆分維度:用戶ID分表

拆分策略:用戶ID取模分表

問題一:分布式事務

分布式事務過於復雜也是分布式系統最難處理的問題,由於篇幅有限,後續會開篇專講這一塊內容。

問題二:分布式ID

問題三:跨片查詢

舉個例子,以用戶id分片之後,需要根據企業id查詢企業所有用戶信息。

sharding針對跨片查詢也是能夠支持的,本質上sharding的跨片查詢是採用同時查詢多個分片的數據,然後聚合結果返回,這個方式對資源耗費比較大,特別是對資料庫連接資源的消耗。

假設分4個資料庫,8個表,則sharding會同時發出32個SQL去查詢。一下子消耗掉了32個連接;

特別是針對單庫分表的情況要注意,假設單庫分64個表,則要消耗64個連接。如果我們部署了2個節點,這個時候兩個節點同時查詢的話,就會遇到資料庫連接數上限問題(mysql默認100連接數)

問題四:分片擴容

隨著數據增長,每個片區的數據也會達到瓶頸,這個時候需要將原有的分片數量進行增加。由於增加了片區,原先的hash規則也跟著變化,造成了需要將舊數據做遷移。

假設原先1個億的數據,hash分64個表,現在增長到50億的數據,需要擴容到128個表,一旦擴容就需要將這50億的數據做一次遷移,遷移成本是無法想像的。

問題五:一致性哈希

首先,求出每個 伺服器的hash值 ,將其配置到一個 0~2^n 的圓環上 (n通常取32)

其次,用同樣的方法求出待 存儲對象的主鍵 hash值 ,也將其配置到這個圓環上。

然後,從數據映射到的位置開始順時針查找,將數據分布到找到的第一個伺服器節點上。

一致性hash的優點在於加入和刪除節點時只會影響到在哈希環中相鄰的節點,而對其他節點沒有影響。

所以使用一致性哈希在集群擴容過程中可以減少數據的遷移。

好了,這次分享到這里,我們日常的實踐可能只會用到其中一種方案,但它不是資料庫架構的全貌,打開技術視野,才能更好地把存儲工具利用起來。

老規矩,一鍵三連,日入兩千,點贊在看,年薪百萬!

本文作者:Jensen

7年Java老兵,小米主題設計師,手機輸入法設計師,ProcessOn特邀講師。

曾涉獵航空、電信、IoT、垂直電商產品研發,現就職於某知名電商企業。

技術公眾號 【架構師修行錄】 號主,專注於分享日常架構、技術、職場干貨,Java Goals:架構師。

交個朋友,一起成長!

熱點內容
cf北京伺服器ip 發布:2025-08-21 16:51:13 瀏覽:725
資料庫欄位值為空的數據 發布:2025-08-21 16:45:14 瀏覽:572
php項目視頻 發布:2025-08-21 16:34:33 瀏覽:194
叉叉腳本激活碼 發布:2025-08-21 16:34:32 瀏覽:250
清理ie緩存快捷鍵 發布:2025-08-21 16:07:30 瀏覽:443
演算法規避 發布:2025-08-21 15:56:48 瀏覽:895
ip伺服器是機器嗎 發布:2025-08-21 15:40:34 瀏覽:770
wpf讀資料庫存儲的時間 發布:2025-08-21 15:30:59 瀏覽:441
存儲過程是先編譯好的嗎 發布:2025-08-21 15:25:07 瀏覽:889
java高並發編程詳解 發布:2025-08-21 15:11:27 瀏覽:550