1. 程式人生 > >mycat教程(二) —— mycat使用教程及分片方法案例

mycat教程(二) —— mycat使用教程及分片方法案例

mycat mycat分區 數據庫中間件 mycat中間件

在完成mycat安裝後, 開始一個示例來盡快熟悉mycat

一、環境說明

1. 服務器說明

服務器名稱 地址 說明
mycat服務器 10.211.55.13 mycat中間件服務器
mysql服務器 10.211.55.9 mysql服務器

2. mysql 庫和表說明

庫名稱 說明
db01 只有一個user表
db02 item表
db03 item表

db02,db03上的item表根據id%2取模保存數據, 也就是進行了數據分片

  1. db01 創建表語句

    CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(50) NOT NULL DEFAULT ‘‘,
    `indate` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
  2. db02,db03 創建表語句
    CREATE TABLE `item` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `value` int(11) NOT NULL DEFAULT ‘0‘,
    `indate` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

3. mycat服務器說明

mycat目錄: /usr/local/mycat

至此, 我們的環境就配置好了

二、配置mycat服務

1. server.xml配置

路徑在 /usr/local/mycat/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="useSqlStat">0</property>  <!-- 1為開啟實時統計、0為關閉 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1為開啟全加班一致性檢測、0為關閉 -->
                <property name="sequnceHandlerType">1</property>
                <property name="processorBufferPoolType">0</property>
                        <!-- 8066 為連接mycat的端口-->
                        <property name="serverPort">8066</property>
                        <!-- 9066 為連接mycat管理地址的端口-->
                        <property name="managerPort">9066</property>
                        <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
                        <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property>
                <property name="handleDistributedTransactions">0</property>
                <property name="useOffHeapForMerge">1</property>
                <property name="memoryPageSize">1m</property>
                <property name="spillsFileBufferSize">1k</property>
                <property name="useStreamOutput">0</property>
                <property name="systemReserveMemorySize">384m</property>
                <property name="useZKSwitch">true</property>
        </system>
        <!-- 配置連接mycat的賬號密碼, 和邏輯庫名稱, 可以設置多個-->
        <user name="root">
                <property name="password">123456</property>
                <property name="schemas">TESTDB</property>
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
</mycat:server>

2. 配置rule.xml

路徑在: /usr/local/mycat/conf/rule.xml
function必須在tableRule的下面, 否則會報錯找不到

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
        <!-- 指定表規則的名稱, 以及分片的function-->
        <tableRule name="role1">
                <rule>
                        <columns>id</columns>
                        <algorithm>mod-long</algorithm>
                </rule>
        </tableRule>
        <!-- 分片名稱為mod-long, 為tableRule標簽提供-->
        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- 指定有幾個節點,咱們有兩個db02和db03,所以寫2, 取模就是id%2 -->
                <property name="count">2</property>
                <property name="virtualBucketTimes">160</property>
        </function>
</mycat:rule>

3. 配置schema.xml

路徑在: /usr/local/mycat/conf/schema.xml
聲明也必須按照順序, 最不需要調用的, 放在最後。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 聲明一個邏輯表, 表名為TESTDB, 和server.xml中的對應 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <!-- 指定實際表名為users, 是在node_db01節點上-->
                <table name="users" primaryKey="id" autoIncrement="true" dataNode="node_db01" />
                <!-- 實際表名為item, 在node_db02和node_db03節點上-->
                <table name="item" primaryKey="id" autoIncrement="true"  dataNode="node_db02,node_db03" rule="role1" />
        </schema>

        <dataNode name="node_db01" dataHost="dataHost01" database="db01" />
        <dataNode name="node_db02" dataHost="dataHost01" database="db02" />
        <dataNode name="node_db03" dataHost="dataHost01" database="db03" />

        <!-- 聲明數據庫的連接地址, 名稱為dataHost01, 為dataNode節點提供-->
        <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select user()</heartbeat>
                <!-- 數據庫的連接地址,賬號和密碼-->
                <writeHost host="server1" url="10.211.55.9:3306" user="root" password="123123" />
        </dataHost>
</mycat:schema>

4. 啟動mycat

> cd /usr/local/mycat/bin
> ./mycat start

如果發生錯誤可以查看/usr/local/mycat/logs/wrapper.log日誌

三、驗證

1. 驗證user表的查詢寫入

賬號和密碼都是server.xml聲明的

> /usr/local/mysql/bin/mysql -h10.211.55.13 -uroot -P8066 -p123456

2. 查看庫

mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)

發現有TESTDB庫

3. 查看表

mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| item             |
| users            |
+------------------+
2 rows in set (0.00 sec)

看到了item和users表, 這就是我們在schema.xml中聲明的邏輯表, 實際對應的是mysql服務器上的表

4. 驗證user的寫入

mysql> insert into users (`id`, `name`, `indate`)values(1, ‘test_name‘, ‘2017-01-01‘);
Query OK, 1 row affected (0.08 sec)

mysql>

去實際的users表中看, 數據也存在。

5. 驗證查詢

mysql> select * from users;
+----+-----------+---------------------+
| id | name      | indate              |
+----+-----------+---------------------+
|  1 | test_name | 2017-01-01 00:00:00 |
+----+-----------+---------------------+
1 row in set (0.06 sec)

也可以查到, 說明執行成功了

2. 驗證item表

1. 驗證寫入

因為id分布式的話,id無法自增判斷, 所以必須指定id, 否則提示錯誤。這個在稍後會介紹如何解決

mysql> insert into item(`id`, `value`, `indate`)values(1, 1, ‘2017-01-01‘);
Query OK, 1 row affected (0.01 sec)

查看實際的庫, 發現寫在了db03庫中,

再寫入一條

mysql> insert into item(`id`, `value`, `indate`)values(2, 2, ‘2017-01-01‘);
Query OK, 1 row affected (0.01 sec)

發現寫在了db02庫中, 所以分片的方式也成功了

2. 驗證查詢

+----+-------+---------------------+
| id | value | indate              |
+----+-------+---------------------+
|  2 |     2 | 2017-01-01 00:00:00 |
|  1 |     1 | 2017-01-01 00:00:00 |
+----+-------+---------------------+
2 rows in set (0.03 sec)

也有了兩條記錄

mycat教程(二) —— mycat使用教程及分片方法案例