目錄
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";
1、Mycat分庫/分表:
1-1、定義
- – 通過某種特定條件,將存放在一個數據庫(主機)中的數據,分散存放到多個數據庫(主機)中。
- ---以達到分散單臺設備負載的效果,即分庫分表
- – 數據的切分根據其切分規則的類型,分爲2種切分模式
- – 垂直分割(縱向) 和 水平分割(橫向)
- --Mycat 是基於Java的分佈式數據庫系統中間層,爲高併發下的分佈式提供解決方案
- 垂直分割(縱向切分)
– 把單一的表,拆分成多個表,並分散到不同的數據庫(主機)上。
– 一個數據庫由多個表構成,每個表對應不同的業務,可以按照業務對錶進行分類,將其分佈到不同的數據庫(主機)上,實現專庫專用,讓不同的庫(主機)分擔不同的業務。
- 水平分割(橫向切分)
– 按照表中某個字段的某種規則,把向表中寫入的記錄分散到多個庫(主機)中。
– 簡單來說,就是按照數據行切分,將表中的某些行存儲到指定的數據庫 (主機) 中。
1-2、軟件介紹
Mycat 是基於Java的分佈式數據庫系統中間層,爲高併發下的分佈式提供解決方案
- – 支持JDBC形式連接
- – 支持MySQL、Oracle、Sqlserver、Mongodb等
- – 提供數據讀寫分離服務
- – 可以實現數據庫服務器的高可用
- – 提供數據分片服務
- – 基於阿里巴巴Cobar進行研發的開源軟件
- – 適合數據大量寫入數據的存儲需求
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、工作過程:
- 當Mycat收到一個SQL時,會先解析這個SQL查找涉及到的表
- 然後看此表的定義, 如果有分片規則,則獲取到SQL裏分片字段的值,並匹配分片函數,得到該SQL對應的分片列表
- 然後將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)
感謝您的拜讀,喜歡請點贊!!!