一、MyCat基礎(chǔ)概念
1、什么是MyCat

一個徹底開源的,面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫集群
支持事務(wù)、ACID、可以替代Mysql的加強(qiáng)版數(shù)據(jù)庫
一個可以視為MYSQL集群的企業(yè)級數(shù)據(jù)庫,用來替代昂貴的Oracle集群
一個融合內(nèi)存緩存技術(shù)、NoSQL技術(shù)、HDFS大數(shù)據(jù)的新型SQL Server
結(jié)合傳統(tǒng)數(shù)據(jù)庫和新型分布式數(shù)據(jù)倉庫的新一代企業(yè)級數(shù)據(jù)庫產(chǎn)品
一個新穎的數(shù)據(jù)庫中間件產(chǎn)品

2、為什么使用MyCat

如今隨著互聯(lián)網(wǎng)的發(fā)展,數(shù)據(jù)的量級也是撐指數(shù)的增長,從GB到TB到PB。對數(shù)據(jù)的各種操作也是愈加的困難,傳統(tǒng)的關(guān)系性數(shù)據(jù)庫已經(jīng)無法滿足快速查詢與插入數(shù)據(jù)的需求。這個時候NoSQL的出現(xiàn)暫時解決了這一危機(jī)。它通過降低數(shù)據(jù)的安全性,減少對事務(wù)的支持,減少對復(fù)雜查詢的支持,來獲取性能上的提升。但是,在有些場合NoSQL一些折衷是無法滿足使用場景的(比如有些使用場景是絕對要有事務(wù)與安全指標(biāo)的。這個時候NoSQL肯定是無法滿足的)。所以還是需要使用關(guān)系性數(shù)據(jù)庫。如何使用關(guān)系型數(shù)據(jù)庫解決海量存儲的問題呢?此時就需要做數(shù)據(jù)庫集群,為了提高查詢性能將一個數(shù)據(jù)庫的數(shù)據(jù)分散到不同的數(shù)據(jù)庫中存儲,為應(yīng)對此問題就出現(xiàn)了——MyCat

MyCat作用:

能滿足數(shù)據(jù)庫數(shù)據(jù)大量存儲;提高了查詢性能
讀寫分離
數(shù)據(jù)分片 垂直拆分(分庫)、水平拆分(分表)、垂直 水平拆分(分庫分表)
多數(shù)據(jù)源整合

3、 數(shù)據(jù)庫中間件對比

① Cobar(前身為amoaba)屬于阿里B2B事業(yè)群,始于2008年,在阿里服役3年多,接管3000 個MySQL數(shù)據(jù)庫的schema, 集群日處理在線SQL請求50億次以上。由于Cobar發(fā)起人的離職, Cobar停止維護(hù)。
② Mycat是開源社區(qū)在阿里cobar基礎(chǔ)上進(jìn)行二次開發(fā),解決了cobar存在的問題,并且加入了許多新 的功能在其中。青出于藍(lán)而勝于藍(lán)。
③ OneProxy基于MySQL官方的proxy思想利用c進(jìn)行開發(fā)的, OneProxy是一款商業(yè)收費(fèi)的中間件。舍棄了一些功能,專注在性能和穩(wěn)定性上。
④ kingshard由小團(tuán)隊(duì)用go語言開發(fā),還需要發(fā)展,需要不斷完善。
⑤ Vitess是Youtube生產(chǎn)在使用,架構(gòu)很復(fù)雜。不支持MySQL原生協(xié)議,使用需要大量改造成本。
⑥ Atlas是360團(tuán)隊(duì)基于mysql proxy改寫,功能還需完善,高并發(fā)下不穩(wěn)定。
⑦ MaxScale是mariadb(MySQL原作者維護(hù)的一個版本) 研發(fā)的中間件
⑧ MySQLRoute是MySQL官方Oracle公司發(fā)布的中間件

4、支持的數(shù)據(jù)庫

支持MySQL ORACLE SQLServer等一些主流的數(shù)據(jù)庫

5、核心技術(shù)

分庫分表:數(shù)據(jù)庫分片指通過某種特定的條件,將我們存放在一個數(shù)據(jù)庫中的數(shù)據(jù)分散存放在不同的多個數(shù)據(jù)庫(主機(jī))中,這樣來達(dá)到分散單臺設(shè)備的負(fù)載,根據(jù)切片規(guī)則,可分為以下兩種切片模式,MyCAT通過定義表的分片規(guī)則來實(shí)現(xiàn)分片,每個表格可以捆綁一個分片規(guī)則,每個分片規(guī)則指定一個分片字段并綁定一個函數(shù),來實(shí)現(xiàn)動態(tài)分片算法

1)Schema:邏輯庫,與MySQL中的Database(數(shù)據(jù)庫)對應(yīng),一個邏輯庫中定義了所包括的Table。
2)Table:邏輯表,即物理數(shù)據(jù)庫中存儲的某一張表,與傳統(tǒng)數(shù)據(jù)庫不同,這里的表格需要聲明其所存儲的邏輯數(shù)據(jù)節(jié)點(diǎn)DataNode。在此可以指定表的分片規(guī)則。
3)DataNode:MyCAT的邏輯數(shù)據(jù)節(jié)點(diǎn),是存放table的具體物理節(jié)點(diǎn),也稱之為分片節(jié)點(diǎn),通過DataSource來關(guān)聯(lián)到后端某個具體數(shù)據(jù)庫上
4)DataSource:定義某個物理庫的訪問地址,用于捆綁到Datanode上
5)分片規(guī)則:前面講了數(shù)據(jù)切分,一個大表被分成若干個分片表,就需要一定的規(guī)則,這樣按照某種業(yè)務(wù)規(guī)則把數(shù)據(jù)分到某個分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難

二、MyCat安裝部署
環(huán)境:

JDK:要求jdk必須是1.7及以上版本
MySQL:推薦mysql是5.5以上版本
MyCat的官方網(wǎng)站:http://www.mycat.org.cn/
主機(jī) 操作系統(tǒng) IP地址

mysql01(master01)
CentOS 7.3
192.168.1.1

mysql02(slave)
CentOS 7.3
192.168.1.8

mycat
CentOS 7.3
192.168.1.3

PS:mysql使用現(xiàn)成的主機(jī)(搭建了雙主 keepalived,主從也可以)。如果沒有mysql,看上一個博客部署。

1、下載及安裝,使用上面的官網(wǎng)地址下載。

復(fù)制鏈接,wget下載

[root@localhost ~]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

將壓縮包解壓縮。建議將mycat放到/usr/local/mycat目錄下。

[root@localhost ~]# tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@localhost ~]# cd mycat/

修改配置文件:

server.xml: 定義用戶以及系統(tǒng)相關(guān)變量,如端口等
schema.xml: 定義邏輯庫,表、分片節(jié)點(diǎn)等內(nèi)容
rule.xml: 定義分片規(guī)則

[root@mycat mycat]# vim conf/server.xml  
80         <user name=mycat>      //定義連接中間件的用戶
81                 <property name=password>123456</property>  //密碼
82                 <property name=schemas>TESTDB</property>      //邏輯庫
[root@mycat mycat]# cp conf/schema.xml conf/schema.xml.bak  //備份配置文件
[root@mycat mycat]# vim conf/schema.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 dataNode=dn1>     //指明邏輯庫,以及節(jié)點(diǎn)
        </schema>
        <dataNode name=dn1 dataHost=host1 database=test_db />     //指定后端服務(wù)器中的真實(shí)庫
        <dataHost name=host1 maxCon=1000 minCon=10 balance=0
                          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.1.1:3306 user=root    //定義寫的服務(wù)器(主)以及IP地址,用戶密碼
                                   password=123.com>
                        <!-- can have multi read hosts -->
                        <readHost host=hostS2 url=192.168.1.8:3306 user=root password=123.com />    //定義讀的服務(wù)器(從)以及IP地址,用戶密碼
                </writeHost>
        </dataHost>
</mycat:schema>

##這個配置文件已經(jīng)把不必要配置項(xiàng)以及注釋的都刪了

重啟mycat服務(wù)
讓mycat擁有mysql命令

[root@mysql02 ~]# scp /usr/local/mysql/bin/mysql 192.168.1.3:/usr/local/sbin/

兩臺mysql授權(quán),允許mycat遠(yuǎn)程登陸

mysql> grant all on *.* to root@\\\'192.168.1.%\\\' identified by \\\'123.com\\\';

MyCat遠(yuǎn)程登錄測試:

[root@mycat mycat]# mysql -uroot -h 192.168.1.1 -P 3306 -p123.com
[root@mycat mycat]# mysql -uroot -h 192.168.1.8 -P 3306 -p123.com

啟動mycat服務(wù):

[root@mycat mycat]# ./bin/mycat help
Usage: ./bin/mycat { console | start | stop | restart | status | dump }
[root@mycat mycat]# ./bin/mycat console 

使用console啟動,會占用一個終端,實(shí)時查看日志內(nèi)容(登錄、查詢、退出),使用start啟動不會又實(shí)時日志,不占用終端

[root@mycat ~]# ss -anplt |grep java

###mycat端口8806

測試,查看數(shù)據(jù)是否同步:

[root@mycat ~]# mysql -umycat -p123456 -h 192.168.1.3 -P8066
mysql> show databases;

mysql> use TESTDB
mysql> show tables;

mysql> select * from tab1;

三、MyCat讀寫分離
Mycat的讀寫分離是建立在Mysql的主從復(fù)制的基礎(chǔ)上的

修改配置文件 schema.xml

[root@mycat ~]# cd mycat/
[root@mycat mycat]# vim conf/schema.xml

1、設(shè)置balance="1"與writeType="0"

Balance參數(shù)設(shè)置:
    修改的balance屬性,通過此屬性配置讀寫分離的類型負(fù)載均衡類型,目前的取值有4 種: 
?   balance=0,不開啟讀寫分離機(jī)制, 所有讀操作都發(fā)送到當(dāng)前可用的 writeHost 上。 
?   balance=1,全部的 readHost與 stand by writeHost 參與 select 語句的負(fù)載均衡,簡單的說,當(dāng)雙主雙從模式(M1->S1, M2->S2,并且M1與M2 互為主備),正常情況下, M2,S1,S2 都參與 select 語句的負(fù)載均衡。
?   balance=2,所有讀操作都隨機(jī)的在 writeHost、 readhost 上分發(fā)。
?   balance=3,所有讀請求隨機(jī)的分發(fā)到 readhost 執(zhí)行,writerHost 不負(fù)擔(dān)讀壓力
WriteType參數(shù)設(shè)置:
?   writeType=“0”, 所有寫操作都發(fā)送到可用的writeHost上。
?   writeType=“1”,所有寫操作都隨機(jī)的發(fā)送到readHost。
?   writeType=“2”,所有寫操作都隨機(jī)的在writeHost、readhost分上發(fā)。

“readHost是從屬于writeHost的,即意味著它從那個writeHost獲取同步數(shù)據(jù),因此,當(dāng)它所屬的writeHost宕機(jī)了,則它也不會再參與到讀寫分離中來,即“不工作了”,這是因?yàn)榇藭r,它的數(shù)據(jù)已經(jīng)“不可靠”了。基于這個考慮,目前mycat 1.3和1.4版本中,若想支持MySQL一主一從的標(biāo)準(zhǔn)配置,并且在主節(jié)點(diǎn)宕機(jī)的情況下,從節(jié)點(diǎn)還能讀取數(shù)據(jù),則需要在Mycat里配置為兩個writeHost并設(shè)置banlance=1。”

2、設(shè)置switchType="2" 與slaveThreshold="100"

switchType 目前有三種選擇:
?   -1:表示不自動切換
?   1 :默認(rèn)值,自動切換
?   2 :基于MySQL主從同步的狀態(tài)決定是否切換

“Mycat心跳檢查語句配置為 show slave status ,dataHost 上定義兩個新屬性: switchType="2" 與slaveThreshold="100",此時意味著開啟MySQL主從復(fù)制狀態(tài)綁定的讀寫分離與切換機(jī)制。Mycat心跳機(jī)制通過檢測 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三個字段來
確定當(dāng)前主從同步的狀態(tài)以及Seconds_Behind_Master主從復(fù)制時延。

3、修改配置文件,啟動程序

[root@mycat mycat]# vim conf/schema.xml

①控制臺啟動:mycat/bin 目錄下執(zhí)行 ./mycat console
②后臺啟動:mycat/bin 目錄下./mycat start
為了能第一時間看到啟動日志,方便定位問題,選擇①控制臺啟動。

[root@mycat mycat]# ./bin/mycat console

登錄后臺管理窗口 此登錄方式用于管理維護(hù) Mycat

[root@mycat ~]# mysql -umycat -p123456 -h 192.168.1.3 -P8066

4、驗(yàn)證讀寫分離 my.cnf binlog_format=STATEMENT
(1) 在寫主機(jī)插入數(shù)據(jù):

[root@mysql02 ~]# mysql -uroot -p123.com
mysql> use test1;
mysql> select * from tab1;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
 ------ 
3 rows in set (0.01 sec)

mysql> insert into tab1 values(4);
Query OK, 1 row affected (0.02 sec)

mysql> select * from tab1;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
|    4 |
 ------ 
4 rows in set (0.00 sec)

主從主機(jī)數(shù)據(jù)不一致了

[root@mysql01 ~]# mysql -uroot -p123.com
mysql> use test1
mysql> select * from tab1;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
 ------ 
3 rows in set (0.00 sec)

(2) 在Mycat里查詢:

mysql> use TESTDB
mysql> select * from tab1;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
|    4 |
 ------ 
4 rows in set (0.00 sec)

四、垂直拆分–分庫

一個數(shù)據(jù)庫由很多表的構(gòu)成,每個表對應(yīng)著不同的業(yè)務(wù),垂直切分是指按照業(yè)務(wù)將表進(jìn)行分類, 分布到不同 的數(shù)據(jù)庫上面,這樣也就將數(shù)據(jù)或者說壓力分擔(dān)到不同的庫
如何劃分表分庫的原則:有緊密關(guān)聯(lián)關(guān)系的表應(yīng)該在一個庫里,相互沒有關(guān)聯(lián)關(guān)系的表可以分到不同的庫里。

這個案例中需要一臺新的mysql來進(jìn)行分庫操作。

主機(jī) 操作系統(tǒng) IP地址

mysql01(master01)
CentOS 7.3
192.168.1.1

mysql02(slave)
CentOS 7.3
192.168.1.8

mycat
CentOS 7.3
192.168.1.3

mysql03(master02)
CentOS 7.3
192.168.1.9

先將上一個案例插入的數(shù)據(jù)刪除

[root@mysql02 ~]# mysql -uroot -p123.com
mysql> delete from tab1 where id=4;
Query OK, 1 row affected (0.01 sec)

mysql> select * from tab1;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
 ------ 
3 rows in set (0.00 sec)

[root@mycat ~]# mysql -umycat -p123456 -h 192.168.1.3 -P8066
mysql> use TESTDB

mysql> select * from tab1;
 ------ 
| id   |
 ------ 
|    1 |
|    2 |
|    3 |
 ------ 
3 rows in set (0.00 sec)

如下四個表:
客戶表分在一個數(shù)據(jù)庫,另外三張都需要關(guān)聯(lián)查詢,分在另外一個數(shù)據(jù)庫。

#客戶表 rows:20萬
CREATE TABLE customer(
id INT AUTO_INCREMENT,
NAME VARCHAR(200),
PRIMARY KEY(id)
);
#訂單表 rows:600萬
CREATE TABLE orders(
id INT AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id)
);
#訂單詳細(xì)表 rows:600萬
CREATE TABLE orders_detail(
id INT AUTO_INCREMENT,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY(id)
);
#訂單狀態(tài)字典表 rows:20
CREATE TABLE dict_order_type(
id INT AUTO_INCREMENT,
order_type VARCHAR(200),
PRIMARY KEY(id)
);

實(shí)現(xiàn)分庫:
1、 修改 schema 配置文件

[root@mycat mycat]# vim conf/schema.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 dataNode=dn1>
                <table name=customer dataNode=dn2> </table>
        </schema> 
        <dataNode name=dn1 dataHost=host1 database=test1 />
        <dataNode name=dn2 dataHost=host2 database=test1 />
        <dataHost name=host1 maxCon=1000 minCon=10 balance=1
                          writeType=0 dbType=mysql dbDriver=native switchType=1  slaveThreshold=100>
                <heartbeat>select user()</heartbeat>
                <writeHost host=hostM1 url=192.168.1.1:3306 user=root
                                   password=123.com>
                        <readHost host=hostS2 url=192.168.1.8:3306 user=root password=123.com />
                </writeHost>
        </dataHost> 
        <dataHost name=host2 maxCon=1000 minCon=10 balance=0
                          writeType=0 dbType=mysql dbDriver=native switchType=1  slaveThreshold=100>
                <heartbeat>select user()</heartbeat>
                <writeHost host=hostM2 url=192.168.1.9:3306 user=root
                                   password=123.com>
                </writeHost> 
        </dataHost>

</mycat:schema>

授權(quán)MyCat遠(yuǎn)程登陸mysql03

[root@mysql03 ~]# mysql -uroot -p123.com
mysql> grant all on *.* to root@\\\'192.168.1.%\\\' identified by \\\'123.com\\\';

因?yàn)樵谂渲梦募羞壿嫀焖鶎?yīng)的真實(shí)庫mysql03中并沒有,需要在mysql03中創(chuàng)建

mysql> create database test1;

2、 重啟mycat,訪問MyCat,創(chuàng)建表

[root@mycat mycat]# mysql -umycat -p123456 -h 192.168.1.3 -P8066

mysql> use TESTDB
mysql> CREATE TABLE customer(
    -> id INT AUTO_INCREMENT,
    -> NAME VARCHAR(200),
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE orders(
    -> id INT AUTO_INCREMENT,
    -> order_type INT,
    -> customer_id INT,
    -> amount DECIMAL(10,2),
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE orders_detail(
    -> id INT AUTO_INCREMENT,
    -> detail VARCHAR(2000),
    -> order_id INT,
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE dict_order_type(
    -> id INT AUTO_INCREMENT,
    -> order_type VARCHAR(200),
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
 -----------------      
| Tables_in_test1 |
 -----------------      
| customer           |
| dict_order_type |
| orders               |
| orders_detail    |
| tab1                  |
 -----------------     
5 rows in set (0.05 sec)

使用mysql01查看表:

mysql> show tables;
 -----------------     
| Tables_in_test1 |
 -----------------     
| dict_order_type |
| orders               |
| orders_detail    |
| tab1                  |
 -----------------     
4 rows in set (0.00 sec)

使用mysql03查看表:

mysql> use test1;
mysql> show tables;
 -----------------      
| Tables_in_test1 |
 -----------------      
| customer           |
 -----------------      
1 row in set (0.00 sec)

查看結(jié)構(gòu)

mysql> desc customer;
 ------- -------------- ------ ----- --------- ---------------- 
| Field | Type         | Null | Key | Default | Extra          |
 ------- -------------- ------ ----- --------- ---------------- 
| id          | int(11)           | NO    | PRI | NULL    | auto_increment |
| NAME  | varchar(200) | YES  |     | NULL       |                |
 ------- -------------- ------ ----- --------- ---------------- 
2 rows in set (0.00 sec)

五、水平拆分–分表

相對于垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規(guī)則來分散到多個庫之中, 每個表中 包含一部分?jǐn)?shù)據(jù)。簡單來說,我們可以將數(shù)據(jù)的水平切分理解為是按照數(shù)據(jù)行的切分,就是將表中的某些行切分到一個數(shù)據(jù)庫,而另外的某些行又切分到其他的數(shù)據(jù)庫中。
實(shí)現(xiàn)分表 選擇要拆分的表 MySQL 單表存儲數(shù)據(jù)條數(shù)是有瓶頸的,單表達(dá)到 1000 萬條數(shù)據(jù)就達(dá)到了瓶頸,會影響查詢效率,需要進(jìn)行水平拆分(分表)進(jìn)行優(yōu)化。 例如:上一案例的 orders、orders_detail 都已經(jīng)達(dá)到600 萬行數(shù)據(jù),需要進(jìn)行分表優(yōu)化。 分表字段以 orders 表為例,可以根據(jù)不同自字段進(jìn)行分表

編號 分表字段 效果

1
id(主鍵、或創(chuàng)建時間)
查詢訂單注重時效,歷史訂單被查詢的次數(shù)少,如此分片會造成一個節(jié)點(diǎn)訪問多,一個訪問少,不平均。

2
customer_id(客戶ID)
根據(jù)客戶 id 去分,兩個節(jié)點(diǎn)訪問平均,一個客戶的所有訂單都在同一個節(jié)點(diǎn)

1、修改配置文件 schema.xml

[root@mycat mycat]# vim conf/schema.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 dataNode=dn1>
                <table name=customer dataNode=dn2> </table>
                <table name=orders dataNode=dn1,dn2 rule=mod_rule>
                        <childTable name=orders_detail primaryKey=id joinKey=order_id parentKey=id />
                </table>
        </schema> 
        <dataNode name=dn1 dataHost=host1 database=test1 />
        <dataNode name=dn2 dataHost=host2 database=test1 />
        <dataHost name=host1 maxCon=1000 minCon=10 balance=1
                          writeType=0 dbType=mysql dbDriver=native switchType=1  slaveThreshold=100>
                <heartbeat>select user()</heartbeat>
                <writeHost host=hostM1 url=192.168.1.1:3306 user=root
                                   password=123.com>
                        <readHost host=hostS2 url=192.168.1.8:3306 user=root password=123.com />
                </writeHost>
        </dataHost> 
        <dataHost name=host2 maxCon=1000 minCon=10 balance=0
                          writeType=0 dbType=mysql dbDriver=native switchType=1  slaveThreshold=100>
                <heartbeat>select user()</heartbeat>
                <writeHost host=hostM2 url=192.168.1.9:3306 user=root
                                   password=123.com>
                </writeHost> 
        </dataHost>

2、修改配置文件rule.xml

[root@mycat mycat]# vim conf/rule.xml

#在 rule 配置文件里新增分片規(guī)則 mod_rule,并指定規(guī)則適用字段為 customer_id,
#還有選擇分片算法 mod-long(對字段求模運(yùn)算) , customer_id 對兩個節(jié)點(diǎn)求模,根據(jù)結(jié)果分片

 38         <tableRule name=mod_rule>
 39                 <rule>
 40                         <columns>customer_id</columns>
 41                         <algorithm>mod-long</algorithm>
 42                 </rule>
 43         </tableRule>
 ……
 105         <function name=mod-long class=io.mycat.route.function.PartitionByMod>
 106                 <!-- how many data nodes -->
 107                 <property name=count>2</property>
#配置算法 mod-long 參數(shù) count 為 2,兩個節(jié)點(diǎn)
 108         </function>

3、因?yàn)樵赿n2(mysql03:192.168.1.9)上并沒有orders表,在數(shù)據(jù)節(jié)點(diǎn)dn2上創(chuàng)建orders表,并重啟mycat服務(wù)

[root@mysql03 ~]# mysql -uroot -p123.com
mysql> use test1;
mysql> CREATE TABLE orders(
    -> id INT AUTO_INCREMENT,
    -> order_type INT,
    -> customer_id INT,
    -> amount DECIMAL(10,2),
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.00 sec)

4、在MyCat中向orders表插入數(shù)據(jù),insert字段不能省略

[root@mycat mycat]# mysql -umycat -p123456 -P8066 -h292.168.1.3
mysql> use TESTDB

mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
Query OK, 1 row affected (0.01 sec)

#在mycat、dn1、dn2中查看orders表數(shù)據(jù),分表成功

dn1(mysql01:192.168.1.1):

[root@mysql01 ~]# mysql -uroot -p123.com
mysql> use test1;
mysql> select * from orders;
 ---- ------------ ------------- ----------- 
| id | order_type | customer_id | amount    |
 ---- ------------ ------------- ----------- 
|  2 |        101 |         100 | 100300.00 |
|  4 |        101 |         101 | 103000.00 |
|  6 |        102 |         100 | 100020.00 |
 ---- ------------ ------------- ----------- 
3 rows in set (0.00 sec)

dn2(mysql03:192.168.1.9):

[root@mysql03 ~]# mysql -uroot -p123.com
mysql> use test1;

mysql> select * from orders;
 ---- ------------ ------------- ----------- 
| id | order_type | customer_id | amount    |
 ---- ------------ ------------- ----------- 
|  1 |        101 |         100 | 100100.00 |
|  3 |        101 |         101 | 120000.00 |
|  5 |        102 |         101 | 100400.00 |
 ---- ------------ ------------- ----------- 
3 rows in set (0.00 sec)

在dn2(mysql03:192.168.1.9) 創(chuàng)建 orders_detail 表

mysql> CREATE TABLE orders_detail(
    -> id INT AUTO_INCREMENT,
    -> detail VARCHAR(2000),
    -> order_id INT,
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.02 sec)

重啟 Mycat 訪問 Mycat 向 orders_detail 表插入數(shù)據(jù)

[root@mycat mycat]# mysql -umycat -p123456 -h 192.168.1.3 -P8066
mysql> use TESTDB
mysql> insert into orders_detail(id,detail,order_id) values (1,\\\'detail\\\',1);
Query OK, 1 row affected (0.03 sec)

mysql> insert into orders_detail(id,detail,order_id) values (2,\\\'detail\\\',2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into orders_detail(id,detail,order_id) values (3,\\\'detail\\\',3);
Query OK, 1 row affected (0.01 sec)

mysql> insert into orders_detail(id,detail,order_id) values (4,\\\'detail\\\',4);
Query OK, 1 row affected (0.01 sec)

mysql> insert into orders_detail(id,detail,order_id) values (5,\\\'detail\\\',5);
Query OK, 1 row affected (0.00 sec)

mysql> insert into orders_detail(id,detail,order_id) values (6,\\\'detail\\\',6);
Query OK, 1 row affected (0.01 sec)

mysql> select o.*,od.detail from orders as o inner join orders_detail as od on o.id=od.order_id;
 ---- ------------ ------------- ----------- -------- 
| id | order_type | customer_id | amount    | detail |
 ---- ------------ ------------- ----------- -------- 
|  1 |        101 |         100 | 100100.00 | detail |
|  3 |        101 |         101 | 120000.00 | detail |
|  5 |        102 |         101 | 100400.00 | detail |
|  2 |        101 |         100 | 100300.00 | detail |
|  4 |        101 |         101 | 103000.00 | detail |
|  6 |        102 |         100 | 100020.00 | detail |
 ---- ------------ ------------- ----------- -------- 
6 rows in set (0.03 sec)

使用dn1、dn2查看:

mysql> select * from orders_detail;

mysql> select * from orders_detail;

六、全局表

在分片的情況下,當(dāng)業(yè)務(wù)表因?yàn)橐?guī)模而進(jìn)行分片以后,業(yè)務(wù)表與這些附屬的字典表之間的關(guān)聯(lián),就成了比較棘手的問題,考慮到字典表具有以下幾個特性:

變動不頻繁 
數(shù)據(jù)量總體變化不大 
數(shù)據(jù)規(guī)模不大,很少有超過數(shù)十萬條記錄 

鑒于此, Mycat 定義了一種特殊的表,稱之為“全局表”,全局表具有以下特性:

全局表的插入、更新操作會實(shí)時在所有節(jié)點(diǎn)上執(zhí)行,保持各個分片的數(shù)據(jù)一致性
全局表的查詢操作,只從一個節(jié)點(diǎn)獲取 
全局表可以跟任何一個表進(jìn)行 JOIN 操作 將字典表或者符合字典表特性的一些表定義為全局表,則從另外一個方面,很好的解決了數(shù)據(jù) JOIN 的難題。 

通過全局表 基于 E-R 關(guān)系的分片策略, Mycat 可以滿足 80%%u4EE5上的企業(yè)應(yīng)用開發(fā)

[root@mycat mycat]# vim conf/schema.xml

                <table name=dict_order_type dataNode=dn1,dn2 type=global> </table>

在dn2(mysql03:192.168.1.9)創(chuàng)建dict_order_type表

mysql> CREATE TABLE dict_order_type(
    -> id INT AUTO_INCREMENT,
    -> order_type VARCHAR(200),
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

重啟MyCat,訪問MyCat向dict_order_type表插入數(shù)據(jù)

[root@mycat mycat]# mysql -umycat -p123456 -h 192.168.1.3 -P8066
mysql> use TESTDB

mysql>  insert into dict_order_type (id,order_type) values (101,\\\'type1\\\');
Query OK, 1 row affected (0.03 sec)

mysql>  insert into dict_order_type (id,order_type) values (102,\\\'type2\\\');
Query OK, 1 row affected (0.01 sec)

mysql> select * from dict_order_type;
 ----- ------------ 
| id  | order_type |
 ----- ------------ 
| 101 | type1      |
| 102 | type2      |
 ----- ------------ 
2 rows in set (0.03 sec)

常用分片規(guī)則

取模:此規(guī)則為對分片字段求摸運(yùn)算。 也是水平分表最常用規(guī)則。 5.1 配置分表中, orders 表采用了此規(guī)則。
分片枚舉:通過在配置文件中配置可能的枚舉 id,自己配置分片,本規(guī)則適用于特定的場景,比如有些業(yè)務(wù) 需要按照省份或區(qū)縣來做保存,而全國省份區(qū)縣固定的,這類業(yè)務(wù)使用本條規(guī)則。

更多關(guān)于云服務(wù)器域名注冊,虛擬主機(jī)的問題,請?jiān)L問三五互聯(lián)官網(wǎng):m.shinetop.cn

贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明出處:三五互聯(lián)知識庫 » MySQL中間件之MyCat

登錄

找回密碼

注冊

主站蜘蛛池模板: 国产精品中文字幕第一区| 免费无码观看的AV在线播放| 推油少妇久久99久久99久久| 国产欧美日韩精品a在线观看| 亚洲综合精品第一页| 亚洲人成网站18禁止| 国产精品综合av一区二区| 日韩精品无码去免费专区| 成人国产精品一区二区网站公司 | 日韩不卡手机视频在线观看| 久久久久夜夜夜精品国产| 精品中文字幕人妻一二| 亚洲精品无码成人aaa片| 韩国精品一区二区三区在线观看 | 日本中文字幕有码在线视频| 下面一进一出好爽视频| 精品亚洲国产成人| 好屌草这里只有精品| 国产亚洲精品AA片在线播放天| 亚洲精品熟女国产| √天堂中文www官网在线| free性开放小少妇| 熟女系列丰满熟妇AV| 丰满的女邻居2| a片在线免费观看| 高潮潮喷奶水飞溅视频无码| 国产亚洲一区二区三区成人| 精品国产成人一区二区| 无遮无挡爽爽免费视频| 伊人久久精品无码麻豆一区| 濉溪县| 精品一区二区中文字幕| 亚洲国产成人无码av在线播放| 大战丰满无码人妻50p| 国产永久免费高清在线观看| 中文字幕丰满伦子无码ab| 日韩精品区一区二区三vr| 少妇被躁爽到高潮无码文| 国产国产久热这里只有精品| 粉嫩在线一区二区三区视频| 国产亚洲精品自在久久vr|