分庫分布的幾件小事(一)資料庫如何拆分

2021-09-23 15:44:00 字數 2271 閱讀 7980

①分庫分表說白了,就是因為資料量太大了,如果你的單錶資料量都到了千萬級別,那麼你的資料庫就無法承受高併發的要求,資料庫操作效能就會出現極大的下降。

②資料庫併發量太大了,一般而言,乙個資料庫最多支撐併發到2000,這時候一定要進行擴容,不然效能會出現嚴重下降。而且乙個健康的單庫併發值你最好保持在每秒1000左右,不要太大。那麼你可以將乙個庫的資料拆分到多個庫中,訪問的時候就訪問乙個庫好了。

比較常見的中介軟體有cobar、tddl、atlas、sharding-jdbc、mycat。

cobar:阿里b2b團隊開發和開源的,屬於proxy層方案。已經好幾年沒有進行更新了,基本沒啥人用。而且不支援讀寫分離、儲存過程、跨庫join和分頁等操作。

tddl:**團隊開發的,屬於client層方案,不支援join,但是支援讀寫分離。目前使用的也不多,因為還依賴**的diamond配置管理系統。

atlas:360開源的,屬於proxy層方案,以前有一些公司在用,但是已經好幾年沒有更新了,所以現在用的也不多。

sharding-jdbc:噹噹開源的,屬於client層方案。sql語法支援多,沒有太多的限制,從2.0版本開始支援分庫分表、讀寫分離、分布式id生成、柔性事務(最大努力送達型事務、tcc事務)。而且現在使用較多。

mycat:基於cobar改造,屬於proxy層方案,支援的功能完善,而且目前應該是非常火的而且不斷流行的資料庫中介軟體,社群很活躍,也有一些公司開始在用了。

proxy型別

proxy型別的中介軟體就是乙個客戶端,需要直接部署乙個中介軟體,去進行分庫分表。服務端將sql傳送到中介軟體客戶端去進行不同表庫的操作。如果中介軟體客戶端不可用將直接導致無法進行分庫分表,而且要走網路耗時。

client

client不需要單獨部署中介軟體客戶端,運維成本低,中介軟體就是乙個jar包,直接在專案中匯入、配置就可以完成分庫分表,而且不需要**層的二次**,效能高點,但是遇到公升級等操作需要重新發布版本,各個系統都需要耦合sharding-jbdc的依賴。

垂直拆分

垂直拆分的意思,就是把乙個有很多欄位的表給拆分成多個表,或者是多個庫上去。每個庫表的結構都不一樣,每個庫表都包含部分字段。一般來說,會將較少的訪問頻率很高的字段放到乙個表裡去,然後將較多的訪問頻率很低的字段放到另外乙個表裡去。因為資料庫是有快取的,你訪問頻率高的行欄位越少,就可以在快取裡快取更多的行,效能就越好。這個一般在表層面做的較多一些。

這個其實挺常見的,不一定我說,大家很多同學可能自己都做過,把乙個大表拆開,訂單表、訂單支付表、訂單商品表。

水平拆分

水平拆分的意思,就是把乙個表的資料給弄到多個庫的多個表裡去,但是每個庫的表結構都一樣,只不過每個庫表放的資料是不同的,所有庫表的資料加起來就是全部資料。水平拆分的意義,就是將資料均勻放更多的庫里,然後用多個庫來抗更高的併發,還有就是用多個庫的儲存容量來進行擴容。

表的拆分

還有表層面的拆分,就是分表,將乙個表變成n個表,就是讓每個表的資料量控制在一定範圍內,保證sql的效能。否則單錶資料量越大,sql效能就越差。一般是200萬行左右,不要太多,但是也得看具體你怎麼操作,也可能是500萬,或者是100萬。你的sql越複雜,就最好讓單錶行數越少。

一般來說,垂直拆分,你可以在表層面來做,對一些字段特別多的表做一下拆分;水平拆分,是併發承載不了,或者是資料量太大,容量承載不了,你給拆了,按什麼欄位來拆,你自己想好;分表,你考慮一下,你如果哪怕是拆到每個庫里去,併發和容量都ok了,但是每個庫的表還是太大了,那麼你就分表,將這個表分開,保證每個表的資料量並不是很大。

range方式

就是每個庫一段連續的資料,這個一般是按比如時間範圍來的,但是這種一般較少用,因為很容易產生熱點問題,大量的流量都打在最新的資料上了。

range來分,好處在於說,後面擴容的時候,就很容易,因為你只要預備好,給每個月都準備乙個庫就可以了,到了乙個新的月份的時候,自然而然,就會寫新的庫了;缺點,但是大部分的請求,都是訪問最新的資料。實際生產用range,要看場景,你的使用者不是僅僅訪問最新的資料,而是均勻的訪問現在的資料以及歷史的資料

hash方式

按照某個欄位hash一下均勻分散,這個較為常用。

hash分法,好處在於說,可以平均分配沒給庫的資料量和請求壓力;壞處在於說擴容起來比較麻煩,會有乙個資料遷移的這麼乙個過程

分庫分布的幾件小事(二)如何進行分庫分表的資料遷移

這是最簡單的也是最low的遷移方案了,如果系統就算短期停機也沒有關係或者造不成多大的影響,可以選用此方案。首先停掉機器,將系統全都停掉,不要再有新的資料進來,然後使用之前寫好的程式,連線舊的資料庫,將舊資料庫裡面的資料讀出來,然後通過資料分發中介軟體寫到分庫分好的資料裡面去。然後修改系統是資料庫連線...

一 資料庫基礎

1.1使用資料庫的必要性 使用資料可以高效且條理分明地儲存資料,它使人們能夠更加迅速和方便地管理資料,主要體現在以下幾個方面.1 可以結構化的儲存大量的資料資訊,方便使用者進行有效的檢索和訪問。2 可以有效的保持資料資訊的一致性 完整性降低資料冗餘。3 可以滿足應用的共享和安全方面的要求。4 資料庫...

一 資料庫分類

一 資料庫分類 1 小型資料庫 access foxbase 2 中型資料庫 informix sql server mysql 3 大型資料庫 sybase db2 oracle 二 專案中如何合理地使用資料庫,可以依據如下三個方面入手 1 專案的規模 a 負載量有多大,即使用者數有多大 b 成本...