一個數據庫由很多表的構成,每個表對應着不同的業務,垂直切分是指按照業務將表進行分類, 分佈到不同 的數據庫上面,這樣也就將數據或者說壓力分擔到不同的庫上面,如下圖:
一個問題:在兩臺主機上的兩個數據庫中的表,能否關聯查詢?
答案:不可以關聯查詢
分庫的原則:有緊密關聯關係的表應該在一個庫裏,相互沒有關聯關係的表可以分到不同的庫裏。
垂直分庫,不能在老的數據庫上進行,需要在新的空數據庫上進行。
先在兩臺機器上創建好2個數據庫,然後通過Mycat創建好需要的空表(分佈在兩臺機器上的數據庫中)。
最後將老的數據庫上的數據灌到新的2個數據庫上就可以了。
Mycat和Mysql環境搭建如前幾篇文章。
主從機IP如下說明:
192.168.1.9 主機 dn1
192.168.1.109 從機 dn2
一. 先修改mycat的scheme.xml配置文件
vim /usr/local/mycat/conf/schema.xml
schema.xml 配置如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2"></table>
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="localhost1" database="orders" />
<dataNode name="dn2" dataHost="localhost2" database="orders" />
<dataHost name="localhost1" 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.9:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="localhost2" 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="hostM2" url="192.168.1.109:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
二. 分別登錄主從機的mysql,創建2個空的數據庫orders
# 在數據節點 dn1、dn2 上分別創建數據庫 orders
# 登錄mysql
cd /usr/local/mysql/bin
./mysql -u root -p
123456
# 創建數據庫orders
CREATE DATABASE orders;
說明:分庫操作不是在原來的老數據庫上進行操作,需要準備兩臺機器分別安裝新的數據庫
三. 啓動 Mycat,開始分庫
mycat登錄:mysql -u mycat -p -h 192.168.1.9 -P 8066
密碼:123456
通過mycat創建如下4張表,建表語句如下:
#客戶表 rows:10萬 CREATE TABLE customer(
id INT AUTO_INCREMENT,
NAME VARCHAR(200),
PRIMARY KEY(id)
);
創建訂單表 rows:100萬
CREATE TABLE orders(
id INT AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id)
);
#訂單詳細表 rows:100萬
CREATE TABLE orders_detail(
id INT AUTO_INCREMENT,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY(id)
);
#訂單狀態字典表 rows:20
CREATE TABLE dict_order_type(
id INT AUTO_INCREMENT,
order_type VARCHAR(200),
PRIMARY KEY(id)
);
四. 分庫驗證
如之前的schema.xml配置,customer這個表會被分到dn2這個節點上,即從機上(192.168.1.109).
其他的表會被分配到dn1上去,即主機上(192.168.1.109)。
也就是說通過mycat把mycat邏輯庫裏的4張表分到了不同的兩臺機器上了,成功實現了垂直分庫操作,如下所示: