1. 程式人生 > >Mycat搭建MySQL叢集

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已經幫我們進行了水平拆分,當資料量大時,各個資料庫的行數就趨於相等