溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-07-23 19:30:09 來源:網(wǎng)絡 閱讀:11211 作者:AndyMac 欄目:MySQL數(shù)據(jù)庫

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

一、環(huán)境說明

1. 服務器說明

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

2. mysql 庫和表說明

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

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

  1. db01 創(chuàng)建表語句

    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 創(chuàng)建表語句
    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

至此, 我們的環(huán)境就配置好了

二、配置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為開啟實時統(tǒng)計、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/">
        <!-- 指定表規(guī)則的名稱, 以及分片的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">
                <!-- 指定有幾個節(jié)點,咱們有兩個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
聲明也必須按照順序, 最不需要調(diào)用的, 放在最后。

<?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節(jié)點上-->
                <table name="users" primaryKey="id" autoIncrement="true" dataNode="node_db01" />
                <!-- 實際表名為item, 在node_db02和node_db03節(jié)點上-->
                <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" />

        <!-- 聲明數(shù)據(jù)庫的連接地址, 名稱為dataHost01, 為dataNode節(jié)點提供-->
        <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select user()</heartbeat>
                <!-- 數(shù)據(jù)庫的連接地址,賬號和密碼-->
                <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

如果發(fā)生錯誤可以查看/usr/local/mycat/logs/wrapper.log日志

三、驗證

1. 驗證user表的查詢寫入

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

> /usr/local/mysql/bin/mysql -h20.211.55.13 -uroot -P8066 -p123456
2. 查看庫
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)

發(fā)現(xiàn)有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表中看, 數(shù)據(jù)也存在。

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

也可以查到, 說明執(zhí)行成功了

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)

查看實際的庫, 發(fā)現(xiàn)寫在了db03庫中,

再寫入一條

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

發(fā)現(xiàn)寫在了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使用教程及分片方法案例

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI