現在隨着互聯網的發展,數據的量級也是撐指數的增加,從GB到TB到PB。對數據的各類操做也是越發的困難,傳統的關係性數據庫已經沒法知足快速查詢與插入數據的需求。這個時候NoSQL的出現暫時解決了這一危機。它經過下降數據的安全性,減小對事務的支持,減小對複雜查詢的支持,來獲取性能上的提高。node
可是,在有些場合NoSQL一些折衷是沒法知足使用場景的,就好比有些使用場景是絕對要有事務與安全指標的。這個時候NoSQL確定是沒法知足的,因此仍是須要使用關係性數據庫。若是使用關係型數據庫解決海量存儲的問題呢?此時就須要作數據庫集羣,爲了提升查詢性能將一個數據庫的數據分散到不一樣的數據庫中存儲。mysql
Mycat 背後是阿里曾經開源的知名產品——Cobar。Cobar 的核心功能和優點是 MySQL 數據庫分片,此產品曾經廣爲流傳,聽說最先的發起者對 Mysql 很精通,後來從阿里跳槽了,阿里隨後開源的 Cobar,並維持到 2013 年年初,而後,就沒有而後了。linux
Cobar 的思路和實現路徑的確不錯。基於 Java 開發的,實現了 MySQL 公開的二進制傳輸協議,巧妙地將本身假裝成一個 MySQL Server,目前市面上絕大多數MySQL客戶端工具和應用都能兼容。比本身實現一個新的數據庫協議要明智的多,由於生態環境在哪裏擺着。git
Mycat 是基於 cobar 演變而來,對 cobar 的代碼進行了完全的重構,使用 NIO 重構了網絡模塊,而且優化了 Buffer 內核,加強了聚合,Join 等基本特性,同時兼容絕大多數數據庫成爲通用的數據庫中間件。github
簡單的說,MyCAT就是:一個新穎的數據庫中間件產品支持mysql集羣,或者mariadb cluster,提供高可用性數據分片集羣。你能夠像使用mysql同樣使用mycat。對於開發人員來講根本感受不到mycat的存在。算法
JDK:要求jdk必須是1.7及以上版本
MySQL:推薦mysql是5.5以上版本
MySQL安裝與啓動步驟以下:( 步驟1-5省略 )sql
rpm -qa|grep -i mysql
rpm -e --nodeps 軟件名稱
rpm -ivh MySQL-server-5.5.49-1.linux2.6.i386.rpm
rpm -ivh MySQL-client-5.5.49-1.linux2.6.i386.rpm
service mysql start
mysql -u root
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
MyCat的官方網站: www.mycat.org.cn
下載地址: github.com/MyCATApache…數據庫
tar -xzvf Mycat-server-1.4-release-20151019230038-linux.tar.gz
mv mycat /usr/local
複製代碼
./mycat start
中止:./mycat stop
mycat 支持的命令{ console | start | stop | restart | status | dump }
Mycat的默認端口號爲:8066安全
簡單來講,就是指經過某種特定的條件,將咱們存放在同一個數據庫中的數據分散存放到多個數據庫(主機)上面,以達到分散單臺設備負載的效果。bash
數據的切分(Sharding)根據其切分規則的類型,能夠分爲兩種切分模式。
邏輯庫(schema) :
邏輯表(table):
分片表:
非分片表:
分片節點(dataNode)
節點主機(dataHost)
分片規則(rule)
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="PINYOUGOUDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_test" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.25.142:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
複製代碼
<property name="charset">utf8</property>
<user name="test">
<property name="password">test</property>
<property name="schemas">PINYOUGOUDB</property>
</user>
<user name="root">
<property name="password">123456</property>
<property name="schemas">PINYOUGOUDB</property>
</user>
複製代碼
進入mycat ,執行下列語句建立一個表:
CREATE TABLE tb_test (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
複製代碼
建立後你會發現,MyCat會自動將你的錶轉換爲大寫,這一點與Oracle有些相似。
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
複製代碼
咱們會發現這些數據被寫入到第一個節點中了,那何時數據會寫到第二個節點中呢? 咱們插入下面的數據就能夠插入第二個節點了
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
由於咱們採用的分片規則是每節點存儲500萬條數據,因此當ID大於5000000則會存儲到第二個節點上。 目前只設置了兩個節點,若是數據大於1000萬條,會怎麼樣呢?執行下列語句測試一下 INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');
rule.xml用於定義分片規則 ,咱們這裏講解兩種最多見的分片規則
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
複製代碼
<function name="rang-long"
class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
複製代碼
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
複製代碼
<function name="murmur"
class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property> <!-- 默認是0 -->
<property name="count">3</property> <!-- 要分片的數據庫節點數量,必須指定,不然無法分片 -->
<!-- 一個實際的數據庫節點被映射爲這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 -->
<property name="virtualBucketTimes">160</property>
<!--
<property name="weightMapFile">weightMapFile</property>
節點的權重,沒有指定權重的節點默認是1。
以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引爲key,
以節點權重值爲值。全部權重值必須是正整數,不然以1代替
-->
<!--
<property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用於測試時觀察各物理節點與虛擬節點的分佈狀況,若是指定了這個屬性,
會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,若是不指定,就不會輸出任何東西
-->
</function>
複製代碼
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
複製代碼
<tableRule name="sharding-by-murmur-order">
<rule>
<columns>order_id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
複製代碼
<table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />