成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

當數據庫扼住系統性能咽喉,直接分庫分表能解決嗎?

數據庫
眾所周知,數據庫很容易成為應用系統的瓶頸。單機數據庫的資源和處理能力有限,在高并發的分布式系統中,可采用分庫分表突破單機局限。

眾所周知,數據庫很容易成為應用系統的瓶頸。單機數據庫的資源和處理能力有限,在高并發的分布式系統中,可采用分庫分表突破單機局限。

本文總結了分庫分表的相關概念、全局ID的生成策略、分片策略、平滑擴容方案及流行的方案。

一、分庫分表概述

在業務量不大時,單庫單表即可支撐。當數據量過大存儲不下、或者并發量過大負荷不起時,就要考慮分庫分表。

1、分庫分表相關術語

  • 讀寫分離:不同的數據庫,同步相同的數據,分別只負責數據的讀和寫;
  • 分區:指定分區列表達式,把記錄拆分到不同的區域中(必須是同一服務器,可以是不同硬盤),應用看來還是同一張表,沒有變化;
  • 分庫:一個系統的多張數據表,存儲到多個數據庫實例中;
  • 分表:對于一張多行(記錄)多列(字段)的二維數據表,又分兩種情形:

①垂直分表:豎向切分,不同分表存儲不同的字段,可以把不常用或者大容量、或者不同業務的字段拆分出去;

②水平分表(最復雜):橫向切分,按照特定分片算法,不同分表存儲不同的記錄。

2、真的要采用分庫分表?

需要注意的是,分庫分表會為數據庫維護和業務邏輯帶來一系列復雜性和性能損耗,除非預估的業務量大到萬不得已,切莫過度設計、過早優化。

規劃期內的數據量和性能問題,嘗試能否用下列方式解決:

  • 當前數據量:如果沒有達到幾百萬,通常無需分庫分表;
  • 數據量問題:增加磁盤、增加分庫(不同的業務功能表,整表拆分至不同的數據庫);
  • 性能問題:升級CPU/內存、讀寫分離、優化數據庫系統配置、優化數據表/索引、優化SQL、分區、數據表的垂直切分;

如果仍未能奏效,才考慮最復雜的方案:數據表的水平切分。

二、全局ID生成策略

1、自動增長列

  • 優點:數據庫自帶功能,有序,性能佳。
  • 缺點:單庫單表無妨,分庫分表時如果沒有規劃,ID可能重復。

解決方案:

設置自增偏移和步長:

  1. ##假設總共有10個分表 
  2. ##級別可選:SESSION(會話級),GLOBAL(全局) 
  3. SET@@SESSION.auto_increment_offset=1;##起始值,分別取值為1~10 
  4. SET@@SESSION.auto_increment_increment=10;##步長增量 

如果采用該方案,在擴容時需要遷移已有數據至新的所屬分片。

全局ID映射表:

在全局Redis中為每張數據表創建一個ID的鍵,記錄該表當前***ID;每次申請ID時,都自增1并返回給應用;Redis要定期持久至全局數據庫。

2、UUID(128位)

在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平臺會提供生成UUID的API。

UUID由4個連字號(-)將32個字節長的字符串分隔后生成的字符串,總共36個字節長。形如:

  1. 550e8400-e29b-41d4-a716-446655440000。 

UUID的計算因子包括:以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字。UUID是個標準,其實現有幾種,最常用的是微軟的GUID(GlobalsUniqueIdentifiers)。

  • 優點:簡單,全球唯一。
  • 缺點:存儲和傳輸空間大,無序,性能欠佳。

3、COMB(組合)

組合GUID(10字節)和時間(6字節),達到有序的效果,提高索引性能。

4、Snowflake(雪花)算法

Snowflake是Twitter開源的分布式ID生成算法,其結果為long(64bit)的數值。其特性是各節點無需協調、按時間大致有序、且整個集群各節點單不重復。

該數值的默認組成如下(符號位之外的三部分允許個性化調整):

 

  • 1bit:符號位,總是0(為了保證數值是正數);
  • 41bit:毫秒數(可用69年);
  • 10bit:節點ID(5bit數據中心+5bit節點ID,支持32*32=1024個節點);
  • 12bit:流水號(每個節點每毫秒內支持4096個ID,相當于409萬的QPS,相同時間內如ID遇翻轉,則等待至下一毫秒)。

三、分片策略

1、連續分片

根據特定字段(比如用戶ID、訂單時間)的范圍,值在該區間的,劃分到特定節點。

  • 優點:集群擴容后,指定新的范圍落在新節點即可,無需進行數據遷移。
  • 缺點:如果按時間劃分,數據熱點分布不均(歷史數冷當前數據熱),導致節點負荷不均。

2、ID取模分片

  • 缺點:擴容后需要遷移數據。

3、一致性Hash算法

  • 優點:擴容后無需遷移數據。

4、Snowflake分片

  • 優點:擴容后無需遷移數據。

四、分庫分表引入的問題

1、分布式事務

由于兩階段/三階段提交對性能損耗大,可改用事務補償機制。

2、跨節點JOIN

對于單庫JOIN,MySQL原生就支持;對于多庫,出于性能考慮,不建議使用MySQL自帶的JOIN,可以用以下方案避免跨節點JOIN:

  • 全局表:一些穩定的共用數據表,在各個數據庫中都保存一份;
  • 字段冗余:一些常用的共用字段,在各個數據表中都保存一份;
  • 應用組裝:應用獲取數據后再組裝;
  • 另外:某個ID的用戶信息在哪個節點,他的關聯數據(比如訂單)也在哪個節點,可以避免分布式查詢。

3、跨節點聚合

只能在應用程序端完成。但對于分頁查詢,每次大量聚合后再分頁,性能欠佳。

4、節點擴容

節點擴容后,新的分片規則導致數據所屬分片有變,因而需要遷移數據。

五、節點擴容方案

1、常規方案

如果增加的節點數和擴容操作沒有規劃,那么絕大部分數據所屬的分片都有變化,需要在分片間遷移:

  • 預估遷移耗時,發布停服公告;
  • 停服(用戶無法使用服務),使用事先準備的遷移腳本,進行數據遷移;
  • 修改為新的分片規則;
  • 啟動服務器。

2、免遷移擴容

采用雙倍擴容策略,避免數據遷移。擴容前每個節點的數據,有一半要遷移至一個新增節點中,對應關系比較簡單。

具體操作如下(假設已有2個節點A/B,要雙倍擴容至A/A2/B/B2這4個節點):

  • 無需停止應用服務器;
  • 新增兩個數據庫A2/B2作為從庫,設置主從同步關系為:A=>A2、B=>B2,直至主從數據同步完畢(早期數據可手工同步);
  • 調整分片規則并使之生效:
  • 原ID%2=0=>A改為ID%4=0=>A,ID%4=2=>A2;
  • 原ID%2=1=>B改為ID%4=1=>B,ID%4=3=>B2。
  • 解除數據庫實例的主從同步關系,并使之生效;
  • 此時,四個節點的數據都已完整,只是有冗余(多存了和自己配對的節點的那部分數據),擇機清除即可(過后隨時進行,不影響業務)。

六、分庫分表方案

1、代理層方式

部署一臺代理服務器偽裝成MySQL服務器,代理服務器負責與真實MySQL節點的對接,應用程序只和代理服務器對接。對應用程序是透明的。比如MyCAT,官網,源碼。

  • MyCAT后端可以支持MySQL、SQLServer、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。
  • MyCAT不僅僅可以用作讀寫分離,以及分表分庫、容災管理,而且可以用于多租戶應用開發、云平臺基礎設施,讓你的架構具備很強的適應性和靈活性。

2、應用層方式

處于業務層和JDBC層中間,是以JAR包方式提供給應用調用,對代碼有侵入性。

主要方案有:

  • 淘寶網的TDDL:已于2012年關閉了維護通道,建議不要使用;
  • 當當網的Sharding-JDBC:仍在活躍維護中:當當應用框架ddframe中,從關系型數據庫模塊dd-rdb中分離出來的數據庫水平分片框架,實現透明化數據庫分庫分表訪問,實現了Snowflake分片算法。

Sharding-JDBC定位為輕量Java框架,使用客戶端直連數據庫,無需額外部署,無其他依賴,DBA也無需改變原有的運維方式。Sharding-JDBC分片策略靈活,可支持等號、between、in等多維度分片,也可支持多分片鍵。

SQL解析功能完善,支持聚合、分組、排序、limit、or等查詢,并支持BindingTable以及笛卡爾積表查詢。

Sharding-JDBC直接封裝JDBC API,可以理解為增強版的JDBC驅動,舊代碼遷移成本幾乎為零:

  • 可適用于任何基于Java的ORM框架,如JPA、Hibernate、Mybatis、Spring JDBC Template或直接使用JDBC。
  • 可基于任何第三方的數據庫連接池,如DBCP、C3P0、BoneCP、Druid等。
  • 理論上可支持任意實現JDBC規范的數據庫。雖然目前僅支持MySQL,但已有支持Oracle、SQLServer等數據庫的計劃。

參考

  • 沈劍:《數據庫秒級平滑擴容架構方案》
  • 分布式事務的解決方案:https://kefeng.wang/2018/03/01/distributed-transaction/
  • 《The Cost of GUIDs as Primary Keys》

:http://www.informit.com/articles/article.aspx?p=25862

  • <twitter/snowflake>:

https://github.com/twitter-archive/snowflake/tree/snowflake-2010

  •  

https://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8%87%AA%E5%A2%9Eid%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/

責任編輯:武曉燕 來源: DBAplus社群
相關推薦

2018-06-01 14:00:00

數據庫MySQL分庫分表

2024-08-02 15:47:28

數據庫分庫分表

2019-01-16 14:00:54

數據庫分庫分表

2022-12-05 07:51:24

數據庫分庫分表讀寫分離

2019-03-06 14:42:01

數據庫分庫分表

2021-04-01 05:40:53

分庫分表數據庫MySQL

2022-06-15 07:32:24

數據庫分庫分表

2019-09-20 11:55:39

戴爾

2020-01-07 09:40:25

數據庫MySQLRedis

2018-08-08 06:40:50

位置數據物聯網IOT

2024-12-04 13:02:34

數據庫分庫分表

2019-01-29 15:25:11

阿里巴巴數據庫分庫分表

2011-04-13 09:19:05

Oracle數據庫系統性能

2023-11-03 14:50:14

2019-08-16 10:19:01

NewSQL數據庫分庫分表

2022-07-11 08:16:47

NewSQL關系數據庫系統

2018-08-14 18:00:14

數據庫分庫分表表拆分

2010-03-03 13:21:40

Android操作系統

2018-05-29 08:39:26

DBA數據庫案例

2023-08-11 08:59:49

分庫分表數據數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久久一区二区国产 | 国产精品视频导航 | 99精品国产在热久久 | 久久成人人人人精品欧 | 亚洲国产自产 | 一级高清 | 99精品99 | 国产精品久久久久久久久久久久久久 | 亚洲欧美视频一区 | 色就是色欧美 | 亚洲精品一区二区三区在线 | 欧美精品国产精品 | 日韩精品一区二 | 亚洲精品免费视频 | 亚洲国产精品一区二区www | 国产高清一区二区 | 一级片av| 国产美女精品视频 | 国产精品免费观看 | 国产九九精品 | 美国一级黄色片 | 成人一区二区三区在线观看 | 9久9久| 91视频在线看 | 亚洲成人高清 | 日一区二区 | 欧美寡妇偷汉性猛交 | 天天看逼| 国产激情综合五月久久 | 人人爱干| 国产精品视频一区二区三区不卡 | 亚洲精品久久久久久久不卡四虎 | 国产精品久久久久久模特 | 成人免费视频网站在线看 | 伊久在线 | 在线视频亚洲 | 在线成人免费视频 | 久久99精品国产自在现线小黄鸭 | 久久免费视频2 | 欧美男人天堂 | 少妇一级淫片免费播放 |