什麼是MyCat
一個徹底開源的,面向企業應用開發的大數據庫集羣
支持事務、ACID、可以替代MySQL的加強版數據庫
一個可以視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣
一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
一個新穎的數據庫中間件產品
爲什麼使用MyCat
如今隨着互聯網的發展,數據的量級也是撐指數的增長,從GB到TB到PB。對數據的各種 操作也是愈加的困難,傳統的關係性數據庫已經無法滿足快速查詢與插入數據的需求。這個時候NoSQL的出現 暫時解決了這一危機。它通過降低數據的安全性,減少對事務的支持,減少對複雜查詢的支持,來獲取性能上 的提升。但是,在有些場合NoSQL一些折衷是無法滿足使用場景的,就比如有些使用場景是絕對要有事務與安 全指標的。這個時候NoSQL肯定是無法滿足的,所以還是需要使用關係性數據庫。如何使用關係型數據庫解決 海量存儲的問題呢?此時就需要做數據庫集羣,爲了提高查詢性能將一個數據庫的數據分散到不同的數據庫中 存儲,爲應對此問題就出現了——MyCat
Mycat作用爲:
能滿足數據庫數據大量存儲;提高了查詢性能
讀寫分離
數據分片 垂直拆分(分庫) 、 水平拆分(分表) 、 垂直+水平拆分(分庫分表)
多數據源整合
支持MySQL ORACLE SQLServer等一些主流的數據庫
核心技術(分庫分表) 數據庫分片指:通過某種特定的條件,將我們存放在一個數據庫中的數據分散存放 在不同的多個數據庫(主機)中,這樣來達到分散單臺設備的負載,根據切片規則,可分爲以下兩種切片模式
MyCAT通過定義表的分片規則來實現分片,每個表格可以捆綁一個分片規則,每個分片規則指定一個分片字段 並綁定一個函數,來實現動態分片算法
1.Schema:邏輯庫,與MySQL中的Database(數據庫)對應,一個邏輯庫中定義了所包括的Table。
2.Table:邏輯表,即物理數據庫中存儲的某一張表,與傳統數據庫不同,這裏的表格需要聲明其所存儲的邏輯 數據節點DataNode。在此可以指定表的分片規則。
3.DataNode:MyCAT的邏輯數據節點,是存放table的具體物理節點,也稱之爲分片節點,通過DataSource來 關聯到後端某個具體數據庫上
4.DataSource:定義某個物理庫的訪問地址,用於捆綁到Datanode上
5.分片規則:前面講了數據切分,一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則 把數據分到某個分片的規則就是分片規則,數據切分選擇合適的分片規則非常重要,將極大的避免後續數據處理的難
MyCat部署
#安裝jdk環境,爲了方便我這裏直接yum安裝了,jdk必須是1.7以上的版本
[root@mycat ~]# yum -y install java
[root@mycat ~]# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
[root@mycat ~]# wget https://github.com/MyCATApache/Mycat-Server/releases/download/Mycat-server-1675-release/Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz
[root@mycat ~]# tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat conf]# pwd
/usr/local/mycat/conf
[root@mycat conf]# vim server.xml # 修改配置文件
#找到最後,找出此模塊,這裏我是爲了不和系統用戶root衝突,所以修改爲了mycat
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
#由於我在修改的途中爲了觀看清晰刪除了很多配置,所以這塊爲了以防萬一就先備份一個副本出來
[root@mycat conf]# cp schema.xml schema.xml.bak
[root@mycat conf]# vim 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"> # dataNode指定節點
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="host1" database="test1" /> # database 指定數據庫
<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.171.135:3306" user="root"
password="123"> # 指定寫的數據庫主機,及登錄賬號密碼
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.171.145:3306" user="root" password="123" /> # 指定讀的數據主機及賬戶和密碼
</writeHost>
</dataHost>
</mycat:schema>
[root@mycat ~]# ln -s /usr/local/mycat/bin/* /usr/bin/ # 做軟連接方便使用
MySQL主從配置
1、master配置
[root@master ~]# vim /etc/my.cnf
.....................
log-bin=mysql-bin
server-id=1
mysql> grant replication slave on *.* to rep@'192.168.171.%' identified by '123'; # 賦予權限使從服務器可以連接
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 448 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> create database test1;
mysql> use test1;
mysql> create table tab1(id int primary key auto_increment,name varchar(22));
mysql> insert into tab1 values(1,'zhang'),(2,'li'),(3,'zhao');
mysql> select * from tab1;
+----+-------+
| id | name |
+----+-------+
| 1 | zhang |
| 2 | li |
| 3 | zhao |
+----+-------+
3 rows in set (0.00 sec)
#賦予權限使mycat能夠遠程登錄
mysql> grant all on *.* to root@'192.168.171.%' identified by '123';
#將mysql命令複製過去,是mycat能簡單使用
[root@master ~]# scp /usr/local/mysql/bin/mysql [email protected]:/usr/bin/
2、slave配置
[root@slave data]# vim /etc/my.cnf
.................
relay-log=relay-bin
server-id=2
mysql> change master to master_host='192.168.171.135',master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=448;
mysql> start slave;
mysql> show slave status\G
mysql> use test1;
mysql> select * from tab1;
+----+-------+
| id | name |
+----+-------+
| 1 | zhang |
| 2 | li |
| 3 | zhao |
+----+-------+
3 rows in set (0.00 sec)
#賦予權限使mycat能夠遠程連接
mysql> grant all on *.* to root@'192.168.171.%' identified by '123';
3、測試
[root@mycat ~]# mysql -umycat -p123456 -h 192.168.171.134 -P8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB | # 這個是邏輯庫
+----------+
1 row in set (0.00 sec)
mysql> use TESTDB
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| tab1 |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from tab1;
+----+-------+
| id | name |
+----+-------+
| 1 | zhang |
| 2 | li |
| 3 | zhao |
+----+-------+
3 rows in set (0.00 sec)