柚子快報激活碼778899分享:數據庫 MySQL-分庫分表
目錄
介紹
問題分析
拆分策略
垂直拆分
垂直分庫
垂直分表
水平拆分
水平分庫
水平分表
實現技術
MyCat
介紹
目錄
結構
入門
配置
schema.xml
schema標簽
datanode標簽
datahost標簽
rule.xml
server.xml
system標簽
user標簽
分片
垂直拆分
水平拆分
分片規(guī)則
范圍分片auto-sharding-long
取模分片mod-long
一致性hash分片sharding-by-murmur
枚舉分片
應用指定算法sharding-by-substring
固定分片hash算法
字符串hash解析算法
按天分片算法
自然月分片
MyCat管理與監(jiān)控
MyCat原理
MyCat管理
MyCat-eye
介紹
問題分析
隨著互聯網及移動互聯網的發(fā)展,應用系統(tǒng)的數據量也是成指數式增長,若采用單數據庫進行數據存儲,存在以下性能瓶頸:
IO瓶頸:熱點數據太多,數據庫緩存不足,產生大量磁盤IO,效率較低,請求數據太多,帶寬不夠,網絡IO瓶頸CPU瓶頸:排序、分組、連接查詢、聚合統(tǒng)計等SQL會耗費大量的CPU資源,請求數太多,CPU出現瓶頸
為了解決上述問題,需要對數據庫進行分庫分表處理
分庫分表的中心思想是將數據分散存儲,使得單一數據庫/表的數據量變小來緩解單一數據庫的性能問題,從而達到提升數據庫性能的目的
拆分策略
分庫分表的形式主要是兩種:垂直拆分和水平拆分,拆分的粒度又分為分庫和分表:
垂直拆分
垂直分庫
以表為依據,根據業(yè)務將不同表拆分到不同庫中
特點:
每個庫的表結構都不一樣每個庫的數據也不一樣所有庫的并集是全量數據
垂直分表
以字段為依據,根據字段屬性將不同字段拆分到不同表中
特點:
每個表的結構都不一樣每個表的數據也不一樣,一般通過一列(主鍵/外鍵)關聯所有表的并集是全量數據
水平拆分
水平分庫
以行(記錄)為依據,按照一定策略,將一個庫的數據拆分到多個庫中
特點:
每個庫的表結構都一樣每個庫的數據都不一樣所有庫的并集是全量數據
水平分表
以行(記錄)為依據,按照一定策略,將一個表的數據拆分到多個表中
特點:
每個表的結構都一樣每個表的數據都不一樣所有表的并集是全量數據
實現技術
shardingJDBC:基于AOP原理,在應用程序中對本地執(zhí)行的SQL進行攔截、解析、改寫、路由處理,需要自行編碼配置實現,只支持Java語言,性能較高MyCat:數據庫分庫分表中間件,不用調整代碼即可實現分庫分表,支持多種語言,性能不及前者
MyCat
介紹
MyCat是開源的、活躍的、基于Java語言編寫的MySQL數據庫中間件,可以像使用MySQL一樣來使用MyCat
優(yōu)勢:
性能可靠穩(wěn)定強大的技術團隊體系完善社區(qū)活躍
目錄
bin:存放可執(zhí)行文件,用于啟動停止mycatconf:存放mycat的配置文件lib:存放mycat的項目依賴包(jar)logs:存放mycat的日志文件
結構
在MyCat的整體結構中,分為:邏輯結構和物理結構
MyCat的邏輯結構主要負責邏輯庫、邏輯表、分片規(guī)則、分片節(jié)點等邏輯結構的處理,而具體的數據存儲還是在物理結構,也就是數據庫服務器中存儲
入門
tb_order表中數據量很大,對其進行數據分片,分為三個數據節(jié)點,每一個節(jié)點主機位于不同的服務器上
準備三臺服務器,并分別創(chuàng)建數據庫db01:
192.168.200.210:MyCat中間件服務器,同時也是第一個分片服務器192.168.200.213:第二個分片服務器192.168.200.214:第三個分片服務器
修改schema.xml配置:
修改server.xml配置:
啟動:
先啟動3臺分片服務器,然后啟動MyCat服務器,切換到MyCat的安裝目錄,啟動MyCat
#啟動
bin/mycat start
#停止
bin/mycat stop
MyCat啟動后,占用端口號8066
連接MyCat:
MyCat在底層模擬了MySQL的協(xié)議
mysql -h 192.168.200.210 -P 8066 -uroot -p123456
在MyCat中創(chuàng)建表,并插入數據:
CREATE TABLE TB_ORDER (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ;
INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
INSERT INTO TB_ORDER(id,title) VALUES(5000000,'goods5000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000000,'goods10000000');
INSERT INTO TB_ORDER(id,title) VALUES(10000001,'goods10000001');
INSERT INTO TB_ORDER(id,title) VALUES(15000000,'goods15000000');
INSERT INTO TB_ORDER(id,title) VALUES(15000001,'goods15000001');
在插入數據時:
如果id的值在1-500w之間,數據將會存儲在第一個分片數據庫中如果id的值在500w-1000w之間,數據將會存儲在第二個分片數據庫中如果id的值在1000w-1500w之間,數據將會存儲在第三個分片數據庫中如果id的值超出1500w,在插入數據時,將會報錯
數據落在哪一個分片服務器是由邏輯表配置時的一個參數rule決定的,這個參數配置的就是分片規(guī)則
配置
schema.xml
schema.xml作為MyCat中最重要的配置文件之一,涵蓋了MyCat的邏輯庫、邏輯表、分片規(guī)則、分片節(jié)點及數據源的配置
主要包含三組標簽:
schema標簽datanode標簽datahost標簽
schema標簽
1.schema定義邏輯庫
schema標簽用于定義 MyCat實例中的邏輯庫 , 一個MyCat實例中, 可以有多個邏輯庫 , 可以通過schema標簽來劃分不同的邏輯庫。MyCat中的邏輯庫的概念,等同于MySQL中的database概念,需要操作某個邏輯庫下的表時, 也需要切換邏輯庫(use xxx)
核心屬性:
name:指定自定義的邏輯庫庫名checkSQLschema:在SQL語句操作時指定了數據庫名稱,執(zhí)行時是否自動去除;true:自動去 除,false:不自動去除sqlMaxLimit:如果未指定limit進行查詢,列表查詢模式查詢多少條記錄
2.schema中的table定義邏輯表
table標簽定義了MyCat中邏輯庫schema下的邏輯表 , 所有需要拆分的表都需要在table標簽中定義
核心屬性:
name:定義邏輯表表名,在該邏輯庫下唯一dataNode:定義邏輯表所屬的dataNode,該屬性需要與dataNode標簽中name對應;多個dataNode逗號分隔rule:分片規(guī)則的名字,分片規(guī)則名字是在rule.xml中定義的primaryKey:邏輯表對應真實表的主鍵type:邏輯表的類型,目前邏輯表只有全局表和普通表,如果未配置,就是普通表;全局表,配置為 global
datanode標簽
核心屬性:
name:定義數據節(jié)點名稱dataHost:數據庫實例主機名稱,引用自 dataHost 標簽中name屬性database:定義分片所屬數據庫
datahost標簽
該標簽在MyCat邏輯庫中作為底層標簽存在,直接定義了具體的數據庫實例、讀寫分離、心跳語句
核心屬性:
name:唯一標識,供上層標簽使用maxCon/minCon:最大連接數/最小連接數balance:負載均衡策略,取值 0,1,2,3writeType:寫操作分發(fā)方式(0:寫操作轉發(fā)到第一個writeHost,第一個掛了,切換到第二個;1:寫操作隨機分發(fā)到配置的writeHost)dbDriver:數據庫驅動,支持native、jdbc
rule.xml
rule.xml中定義所有拆分表的規(guī)則, 在使用過程中可以靈活的使用分片算法, 或者對同一個分片算法使用不同的參數, 它讓分片過程可配置化
主要包含兩類標簽:tableRule、Function
server.xml
server.xml配置文件包含了MyCat的系統(tǒng)配置信息,主要有兩個重要的標簽:system、user
system標簽
主要配置MyCat中的系統(tǒng)配置信息
屬性取值含義charsetutf8設置Mycat的字符集, 字符集需要與MySQL的字符集保持一致nonePasswordLogin0,10為需要密碼登陸、1為不需要密碼登陸 ,默認為0,設置為1則需要指定默認賬戶useHandshakeV100,1使用該選項主要的目的是為了能夠兼容高版本的jdbc驅動, 是否采用HandshakeV10Packet來與client進行通信, 1:是, 0:否useSqlStat0,1開啟SQL實時統(tǒng)計, 1 為開啟 , 0 為關閉 ; 開啟之后, MyCat會自動統(tǒng)計SQL語句的執(zhí)行情況 ; mysql -h 127.0.0.1 -P 9066 -u root -p 查看MyCat執(zhí)行的SQL, 執(zhí)行效率比較低的SQL , SQL的整體執(zhí)行情況、讀寫比例等 ; show @@sql ; show @@sql.slow ; show @@sql.sum ;useGlobleTableCheck0,1是否開啟全局表的一致性檢測。1為開啟 ,0為關閉 。sqlExecuteTimeout1000SQL語句執(zhí)行的超時時間 , 單位為 s ;sequnceHandlerType0,1,2用來指定Mycat全局序列類型,0 為本地文件,1 為數據庫方式,2 為時間戳列方式,默認使用本地文件方式,文件方式主要用于測試sequnceHandlerPattern正則表達式必須帶有MYCATSEQ或者 mycatseq進入序列匹配流程 注意MYCATSEQ_有空格的情況subqueryRelationshipChecktrue,false子查詢中存在關聯查詢的情況下,檢查關聯字段中是否有分片字段 .默認 falseuseCompression0,1開啟mysql壓縮協(xié)議 , 0 : 關閉, 1 : 開啟fakeMySQLVersion5.5,5.6設置模擬的MySQL版本號defaultSqlParser由于MyCat的最初版本使用了FoundationDB的SQL解析器, 在MyCat1.3后增加了Druid解析器, 所以要設置defaultSqlParser屬性來指定默認的解析器; 解析器有兩個 : druidparser 和 fdbparser, 在MyCat1.4之后,默認是druidparser, fdbparser已經廢除了processors1,2....指定系統(tǒng)可用的線程數量, 默認值為CPU核心 x 每個核心運行線程數量; processors 會影響processorBufferPool, processorBufferLocalPercent, processorExecutor屬性, 所有, 在性能調優(yōu)時, 可以適當地修改processors值processorBufferChunk指定每次分配Socket Direct Buffer默認值為4096字節(jié), 也會影響B(tài)ufferPool長度, 如果一次性獲取字節(jié)過多而導致buffer不夠用, 則會出現警告, 可以調大該值processorExecutor指定NIOProcessor上共享 businessExecutor固定線程池的大小; MyCat把異步任務交給 businessExecutor線程池中, 在新版本的MyCat中這個連接池使用頻次不高, 可以適當地把該值調小packetHeaderSize指定MySQL協(xié)議中的報文頭長度, 默認4個字節(jié)maxPacketSize指定MySQL協(xié)議可以攜帶的數據最大大小, 默認值為16MidleTimeout30指定連接的空閑時間的超時長度;如果超時,將關閉資源并回收, 默認30分鐘txIsolation1,2,3,4初始化前端連接的事務隔離級別,默認為 REPEATED_READ , 對應數字為3 READ_UNCOMMITED=1; READ_COMMITTED=2; REPEATED_READ=3; SERIALIZABLE=4;sqlExecuteTimeout300執(zhí)行SQL的超時時間, 如果SQL語句執(zhí)行超時,將關閉連接; 默認300秒;serverPort8066定義MyCat的使用端口, 默認8066managerPort9066定義MyCat的管理端口, 默認9066
user標簽
配置MyCat中的用戶、訪問密碼以及用戶針對邏輯庫、邏輯表的權限信息
分片
垂直拆分
在業(yè)務系統(tǒng)中, 涉及以下表結構 ,但是由于用戶與訂單每天都會產生大量的數據, 單臺服務器的數據存儲及處理能力是有限的, 可以對數據庫表進行拆分, 原有的數據庫表如下:
現在考慮將其進行垂直分庫操作,將商品相關的表拆分到一個數據庫服務器,訂單表拆分的一個數據庫服務器,用戶及省市區(qū)表拆分到一個服務器,最終結構如下:
準備三臺服務器,并創(chuàng)建數據庫shopping:
schema.xml:
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
server.xml:
上傳測試SQL腳本到服務器的/root目錄:
執(zhí)行指令導入測試數據, 重新啟動MyCat后,在命令行中,通過source指令導入表結構以及對應的數據,查看數據分布情況:
source /root/shopping-table.sql
source /root/shopping-insert.sql
查詢用戶的收件人及收件人的地址信息(包括省、市、區(qū)),可以正常查詢出數據:
select ua.user_id, ua.contact, p.province, c.city, r.area , ua.address
from tb_user_address ua ,tb_areas_city c , tb_areas_provinces p ,tb_areas_region r
where ua.province_id = p.provinceid and ua.city_id = c.cityid and ua.town_id = r.areaid;
查詢每一筆訂單及訂單的收件地址信息(包括省、市、區(qū)):
SELECT order_id , payment ,receiver, province , city , area
FROM tb_order_master o, tb_areas_provinces p , tb_areas_city c , tb_areas_region r
WHERE o.receiver_province = p.provinceid AND o.receiver_city = c.cityid AND o.receiver_region = r.areaid ;
訂單相關的表和省市區(qū)的表不在同一個服務器中,SQL語句報錯,原因是沒有一個數據庫服務器完全包含了訂單及省市區(qū)的表結構
解決方式:全局表
對于省、市、區(qū)/縣表tb_areas_provinces , tb_areas_city , tb_areas_region,是屬于數據字典表,在多個業(yè)務模塊中都可能會遇到,可以將其設置為全局表,利于業(yè)務操作
修改schema.xml中的邏輯表的配置,修改 tb_areas_provinces、tb_areas_city、tb_areas_region三個邏輯表,增加 type 屬性,配置為global,就代表該表是全局表,就會在所涉及到的dataNode中創(chuàng)建表。對于當前配置來說,也就意味著所有的節(jié)點中都有該表了
重啟MyCat
刪除原來每一個數據庫服務器中的所有表結構
通過source指令導入表及數據
檢查每一個數據庫服務器中的表及數據分布,三個節(jié)點中都有這三張全局表
再次執(zhí)行SQL語句
當在MyCat中更新全局表時,所有分片中的數據都改變,每個節(jié)點的全局表數據時刻保持一致
水平拆分
在業(yè)務系統(tǒng)中, 有一張表(日志表), 業(yè)務系統(tǒng)每天都會產生大量的日志數據 , 單臺服務器的數據存儲及處理能力是有限的, 可以對數據庫表進行拆分
每臺服務器上創(chuàng)建數據庫itcast
schema.xml:
server.xml:
重啟MyCat,創(chuàng)建表,插入數據:
CREATE TABLE tb_log (
id bigint(20) NOT NULL COMMENT 'ID',
model_name varchar(200) DEFAULT NULL COMMENT '模塊名',
model_value varchar(200) DEFAULT NULL COMMENT '模塊值',
return_value varchar(200) DEFAULT NULL COMMENT '返回值',
return_class varchar(200) DEFAULT NULL COMMENT '返回值類型',
operate_user varchar(20) DEFAULT NULL COMMENT '操作用戶',
operate_time varchar(20) DEFAULT NULL COMMENT '操作時間',
param_and_value varchar(500) DEFAULT NULL COMMENT '請求參數名及參數值', operate_class varchar(200) DEFAULT NULL COMMENT '操作類',
operate_method varchar(200) DEFAULT NULL COMMENT '操作方法',
cost_time bigint(20) DEFAULT NULL COMMENT '執(zhí)行方法耗時, 單位 ms',
source int(1) DEFAULT NULL COMMENT '來源 : 1 PC , 2 Android , 3 IOS', PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class,
operate_user, operate_time, param_and_value, operate_class, operate_method,
cost_time,source)
VALUES('1','user','insert','success','java.lang.String','10001','2022-01-06
18:12:28','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','10',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class,
operate_user, operate_time, param_and_value, operate_class, operate_method,
cost_time,source)
VALUES('2','user','insert','success','java.lang.String','10001','2022-01-06
18:12:27','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','23',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class,
operate_user, operate_time, param_and_value, operate_class, operate_method,
cost_time,source)
VALUES('3','user','update','success','java.lang.String','10001','2022-01-06
18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','34',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class,
operate_user, operate_time, param_and_value, operate_class, operate_method,
cost_time,source)
VALUES('4','user','update','success','java.lang.String','10001','2022-01-06
18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','13',2);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class,
operate_user, operate_time, param_and_value, operate_class, operate_method,
cost_time,source)
VALUES('5','user','insert','success','java.lang.String','10001','2022-01-06
18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','insert','29',3);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class,
operate_user, operate_time, param_and_value, operate_class, operate_method,
cost_time,source)
VALUES('6','user','find','success','java.lang.String','10001','2022-01-06
18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','find','29',2);
分片規(guī)則
范圍分片auto-sharding-long
根據指定的字段及其配置的范圍與數據節(jié)點的對應情況,來決定該數據屬于哪一個分片
schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
在rule.xml中配置分片規(guī)則時,關聯了一個映射配置文件autopartition-long.txt:
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
含義:0-500萬之間的值,存儲在0號數據節(jié)點(數據節(jié)點的索引從0開始) ;500萬-1000萬之間的數據存儲在1號數據節(jié)點 ;1000萬-1500萬的數據節(jié)點存儲在2號節(jié)點?
該分片規(guī)則主要針對于數字類型的字段使用
取模分片mod-long
根據指定的字段值與節(jié)點數量進行取模運算,根據運算結果,來決定該數據屬于哪一個分片
schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
?該分片規(guī)則主要針對于數字類型的字段使用
一致性hash分片sharding-by-murmur
一致性哈希是相同的哈希因子計算值總是被劃分到相同的分區(qū)表中,不會因為分區(qū)節(jié)點的增加而改變原來數據的分區(qū)位置,有效解決了分布式數據的擴容問題
schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數據:
create table tb_order(
id varchar(100) not null primary key, money int null,
content varchar(200) null
);
INSERT INTO tb_order (id, money, content) VALUES ('b92fdaaf-6fc4-11ec-b831-482ae33c4a2d', 10, 'b92fdaf8-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b93482b6-6fc4-11ec-b831-482ae33c4a2d', 20, 'b93482d5-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b937e246-6fc4-11ec-b831-482ae33c4a2d', 50, 'b937e25d-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b93be2dd-6fc4-11ec-b831-482ae33c4a2d', 100, 'b93be2f9-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b93f2d68-6fc4-11ec-b831-482ae33c4a2d', 130, 'b93f2d7d-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b9451b98-6fc4-11ec-b831-482ae33c4a2d', 30, 'b9451bcc-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b9488ec1-6fc4-11ec-b831-482ae33c4a2d', 560, 'b9488edb-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b94be6e6-6fc4-11ec-b831-482ae33c4a2d', 10, 'b94be6ff-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b94ee10d-6fc4-11ec-b831-482ae33c4a2d', 123, 'b94ee12c-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b952492a-6fc4-11ec-b831-482ae33c4a2d', 145, 'b9524945-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b95553ac-6fc4-11ec-b831-482ae33c4a2d', 543, 'b95553c8-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b9581cdd-6fc4-11ec-b831-482ae33c4a2d', 17, 'b9581cfa-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b95afc0f-6fc4-11ec-b831-482ae33c4a2d', 18, 'b95afc2a-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b95daa99-6fc4-11ec-b831-482ae33c4a2d', 134, 'b95daab2-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b9667e3c-6fc4-11ec-b831-482ae33c4a2d', 156, 'b9667e60-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b96ab489-6fc4-11ec-b831-482ae33c4a2d', 175, 'b96ab4a5-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b96e2942-6fc4-11ec-b831-482ae33c4a2d', 180, 'b96e295b-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b97092ec-6fc4-11ec-b831-482ae33c4a2d', 123, 'b9709306-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b973727a-6fc4-11ec-b831-482ae33c4a2d', 230, 'b9737293-6fc4-11ec-b831-482ae33c4a2d');
INSERT INTO tb_order (id, money, content) VALUES ('b978840f-6fc4-11ec-b831-482ae33c4a2d', 560, 'b978843c-6fc4-11ec-b831-482ae33c4a2d');
枚舉分片
通過在配置文件中配置可能的枚舉值,指定數據分布到不同數據節(jié)點上,本規(guī)則適用于按照省份、性別、狀態(tài)拆分數據等業(yè)務
schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
partition-hash-int.txt:狀態(tài)為1對應第一個節(jié)點(節(jié)點下標從0開始),為2對應第二個節(jié)點,為3對應第三個節(jié)點
1=0
2=1
3=2
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數據:
CREATE TABLE tb_user (
id bigint(20) NOT NULL COMMENT 'ID',
username varchar(200) DEFAULT NULL COMMENT '姓名',
status int(2) DEFAULT '1' COMMENT '1: 未啟用, 2: 已啟用, 3: 已關閉',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into tb_user (id,username ,status) values(1,'Tom',1);
insert into tb_user (id,username ,status) values(2,'Cat',2);
insert into tb_user (id,username ,status) values(3,'Rose',3);
insert into tb_user (id,username ,status) values(4,'Coco',2);
insert into tb_user (id,username ,status) values(5,'Lily',1);
insert into tb_user (id,username ,status) values(6,'Tom',1);
insert into tb_user (id,username ,status) values(7,'Cat',2);
insert into tb_user (id,username ,status) values(8,'Rose',3);
insert into tb_user (id,username ,status) values(9,'Coco',2);
insert into tb_user (id,username ,status) values(10,'Lily',1);
應用指定算法sharding-by-substring
運行階段由應用自主決定路由到哪個分片,直接根據字符子串(必須是數字)計算分片號
?schema.xml邏輯表配置:
!-- 應用指定算法 -->
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
示例說明id=05-100000002 , 在此配置中代表根據id中從startIndex=0開始,截取siz=2位數字即05,05就是獲取的分區(qū),如果沒找到對應的分片則默認分配到defaultPartition
重啟,創(chuàng)建表插入數據:
CREATE TABLE tb_app (
id varchar(10) NOT NULL COMMENT 'ID',
name varchar(200) DEFAULT NULL COMMENT '名稱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into tb_app (id,name) values('0000001','Testx00001');
insert into tb_app (id,name) values('0100001','Test100001');
insert into tb_app (id,name) values('0100002','Test200001');
insert into tb_app (id,name) values('0200001','Test300001');
insert into tb_app (id,name) values('0200002','TesT400001');
固定分片hash算法
該算法類似于十進制的求模運算,但是二進制的操作,例如,取id的二進制后10位與1111111111進行位&運算,位&運算最小值為0000000000,最大值為1111111111,轉換為十進制,也就是位于0-1023之間
特點:
如果是求模,連續(xù)的值,分別分配到各個不同的分片;但是此算法會將連續(xù)的值可能分配到相同的分片,降低事務處理的難度可以均勻分配,也可以非均勻分配分片字段必須為數字類型
?schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
約束:
分片長度:默認最大1024count、length的長度必須一致
以上分為三個分區(qū):0-255,256-511,512-1023
分片規(guī)則配置屬性含義:
?示例說明:
重啟,創(chuàng)建表插入數據:
CREATE TABLE tb_longhash (
id int(11) NOT NULL COMMENT 'ID',
name varchar(200) DEFAULT NULL COMMENT '名稱',
firstChar char(1) COMMENT '首字母',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into tb_longhash (id,name,firstChar) values(1,'七匹狼','Q');
insert into tb_longhash (id,name,firstChar) values(2,'八匹狼','B');
insert into tb_longhash (id,name,firstChar) values(3,'九匹狼','J');
insert into tb_longhash (id,name,firstChar) values(4,'十匹狼','S');
insert into tb_longhash (id,name,firstChar) values(5,'六匹狼','L');
insert into tb_longhash (id,name,firstChar) values(6,'五匹狼','W');
insert into tb_longhash (id,name,firstChar) values(7,'四匹狼','S');
insert into tb_longhash (id,name,firstChar) values(8,'三匹狼','S');
insert into tb_longhash (id,name,firstChar) values(9,'兩匹狼','L');
字符串hash解析算法
截取字符串中的指定位置的子字符串,進行hash算法,算出分片
?schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
示例說明:
重啟,創(chuàng)建表插入數據:
create table tb_strhash(
name varchar(20) primary key,
content varchar(100)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_strhash (name,content) VALUES('T1001', UUID());
INSERT INTO tb_strhash (name,content) VALUES('ROSE', UUID());
INSERT INTO tb_strhash (name,content) VALUES('JERRY', UUID());
INSERT INTO tb_strhash (name,content) VALUES('CRISTINA', UUID());
INSERT INTO tb_strhash (name,content) VALUES('TOMCAT', UUID());
按天分片算法
按照日期及對應的時間周期來分片
?schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數據:
create table tb_datepart(
id bigint not null comment 'ID' primary key,
name varchar(100) null comment '姓名',
create_time date null
);
insert into tb_datepart(id,name ,create_time) values(1,'Tom','2022-01-01');
insert into tb_datepart(id,name ,create_time) values(2,'Cat','2022-01-10');
insert into tb_datepart(id,name ,create_time) values(3,'Rose','2022-01-11');
insert into tb_datepart(id,name ,create_time) values(4,'Coco','2022-01-20');
insert into tb_datepart(id,name ,create_time) values(5,'Rose2','2022-01-21');
insert into tb_datepart(id,name ,create_time) values(6,'Coco2','2022-01-30');
insert into tb_datepart(id,name ,create_time) values(7,'Coco3','2022-01-31');
自然月分片
使用場景為按照月份來分片,每個自然月為一個分片
?schema.xml邏輯表配置:
schema.xml數據節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數據:
create table tb_monthpart(
id bigint not null comment 'ID' primary key,
name varchar(100) null comment '姓名',
create_time date null
);
insert into tb_monthpart(id,name ,create_time) values(1,'Tom','2022-01-01');
insert into tb_monthpart(id,name ,create_time) values(2,'Cat','2022-01-10');
insert into tb_monthpart(id,name ,create_time) values(3,'Rose','2022-01-31');
insert into tb_monthpart(id,name ,create_time) values(4,'Coco','2022-02-20');
insert into tb_monthpart(id,name ,create_time) values(5,'Rose2','2022-02-25');
insert into tb_monthpart(id,name ,create_time) values(6,'Coco2','2022-03-10');
insert into tb_monthpart(id,name ,create_time) values(7,'Coco3','2022-03-31');
insert into tb_monthpart(id,name ,create_time) values(8,'Coco4','2022-04-10');
insert into tb_monthpart(id,name ,create_time) values(9,'Coco5','2022-04-30');
MyCat管理與監(jiān)控
MyCat原理
在MyCat中,當執(zhí)行一條SQL語句時,MyCat需要進行SQL解析、分片分析、路由分析、讀寫分離分析等操作,最終經過一系列的分析決定將當前的SQL語句到底路由到哪幾個(或哪一個)節(jié)點數據庫,數據庫將數據執(zhí)行完畢后,如果有返回的結果,則將結果返回給MyCat,最終還需要在MyCat中進行結果合并、聚合處理、排序處理、分頁處理等操作,最終再將結果返回給客戶端
MyCat官方提供了一個管理監(jiān)控平臺MyCat-Web(MyCat-eye),?MyCat-Web是MyCat可視化運維的管理和監(jiān)控平臺,彌補了MyCat在監(jiān)控上的空白,幫MyCat分擔統(tǒng)計任務和配置管理任務,MyCat-Web還引入了Zookeeper作為配置中心,可以管理多個節(jié)點。MyCat-Web主要管理和監(jiān)控MyCat的流量、連接、活動線程和內存等,具備IP白名單、郵件告警等模塊,還可以統(tǒng)計SQL并分析慢SQL和高頻SQL等,為優(yōu)化SQL提供依據
MyCat管理
MyCat默認開通兩個端口,可以在server.xml中修改:
8066 數據訪問端口,即進行 DML 和 DDL 操作9066 數據庫管理端口,即 mycat 服務管理控制功能,用于管理mycat的整個集群狀態(tài)
連接MyCat的管理控制臺:
mysql -h 192.168.200.210 -p 9066 -uroot -p123456
MyCat-eye
MyCat-eye(MyCat-web)是對mycat-server提供監(jiān)控服務,功能不局限于對mycat-server使用,它通過JDBC連接對MyCat、MySQL監(jiān)控,監(jiān)控遠程服務器(目前僅限于Linux系統(tǒng))的cpu、內存、網絡、磁盤
MyCat-eye運行過程中需要依賴zookeeper
安裝MyCat-eye和zookeeper
訪問:
配置,開啟MyCat的實時統(tǒng)計功能(server.xml):
在MyCat監(jiān)控界面配置服務地址:
通過MyCat執(zhí)行一系列的增刪改查的測試,過一段時間后打開,查看MyCat-eye監(jiān)控到的數據信息
性能監(jiān)控:
物理節(jié)點:
SQL統(tǒng)計:
SQL表分析:
SQL監(jiān)控:
高頻SQL:
柚子快報激活碼778899分享:數據庫 MySQL-分庫分表
相關閱讀
本文內容根據網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯系刪除。