ACP網際網路架構認證筆記-DRDS分散式關係型資料庫服務

服務架構.png
DRDS的基礎原理是Sharding,即資料分片,是典型的水平擴充套件分散式資料庫模型,和傳統單機資料庫share anything架構不同,DRDS採用的是 share nothing架構 。
DRDS主要解決單機資料庫容量瓶頸,單機資料庫擴充套件困難,傳統資料庫使用成本高的問題,是高性價比,低運維成本的分散式資料庫。主要場景是大規模線上資料操作,如 : 高併發實時交易,海量資料儲存和訪問,資料庫雲上備份容災。DRDS相容SQL/">MySQL協議和語法,支援分庫分表、平滑擴容、服務升降配、透明讀寫分離,分散式事務,分散式資料庫生命週期管理。
share nothing架構核心思路利用普通的伺服器,將單機資料拆分到底層的多個數據庫例項上,通過統一的Proxy叢集(DRDS 節點)進行SQL解析優化、路由和結果聚合,對外暴露簡單唯一的資料庫連結。
DRDS 不支援Mysql檢視、儲存過程、跨庫外來鍵和級聯刪除,不支援自定義資料型別、流程控制類語句、自定義函式 。
DRDS例項是由一組DRDS Server節點和底層儲存組成的分散式叢集,分為共享例項(規格只有8Core8G,使用公網地址)和專享例項(最小規格8Core16G,即兩個DRDS節點,預設提供內網地址)
DRDS Server,即DRDS節點,主要作用是SQL解析優化、路由和結果歸併。
DRDS可以進行購買建立例項,建立克隆例項(DRDS例項必須是專享例項),例項間資料庫遷移,例項釋放,例項變配,平滑擴容操作。
DRDS例項效能主要由DRDS規格和選擇的RDS效能決定。DRDS可進行效能監控,重要監控指標有邏輯QPS和物理QPS,連線數,執行緒活躍數,CPU 利用率,RT邏輯和物理RT,網路輸入和輸出流量。
DRDS例項變配(變配例項的規格,主要是增加了處理節點和均攤QPS)實現服務的彈性擴充套件,解決DRDS效能問題(資源合理利用和解決瓶頸)。衡量DRDS例項規格的重要指標是QPS,QPS和CPU效能是正相關的,CPU利用率超出90%或持續超出80%說明DRDS效能瓶頸,需要例項升配。衡量DRDS資料庫效能主要從響應時間(RT)和QPS兩個指標進行衡量,RT一般是單個SQL效能,可SQL優化解決,QPS效能請選擇例項變配。
SQL優化 : 主要原則讓更多的計算可以下推到RDS/MySQL上執行,DRDS可制定執行計劃,
DRDS是否需要平滑擴容(即增加RDS的數量)一般觀察RDS的三個指標 : IOPS,CPU,磁碟空間。如果IOPS和CPU任何一個指標長期保持在80%以上或頻繁收到報警資訊,請嘗試SQL優化,升高RDS規格或設定只讀庫,如果仍不能解決請進行擴容。RDS的磁碟容量剩餘請儘量保持在30%以上。擴容有風險,擴容時請不要執行SQL,請在RDS低負載時和業務低谷期時進行,擴容不影響原有資料正常訪問。
DRDS控制檯地址為 ofollow,noindex">https://drds.console.aliyun.com
DRDS控制檯提供檢視資料庫具體資訊、刪除資料庫、重置密碼、只讀使用者管理等功能。
DRDS控制檯不支援直接執行帶有dbpartition 或 tbpartition 關鍵字的分散式DDL。
DRDS的資料庫只能在控制檯上面建立,需要選擇至少一個(多個)RDS(型別為MySQL,狀態為執行中)作為儲存節點。
DRDS 目前 不支援使用 DDL 語句直接建庫 ,請登入 DRDS 控制檯進行建立。具體操作指南請參考 建立 DRDS 資料庫 。
如果選擇的RDS區域和DRDS不相同,即跨區,會帶來最高3ms的網路延遲。資料庫建立型別分為拆分型(主要型別),非拆分型(將RDS資料庫交由DRDS代理訪問,實現讀寫分離)。拆分型的資料庫, DRDS預設在1個RDS上建立8個物理庫(不能更改) ,總物理庫數量 = 選擇RDS數量 * 8。分表數理論上沒有限制,但受限於DRDS本身的規格資源。單個物理分表的容量不超過500萬行資料。
刪除資料庫只會刪除由DRDS所建立的資料庫,不會影響原本在RDS上的資料庫。
DRDS選擇資料庫連線池(提高了應用效能),主要作用是資源複用,提高系統響應效率,避免連線洩漏,DRDS可使用後端連線池數自動調整功能。
DRDS讀寫分離,對應用透明的設計, 無需更改程式碼 。拆分型只需在DRDS控制檯中調整讀權重比例(設定讀策略),就可將讀流量在主RDS和只讀RDS中進行分流,寫流量都在主RDS上,不分流。 可通過SHOW NODE指令檢視實際讀流量分佈 。主RDS上是強讀(強一致性,即強實時性),只讀RDS上是弱讀(存在毫秒級延遲), 個別需要實時性、強一致性讀的SQL可通過HINT實現 。非拆分型直接選擇RDS的資料庫引入到DRDS做讀寫分離。 讀寫分離只對查詢有效,寫請求和顯式事務查詢都在主RDS中 。
DRDS HINT可指定在主RDS或只讀RDS上執行SQL,HINT基於MySQL註釋實現的。自定義的HINT作用讀寫分離(通過將SQL指定發給主RDS或自讀RDS實現),切斷延遲的只讀RDS,自定義SQL超時時間,指定分庫執行SQL,掃描全部分庫分表。
每個DRDS資料庫可以建立一個只讀使用者, 只讀使用者只能進行SELECT操作。DRDS 裡通過 CREATE USER 創建出來的賬號只存在於 DRDS,跟 RDS 沒有任何關係,也不會同步到後端的 RDS 中去。只讀賬號的名字是資料庫名加上 _RO 字尾,比如資料庫名是 easydb,只讀賬號的名字就叫 easydb_RO。
DRDS資料庫的表操作許可權有8個,CREATE、DROP、ALTER、INDEX、INSERT、DELETE、UPDATE、SELECT。進行相關操作必須要以上對應的許可權,如TRUNCATE需要DROP許可權,REPLACE需要INSERT和DELETE許可權,INSERT ON DUPLICATE UPDATE需要INSERT和UPDATE許可權。
DRDS廣播表,(小表廣播,主要提升JOIN效率,BROADCAST),DRDS將資料量小(小表),更新頻率不高並設定為 單表 的表叫做廣播表。廣播表通過同步機制進行資料同步,有秒級延遲,廣播表會在每一個分庫中都會建立同樣的表,但資料只儲存在第一個分庫上(即分庫中資料不是全量複製)。
DRDS資料庫水平拆分到每個RDS的資料庫中,拆分的庫叫分庫,分庫的表叫分表(也叫分片),拆分分為庫級拆分(即進行分庫),表級拆分(即進行分表)。通過拆分鍵實現,拆分鍵分為分庫鍵(DB_PARTITION_KEY),分表鍵(TB_PARTITION_KEY)。可通過SHOW RULE檢視資料庫下每一個邏輯表的拆分情況。 通過SHOW TOPOLOGY檢視邏輯表的拓撲分佈(儲存在哪些分庫中,每個分庫下包含哪些分表)。
dbpartition by hash(按hash分庫), tbpartition by WEEK(支援按時間分表,但不支援按時間分庫) 。
tbpartitions :每個庫上的物理表數目 (預設為1) ,如無需分表,就無需指定該欄位
DRDS拆分鍵是生成拆分規則的資料庫欄位,只支援單個欄位,建好分庫分表後拆分鍵不能變更,值不可修改。選擇拆分鍵請儘量規避熱點資料。拆分原則是 : 儘可能找到資料表中的資料在業務邏輯上的主體。
DRDS SQL路由,即按照拆分鍵和SQL語義把SQL分發到底層各個儲存的分表進行執行。拆分鍵是DRDS中資料分佈和SQL路由的憑證,DRDS將返回的資料按照原始SQL語義進行合併返回給使用者。
DRDS中的sequence序列的特點是 全域性唯一,有序遞增 ,分為三種類型 : Group,單元化Group,Simple。DRDS預設使用Group(不會單點,效能好),但 序列不連續、可能會有跳躍段,不能迴圈 ,不會嚴格從起始值開始取值( 即show sequences命令看到的不一定是最大值 )。Simple(效能差),單調遞增,有瓶頸,謹慎使用。
DRDS可以進行資料表管理,可查看錶結構、設定全表掃描、刪除表。DRDS可設定白名單。DRDS支援資料匯入匯出。DRDS支援分散式JOIN,但對複雜情況,如對大表之間的JOIN,執行代價高,速度過慢容易導致效能或者系統不可用。
全表掃描是SQL語句被分發到所有分庫上執行,在執行帶有WHERE條件的UPDATE、DELETE、SELECT語句時, SQL語句中沒有使用拆分鍵或者雖指定拆分鍵但是範圍太廣會導致全表掃描。全表掃描預設是關閉的,響應較慢,避免在高併發業務場景中使用。
DRDS將執行時間超過1秒的SQL定義為慢SQL,分為邏輯慢SQL(應用傳送到DRDS,使用SHOW FULL SLOW檢視),物理慢SQL(DRDS傳送到RDS,使用SHOW FULL PHYSICAL_SLOW檢視)。SHOW SLOW可檢視慢SQL,SHOW PROCESSLIST檢視資料庫實時執行資訊。
DRDS支援由經典網路(Classic)切換到VPC(例項必須是共享例項,且地域和VPC的必須相同),切換後Classic型別的ECS無法訪問DRDS,VPC環境的ECS才能訪問VPC環境的DRDS。DRDS切換到VPC後,不會影響DRDS之下的RDS,RDS例項的域名會自動解析為VPC的IP段地址 ,因此RDS的網路型別不需要切換。
DRDS預設支援只單機事務,不支援跨庫事務。分散式事務服務請單獨申請開通。
DRDS DDL 拆分函式對分庫分表的支援情況
DRDS 是一個支援既分庫又分表的資料庫服務。目前 DRDS 分庫函式與分表函式的支援情況如下:
拆分函式 | 描述 | 是否支援用於分庫 | 是否支援用於分表 |
---|---|---|---|
HASH | 簡單取模 | 是 | 是 |
UNI_HASH | 簡單取模 | 是 | 是 |
RIGHT_SHIFT | 數值向右移 | 是 | 是 |
RANGE_HASH | 雙拆分列雜湊 | 是 | 是 |
MM | 按月份雜湊 | 否 | 是 |
DD | 按日期雜湊 | 否 | 是 |
WEEK | 按周雜湊 | 否 | 是 |
MMDD | 按月日雜湊 | 否 | 是 |
YYYYMM | 按年月雜湊 | 是 | 是 |
YYYYWEEK | 按年周雜湊 | 是 | 是 |
YYYYDD | 按年日雜湊 | 是 | 是 |
YYYYMM_OPT | 按年月雜湊,改進型 | 是 | 是 |
YYYYWEEK_OPT | 按年周雜湊,改進型 | 是 | 是 |
YYYYDD_OPT | 按年日雜湊,改進型 | 是 | 是 |