當前位置:首頁 » 操作系統 » 分布式資料庫mysql

分布式資料庫mysql

發布時間: 2023-02-02 05:26:28

A. php mysql分布式資料庫如何實現

當前做分布式的廠商有幾家,我知道比較出名的有「華為雲分布式資料庫DDM」和「阿里雲分布式資料庫」,感興趣可以自行搜素了解下。

分布式資料庫的幾點概念可以了解一下。

數據分庫:

以表為單位,把原有資料庫切分成多個資料庫。切分後不同的表存儲在不同的資料庫上。

以表中的數據行記錄為單位,把原有邏輯資料庫切分成多個物理資料庫分片,表數據記錄分布存儲在各個分片上。

路由分發:

在分布式資料庫中,路由的作用即將SQL語句進行解析,並轉發到正確的分片上,保證SQL執行後得到正確的結果,並且節約QPS資源。

讀寫分離:

資料庫中對計算和緩存資源消耗較多的往往是密集或復雜的SQL查詢。當系統資源被查詢語句消耗,反過來會影響數據寫入操作,進而導致資料庫整體性能下降,響應緩慢。因此,當資料庫CPU和內存資源佔用居高不下,且讀寫比例較高時,可以為資料庫添加只讀資料庫。

B. 資料庫都有哪些

一、資料庫種類有哪些
早期較為時興的資料庫種類有三種,分別是層次式資料庫、網路式資料庫和關系型資料庫。而在如今的互聯網中,最常見的資料庫種類主要有2種,即關系型資料庫和非關系型資料庫。

二、層次資料庫介紹
層次資料庫是最開始研製的資料庫系統軟體,它把數據根據層次構造(樹結構)的方法呈現。層次資料庫以前是非常熱門的資料庫,但伴隨著關系資料庫的逐漸流行,如今早已非常少應用了。

較為具備象徵性的層次資料庫是IMS(Information Management System)資料庫,由IBM企業研發。

三、關系型資料庫詳細介紹
網路資料庫和層次資料庫在數據獨立性和抽象性級別上有所欠缺,用戶開展存儲時,需要聲明數據的存儲結構和相對路徑。而關系資料庫就可以較切實解決這種問題。

和Excel工作簿一樣,關系型資料庫也選用由列和行構成的二維表來管理數據,簡單易懂。另外,它還利用SQL(Structured Query Language,結構化查詢語言)對數據開展實際操作。

四、非關系型資料庫詳細介紹
伴隨著互聯網技術Web2.0的興起,傳統關系型資料庫在應對大數據量,比如大規模和高並發的微博、微信或者SNS類型的web2.0動態網頁時,已經有些力不從心,曝露了許多難以克服的難題。因此出現了針對大規模數據量場景,以性能卓越和應用便捷為目的的的資料庫產品——NOSQL資料庫。

C. Mysql Cluster 與 OceanBase 有哪些區別哪個更優秀

1. 分布式存儲部分是做為mysql的一種存儲引擎實現的(NDB),上層SQL沒有感知,所以SQL層應該沒有支持分布式並行查詢處理。OceanBase的基於代價的查詢優化器對於大查詢會充分發揮分布式資料庫的並行處理能力。再如OB分布式執行計劃可以下壓到存儲所在機器。而ndb node實現存儲引擎介面沒有復雜的查詢處理能力。
2. Mysql cluster中主備同步是用兩階段提交實現的,這個有點無語。另外REDO日誌非同步寫入,延時一秒。也就是說宕機會丟一秒的事務,想像一下雙十一每秒17萬筆交易丟失……這塊是它的整體架構導致事務層實現機制的問題。
btw,mysql cluster屬於分布式資料庫,mysql主從幾節點都不是分布式資料庫。

D. 國內做MySQL分布式資料庫廠家有哪些

國內的資料庫廠家有很多,像萬里開源、創意信息、南通、神通等。
其中萬里開源是前MySQL中國研發中心,先後與MySQL AB、SUN、Oracle合作研發過MySQL核心代碼。與MySQL聯合研發期間主要的貢獻集中在Replication復制模塊與NDBCluster模塊,對分布式資料庫集群的研發和經驗積累已經有約14年,對MySQL內核以及分布式資料庫集群有著深刻的理解與技術沉澱,目前擁有約80餘項技術專利與軟體著作權。目前萬里開源具有員工180+人,其中資料庫技術團隊約100+人,技術團隊的組成以985和211畢業生為主。
而且,萬里開源還是創意信息控股的子公司,創意信息技術股份有限公司(股票代碼:300366)成立於1996年,2014年在深交所創業板上市,總部位於成都。依託上市公司資源,
無論從公司實力還是研發背景上來看,萬里開源都是一家做分布式資料庫不錯的公司。

E. TDSQL TCA 分布式實例特點初探分布表和SQL透傳


TDSQL分布式實例通過Proxy介面提供和mysql兼容的連接方式,用戶通過IP地址、埠號以及用戶名、密碼進行連接:

(注意:公有雲TDSQL需要在實例頁面申請公網連接地址)

連接示例:mysql -h172.21.32.13 (proxy地址) -P3306(proxy埠) -utest (資料庫賬號) -p

與普通的mysql連接方法一致,分布式實例兼容mysql的協議和語法,支持SSL加密等功能。當然,您也可以使用navicat、 jdbc、 odbc、 php、 Python等來連接分布式TDSQL實例。

1、TDSQL分布式實例支持表的類型介紹

a、分布式表: 即水平拆分表,也成為「分表」,該表從業務視角是一張完整的邏輯表,但後端根據分表鍵(shardkey)的HASH值將數據分布到不同的物理節點組(SET)中。

b、普通表: 又名Noshard表,即無需拆分的表,和傳統集中式資料庫中的表一致,且沒有做任何特殊處理的表,目前分布式實例將該表默認存放在第一個物理節點組(set)中。

c、廣播表: 又名小表廣播技術,即設置為廣播表後,該表的所有操作都將廣播到所有物理節點組(set)中,每個set都有該表的全量數據,常用於業務系統關聯查詢較多,修改較少的小表或配置表等。

表類型選用注意事項:

在分布式實例中,如果兩張表分表鍵相等,這意味著兩張表**相同的分表鍵對應的行**,存儲在相同的物理節點組中。這種場景通常被稱為組拆分(groupshard),會極大的提升業務聯合查詢等語句的處理效率。由於單表默認放置在第一個set上,如果在分布式實例中建立大的單表,則會導致第一個set的負載太大。除非特別需要,在分布式實例中盡量使用分布式表,這也是分布式實例的特點之一。

2、TDSQL分布式實例表的創建

接下來我們來看下分布式資料庫TDSQL所支持的三種類型表的使用方法和注意事項。

a、分布式表的使用

簡述:普通的分表創建時必須在最後面**指定分表鍵(shardkey)的值,該值為表中的一個欄位名字,會用於後續sql的路由選擇。連接到TDSQL分布式實例後,我們創建一個本次操作使用的資料庫名為:testdb

mysql> create database testdb;

mysql>use testdb;

接下來我們創建分布式表,命名以分布式拼音首字母命名

**建表語句1:**

MySQL testdb> create table fbs ( a int, b int, c char(20),primary key (a),unique key u_1(a,c) ) shardkey=a;

Query OK, 0 rows affected (0.07 sec)

**建表語句2:**

MySQL testdb> create table fbs2 ( a int, b int, c char(20), primary key (a,b) ) shardkey=a;

Query OK, 0 rows affected (0.09 sec)

b、廣播表的創建

簡述:支持建小表(廣播表),此時該表在所有set中都是全部數據,這個主要方用於跨set的join操作,同時通過分布式事務保證修改操作的原子性,使得所有set的數據是完全一致的 。

**語句:**

MySQL testdb> create table gbb(a int,b int key) **shardkey=noshardkey_allset;**

Query OK, 0 rows affected (0.03 sec)


c、傳統普通表

簡述:支持建立普通的表,語法和傳統mysql完全一樣,此時該表的數據全量存在第一個set節點中,所有該類型的表都放在第一個set中。

MySQL testdb> create table ptb(a int ,b varchar(10));

Query OK, 0 rows affected (0.03 sec)

注意事項:

1、在分布式實例中,分布式表shardkey對應後端資料庫的分區欄位,因此必須是主鍵以及所有唯一索引的一部分, 否則可能無法完成建表操作。

2、分布式表shardkey欄位的值不包含中文, 否則proxy會轉換字元集可能會出錯。另外SQL語法上如:shardkey=a 一般放在SQL語句最後來寫。

3、TDSQL分布式實例表的數據操作

為了更好的發揮分布式架構的優勢,在進行SQL操作時和傳統資料庫還是有部分差異。接下來我們從資料庫的插入,更新,刪除方面分別來看有哪些注意事項。

======INSERT插入操作=======

**插入語句1:**

MySQL testdb> insert into fbs(a,b) values(10,1000);

Query OK, 1 row affected (0.00 sec)

**插入語句2:**

MySQL testdb> insert into fbs values(1,10,1000);

MySQL testdb> insert into test1 (b,c) values(100,"record3");

ERROR 810 (HY000): Proxy ERROR:sql is too complex,need to send to only noshard table.Shard table insert must has field spec

注意:語句2報錯的原因insert時欄位需要包含shardkey,否則會拒絕執行該sql,因為Proxy不知道該sql發往哪個後端分片節點。

=====UPDATE、DELETE更新、刪除操作=====

更新語句1:

MySQL testdb> update fbs set b=2000 where a=10;

Query OK, 1 row affected (0.00 sec)

更新語句2:

MySQL testdb> update fbs set b=2000 ;

ERROR 658 (HY000): Proxy ERROR: Join internal error: update query has no where clause

刪除操作:

MySQL testdb> delete from fbs;

ERROR 913 (HY000): Proxy ERROR:Join internal error: delete query has no where clause

注意事項:

1、出於數據操作安全上和減少人為誤操作導致數據丟失情況的出現,TDSQL禁止update 無 where 條件的更新動作。

2、同樣的delete操作無where條件也會被禁止執行,如果確認要刪除表數據或表,建議備份後用truncate或drop方式操作。

3、同樣的update操作時盡量避免更新shardkey欄位,因為影響Proxy中的路由更新,會導致錯誤。



1、TDSQL透傳功能介紹

對於分布式實例,會對SQL進行語法解析,有一定的限制,如果用戶想在某個set中獲取單個節點數據,或在指定節點執行SQL,可以使用TDSQL的透傳SQL的功能。

使用透傳功能,我們需要重新連接登錄TDSQL分布式實例時指定 **- c選項**。普通登錄方式,不支持指定節點執行SQL的透傳功能。

登錄如下:

mysql -h172.21.32.13 (proxy地址) -utest -P3306 -p -c(透傳必須指定-c)

2、TDSQL透傳操作演示

首先我們重新登陸TDSQL分布式實例: mysql -h172.21.32.13 -utest -P3306 -p -c

仍舊切換使用testdb資料庫。

a、查看分布式實例set節點

使用/*proxy*/show status 查看當前的TDSQL分布式實例的節點信息,共有兩個set ,分別為set_1605181898_1、set_1605181972_3

MySQL testdb> /*proxy*/show status ;

+-----------------------------+-------------------------------------------------------------------+

| status_name | value |

+-----------------------------+-------------------------------------------------------------------+

| cluster | group_1605181791_302290 |

| **set_1605181898_1:ip | 10.53.179.14:4322;[email protected]:4322@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181898_1:hash_range | 0---31 |

| **set_1605181972_3:ip | 10.53.179.14:4323;[email protected]:4323@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181972_3:hash_range | 32---63 |

| set | set_1605181898_1,set_1605181972_3 |

+-----------------------------+-------------------------------------------------------------------+

6 rows in set (0.00 sec)

b、演示數據插入

我們針對之前創建的fbs分布式表進行數據的插入

MySQL testdb> insert into fbs(a,b,c) values(10,1,'AAA'),(20,2,'bbb'),(30,3,'ccc'),(40,4,'dddd'),(50,5,'eee'),(60,6,'fff'),(70,7,'ggg'),(80,8,'hhhh');

MySQL testdb> select * from fbs order by 1;

+----+------+------+

| a | b | c |

+----+------+------+

| 10 | 1 | AAA |

| 20 | 2 | bbb |

| 30 | 3 | ccc |

| 40 | 4 | dddd |

| 50 | 5 | eee |

| 60 | 6 | fff |

| 70 | 7 | ggg |

| 80 | 8 | hhhh |

+----+------+------+

8 rows in set (0.00 sec)

c、透傳查看數據在各個節點的分布情況

MySQL testdb> /*proxy*/show status;

+-----------------------------+-------------------------------------------------------------------+

| status_name | value |

+-----------------------------+-------------------------------------------------------------------+

| cluster | group_1605181791_302290 |

| **set_1605181898_1:ip | 10.53.179.14:4322;[email protected]:4322@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181898_1:hash_range | 0---31 |

| set_1605181972_3:ip | 10.53.179.14:4323;[email protected]:4323@1@IDC_GZ_YDSS0301_79263@0 |

| set_1605181972_3:hash_range | 32---63 |

| set | set_1605181898_1,set_1605181972_3 |

+-----------------------------+-------------------------------------------------------------------+

6 rows in set (0.00 sec)

查看數據在set_1605181898_1 節點上的分布

MySQL testdb> /*sets:set_1605181898_1*/select * from fbs order by 1;

+----+------+------+------------------+

| a | b | c | info |

+----+------+------+------------------+

| 10 | 1 | AAA | set_1605181898_1 |

| 30 | 3 | ccc | set_1605181898_1 |

| 40 | 4 | dddd | set_1605181898_1 |

| 50 | 5 | eee | set_1605181898_1 |

| 80 | 8 | hhhh | set_1605181898_1 |

+----+------+------+------------------+

5 rows in set (0.00 sec)

查看數據在set_1605181972_3節點上的分布

MySQL testdb> /*sets:set_1605181972_3*/select * from fbs order by 1;

+----+------+------+------------------+

| a | b | c | info |

+----+------+------+------------------+

| 20 | 2 | bbb | set_1605181972_3 |

| 60 | 6 | fff | set_1605181972_3 |

| 70 | 7 | ggg | set_1605181972_3 |

+----+------+------+------------------+

3 rows in set (0.00 sec)

d、通過shardkey分片號查看數據

MySQL testdb> /*shardkey:2*/select * from fbs order by 1;

+----+------+------+

| a | b | c |

+----+------+------+

| 20 | 2 | bbb |

| 60 | 6 | fff |

| 70 | 7 | ggg |

+----+------+------+

3 rows in set (0.00 sec)

支持透傳種類和格式:

1、set名字可以通過/*proxy*/show status查詢

2、/*sets:set_1名稱*/ 透傳指定節點

3、/*sets:allsets*/ 透傳所有節點

4、/*shardkey:10*/ 透傳到shardkey分片對應的set

5、支持透傳sql到對應的一個或者多個set

分布式表的DDL部分的語句限制:

暫不支持CREATE TABLE ... LIKE

暫不支持CREATE TABLE ... SELECT

暫不支持CREATE TEMPORARY TABLE

暫不支持CREATE/DROP/ALTER SERVER/LOGFILE GROUP/

暫不支持ALTER對分表鍵(shardkey)進行重命名,不過可以修改類型

分布式表的DML部分的語句限制:

暫不支持SELECT INTO OUTFILE/INTO DUMPFILE/INTO LOAD DATA導出

暫不支持INSERT ... SELECT

暫不支持UPDATE 分布式shardkey列的值

本操作主要是面向傳統資料庫的開發者或者DBA用戶,讓大家能夠初步入手了解分布式資料庫的特點。另外分布式資料庫在架構上提供了靈活的讀寫分離模式,在SQL上支持全局的order by, group by, limit操作,支持聚合函數,跨set節點的join、子查詢、支持分布式事務,傳統資料庫所支持的大部分操作在分布式資料庫中得到繼承。分布式資料庫是在傳統資料庫的基礎之上發展起來的,對傳統集中式的資料庫有較好的兼容性,對SQL語句語法的使用上兼容大部分SQL1999,SQL2003標准,且對SQL的ACID特性都予以支持。分布式資料庫在邏輯上是一個獨立完整的資料庫,但在架構上和物理上採用 多節點分片方式,經過內部演算法將數據打散分布來到不同節點存儲數據,對前端業務屏蔽後端的復雜架構,並且自身具備數據的最終一致性訪問,可用性和分區容災等特性的資料庫。希望本次操作能給大家帶來一些對分布式資料庫TDSQL的一些認識和收獲。


*禁止轉載,可轉發(轉發文章請註明出處)

TDPub企業級分布式關系資料庫

F. MySQL、PG屬於分布式資料庫嗎怎麼區分資料庫是否為分布式

MySQL、PostgreSQL屬於關系型資料庫
分布式資料庫系統通常使用較小的計算機系統,每台計算機可單獨放在一個地方,每台計算機中都可能有DBMS的一份完整拷貝副本,或者部分拷貝副本,並具有自己局部的資料庫,位於不同地點的許多計算機通過網路互相連接,共同組成一個完整的、全局的邏輯上集中、物理上分布的大型資料庫。
比較火的分布式資料庫有tidb和 sequoiadb

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

隨著時間和業務的發展,資料庫中的數據量增長是不可控的,庫和表中的數據會越來越大,隨之帶來的是更高的 磁碟 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:架構師。

交個朋友,一起成長!

H. mysql如何做成分布式

MySQL做分布式需要通過ndb的Cluster來實現。 MySQLCluster是MySQL適合於分布式計算環境的高實用、高冗餘版本。 實現的步驟比較復雜,網路雲案例:《MySQLCluster(MySQL集群)分布式》 下載地址:

I. 單機MySQL資料庫怎麼做成分布式資料庫集群

可以採用開源的MyCat解決方案,優點是免費,缺點是出現問題可能要自己解決或者去社區尋找解決方案;

也可以採用北京萬里開源軟體有限公司的集群解決方案,後端使用開源的MySQL存儲數據,優點是有任何問題他們都可以幫忙解決,而且不用擔心系統後續的擴展、集群高可用等情況,他們的工程師還開發過MySQL核心代碼,找他們可以睡個安穩覺,缺點是不免費,他們還有自己的國產資料庫GreatDB,100%兼容MySQL。

對於初創企業,可以考慮選擇免費的開源解決方案,畢竟遇到的問題可能有限,如果要想長期穩定發展,還是選擇萬里開源這樣的公司比較靠譜一些。

熱點內容
怎麼把自家電腦變成伺服器 發布:2024-04-17 01:14:58 瀏覽:161
有哪些高配置的游戲手機 發布:2024-04-17 01:09:11 瀏覽:437
交易系統編程 發布:2024-04-17 00:09:50 瀏覽:700
編程思想pdf下載 發布:2024-04-16 23:56:26 瀏覽:184
資料庫網格計算 發布:2024-04-16 23:28:13 瀏覽:23
電波蘿莉醬解壓 發布:2024-04-16 23:26:59 瀏覽:548
平板訪問密碼是什麼時候設置的 發布:2024-04-16 23:15:52 瀏覽:179
pyinstaller如何自定義配置打包 發布:2024-04-16 22:51:54 瀏覽:200
怎麼設置建行登陸密碼 發布:2024-04-16 22:49:58 瀏覽:59
大型激光編程 發布:2024-04-16 22:41:04 瀏覽:536