柚子快報激活碼778899分享:數(shù)據(jù)庫 MySQL-分庫分表
目錄
介紹
問題分析
拆分策略
垂直拆分
垂直分庫
垂直分表
水平拆分
水平分庫
水平分表
實現(xiàn)技術(shù)
MyCat
介紹
目錄
結(jié)構(gòu)
入門
配置
schema.xml
schema標簽
datanode標簽
datahost標簽
rule.xml
server.xml
system標簽
user標簽
分片
垂直拆分
水平拆分
分片規(guī)則
范圍分片auto-sharding-long
取模分片mod-long
一致性hash分片sharding-by-murmur
枚舉分片
應(yīng)用指定算法sharding-by-substring
固定分片hash算法
字符串hash解析算法
按天分片算法
自然月分片
MyCat管理與監(jiān)控
MyCat原理
MyCat管理
MyCat-eye
介紹
問題分析
隨著互聯(lián)網(wǎng)及移動互聯(lián)網(wǎng)的發(fā)展,應(yīng)用系統(tǒng)的數(shù)據(jù)量也是成指數(shù)式增長,若采用單數(shù)據(jù)庫進行數(shù)據(jù)存儲,存在以下性能瓶頸:
IO瓶頸:熱點數(shù)據(jù)太多,數(shù)據(jù)庫緩存不足,產(chǎn)生大量磁盤IO,效率較低,請求數(shù)據(jù)太多,帶寬不夠,網(wǎng)絡(luò)IO瓶頸CPU瓶頸:排序、分組、連接查詢、聚合統(tǒng)計等SQL會耗費大量的CPU資源,請求數(shù)太多,CPU出現(xiàn)瓶頸
為了解決上述問題,需要對數(shù)據(jù)庫進行分庫分表處理
分庫分表的中心思想是將數(shù)據(jù)分散存儲,使得單一數(shù)據(jù)庫/表的數(shù)據(jù)量變小來緩解單一數(shù)據(jù)庫的性能問題,從而達到提升數(shù)據(jù)庫性能的目的
拆分策略
分庫分表的形式主要是兩種:垂直拆分和水平拆分,拆分的粒度又分為分庫和分表:
垂直拆分
垂直分庫
以表為依據(jù),根據(jù)業(yè)務(wù)將不同表拆分到不同庫中
特點:
每個庫的表結(jié)構(gòu)都不一樣每個庫的數(shù)據(jù)也不一樣所有庫的并集是全量數(shù)據(jù)
垂直分表
以字段為依據(jù),根據(jù)字段屬性將不同字段拆分到不同表中
特點:
每個表的結(jié)構(gòu)都不一樣每個表的數(shù)據(jù)也不一樣,一般通過一列(主鍵/外鍵)關(guān)聯(lián)所有表的并集是全量數(shù)據(jù)
水平拆分
水平分庫
以行(記錄)為依據(jù),按照一定策略,將一個庫的數(shù)據(jù)拆分到多個庫中
特點:
每個庫的表結(jié)構(gòu)都一樣每個庫的數(shù)據(jù)都不一樣所有庫的并集是全量數(shù)據(jù)
水平分表
以行(記錄)為依據(jù),按照一定策略,將一個表的數(shù)據(jù)拆分到多個表中
特點:
每個表的結(jié)構(gòu)都一樣每個表的數(shù)據(jù)都不一樣所有表的并集是全量數(shù)據(jù)
實現(xiàn)技術(shù)
shardingJDBC:基于AOP原理,在應(yīng)用程序中對本地執(zhí)行的SQL進行攔截、解析、改寫、路由處理,需要自行編碼配置實現(xiàn),只支持Java語言,性能較高MyCat:數(shù)據(jù)庫分庫分表中間件,不用調(diào)整代碼即可實現(xiàn)分庫分表,支持多種語言,性能不及前者
MyCat
介紹
MyCat是開源的、活躍的、基于Java語言編寫的MySQL數(shù)據(jù)庫中間件,可以像使用MySQL一樣來使用MyCat
優(yōu)勢:
性能可靠穩(wěn)定強大的技術(shù)團隊體系完善社區(qū)活躍
目錄
bin:存放可執(zhí)行文件,用于啟動停止mycatconf:存放mycat的配置文件lib:存放mycat的項目依賴包(jar)logs:存放mycat的日志文件
結(jié)構(gòu)
在MyCat的整體結(jié)構(gòu)中,分為:邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
MyCat的邏輯結(jié)構(gòu)主要負責邏輯庫、邏輯表、分片規(guī)則、分片節(jié)點等邏輯結(jié)構(gòu)的處理,而具體的數(shù)據(jù)存儲還是在物理結(jié)構(gòu),也就是數(shù)據(jù)庫服務(wù)器中存儲
入門
tb_order表中數(shù)據(jù)量很大,對其進行數(shù)據(jù)分片,分為三個數(shù)據(jù)節(jié)點,每一個節(jié)點主機位于不同的服務(wù)器上
準備三臺服務(wù)器,并分別創(chuàng)建數(shù)據(jù)庫db01:
192.168.200.210:MyCat中間件服務(wù)器,同時也是第一個分片服務(wù)器192.168.200.213:第二個分片服務(wù)器192.168.200.214:第三個分片服務(wù)器
修改schema.xml配置:
修改server.xml配置:
啟動:
先啟動3臺分片服務(wù)器,然后啟動MyCat服務(wù)器,切換到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)建表,并插入數(shù)據(jù):
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');
在插入數(shù)據(jù)時:
如果id的值在1-500w之間,數(shù)據(jù)將會存儲在第一個分片數(shù)據(jù)庫中如果id的值在500w-1000w之間,數(shù)據(jù)將會存儲在第二個分片數(shù)據(jù)庫中如果id的值在1000w-1500w之間,數(shù)據(jù)將會存儲在第三個分片數(shù)據(jù)庫中如果id的值超出1500w,在插入數(shù)據(jù)時,將會報錯
數(shù)據(jù)落在哪一個分片服務(wù)器是由邏輯表配置時的一個參數(shù)rule決定的,這個參數(shù)配置的就是分片規(guī)則
配置
schema.xml
schema.xml作為MyCat中最重要的配置文件之一,涵蓋了MyCat的邏輯庫、邏輯表、分片規(guī)則、分片節(jié)點及數(shù)據(jù)源的配置
主要包含三組標簽:
schema標簽datanode標簽datahost標簽
schema標簽
1.schema定義邏輯庫
schema標簽用于定義 MyCat實例中的邏輯庫 , 一個MyCat實例中, 可以有多個邏輯庫 , 可以通過schema標簽來劃分不同的邏輯庫。MyCat中的邏輯庫的概念,等同于MySQL中的database概念,需要操作某個邏輯庫下的表時, 也需要切換邏輯庫(use xxx)
核心屬性:
name:指定自定義的邏輯庫庫名checkSQLschema:在SQL語句操作時指定了數(shù)據(jù)庫名稱,執(zhí)行時是否自動去除;true:自動去 除,false:不自動去除sqlMaxLimit:如果未指定limit進行查詢,列表查詢模式查詢多少條記錄
2.schema中的table定義邏輯表
table標簽定義了MyCat中邏輯庫schema下的邏輯表 , 所有需要拆分的表都需要在table標簽中定義
核心屬性:
name:定義邏輯表表名,在該邏輯庫下唯一dataNode:定義邏輯表所屬的dataNode,該屬性需要與dataNode標簽中name對應(yīng);多個dataNode逗號分隔rule:分片規(guī)則的名字,分片規(guī)則名字是在rule.xml中定義的primaryKey:邏輯表對應(yīng)真實表的主鍵type:邏輯表的類型,目前邏輯表只有全局表和普通表,如果未配置,就是普通表;全局表,配置為 global
datanode標簽
核心屬性:
name:定義數(shù)據(jù)節(jié)點名稱dataHost:數(shù)據(jù)庫實例主機名稱,引用自 dataHost 標簽中name屬性database:定義分片所屬數(shù)據(jù)庫
datahost標簽
該標簽在MyCat邏輯庫中作為底層標簽存在,直接定義了具體的數(shù)據(jù)庫實例、讀寫分離、心跳語句
核心屬性:
name:唯一標識,供上層標簽使用maxCon/minCon:最大連接數(shù)/最小連接數(shù)balance:負載均衡策略,取值 0,1,2,3writeType:寫操作分發(fā)方式(0:寫操作轉(zhuǎn)發(fā)到第一個writeHost,第一個掛了,切換到第二個;1:寫操作隨機分發(fā)到配置的writeHost)dbDriver:數(shù)據(jù)庫驅(qū)動,支持native、jdbc
rule.xml
rule.xml中定義所有拆分表的規(guī)則, 在使用過程中可以靈活的使用分片算法, 或者對同一個分片算法使用不同的參數(shù), 它讓分片過程可配置化
主要包含兩類標簽:tableRule、Function
server.xml
server.xml配置文件包含了MyCat的系統(tǒng)配置信息,主要有兩個重要的標簽:system、user
system標簽
主要配置MyCat中的系統(tǒng)配置信息
屬性取值含義charsetutf8設(shè)置Mycat的字符集, 字符集需要與MySQL的字符集保持一致nonePasswordLogin0,10為需要密碼登陸、1為不需要密碼登陸 ,默認為0,設(shè)置為1則需要指定默認賬戶useHandshakeV100,1使用該選項主要的目的是為了能夠兼容高版本的jdbc驅(qū)動, 是否采用HandshakeV10Packet來與client進行通信, 1:是, 0:否useSqlStat0,1開啟SQL實時統(tǒng)計, 1 為開啟 , 0 為關(guān)閉 ; 開啟之后, 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為關(guān)閉 。sqlExecuteTimeout1000SQL語句執(zhí)行的超時時間 , 單位為 s ;sequnceHandlerType0,1,2用來指定Mycat全局序列類型,0 為本地文件,1 為數(shù)據(jù)庫方式,2 為時間戳列方式,默認使用本地文件方式,文件方式主要用于測試sequnceHandlerPattern正則表達式必須帶有MYCATSEQ或者 mycatseq進入序列匹配流程 注意MYCATSEQ_有空格的情況subqueryRelationshipChecktrue,false子查詢中存在關(guān)聯(lián)查詢的情況下,檢查關(guān)聯(lián)字段中是否有分片字段 .默認 falseuseCompression0,1開啟mysql壓縮協(xié)議 , 0 : 關(guān)閉, 1 : 開啟fakeMySQLVersion5.5,5.6設(shè)置模擬的MySQL版本號defaultSqlParser由于MyCat的最初版本使用了FoundationDB的SQL解析器, 在MyCat1.3后增加了Druid解析器, 所以要設(shè)置defaultSqlParser屬性來指定默認的解析器; 解析器有兩個 : druidparser 和 fdbparser, 在MyCat1.4之后,默認是druidparser, fdbparser已經(jīng)廢除了processors1,2....指定系統(tǒng)可用的線程數(shù)量, 默認值為CPU核心 x 每個核心運行線程數(shù)量; processors 會影響processorBufferPool, processorBufferLocalPercent, processorExecutor屬性, 所有, 在性能調(diào)優(yōu)時, 可以適當?shù)匦薷膒rocessors值processorBufferChunk指定每次分配Socket Direct Buffer默認值為4096字節(jié), 也會影響B(tài)ufferPool長度, 如果一次性獲取字節(jié)過多而導致buffer不夠用, 則會出現(xiàn)警告, 可以調(diào)大該值processorExecutor指定NIOProcessor上共享 businessExecutor固定線程池的大小; MyCat把異步任務(wù)交給 businessExecutor線程池中, 在新版本的MyCat中這個連接池使用頻次不高, 可以適當?shù)匕言撝嫡{(diào)小packetHeaderSize指定MySQL協(xié)議中的報文頭長度, 默認4個字節(jié)maxPacketSize指定MySQL協(xié)議可以攜帶的數(shù)據(jù)最大大小, 默認值為16MidleTimeout30指定連接的空閑時間的超時長度;如果超時,將關(guān)閉資源并回收, 默認30分鐘txIsolation1,2,3,4初始化前端連接的事務(wù)隔離級別,默認為 REPEATED_READ , 對應(yīng)數(shù)字為3 READ_UNCOMMITED=1; READ_COMMITTED=2; REPEATED_READ=3; SERIALIZABLE=4;sqlExecuteTimeout300執(zhí)行SQL的超時時間, 如果SQL語句執(zhí)行超時,將關(guān)閉連接; 默認300秒;serverPort8066定義MyCat的使用端口, 默認8066managerPort9066定義MyCat的管理端口, 默認9066
user標簽
配置MyCat中的用戶、訪問密碼以及用戶針對邏輯庫、邏輯表的權(quán)限信息
分片
垂直拆分
在業(yè)務(wù)系統(tǒng)中, 涉及以下表結(jié)構(gòu) ,但是由于用戶與訂單每天都會產(chǎn)生大量的數(shù)據(jù), 單臺服務(wù)器的數(shù)據(jù)存儲及處理能力是有限的, 可以對數(shù)據(jù)庫表進行拆分, 原有的數(shù)據(jù)庫表如下:
現(xiàn)在考慮將其進行垂直分庫操作,將商品相關(guān)的表拆分到一個數(shù)據(jù)庫服務(wù)器,訂單表拆分的一個數(shù)據(jù)庫服務(wù)器,用戶及省市區(qū)表拆分到一個服務(wù)器,最終結(jié)構(gòu)如下:
準備三臺服務(wù)器,并創(chuàng)建數(shù)據(jù)庫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腳本到服務(wù)器的/root目錄:
執(zhí)行指令導入測試數(shù)據(jù), 重新啟動MyCat后,在命令行中,通過source指令導入表結(jié)構(gòu)以及對應(yīng)的數(shù)據(jù),查看數(shù)據(jù)分布情況:
source /root/shopping-table.sql
source /root/shopping-insert.sql
查詢用戶的收件人及收件人的地址信息(包括省、市、區(qū)),可以正常查詢出數(shù)據(jù):
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 ;
訂單相關(guān)的表和省市區(qū)的表不在同一個服務(wù)器中,SQL語句報錯,原因是沒有一個數(shù)據(jù)庫服務(wù)器完全包含了訂單及省市區(qū)的表結(jié)構(gòu)
解決方式:全局表
對于省、市、區(qū)/縣表tb_areas_provinces , tb_areas_city , tb_areas_region,是屬于數(shù)據(jù)字典表,在多個業(yè)務(wù)模塊中都可能會遇到,可以將其設(shè)置為全局表,利于業(yè)務(wù)操作
修改schema.xml中的邏輯表的配置,修改 tb_areas_provinces、tb_areas_city、tb_areas_region三個邏輯表,增加 type 屬性,配置為global,就代表該表是全局表,就會在所涉及到的dataNode中創(chuàng)建表。對于當前配置來說,也就意味著所有的節(jié)點中都有該表了
重啟MyCat
刪除原來每一個數(shù)據(jù)庫服務(wù)器中的所有表結(jié)構(gòu)
通過source指令導入表及數(shù)據(jù)
檢查每一個數(shù)據(jù)庫服務(wù)器中的表及數(shù)據(jù)分布,三個節(jié)點中都有這三張全局表
再次執(zhí)行SQL語句
當在MyCat中更新全局表時,所有分片中的數(shù)據(jù)都改變,每個節(jié)點的全局表數(shù)據(jù)時刻保持一致
水平拆分
在業(yè)務(wù)系統(tǒng)中, 有一張表(日志表), 業(yè)務(wù)系統(tǒng)每天都會產(chǎn)生大量的日志數(shù)據(jù) , 單臺服務(wù)器的數(shù)據(jù)存儲及處理能力是有限的, 可以對數(shù)據(jù)庫表進行拆分
每臺服務(wù)器上創(chuàng)建數(shù)據(jù)庫itcast
schema.xml:
server.xml:
重啟MyCat,創(chuàng)建表,插入數(shù)據(jù):
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 '請求參數(shù)名及參數(shù)值', 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
根據(jù)指定的字段及其配置的范圍與數(shù)據(jù)節(jié)點的對應(yīng)情況,來決定該數(shù)據(jù)屬于哪一個分片
schema.xml邏輯表配置:
schema.xml數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
在rule.xml中配置分片規(guī)則時,關(guān)聯(lián)了一個映射配置文件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號數(shù)據(jù)節(jié)點(數(shù)據(jù)節(jié)點的索引從0開始) ;500萬-1000萬之間的數(shù)據(jù)存儲在1號數(shù)據(jù)節(jié)點 ;1000萬-1500萬的數(shù)據(jù)節(jié)點存儲在2號節(jié)點?
該分片規(guī)則主要針對于數(shù)字類型的字段使用
取模分片mod-long
根據(jù)指定的字段值與節(jié)點數(shù)量進行取模運算,根據(jù)運算結(jié)果,來決定該數(shù)據(jù)屬于哪一個分片
schema.xml邏輯表配置:
schema.xml數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
?該分片規(guī)則主要針對于數(shù)字類型的字段使用
一致性hash分片sharding-by-murmur
一致性哈希是相同的哈希因子計算值總是被劃分到相同的分區(qū)表中,不會因為分區(qū)節(jié)點的增加而改變原來數(shù)據(jù)的分區(qū)位置,有效解決了分布式數(shù)據(jù)的擴容問題
schema.xml邏輯表配置:
schema.xml數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數(shù)據(jù):
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');
枚舉分片
通過在配置文件中配置可能的枚舉值,指定數(shù)據(jù)分布到不同數(shù)據(jù)節(jié)點上,本規(guī)則適用于按照省份、性別、狀態(tài)拆分數(shù)據(jù)等業(yè)務(wù)
schema.xml邏輯表配置:
schema.xml數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
partition-hash-int.txt:狀態(tài)為1對應(yīng)第一個節(jié)點(節(jié)點下標從0開始),為2對應(yīng)第二個節(jié)點,為3對應(yīng)第三個節(jié)點
1=0
2=1
3=2
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數(shù)據(jù):
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: 已關(guān)閉',
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);
應(yīng)用指定算法sharding-by-substring
運行階段由應(yīng)用自主決定路由到哪個分片,直接根據(jù)字符子串(必須是數(shù)字)計算分片號
?schema.xml邏輯表配置:
!-- 應(yīng)用指定算法 -->
schema.xml數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
示例說明id=05-100000002 , 在此配置中代表根據(jù)id中從startIndex=0開始,截取siz=2位數(shù)字即05,05就是獲取的分區(qū),如果沒找到對應(yīng)的分片則默認分配到defaultPartition
重啟,創(chuàng)建表插入數(shù)據(jù):
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,轉(zhuǎn)換為十進制,也就是位于0-1023之間
特點:
如果是求模,連續(xù)的值,分別分配到各個不同的分片;但是此算法會將連續(xù)的值可能分配到相同的分片,降低事務(wù)處理的難度可以均勻分配,也可以非均勻分配分片字段必須為數(shù)字類型
?schema.xml邏輯表配置:
schema.xml數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
約束:
分片長度:默認最大1024count、length的長度必須一致
以上分為三個分區(qū):0-255,256-511,512-1023
分片規(guī)則配置屬性含義:
?示例說明:
重啟,創(chuàng)建表插入數(shù)據(jù):
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數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
示例說明:
重啟,創(chuàng)建表插入數(shù)據(jù):
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());
按天分片算法
按照日期及對應(yīng)的時間周期來分片
?schema.xml邏輯表配置:
schema.xml數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數(shù)據(jù):
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數(shù)據(jù)節(jié)點配置:
rule.xml分片規(guī)則配置:
分片規(guī)則配置屬性含義:
重啟,創(chuàng)建表插入數(shù)據(jù):
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解析、分片分析、路由分析、讀寫分離分析等操作,最終經(jīng)過一系列的分析決定將當前的SQL語句到底路由到哪幾個(或哪一個)節(jié)點數(shù)據(jù)庫,數(shù)據(jù)庫將數(shù)據(jù)執(zhí)行完畢后,如果有返回的結(jié)果,則將結(jié)果返回給MyCat,最終還需要在MyCat中進行結(jié)果合并、聚合處理、排序處理、分頁處理等操作,最終再將結(jié)果返回給客戶端
MyCat官方提供了一個管理監(jiān)控平臺MyCat-Web(MyCat-eye),?MyCat-Web是MyCat可視化運維的管理和監(jiān)控平臺,彌補了MyCat在監(jiān)控上的空白,幫MyCat分擔統(tǒng)計任務(wù)和配置管理任務(wù),MyCat-Web還引入了Zookeeper作為配置中心,可以管理多個節(jié)點。MyCat-Web主要管理和監(jiān)控MyCat的流量、連接、活動線程和內(nèi)存等,具備IP白名單、郵件告警等模塊,還可以統(tǒng)計SQL并分析慢SQL和高頻SQL等,為優(yōu)化SQL提供依據(jù)
MyCat管理
MyCat默認開通兩個端口,可以在server.xml中修改:
8066 數(shù)據(jù)訪問端口,即進行 DML 和 DDL 操作9066 數(shù)據(jù)庫管理端口,即 mycat 服務(wù)管理控制功能,用于管理mycat的整個集群狀態(tài)
連接MyCat的管理控制臺:
mysql -h 192.168.200.210 -p 9066 -uroot -p123456
MyCat-eye
MyCat-eye(MyCat-web)是對mycat-server提供監(jiān)控服務(wù),功能不局限于對mycat-server使用,它通過JDBC連接對MyCat、MySQL監(jiān)控,監(jiān)控遠程服務(wù)器(目前僅限于Linux系統(tǒng))的cpu、內(nèi)存、網(wǎng)絡(luò)、磁盤
MyCat-eye運行過程中需要依賴zookeeper
安裝MyCat-eye和zookeeper
訪問:
配置,開啟MyCat的實時統(tǒng)計功能(server.xml):
在MyCat監(jiān)控界面配置服務(wù)地址:
通過MyCat執(zhí)行一系列的增刪改查的測試,過一段時間后打開,查看MyCat-eye監(jiān)控到的數(shù)據(jù)信息
性能監(jiān)控:
物理節(jié)點:
SQL統(tǒng)計:
SQL表分析:
SQL監(jiān)控:
高頻SQL:
柚子快報激活碼778899分享:數(shù)據(jù)庫 MySQL-分庫分表
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。