數據庫基礎之10(Mycat 分庫分表)

目錄

1、Mycat分庫/分表:

1-1、定義

1-2、軟件介紹

1-3、分片規則

1-4、工作過程:

2、環境部署

2-1、配置mycat

2-2、修改配置文件/usr/local/mycat/conf/server.xml-----定義了客戶端連接mycat服務時的用戶名密碼及訪問權限

2-3、修改配置文件/usr/local/mycat/conf/schema.xml:--------定義分片信息

2-4、修改配置文件vim /usr/local/mycat/conf/rule.xml:-------定義分片規則的算法

2-5、在節點數據庫上添加授權用戶:    grant all on *.* to yaya@"%" identified by "123456";

2-6、在節點數據庫上設置表名不區分字母大小寫

3、測試配置


1、Mycat分庫/分表:

 

1-1、定義

 

  • – 通過某種特定條件,將存放在一個數據庫(主機)中的數據,分散存放到多個數據庫(主機)中。
  • ---以達到分散單臺設備負載的效果,即分庫分表
  • – 數據的切分根據其切分規則的類型,分爲2種切分模式
  • – 垂直分割(縱向) 和 水平分割(橫向)
  • --Mycat 是基於Java的分佈式數據庫系統中間層,爲高併發下的分佈式提供解決方案

 

  • 垂直分割(縱向切分)

– 把單一的表,拆分成多個表,並分散到不同的數據庫(主機)上。
– 一個數據庫由多個表構成,每個表對應不同的業務,可以按照業務對錶進行分類,將其分佈到不同的數據庫(主機)上,實現專庫專用,讓不同的庫(主機)分擔不同的業務。

  • 水平分割(橫向切分)

– 按照表中某個字段的某種規則,把向表中寫入的記錄分散到多個庫(主機)中。
– 簡單來說,就是按照數據行切分,將表中的某些行存儲到指定的數據庫 (主機) 中。

 

1-2、軟件介紹

Mycat 是基於Java的分佈式數據庫系統中間層,爲高併發下的分佈式提供解決方案

  1. – 支持JDBC形式連接
  2. – 支持MySQL、Oracle、Sqlserver、Mongodb等
  3. – 提供數據讀寫分離服務
  4. – 可以實現數據庫服務器的高可用
  5. – 提供數據分片服務
  6. – 基於阿里巴巴Cobar進行研發的開源軟件
  7. – 適合數據大量寫入數據的存儲需求

1-3、分片規則

mycat服務提供10種分片規則。每種分片規則對應一種算法。
– 1枚舉法 sharding-by-intfile --------算法爲hash-int
– 2固定分片hash算法 rule1------------func1
– 3範圍約定 auto-sharding-long------rang-long
– 4求模法 mod-long------------------mod-long
– 5日期列分區法 sharding-by-date------sharding-by-date
– 6通配取模 sharding-by-pattern ------->sharding-by-pattern
– 7ASCII碼求模通配 sharding-by-prefixpattern ------->sharding-by-prefixpattern
– 8編程指定 sharding-by-substring ------->sharding-by-substring
– 9字符串拆分hash解析 sharding-by-stringhash ------>sharding-by-stringhash
– 10一致性hash sharding-by-murmur -------->murmur

1-4、工作過程:

  1. 當Mycat收到一個SQL時,會先解析這個SQL查找涉及到的表
  2. 然後看此表的定義, 如果有分片規則,則獲取到SQL裏分片字段的值,並匹配分片函數,得到該SQL對應的分片列表
  3. 然後將SQL發往這些分片去執行,最後收集和處理所有分片返回的結果數據,並輸出到客戶端


2、環境部署

2-1、配置mycat

  • 安裝JDK

[root@localhost ~]# rpm -qa | grep -i jdk -----------------安裝系統自帶的即可
java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64

  •  安裝mycat服務軟件包

[root@localhost ~]# tar -zxf Mycat-server-1.4-beta-20150604171601-linux.tar.gz #免安裝,解壓後即可使用
[root@localhost ~]# mv mycat/ /usr/local/
[root@localhost ~]# ls /usr/local/mycat/
bin     catlet     conf       lib     logs      version.txt

  • 目錄結構說明

– bin ----- mycat命令 比如啓動 停止 等
– catlet ------擴展功能
– conf  ----------配置文件
– lib -------mycat使用的jar包 mycat是java開發的
– log ------mycat啓動日誌和運行日誌
– wrapper.log -----mycat服務啓動日誌啓動有問題可以看這個日誌的內容
– mycat.log ------記錄 sql腳本執行後的具體報錯內容

 

  • 重要配置文件說明

ls /usr/local/mycat/conf
– server.xml------設置客戶端連接mycat服務的賬號 、密碼等
– schema.xml-------配置mycat使用的真實數據庫和表
– rule.xml---------定義mycat分片規則
cp server.xml  server.xml.bak----做備份
cp schema.xml  schema.xml.bak----做備份

  • 配置標籤說明                                

– <user>.......</user>
定義連接mycat服務時使用的用戶和密碼及邏輯庫的名字      
一是一個用戶。邏輯庫是客戶端訪問的時候顯示的庫名
– <datanode>......</datanode>
指定數據節點(物理庫的主機名和存儲分片數據的數據庫名)
– <datahost>......</datahost>
指定數據庫服務器的IP地址及連接數據庫時使用的授權用戶名及密碼

 

2-2、修改配置文件/usr/local/mycat/conf/server.xml-----定義了客戶端連接mycat服務時的用戶名密碼及訪問權限

<mycat:server xmlns:mycat="http://org.opencloudb/">
<user name="admin">--------------連接mycat服務時使用的用戶名 admin
<property name="password">123456</property> -------使用admin用戶連接mycat用戶時使用的密碼
<property name="schemas">TESTDB</property> ------連接上mycat服務後,訪問的虛擬庫的名字,可以看到的庫名多個時,使用逗號分隔 (是邏輯上的庫名)
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> -----定義只讀權限,使用定義的user用戶連接mycat服務後只有讀記錄的權限
</mycat:server>

 

2-3、修改配置文件/usr/local/mycat/conf/schema.xml:--------定義分片信息

<mycat:schema xmlns:mycat="http://org.opencloudb/">
 5         <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">------TESTDB必須和連接上mycat服務後,可以看到的庫名一致
 6                 <!-- auto sharding by id (long) -->
 7                 <table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />---填充表名爲travelrecord的表內容時,將表內容分片給節點名dn1,dn2的主機,並且定義了分片規則是那種分片規則
 20                 <table name="employee" primaryKey="ID" dataNode="dn1,dn2"--指出了該表中必須要有ID字段且爲主鍵
 21                         rule="sharding-by-intfile" />

 37         <dataNode name="dn1" dataHost="c1" database="db1" />----節點dn1的主機名爲c1,庫名爲db1
 38         <dataNode name="dn2" dataHost="c2" database="db2" />--- 節點dn2的主機名爲c2,庫名爲db2
 43         <dataHost name="c1" maxCon="1000" minCon="10" balance="0"
 44                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
 45                 <heartbeat>select user()</heartbeat>
 46                 <!-- can have multi write hosts -->
 47                 <writeHost host="hostM1" url="192.168.4.152:3306" ----主機名爲c1的IP地址爲192.168.4.152,訪問端口爲3306
 48                         user="yaya" password="123456">-----訪問時的用戶名和密碼爲yaya,123456
 55         </dataHost>
 56         <dataHost name="c2" maxCon="1000" minCon="10" balance="0"
 57                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
 58                 <heartbeat>select user()</heartbeat>
 59                 <!-- can have multi write hosts -->
 60                 <writeHost host="hostM1" url="192.168.4.153:3306" ----主機名爲c1的IP地址爲192.168.4.153,訪問端口爲3306
 61                         user="yaya" password="123456">-----訪問時的用戶名和密碼爲yaya,123456
 68         </dataHost>

</mycat:schema>


2-4、修改配置文件vim /usr/local/mycat/conf/rule.xml:-------定義分片規則的算法

 26         <tableRule name="sharding-by-intfile">--------------找到分片信息中對應的分片規則
 27                 <rule>
 28                         <columns>sharding_id</columns>------定義了分片規則是靠sharding_id字段來區分寫入不同節點主機的相關數據庫的相關表中

 29                         <algorithm>hash-int</algorithm>-------定義該分片規則對應的算法
 30                 </rule>

 86         <function name="hash-int"--------找到對hash-int算法的功能解釋
 87                 class="org.opencloudb.route.function.PartitionByFileMap">
 88                 <property name="mapFile">partition-hash-int.txt</property>--指出了該算法定義功能的文件名是什麼
 89         </function>

vim /usr/local/mycat/conf/partition-hash-int.txt ----打開該算法定義功能的文件

10000=0-------sharding_id字段值爲10000時,將會把記錄寫到dn1節點對應主機的db1庫中        
10010=1-------sharding_id字段值爲10010時,將會把記錄寫到dn2節點對應主機的db2庫中    


2-5、在節點數據庫上添加授權用戶:    grant all on *.* to yaya@"%" identified by "123456";

 

2-6、在節點數據庫上設置表名不區分字母大小寫

Vim /etc/my.cnf
[mysqld]
……
……
lower_case_table_names = 1 --------表名不區分字母大小寫
[root@localhost ~]# systemctl restart mysqld-----添加對應設置後重啓mysqld服務

/usr/local/mycat/bin/mycat status------起服務
ln -s /usr/local/mycat/bin/mycat  /usr/bin/mycat-----創建軟連接
Netstat -untlp | grep 8806-----------查看服務是否啓動

 

3、測試配置

• 在客戶端連接mycat服務器
– mysql –hmycat服務器ip地址 – P端口 – u用戶 – p密碼

例如:
[root@room9pc17 ~]# mysql -h192.168.4.56 -P8066 -uadmin -p123456
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1row in set (0.00 sec)

 

  • 建表驗證

create table employee(ID int(2) primary key auto_increment,name char(15),pay float(7,2),sharding_id int(2),sex enum("boy","girl"));---------------建表時必須要有規則所定義的字段,和規則對應的算法所定義的
);

 insert into employee(name,pay,sharding_id,sex) values("yangsi",10000,10000,"girl");
 insert into employee(name,pay,sharding_id,sex) values("yangsan",10000,10010,"girl");
 insert into employee(name,pay,sharding_id,sex) values("yanger",10000,10010,"girl");
 insert into employee(name,pay,sharding_id,sex) values("yangyi",10000,10000,"girl");

  •    dn1本機管理員登陸本機:

mysql> select * from employee;
+----+--------+----------+-------------+------+
| ID | name   | pay      | sharding_id | sex  |
+----+--------+----------+-------------+------+
|  1 | yangyi | 10000.00 |       10000 | girl |
|  2 | yangsi | 10000.00 |       10000 | girl |
+----+--------+----------+-------------+------+
2 rows in set (0.00 sec)

  •      dn2本機管理員登陸本機:

mysql> select * from employee;
+----+---------+----------+-------------+------+
| ID | name    | pay      | sharding_id | sex  |
+----+---------+----------+-------------+------+
|  1 | yanger  | 10000.00 |       10010 | girl |
|  2 | yangsan | 10000.00 |       10010 | girl |
+----+---------+----------+-------------+------+
2 rows in set (0.00 sec)

感謝您的拜讀,喜歡請點贊!!!

發佈了41 篇原創文章 · 獲贊 20 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章