一旺拉、MyCat簡(jiǎn)介
1.什么是MyCat靡努?
MyCat 是目前最流行的基于 java 語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)中間件,是一個(gè)實(shí)現(xiàn)了 MySQL 協(xié)議的服務(wù)器一睁,前端用戶可以把它看作是一個(gè)數(shù)據(jù)庫(kù)代理宗苍,用 MySQL 客戶端工具和命令行訪問(wèn)稼稿,而其后端可以用 MySQL 原生協(xié)議與多個(gè) MySQL 服務(wù)器通信薄榛,也可以用 JDBC 協(xié)議與大多數(shù)主流數(shù)據(jù)庫(kù)服務(wù)器通信,其核心功能是分庫(kù)分表让歼。配合數(shù)據(jù)庫(kù)的主從模式還可實(shí)現(xiàn)讀寫(xiě)分離敞恋。
MyCat 官網(wǎng):http://www.mycat.io/
MyCat 是基于阿里開(kāi)源的 Cobar 產(chǎn)品而研發(fā),Cobar 的穩(wěn)定性谋右、可靠性硬猫、優(yōu)秀的架構(gòu)和性能以及眾多成熟的使用案例使得 MyCat 變得非常的強(qiáng)大。
MyCat 發(fā)展到目前的版本改执,已經(jīng)不是一個(gè)單純的 MySQL 代理了啸蜜,它的后端可以支持MySQL、SQL Server辈挂、Oracle衬横、DB2、PostgreSQL 等主流數(shù)據(jù)庫(kù)终蒂,也支持 MongoDB 這種新型NoSQL 方式的存儲(chǔ)蜂林,未來(lái)還會(huì)支持更多類(lèi)型的存儲(chǔ)。而在最終用戶看來(lái)拇泣,無(wú)論是那種存儲(chǔ)方式噪叙,在 MyCat 里,都是一個(gè)傳統(tǒng)的數(shù)據(jù)庫(kù)表挫酿,支持標(biāo)準(zhǔn)的 SQL 語(yǔ)句進(jìn)行數(shù)據(jù)的操作构眯,這樣一來(lái)愕难,對(duì)前端業(yè)務(wù)系統(tǒng)來(lái)說(shuō)早龟,可以大幅降低開(kāi)發(fā)難度,提升開(kāi)發(fā)速度猫缭。
2.使用MyCat后的結(jié)構(gòu)圖:
3.MyCat的優(yōu)勢(shì):
(1)數(shù)據(jù)量級(jí):
Mycat 可以管理若干 MySQL 數(shù)據(jù)庫(kù),同時(shí)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和操作葱弟。
(2)開(kāi)源性質(zhì):
Mycat 是 java 編寫(xiě)的中間件. 開(kāi)源,免費(fèi)。
有非常多的人和組織對(duì) Mycat 實(shí)行開(kāi)發(fā),維護(hù),管理,更新猜丹。
Mycat 版本提升較快,可以跟隨環(huán)境發(fā)展.如果有問(wèn)題,可以快速解決芝加。
Mycat 有開(kāi)源網(wǎng)站和開(kāi)源社區(qū).且有官方發(fā)布的電子書(shū)籍。
Mycat 是阿里原應(yīng)用 corba 轉(zhuǎn)型而來(lái)的射窒。
(3)市場(chǎng)應(yīng)用:
Mycat 在互聯(lián)網(wǎng)應(yīng)用中占比非常高藏杖。
二、MyCat中的概念:
1.切分:
1.1 縱向切分/垂直切分:
就是把原本存儲(chǔ)于一個(gè)庫(kù)的數(shù)據(jù)存儲(chǔ)到多個(gè)庫(kù)上脉顿。由于對(duì)數(shù)據(jù)庫(kù)的讀寫(xiě)都是對(duì)同一個(gè)庫(kù)進(jìn)行操作蝌麸,所以單庫(kù)并不能解決大規(guī)模并發(fā)寫(xiě)入的問(wèn)題。
例如艾疟,我們會(huì)建立定義數(shù)據(jù)庫(kù) workDB来吩、商品數(shù)據(jù)庫(kù) payDB敢辩、用戶數(shù)據(jù)庫(kù) userDB、日志數(shù)據(jù)庫(kù) logDB 等弟疆,分別用于存儲(chǔ)項(xiàng)目數(shù)據(jù)定義表戚长、商品定義表、用戶數(shù)據(jù)表怠苔、日志數(shù)據(jù)表等同廉。
- 優(yōu)點(diǎn):
(1)減少增量數(shù)據(jù)寫(xiě)入時(shí)的鎖對(duì)查詢的影響。
(2)由于單表數(shù)量下降柑司,常見(jiàn)的查詢操作由于減少了需要掃描的記錄恤溶,使得單表單次查詢所需的檢索行數(shù)變少,減少了磁盤(pán) IO帜羊,時(shí)延變短咒程。
- 缺點(diǎn):
無(wú)法解決單表數(shù)據(jù)量太大的問(wèn)題。
2.橫向切分/水平切分:
把原本存儲(chǔ)于一個(gè)表的數(shù)據(jù)分塊存儲(chǔ)到多個(gè)表上讼育。當(dāng)一個(gè)表中的數(shù)據(jù)量過(guò)大時(shí)帐姻,我們可以把該表的數(shù)據(jù)按照某種規(guī)則,進(jìn)行劃分奶段,然后存儲(chǔ)到多個(gè)結(jié)構(gòu)相同的表饥瓷,和不同的庫(kù)上。
例如痹籍,我們 userDB 中的 userTable 中數(shù)據(jù)量很大呢铆,那么可以把 userDB 切分為結(jié)構(gòu)相同的多個(gè) userDB:part0DB、part1DB 等蹲缠,再將 userDB 上的 userTable棺克,切分為很多 userTable:userTable0、userTable1 等线定,然后將這些表按照一定的規(guī)則存儲(chǔ)到多個(gè) userDB 上娜谊。
- 優(yōu)點(diǎn):
(1)單表的并發(fā)能力提高了,磁盤(pán) I/O 性能也提高了斤讥。
(2)如果出現(xiàn)高并發(fā)的話纱皆,總表可以根據(jù)不同的查詢,將并發(fā)壓力分到不同的小表里面芭商。
- 缺點(diǎn):
無(wú)法實(shí)現(xiàn)表連接查詢派草。
3.其他概念:
3.1邏輯庫(kù)-Schema:
Mycat 中定義的 database.是邏輯上存在的.但是物理上是不存在的.
主要是針對(duì)縱向切分提供的概念。
3.2 邏輯表-table:
Mycat 中定義的 table.是邏輯上存在,物理上是不存在的铛楣;主要是針對(duì)橫向切分提供的概念近迁。
3.3 默認(rèn)端口:
Mycat 默認(rèn)端口是 8066。
3.4數(shù)據(jù)主機(jī) - dataHost:
物理 MySQL 存放的主機(jī)地址.可以使用主機(jī)名,IP,域名定義蛉艾。
3.5 數(shù)據(jù)節(jié)點(diǎn) - dataNode:
配置物理的 database. 數(shù)據(jù)保存的物理節(jié)點(diǎn).就是 database钳踊。
3.6分片規(guī)則:
當(dāng)控制數(shù)據(jù)的時(shí)候,如何訪問(wèn)物理 database 和 table衷敌。
就是訪問(wèn) dataHost 和 dataNode 的算法。
在 Mycat 處理具體的數(shù)據(jù) CRUD 的時(shí)候,如何訪問(wèn) dataHost 和 dataNode 的算法.如:哈希算法,crc32 算法等拓瞪。
三缴罗、MyCat 的使用
1.MyCat解決的問(wèn)題
1.1 讀寫(xiě)分離:
原理:需要搭建主從模式,讓主數(shù)據(jù)庫(kù)(master)處理事務(wù)性增祭埂、改面氓、刪操作(INSERT、UPDATE蛆橡、DELETE)舌界,而從數(shù)據(jù)庫(kù)(slave)處理 SELECT 查詢操作。
Mycat 配合數(shù)據(jù)庫(kù)本身的復(fù)制功能泰演,可以解決讀寫(xiě)分離的問(wèn)題呻拌。
1.2主從備份:
什么是主從備份: 就是一種主備模式的數(shù)據(jù)庫(kù)應(yīng)用。
主庫(kù)(Master)數(shù)據(jù)與備庫(kù)(Slave)數(shù)據(jù)完全一致睦焕;
實(shí)現(xiàn)數(shù)據(jù)的多重備份, 保證數(shù)據(jù)的安全藐握;
可以在 Master[InnoDB]和 Slave[MyISAM]中使用不同的數(shù)據(jù)庫(kù)引擎,實(shí)現(xiàn)讀寫(xiě)的分離。
1.3主從備份目的:
保證數(shù)據(jù)的安全垃喊;盡量避免數(shù)據(jù)丟失的可能猾普。
使用不同的數(shù)據(jù)庫(kù)引擎,實(shí)現(xiàn)讀寫(xiě)分離.提高所有的操作效率。
InnoDB 使用 DML 語(yǔ)法操作. MyISAM 使用 DQL 語(yǔ)法操作本谜。
1.4主從備份效果:
所有對(duì) Master 的操作,都會(huì)同步到 Slave 中初家。
如果 Master 和 Salve 天生上環(huán)境不同 , 那么對(duì) Master 的操作 , 可能會(huì)在 Slave 中出現(xiàn)錯(cuò)誤。
如 : 在創(chuàng)建主從模式之前 ,Master 有 database : db1, db2, db3. Slave 有 database: db1,db2乌助。
創(chuàng)建主從模式 . 現(xiàn)在的情況 Master 和 Slave 天生不同溜在。
主從模式創(chuàng)建成功后 , 在 Master 中 drop database db3; Slave 中拋出數(shù)據(jù)庫(kù) SQL 異常眷茁;后續(xù)所有的命令不能同步炕泳。
一旦出現(xiàn)錯(cuò)誤;只能重新實(shí)現(xiàn)主從模式上祈。
2.MySql 的主從模式搭建:
2.1安裝MySQL環(huán)境:
將MySQL分別安裝到兩個(gè)Linux服務(wù)器中;
主庫(kù):192.168.226.130浙芙;
從庫(kù):192.168.226.128登刺;
3.2主從備份配置:
- 修改Master主庫(kù)配置文件:
命令:vim /etc/my.cnf;
修改內(nèi)容: server_id 是MySQL 服務(wù)唯一標(biāo)識(shí)嗡呼;
配置要求:
server_id 任意配置,只要是數(shù)字即可纸俭; log_bin 值: master_log開(kāi)啟日志功能以及日志文件命名。
server_id Master 唯一標(biāo)識(shí)數(shù)字必須小于 Slave從庫(kù) 唯一標(biāo)識(shí)數(shù)字南窗。
- 重啟MySQL:
service mysqld restart揍很;
- 創(chuàng)建用戶:
(1)先進(jìn)入MySQL數(shù)據(jù)庫(kù)中:mysql -uusername -ppassword郎楼;
(2)創(chuàng)建用戶:此用戶是從庫(kù)訪問(wèn)主庫(kù)使用的用戶。
grant all privileges on *.* to 'myslave'@'192.168.226.128' identified by
'myslave' with grant option;
flush privileges;
- 查看用戶:
use mysql;
select host, name from user;
- 查看Master信息:
show master status;
3.2Slave從庫(kù)配置:
- 修改Slave配置文件:
命令:vim /etc/my.cnf
添加唯一標(biāo)識(shí):server_id=2窒悔;
- 重啟MySQL服務(wù):
service mysqld restart呜袁;
- 配置主庫(kù)信息:
(1)進(jìn)入mysql數(shù)據(jù)庫(kù):mysql -uusername -ppassword;
(2)停止Slave功能:stop slave简珠;
(3) 配置主庫(kù)信息:需要修改的數(shù)據(jù)是依據(jù)Master信息修改的阶界;ip是Master所在物理機(jī)IP. 用戶名和密碼是Master 提供的 Slave 訪問(wèn)用戶名和密碼,日志文件是在 Master 中查看的主庫(kù)信息提供的聋庵;在Master 中使用命令 show master status 查看日志文件名稱(chēng)膘融。
change master to master_host='192.168.70.148',master_user='myslave',
master_password='myslave',master_log_file='master_log.000001';
- 啟動(dòng)Slave功能:
start slave;
查看Slave配置:show slave status \G;
檢查是否出現(xiàn)異常祭玉。
- 注意:
如果Linux服務(wù)器是克隆可能會(huì)出現(xiàn)下面的錯(cuò)誤:
slave have equal MySQL Server UUIDs氧映;清空auto.cnf文件下的內(nèi)容。重啟MySQL服務(wù)脱货。
https://www.linuxidc.com/Linux/2015-02/113564.htm
2.3測(cè)試主從:
也可以使用客戶端工具屯耸。
- 創(chuàng)建庫(kù):
create database demo1 default character set utf8;
- 新建表:
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 添加數(shù)據(jù):
insert into users values(1,‘a(chǎn)dmin’)
3.安裝MyCat:
3.1安裝環(huán)境:
新建Linux服務(wù)器:192.168.226.129;
需要配置JDK蹭劈;
- 在主從數(shù)據(jù)庫(kù)中都要完成:
(1)開(kāi)放 3306 端口或直接關(guān)閉防火墻疗绣;
(2)保證 root 用戶可以被 mycat 訪問(wèn):分別進(jìn)入MySQL中執(zhí)行下面命令;
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;
3.2安裝MyCat:
(1)上傳并解壓My擦通過(guò)壓縮包:
tar -zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz铺韧;
(2) 將解壓后的文件夾復(fù)制到/usr/local/下:
3.3MyCat目錄介紹:
(1)bin 目錄里是啟動(dòng)腳本多矮。
(2)conf 目錄里是配置文件。
(3)catlet 為 Mycat 的一個(gè)擴(kuò)展功能哈打。
(4)lib 目錄里是 Mycat 和它的依賴(lài) jar塔逃。
(5)logs 目錄里是 console.log 用來(lái)保存控制臺(tái)日志,和 mycat.log 用來(lái)保存 mycat 的 log4j日志料仗。
4.MyCat 中的配置文件:
Mycat 的架構(gòu)其實(shí)很好理解湾盗,Mycat 是代理,Mycat 后面就是物理數(shù)據(jù)庫(kù)立轧。和 Web 服務(wù)器的 Nginx 類(lèi)似格粪。對(duì)于使用者來(lái)說(shuō),訪問(wèn)的都是 Mycat氛改,不會(huì)接觸到后端的數(shù)據(jù)庫(kù)帐萎。我們現(xiàn)在做一個(gè)主從、讀寫(xiě)分離胜卤。結(jié)構(gòu)如下圖:
4.1Mycat 的配置文件都在 conf 目錄下:
4.2 server.xml配置文件:
<property name="serverPort">8066</property> <!-- Mycat 服務(wù)端口號(hào) -->
<property name="managerPort">9066</property><!-- Mycat 管理端口號(hào) -->
<user name="root"><!-- mycat 用戶名 -->
<property name="password">密碼</property>
<property name="schemas">用戶可訪問(wèn)邏輯庫(kù)名</property>
<!-- 表級(jí) DML 權(quán)限設(shè)置 -->
<!-- 不檢查 SQL 語(yǔ)法結(jié)果
<privileges check="false">
<schema name="邏輯庫(kù)名" dml="0110" >
<table name="邏輯表名" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user"><!-- 其他用戶名 -->
<property name="password">密碼</property>
<property name="schemas">可訪問(wèn)邏輯庫(kù)名</property>
<property name="readOnly">是否只讀</property>
</user>
-
配置 Mycat 服務(wù)信息:
示例 - 配置權(quán)限:
dml 權(quán)限順序?yàn)椋篿nsert(新增),update(修改),select(查詢),delete(刪除),0000--> 1111,0 為禁止權(quán)限疆导,1 為開(kāi)啟權(quán)限。
4.3schema.xml配置文件:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="root">
<readHost host="hostS2" url="192.168.1.200:3306" user="root"
password="root" />
</writeHost>
</dataHost>
</mycat:schema>
-
用于定義邏輯庫(kù)和邏輯表的配置文件:
示例 - 節(jié)點(diǎn)和屬性的作用:
(1)標(biāo)簽schema配置邏輯庫(kù)的標(biāo)簽葛躏;
屬性:
name:邏輯庫(kù)名稱(chēng)澈段;
checkSQLschema:是否檢測(cè) SQL 語(yǔ)法中的 schema 信息悠菜;
sqlMaxLimit:Mycat 在執(zhí)行 SQL 的時(shí)候,如果 SQL 語(yǔ)句中沒(méi)有 limit 子句.自動(dòng)增加 limit 子句. 避免一次、性得到過(guò)多的數(shù)據(jù),影響效率. limit子句的限制數(shù)量默認(rèn)配置為100.如果SQL中有具體的limit子句,當(dāng)前屬性失效败富。
(2)標(biāo)簽 table:定義邏輯表的標(biāo)簽悔醋;
屬性:
name:邏輯表名;
dataNode:數(shù)據(jù)節(jié)點(diǎn)名稱(chēng)囤耳,即物理數(shù)據(jù)庫(kù)中的 database 名稱(chēng)篙顺;多個(gè)名稱(chēng)使用逗號(hào)分隔。
rule:分片規(guī)則名稱(chēng).具體的規(guī)則名稱(chēng)參考 rule.xml 配置文件充择。
(3)dataNode:定義數(shù)據(jù)節(jié)點(diǎn)的標(biāo)簽德玫;
屬性:
name:數(shù)據(jù)節(jié)點(diǎn)名稱(chēng), 是定義的邏輯名稱(chēng),對(duì)應(yīng)具體的物理數(shù)據(jù)庫(kù) database;
dataHost:引用 dataHost 標(biāo)簽的 name 值,代表使用的物理數(shù)據(jù)庫(kù)所在位置和配置信息椎麦。
database:在 dataHost 物理機(jī)中,具體的物理數(shù)據(jù)庫(kù) database 名稱(chēng)宰僧。
(4)dataHost 標(biāo)簽:定義數(shù)據(jù)主機(jī)的標(biāo)簽
屬性:
name:定義邏輯上的數(shù)據(jù)主機(jī)名稱(chēng)
maxCon/minCon:
最大連接數(shù), max connections;
最小連接數(shù), min connections观挎;
dbType:數(shù)據(jù)庫(kù)類(lèi)型 琴儿;
dbDriver:數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)型, native,使用 mycat 提供的本地驅(qū)動(dòng)。
(5)dataHost 子標(biāo)簽 writeHost:寫(xiě)數(shù)據(jù)的數(shù)據(jù)庫(kù)定義標(biāo)簽. 實(shí)現(xiàn)讀寫(xiě)分離操作嘁捷;
屬性:
host:數(shù)據(jù)庫(kù)命名造成;
url:數(shù)據(jù)庫(kù)訪問(wèn)路徑;
user:數(shù)據(jù)庫(kù)訪問(wèn)用戶名雄嚣;
password:訪問(wèn)用戶密碼晒屎;
(6)writeHost 子標(biāo)簽 readHost:讀數(shù)據(jù)的數(shù)據(jù)庫(kù)定義標(biāo)簽;
屬性:
host:數(shù)據(jù)庫(kù)命名缓升;
url:數(shù)據(jù)庫(kù)訪問(wèn)路徑
user:數(shù)據(jù)庫(kù)訪問(wèn)用戶名
password:訪問(wèn)用戶密碼鼓鲁;
4.4rule.xml配置文件:
用于定義分片規(guī)則的配置文件。
mycat 默認(rèn)的分片規(guī)則: 以 500 萬(wàn)為單位,實(shí)現(xiàn)分片規(guī)則港谊;
邏輯庫(kù) A 對(duì)應(yīng) dataNode - db1 和 db2. 1-500 萬(wàn)保存在 db1 中, 500 萬(wàn)零 1 到 1000 萬(wàn)保存在 db2 中,1000 萬(wàn)零 1 到 1500 萬(wàn)保存在 db1 中.依次類(lèi)推骇吭。
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
-
tableRule:
示例 - function:
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
5.實(shí)現(xiàn)讀寫(xiě)分離:
- 修改Schema.xml配置文件:
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="users" dataNode="dn1" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="demo1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.226.130:3306" user="root" password="root">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.226.128:3306" user="root" password="root" />
</writeHost>
</dataHost>
- 修改Server.xml配置文件:
<user name="root">
<property name="password">123456</property>
<property name="schemas">test</property>
<!-- 表級(jí) DML 權(quán)限設(shè)置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">test</property>
<property name="readOnly">true</property>
</user>
- 測(cè)試讀寫(xiě)分離:
啟動(dòng)MyCat命令:bin/mycat start;
停止命令:bin/mycat stop歧寺;
重啟命令:bin/mycat restart燥狰;
查看 MyCat 狀態(tài):bin/mycat status;
訪問(wèn)方式:客戶端軟件訪問(wèn)或者命令行訪問(wèn):
mysql -u 用戶名 -p 密碼 -hmycat 主機(jī) IP -P8066成福;鏈接成功后,可以當(dāng)做 MySQL 數(shù)據(jù)庫(kù)使用碾局。
- 注意balance屬性:
(1)balance=”0”, 不開(kāi)啟讀寫(xiě)分離機(jī)制,所有讀操作都發(fā)送到當(dāng)前可用的 writeHost 上奴艾;
(2)balance=”1”,全部的 readHost 與 stand by writeHost 參與 select 語(yǔ)句的負(fù)載均衡内斯;
(3)balance=”2”蕴潦,所有讀操作都隨機(jī)的在 writeHost像啼、 readhost 上分發(fā)。
(4)balance=”3”潭苞, 所有讀請(qǐng)求隨機(jī)的分發(fā)到 writeHost 對(duì)應(yīng)的 readhost 執(zhí)行,writerHost不負(fù)擔(dān)讀壓力忽冻。
6.MyCat實(shí)現(xiàn)分庫(kù):
6.1分片規(guī)則:
(1)auto-sharding-long 范圍約定:
以 500 萬(wàn)為單位,實(shí)現(xiàn)分片規(guī)則。
邏輯庫(kù) A 對(duì)應(yīng) dataNode - db1 和 db2. 1-500 萬(wàn)保存在 db1 中, 500 萬(wàn)零 1 到 1000 萬(wàn)保存在 db2 中,1000 萬(wàn)零 1 到 1500 萬(wàn)保存在 db1 中.依次類(lèi)推此疹。
(2)crc32slot 規(guī)則:
在 CRUD 操作時(shí),根據(jù)具體數(shù)據(jù)的 crc32 算法計(jì)算,數(shù)據(jù)應(yīng)該保存在哪一個(gè) dataNode 中僧诚。
- 需要注意的地方:
(1)<columns>id</columns>中推薦配置主鍵列;
(2)所有的 tableRule 只能使用一次蝗碎。如果需要為多個(gè)表配置相同的分片規(guī)則湖笨,那么需要在此重新定義該規(guī)則。
(3)在 crc32Slot 算法中的分片數(shù)量一旦給定蹦骑,MyCat 會(huì)將該分片數(shù)量和 slor 的取值范圍保存到文件中慈省。再次修改分片數(shù)量時(shí)是不會(huì)生效的,需要將該文件刪除眠菇。文件位置位于 conf目錄中的 ruledata 目錄中边败。
6.2配置分庫(kù):
在客戶端工具中測(cè)試;
在master主庫(kù)連接中創(chuàng)建數(shù)據(jù)庫(kù)捎废;
在MyCat連接中創(chuàng)建表笑窜。
- 創(chuàng)建數(shù)據(jù)庫(kù):
create database demo1 default character set utf8;
create database demo2 default character set utf8;
create database demo3 default character set utf8;
- 創(chuàng)建表:
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 修改Schema.xml配置文件:
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="users" dataNode="dn1,dn2,dn3" rule="crc32slot"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="demo1" />
<dataNode name="dn2" dataHost="localhost1" database="demo2" />
<dataNode name="dn3" dataHost="localhost1" database="demo3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.226.130:3306" user="root" password="root">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.226.128:3306" user="root" password="root" />
</writeHost>
</dataHost>
-
結(jié)果:
示例 注意:
(1)使用 MyCat 實(shí)現(xiàn)分庫(kù)時(shí),先在 MyCat 中定義邏輯庫(kù)與邏輯表登疗,然后在 MyCat 的鏈接中執(zhí)行創(chuàng)建表的命令必須要在 MyCat 中運(yùn)行排截。因?yàn)镸yCat 在創(chuàng)建表時(shí),會(huì)在表中添加一個(gè)新的列谜叹,列名為_(kāi)slot匾寝。
(2)使用 MyCat 插入數(shù)據(jù)時(shí),語(yǔ)句中必須要指定所有的列荷腊。即便是一個(gè)完全項(xiàng)插入也不允許省略列名艳悔。