Java高級(jí)技術(shù)day85:MyCat

一旺拉、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)插入也不允許省略列名艳悔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市女仰,隨后出現(xiàn)的幾起案子猜年,更是在濱河造成了極大的恐慌,老刑警劉巖疾忍,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乔外,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡一罩,警方通過(guò)查閱死者的電腦和手機(jī)杨幼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人差购,你說(shuō)我怎么就攤上這事四瘫。” “怎么了欲逃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵找蜜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我稳析,道長(zhǎng)洗做,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任彰居,我火速辦了婚禮诚纸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裕菠。我一直安慰自己咬清,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布奴潘。 她就那樣靜靜地躺著旧烧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪画髓。 梳的紋絲不亂的頭發(fā)上掘剪,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音奈虾,去河邊找鬼夺谁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肉微,可吹牛的內(nèi)容都是我干的匾鸥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碉纳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勿负!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起劳曹,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奴愉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后铁孵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锭硼,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年蜕劝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檀头。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轰异。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳖擒,靈堂內(nèi)的尸體忽然破棺而出溉浙,到底是詐尸還是另有隱情烫止,我是刑警寧澤蒋荚,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站馆蠕,受9級(jí)特大地震影響期升,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜互躬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一播赁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吼渡,春花似錦容为、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至寄雀,卻和暖如春得滤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盒犹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工懂更, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人急膀。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓沮协,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卓嫂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慷暂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一、MyCat簡(jiǎn)介 1.什么是MyCat MyCat是目前最流行的基于Java語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)中間件命黔,是一個(gè)實(shí)現(xiàn)了...
    青年心路閱讀 50,283評(píng)論 0 30
  • 什么是 MyCat MyCat 是目前最流行的基于 java 語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)中間件呜呐,是一個(gè)實(shí)現(xiàn)了 MySQL 協(xié)...
    小破孩_e9ce閱讀 259評(píng)論 0 0
  • MySQL的安裝(rpm格式/需要聯(lián)網(wǎng)) 安裝環(huán)境 VMware Linux CentOS-6.5。 上傳工具Fi...
    Cehae閱讀 12,620評(píng)論 0 16
  • 一悍募、MyCat 1.簡(jiǎn)介 MyCat是目前最流行的基于Java語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)中間件蘑辑,是要給實(shí)現(xiàn)了MySQL協(xié)...
    故人望曲江閱讀 541評(píng)論 0 1
  • 蜜糖糖/文 綠茶應(yīng)該是茶里最簡(jiǎn)單的茶了,幾片葉子就可以泡出一杯香濃...
    月小兮閱讀 431評(píng)論 0 3