drds基礎筆記

幫助文檔URL: https://help.aliyun.com/document_detail/29659.html?spm=a2c4g.11186623.6.539.6c5jsL

drds知識總結:

bug1,分庫分表的時候,在表對象中查不到.
bug2,分庫分表無法進行數據導入,提示表結構找不到.
note1,分區鍵起作用後,可能導致查詢出結果主鍵衝突.主鍵要提前設定爲全局唯一.
note2,分區鍵鍵值不可修改.
note3,如果是雪花生成的,都是16的整數倍,取模後都爲0,落在0分庫.對於歷史數據,統一修改爲自增,或者採用其他分區函數.
哈希算法是簡單取模,要求拆分列的值的自身分佈均衡才能保證哈希均衡。

note4,right_shift是先轉換成2進制,然後向右移動位數進行計算,如果原來是16整數倍的數據,如右移位數不夠,數據仍不均,導致right_shift處理後的數據還是分佈不均勻.


(Distributed Relational Database Service)
特點:
分庫分表,透明讀寫分離,分佈式事務(結合分佈式事務套件 GTS),平滑擴容.
目的:單機數據庫遇到的容量(200+mysql實例)和性能瓶頸,最主要是性能問題.


其他技巧:
權限,查看子庫,自生成主鍵
分佈式運維指令集
DRDS 提供獨有分佈式數據庫運維指令集,如 SHOW SLOW、TRACE、SHOW NODE 等指令,幫助您快速發現和定位問題。
全局唯一數字序列
DRDS 支持分佈式全局唯一且有序遞增的數字序列。滿足業務在使用分佈式數據庫下對主鍵或者唯一鍵以及特定場景的需求。
數據庫賬號權限體系
DRDS 支持類單機 MySQL 賬號和權限體系,確保不同角色使用的賬號操作安全。


名詞理解:
DRDS 服務節點(DRDS Server) DRDS Server 是 DRDS 核心組件,提供 SQL 的解析、優化、路由和結果歸併。
DRDS 實例 DRDS 實例是由一組 DRDS Server 節點組成的分佈式數據庫服務集羣。各服務節點無狀態,同時處理 SQL 請求。
分庫 DRDS 水平拆分後,邏輯數據庫數據存儲在多個物理存儲實例上,每個存儲實例上的物理庫稱爲分庫。
分表 DRDS 水平拆分後,每一個分庫上的物理數據表稱爲分表。
小表廣播
全表掃描 數據庫拆分模式下,如果 SQL 語句中沒有指定拆分鍵.
DRDS 自定義註釋(DRDS Hint)


SQL 大類限制
暫不支持用戶自定義數據類型、自定義函數。
暫不支持視圖、存儲過程、觸發器、遊標。
暫不支持 BEGIN…END、LOOP…END LOOP、REPEAT…UNTIL…END REPEAT、WHILE…DO…END WHILE 等複合語句。
暫不支類似 IF ,WHILE 等流程控制類語句。


DML
暫不支持 SELECT INTO OUTFILE/INTO DUMPFILE/INTO var_name。
暫不支持非 WHERE 條件的 Correlate Subquery。 #只支持where條件的關聯子查詢
暫不支持 SQL 中帶聚合條件的 Correlate Subquery。 #且關聯子查詢不能有聚合函數.
5.3.1 版本 SQL 兼容性
不支持 BIT_AND
不支持 BIT_XOR
不支持 BIT_OR


拆分鍵(分庫分表)暫時只支持單個字段
注意:在執行帶有 WHERE 條件的 UPDATE、DELETE、SELECT 語句時,如果 SQL 語句中沒有使用拆分鍵,或者雖然指定了拆分鍵但是範圍太廣,會導致 SQL 語句被分發到所有分庫上執行(即全表掃描),且執行結果會在 DRDS 中進行合併。全表掃描響應較慢,在高併發業務場景中應儘量避免使用。


磁盤餘量接近30%,那麼可以通過平滑擴容來改善
平滑擴容資源消耗高,執行擴容前請提工單尋求 DRDS 團隊協助。


監控:
網絡流入:rds->drds
網絡流出:drds->rds(主要是sql); drds->應用




權限級別支持情況
全局層級(暫不支持)
數據庫層級(支持)*****
表層級(支持)*****
列層級(暫不支持)
子程序層級(暫不支持)
注意:DRDS 裏通過 CREATE USER 創建出來的賬號只存在於 DRDS,跟 RDS 沒有任何關係,也不會同步到後端的 RDS 中去。


只有管理員賬號具有創建賬號和授權功能;其它賬號只能由管理員賬號創建,其權限只能由管理員賬號授予;
管理員賬號是跟數據庫綁定的,沒有其它數據庫的權限,連接的時候只能連接自己對應的那個數據庫,不能授予其它數據庫的權限給某個賬號。例如 easydb 這個管理員賬號只能連接 easydb 數據庫,只能授予 easydb 數據庫權限或者 easydb 數據庫中表的權限給某個賬號;
創建權限只能通過cmd方式:https://help.aliyun.com/document_detail/50890.html?spm=a2c4g.11186623.6.570.XK5yf9


DRDS 默認會在 1 個 RDS 上創建 8 個物理庫,總的物理庫數量爲選擇的 RDS 數量乘以 8。


由於使用 MySQL 客戶端,在使用 HINT 時,在命令行上務必添加 -c 參數,否則失效.通過註釋實現(類似/*…*/)。


RDS 只讀實例過期或者需要釋放時,需要在 DRDS 控制檯中把讀權重置爲0,否則流量會繼續走到原有隻讀實例,導致執行失敗。


全表掃描功能默認是關閉的,需要配置後才能使用.
通過 DTS 數據遷移到 DRDS,不支持結構導入,請先在 DRDS 庫上建表。


在全表掃描時,通過聚合函數,DRDS 支持對全表的統計彙總。目前支持的聚合函數有 COUNT、MAX、MIN、SUM, 另外還支持 LIKE、ORDER BY 與 LIMIT 語法。




擴容期間請勿在控制檯提交 DDL 任務或通過直接連接 DRDS 執行 DDL 語句,否則會導致擴容任務失敗。
擴容需要保證源庫中所有表具有主鍵,如果沒有需要事先添加好。


拆分變更:以單錶轉分表爲例,在建立轉換任務前,需要先準備好新表,除拆分方式和表名稱外,新表需要與舊錶結構相同.新表與舊錶需在同一個數據庫內,轉換任務運行期間需避免對舊錶或新表做結構變更。


DDL語句特有的參數:
DBPARTITION BY、TBPARTITION BY、TBPARTITIONS、BROADCAST。方式:mysql client,navicate,DMS.


分庫分表的子句和參數:
DBPARTITION BY hash(partition_key):指定分庫鍵和分庫算法,不支持按照時間分庫;
TBPARTITION BY { HASH(column) | {MM|DD|WEEK|MMDD}(column)(可選):默認與 DBPARTITION BY 相同,指定物理表使用什麼方式映射數據;
TBPARTITIONS num(可選):每個庫上的物理表數目(默認爲1),如不分表,就不需要指定該字段。


1,創建單庫單表,會在一個rds實力創建,8個物理分庫每個只有一個同名的該表.
2,創建分表,會在一個rds實例上創建,8個物理分庫,每個包含一個該表,但序號是遞增的.
3,創建分表,且指定tbpartitions num,則8個物理分庫,每個包含num個該表,序號是遞增的.


單庫單表:
建一張單庫單表,不做任何拆分。
CREATE TABLE single_tbl(
  id int, 
  name varchar(30), 
  primary key(id)
);
只在 0 庫創建了一張單庫單表的邏輯表。
mysql> show topology from single_tbl;


分庫不分表:
假設已經建好的分庫數爲 8,建一張表,只分庫不分表,分庫方式爲根據 id 列哈希。
CREATE TABLE multi_db_single_tbl(
  id int, 
  name varchar(30), 
  primary key(id)
) dbpartition by hash(id);
查看該邏輯表的節點拓撲,可以看出在每個分庫都創建了 1 張分表,既只做了分庫。
mysql> show topology from multi_db_single_tbl;


分庫分表:
建一張表,既分庫又分表,每個庫含有 3 張物理表,分庫拆分方式爲按照 id 列進行哈希,分表拆分方式爲按照 bid 列進行哈希(先根據 id 列的值進行哈希運算,將表中數據分佈在多個子庫中,每個子庫中的數據再根據 bid 列值的哈希運算結果分佈在3個物理表中)。
CREATE TABLE multi_db_multi_tbl(
  id int auto_increment, 
  bid int, 
  name varchar(30), 
  primary key(id)
) dbpartition by hash(id) tbpartition by hash(bid) tbpartitions 3;
查看該邏輯表的節點拓撲,可以看出在每個分庫都創建了 3 張分表。
mysql> show topology from multi_db_multi_tbl;
查看該邏輯表的拆分規則,可以看出分庫分表的拆分拆分方式均爲哈希,分庫的拆分鍵爲 id,分表的拆分鍵爲 bid。
mysql> show rule from multi_db_multi_tbl;




使用雙字段哈希函數做拆分
適合於需要有兩個拆分鍵,並且僅使用其中一個拆分鍵值進行查詢時的場景。
注意事項
兩個拆分鍵皆不能修改。
插入數據時如果發現兩個拆分鍵指向不同的分庫或分表時,插入會失敗。


使用日期做拆分,按星期存儲
按照一年 12 個月進行拆分
按照一個月 31 天進行拆分
按照一年 365 天進行拆分
按照一年 365 天進行拆分,路由到 10 張物理表


系統默認使用主鍵作爲拆分字段。
CREATE TABLE prmkey_multi_tbl(
id int, 
name varchar(30), 
primary key(id)
) dbpartition by hash() tbpartition by hash() tbpartitions 3;


創建廣播表:
CREATE TABLE brd_tbl(
  id int, 
  name varchar(30), 
  primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;
將 JOIN 操作下推到底層的 RDS(MySQL),來避免跨庫 JOIN。


注意:如果修改的是拆分表,則不允許修改拆分字段。
增加列:
ALTER TABLE user_log
  ADD COLUMN idcard varchar(30);
增加索引:
ALTER TABLE user_log
  ADD INDEX idcard_idx (idcard);
刪除索引:
ALTER TABLE user_log
  DROP INDEX idcard_idx;
修改字段:
ALTER TABLE user_log
  MODIFY COLUMN idcard varchar(40);


DRDS DDL 的執行是一個分佈式處理過程,出錯可能導致各個分片表結構不一致,所以需要進行手動清理。
步驟如下:https://help.aliyun.com/document_detail/51893.html?spm=a2c4g.11186623.6.596.a3dHbO
1,DRDS 會提供基本的錯誤描述信息,比如語法錯誤等。如果錯誤信息太長,則會提示用戶調用 SHOW WARNINGS 的 SQL 命令來查看每個分庫執行失敗的原因。
2,可以通過 SHOW TOPOLOGY 命令來查看物理表的拓撲結構。SHOW TOPOLOGY的具體用法請參考 DRDS 控制指令。
3,使用 CHECK TABLE tablename指令來查看邏輯表是否創建成功。比如下面的例子展示了 multi_db_multi_tbl 的某個物理分表沒有創建成功。
4,使用冪等的方式繼續執行建表操作或刪表操作,會創建或刪除剩餘的物理表。


拆分函數 描述 是否支持用於分庫 是否支持用於分表
HASH 簡單取模 ********
UNI_HASH 簡單取模 ********
RIGHT_SHIFT 數值向右移 ********
RANGE_HASH 雙拆分列哈希 ********
MM 按月份哈希
DD 按日期哈希
WEEK 按周哈希
MMDD 按月日哈希
YYYYMM 按年月哈希
YYYYWEEK 按年周哈希
YYYYDD 按年日哈希
YYYYMM_OPT 按年月哈希,改進型
YYYYWEEK_OPT 按年周哈希,改進型
YYYYDD_OPT 按年日哈希,改進型


當一張邏輯表的分庫拆分方式與分表拆分方式不一致時,若 SQL 查詢沒有同時帶上分庫條件與分表條件,則 DRDS 在查詢過程會產生全分庫掃描或全分表掃描的操作。


DRDS 的拆分函數對各數據類型對支持情況有所不同,時間拆分函數只支持時間類型,其他類型支持非時間字段.https://help.aliyun.com/document_detail/57193.html?spm=a2c4g.11186623.6.598.2qjDGt




HASH  
使用要求
拆分鍵的數據類型必須是整數類型或字符串類型。
分庫和分表都使用同一個拆分鍵進行 HASH 時,根據拆分鍵的鍵值按總的分表數取餘。例如,有 2 個分庫,每個分庫 4 張分表,那麼 0 庫上保存分表 0~3,1 庫上保存分表 4~7。某個鍵值爲 15,15 % (2 * 4) = 7,所以 15 被分到 1 庫的表 7 上。


UNI_HASH
分庫和分表都使用同一個拆分鍵進行 UNI_HASH 時,仍然保證先根據分庫鍵鍵值按分庫數取餘( HASH不是 ),再均勻散佈到該分庫的各個分表上
適用場景:兩張邏輯表需要根據同一個拆分鍵進行分庫,兩張表的分表數不同,又經常會按該拆分鍵進行 JOIN 的場景。


SHOW RULE [FROM tablename] 語句
SHOW FULL RULE [FROM tablename] 語句 查看數據庫下邏輯表的拆分規則,比 SHOW RULE 指令展示的信息更加詳細。
SHOW TOPOLOGY FROM tablename 語句 查看指定邏輯表的拓撲分佈,展示該邏輯表保存在哪些分庫中,每個分庫下包含哪些分表。
SHOW BROADCASTS 語句 查看廣播表列表。
SHOW DATASOURCES 語句 查看底層存儲信息,包含數據庫名、數據庫分組名、連接信息、用戶名、底層存儲類型、讀寫權重、連接池信息等。
SHOW NODE 語句 查看物理庫的讀寫次數(歷史累計數據)、讀寫權重(歷史累計數據)。


show rule:查看數據庫下每一個邏輯表的拆分情況;
show rule from tablename:查看數據庫下指定邏輯表的拆分情況。


注意:僅拆分表和廣播表指定了 AUTO_INCREMENT 後,DRDS 纔會創建隱式的 Sequence。非拆分表並不會,非拆分表的 AUTO_INCREMENT 的值由底層 RDS(MySQL)自己生成。


由於拆分鍵的值的修改會涉及到數據在分片之間的移動,屬於分佈式事務(DRDS 默認不支持分佈式事務),所以目前 DRDS 不允許修改拆分鍵的值。如果業務有此需求,可以嘗試重新插入數據,再刪除老數據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章