Mycat搭建MySQL叢集
Mycat
MyCAT為資料庫中介軟體產品,支援mysql叢集,提供高可用性資料分片叢集。
分片
分片簡單來說,就是指通過某種特定的條件,將我們存放在同一個資料庫中的資料分散存放到多個數據庫(主機)上面,以達到分散單臺裝置負載的效果
資料的切分(Sharding)根據其切分規則的型別,可以分為兩種切分模式。
(1)一種是按照不同的表(或者Schema)來切分到不同的資料庫(主機)之上,這種切分可以稱之為資料的垂直(縱向)切分
(2)另外一種則是根據表中的資料的邏輯關係,將同一個表中的資料按照某種條件拆分到多臺資料庫(主機)上面,這種切分稱之為資料的水平(橫向)切分。
安裝Mycat
到官方下載
http://dl.mycat.io/1.6-RELEASE/
我選擇windows版的
Mycat-server-1.6-RELEASE-20161028204710-win.tar.gz
解壓下載的壓縮包,我就安裝在D:\server\mycat
接下類介紹mycat的使用規則,為了簡單起見,我就從分片使用最多的演算法,一致性雜湊演算法說起
當我們需要將資料平均分在幾個分割槽中,需要使用一致性hash規則
檢視D:\server\mycat\conf\rule.xml
tableRule的name配置了使用的演算法函式,函式我也把它複製在下面
rule指定對id列進行分片,演算法為murmur
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
<function name="murmur"
class="io.mycat.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>
接下來我們就使用該演算法進行分片
在D:\server\mycat\conf\schema.xml
中,為了清晰起見,我把配置資訊的意思註釋在配置檔案中
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--邏輯資料庫TESTDB-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!--邏輯資料表tb_test-->
<!--rule="sharding-by-murmur" 使用隨機拆分 -->
<table name="tb_test" dataNode="dn1,dn2,dn3"
rule="sharding-by-murmur" />
</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>
<!-- host="hostM1" 物理資料庫 -->
<writeHost host="hostM1" url="127.0.0.1:3306" user="root"
password="123">
</writeHost>
</dataHost>
</mycat:schema>
接下來配置中介軟體
在 D:\server\mycat\conf\server.xml
中,配置連線mycat的使用者密碼
我們只需要連線mycat這個邏輯資料庫即可,
<!--邏輯資料庫的使用者密碼 埠為8066-->
<user name="root">
<property name="password">123</property>
<property name="schemas">TESTDB</property>
</user>
啟動mycat
在cmdD:\server\mycat\bin\startup_nowrap.bat
出現 如下資訊即為啟動成功
接下來使用mysql客戶端連線mycat
首先使用本地資料建立db1 db2 db3 三個資料庫
建立表和資料指令碼如下
CREATE TABLE tb_test (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO tb_test(ID,TITLE) VALUES(114,'goods1');
INSERT INTO tb_test(ID,TITLE) VALUES(225,'goods2');
INSERT INTO tb_test(ID,TITLE) VALUES(3524,'goods3');
INSERT INTO tb_test(ID,TITLE) VALUES(331,'goods1');
INSERT INTO tb_test(ID,TITLE) VALUES(215,'goods2');
INSERT INTO tb_test(ID,TITLE) VALUES(344,'goods3');
SELECT ID,TITLE FROM tb_test
執行sql指令碼後,可以看到
邏輯資料庫如下
物理資料庫如下
檢視db1,db2,db3各個物理資料庫的記錄如下
可以看到mycat已經幫我們進行了水平拆分,當資料量大時,各個資料庫的行數就趨於相等