現在隨着互聯網的發展,數據的量級也是撐指數的增加,從GB到TB到PB。對數據的各類操做也是越發的困難,傳統的關係性數據庫已經沒法知足快速查詢與插入數據的需求。這個時候NoSQL的出現暫時解決了這一危機。它經過下降數據的安全性,減小對事務的支持,減小對複雜查詢的支持,來獲取性能上的提高。
可是,在有些場合NoSQL一些折衷是沒法知足使用場景的,就好比有些使用場景是絕對要有事務與安全指標的。這個時候NoSQL確定是沒法知足的,因此仍是須要使用關係性數據庫。若是使用關係型數據庫解決海量存儲的問題呢?此時就須要作數據庫集羣,爲了提升查詢性能將一個數據庫的數據分散到不一樣的數據庫中存儲java
cobar是阿里之前的產品,它是基於java開發的,實現了mysql公開的二進制傳輸協議,巧妙地將本身假裝成一個MySQLServer,對目前市場上的大多數客戶端和應用都比較兼容node
MyCat是基於cobar演變而來,對cobar的代碼進行了完全的重構,使用NIO重構了網絡模塊,而且優化了buffer內核,加強了聚合,join 等基本特性,同時兼容絕大多數的數據庫成爲了通用的數據庫中間件
MyCat就是一個數據庫中間件,支持mysql集羣,提供高可用性的數據分片集羣mysql
MyCat支持的數據庫linux
要求JDK必須是1.7或者更高的
要求mysql是5.5以上的git
將mysql的服務端和客戶端安裝包上傳到服務器
github
查詢是否安裝過mysql
rpm -qa | grep -i mysql
算法
若是有之前的版本就卸掉
rpm -e --nodeps 版本名稱
sql
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;
數據庫
能夠在本地用軟件鏈接一下mysql數據庫安全
MyCat的官方網站
http://www.mycat.org.cn/
下載地址
https://github.com/MyCATApache/Mycat-download
進入到MyCat的目錄下的bin目錄,啓動MyCat
./mycat start
中止
./mycat stop
mycat 支持的命令{ console | start | stop | restart | status | dump }
其中使用console命令的時候若是出錯了還能顯示錯誤信息
MyCat的默認端口號是8066
就是經過某種特定的條件,將咱們存放在同一個數據庫中的數據分散存放到多個數據庫上面.
數據切分(sharding)根據其切分規則的類型,能夠分爲兩種切分方式.
一種是按照不一樣的表來切分到不一樣的數據庫上,這種切分能夠稱爲數據垂直(縱向)切分
一種是根據表中的數據的邏輯關係,將同一個表中的數據按照某種條件拆分到多臺數據庫上面,這種切分稱之爲數據的水平(橫向)切分
邏輯庫(schema)
數據中間件能夠被看作是一個或者多個數據庫集羣構成的邏輯庫
邏輯表(table)
分佈式數據庫中,對應用來講,讀寫數據的表就是邏輯表。邏輯表,能夠是數據切分後,分佈在一個或多個分片庫中,也能夠不作數據切分,不分片,只有一個表構成。
分片表:是指那些原有的很大數據的表,須要切分到多個數據庫的表,這樣,每一個分片都有一部分數據,全部分片構成了完整的數據。 總而言之就是須要進行分片的表。
非分片表:一個數據庫中並非全部的表都很大,某些表是能夠不用進行切分的,非分片是相對分片表來講的,就是那些不須要進行數據切分的表。
分佈節點(dataNode)
數據切分後,一個大表被分到不一樣的分片數據庫上面,每一個表分片所在的數據庫就是分片節點(dataNode).
節點主機(dataHost)
數據切分後,每一個分片節點(dataNode)不必定都會獨佔一臺機器,同一機器上面能夠有多個分片數據庫,這樣一個或多個分片節點(dataNode)所在的機器就是節點主機(dataHost),爲了規避單節點主機併發數限制,儘可能將讀寫壓力高的分片節點(dataNode)均衡的放在不一樣的節點主機(dataHost)
分片規則(rule)
一個大表要想被被分紅若干個分片表,就須要必定的規則,這樣按照某種業務規則把數據分到某個分片的規則就是分片規則,數據切分選擇合適的分片規則很是重要,將極大的避免後續數據處理的難度.
schema.xml是MyCat的一個配置文件,主要管理MyCat的邏輯庫,邏輯表,分片規則,dataNode,和DataSource.
schema標籤用於定義MyCat事例中的邏輯庫
table標籤訂義了MyCat中的邏輯表rule用於指定分片規則
dataNode標籤訂義了MyCat中的數據節點,也就是數據分片
dataHost標籤訂義了具體的數據庫實例,讀寫分離配置和心跳語句
案例:
按服務器mysql中建立三個數據庫 db1,db2,db3
修改schema.xml
<?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>
配置server.xml
server.xml幾乎保存了全部MyCat須要的系統配置信息.常在這裏配置用戶名,密碼以及權限.在system中添加utf-8字符集設置,否則那存儲中文時會出現問號
<property name="charset">utf8</property>
修改user的設置,這裏爲PINYOUGOUDB設置了兩個用戶
<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會自動把表的名字轉換爲大寫,之後再寫表的名字的時候最好把表的名字都寫成大寫
還有在插入數據的時候必定要把字段列表寫出來,否則就會報錯
錯誤代碼: 1064
partition table, insert must provide ColumnList
往表裏面插入一些數據
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');
注意,上面的三條數據會在第一個表裏面顯示,若是想要在db2中顯示數據須要用下面的數據
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
由於咱們採用的分片規則是每一個節點存儲500萬條數據,也就是一共可以存儲1500萬條數據,超過該範圍的就會出現錯誤
rule.xml用於定義分片規則 ,咱們這裏講解兩種最多見的分片規則
<tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule>
tableRule 是定義具體某個表或某一類表的分片規則名稱 columns用於定義分片的列 algorithm表明算法名稱
rang-long的定義
<function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function>
Function用於定義算法 mapFile 用於定義算法須要的數據,打開autopartition-long.txt
# range start-end ,data node index # K=1000,M=10000. 0-500M=0 500M-1000M=1 1000M-1500M=2
找到function的name爲murmur 的定義,將count屬性改成3,由於我要將數據分紅3片
<function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash"> <property name="seed">0</property><!-- 默認是0 --> <property name="count">3</property><!-- 要分片的數據庫節點數量,必須指定,不然無法分片 --> <property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射爲這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 --> <!-- <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>
可是這個規則指定的列是id ,若是咱們的表主鍵不是id ,而是order_id ,那麼咱們應該從新定義一個tableRule:
<tableRule name="sharding-by-murmur-order"> <rule> <columns>order_id</columns> <algorithm>murmur</algorithm> </rule> </tableRule>
在schema.xml中配置邏輯表時,指定規則爲sharding-by-murmur-order
<table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />
能夠建立一個訂單表,並插入數據,測試分片的效果
1.4 數據庫的讀寫分離
數據庫讀寫分離對於大型系統或者訪問量很高的互聯網應用來講,是必不可少的一個重要功能。對於MySQL來講,標準的讀寫分離是主從模式,一個寫節點Master後面跟着多個讀節點,讀節點的數量取決於系統的壓力,一般是1-3個讀節點的配置