Mysql學習之初識Mycat

 

測試環境

兩臺虛擬機:192.169.10.241(node1)、192.169.10.242(node2) 
操作系統:RHEL6.8
Mysql版本:5.7.19
其中:node1的3306、3307、node2的3306 爲一主兩從的結構
           node2的3307爲單實例


MyCat安裝

下載地址:
        http://dl.mycat.io/1.6.7.3/
Mycat這裏我也安裝在node1上
解壓安裝包:
        tar -zxvf Mycat-server-1.6.7.3-release-20190828135747-linux.tar.gz


MyCat配置、運行

配置文件都在./conf裏面

        我首先配置的是server.xml和schema.xml文件,針對MyCat的邏輯用戶、邏輯db、邏輯節點、物理節點這幾個屬性

server.xml裏面配置MyCat的一些系統參數:
        user裏面配置的是MyCat邏輯用戶的屬性,schemas參數對應的是邏輯db

        另外在system裏面配置了Mycat的管理端口和業務端口

        其他的參數暫時都是默認的,xml裏面對於各參數的註釋交待的也比較清楚

schema.xml裏面配置的是MyCat的邏輯db、邏輯節點、物理節點這些屬性:
        schema裏面配置的是邏輯db的信息,包括邏輯db、邏輯db下面的表、邏輯db對應的邏輯節點

        dataNode裏面配置的是邏輯節點的信息,以及邏輯節點對應的物理節點

         dataHost裏面配置的是物理節點的信息,包括讀寫節點、負載均衡、心跳檢測等

 基本信息配置完成後,就可以啓動MyCat了,../bin下面mycat start即可,啓動日誌打印在./log/wrapper.log

啓動遇到的問題:
       wrapper.log日誌如下

STATUS | wrapper  | 2019/09/20 04:23:32 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2019/09/20 04:23:33 | Launching a JVM...
INFO   | jvm 1    | 2019/09/20 04:23:35 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2019/09/20 04:23:35 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2019/09/20 04:23:35 | 
INFO   | jvm 1    | 2019/09/20 04:23:35 | WrapperSimpleApp: Unable to locate the class io.mycat.MycatStartup: java.lang.UnsupportedClassVersionError: io/mycat/MycatStartup : Unsupported major.minor version 52.
0
INFO   | jvm 1    | 2019/09/20 04:23:35 | 
INFO   | jvm 1    | 2019/09/20 04:23:35 | WrapperSimpleApp Usage:
INFO   | jvm 1    | 2019/09/20 04:23:35 |   java org.tanukisoftware.wrapper.WrapperSimpleApp {app_class} [app_arguments]
INFO   | jvm 1    | 2019/09/20 04:23:35 | 
INFO   | jvm 1    | 2019/09/20 04:23:35 | Where:
INFO   | jvm 1    | 2019/09/20 04:23:35 |   app_class:      The fully qualified class name of the application to run.
INFO   | jvm 1    | 2019/09/20 04:23:35 |   app_arguments:  The arguments that would normally be passed to the
INFO   | jvm 1    | 2019/09/20 04:23:35 |                   application.
STATUS | wrapper  | 2019/09/20 04:23:37 | <-- Wrapper Stopped

        從網上查得知,Mycat的運行依賴於jdk,於是從網上下載jdk-8u221-linux-x64.tar.gz,解壓,在/usr/bin下面設置軟鏈接,然後也修改了mycat的./conf下的wrapper.conf

        修改完成後再啓動,啓動成功

MyCat讀寫分離

        讀寫分離的話,主要是配置邏輯節點和物理節點這部分

dataHost相關參數:
balance: 
負載均衡類型,目前的取值有 3 種:
1. balance="0", 不開啓讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上。
2. balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且 M1 與 M2 互爲主備),正常情況下,M2,S1,S2 都參與 select 語句的負載均衡。
3. balance="2",所有讀操作都隨機的在 writeHost、readhost 上分發。
4. balance="3",所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,
注意 balance=3 只在 1.4 及其以後版本有,1.3 沒有。

writeType
負載均衡類型,目前的取值有 2 種:
1. writeType="0", 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個 writeHost,
重新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .
2. writeType="1",所有寫操作都隨機的發送到配置的 writeHost,1.5 以後廢棄不推薦

來測試一下:
       
在這裏可以修改一下./conf/log4j2.xml,將日誌輸出級別修改爲debug,日誌爲./log/mycat.log

       然後通過業務端口登錄Mycat,然後查詢表

[root@rhel6 bin]# mysql -uroot -p -P8066  -h192.169.10.241
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.29-mycat-1.6.7.3-release-20190828215749 MyCat Server (OpenCloudDB)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

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> select * from test1008;
+----+------+
| id | comm |
+----+------+
|  2 | 2    |
|  4 | 4    |
|  1 | 1    |
|  3 | 3    |
+----+------+
4 rows in set (0.01 sec)

mysql> select * from test1008;
+----+------+
| id | comm |
+----+------+
|  2 | 2    |
|  4 | 4    |
|  1 | 1    |
|  3 | 3    |
+----+------+
4 rows in set (0.00 sec)

       然後我們去mycat.log裏面看日誌打印

2019-09-20 08:30:19.571 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.net.FrontendConnection.query(FrontendConnection.java:340)) - ServerConnection [id=1, schema=testdb, host=192.169.10.241, user=root,txIsolation=3, autocommit=true, schema=testdb, executeSql=show tables] select * from test1008
2019-09-20 08:30:19.571 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.ServerQueryHandler.query(ServerQueryHandler.java:57)) - ServerConnection [id=1, schema=testdb, host=192.169.10.241, user=root,txIsolation=3, autocommit=true, schema=testdb, executeSql=select * from test1008]select * from test1008
2019-09-20 08:30:19.637 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.cache.impl.EnchachePool.get(EnchachePool.java:77)) - SQLRouteCache  miss cache ,key:testdbselect * from test1008
2019-09-20 08:30:19.718 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.cache.impl.EnchachePool.putIfAbsent(EnchachePool.java:60)) - SQLRouteCache add cache ,key:testdbselect * from test1008 value:select * from test1008, route={
   1 -> dn1{SELECT *
FROM test1008
LIMIT 100}
   2 -> dn2{SELECT *
FROM test1008
LIMIT 100}
}
2019-09-20 08:30:19.718 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.execute(NonBlockingSession.java:126)) - ServerConnection [id=1, schema=testdb, host=192.169.10.241, user=root,txIsolation=3, autocommit=true, schema=testdb, executeSql=select * from test1008]select * from test1008, route={
   1 -> dn1{SELECT *
FROM test1008
LIMIT 100}
   2 -> dn2{SELECT *
FROM test1008
LIMIT 100}
} rrs 
2019-09-20 08:30:19.724 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.<init>(MultiNodeQueryHandler.java:128)) - execute mutinode query select * from test1008
2019-09-20 08:30:19.729 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.<init>(MultiNodeQueryHandler.java:164)) - has data merge logic 
2019-09-20 08:30:19.729 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.execute(MultiNodeQueryHandler.java:197)) - rrs.getRunOnSlave()-default
2019-09-20 08:30:19.729 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDBNode.getConnection(PhysicalDBNode.java:96)) - rrs.getRunOnSlave()  default 
2019-09-20 08:30:19.732 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDBNode.getConnection(PhysicalDBNode.java:127)) - rrs.getRunOnSlave()  default 
2019-09-20 08:30:19.733 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDBPool.getRWBanlanceCon(PhysicalDBPool.java:551)) - select read source hostS2 for dataHost:datahost1
2019-09-20 08:30:19.736 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDBNode.getConnection(PhysicalDBNode.java:96)) - rrs.getRunOnSlave()  default 
2019-09-20 08:30:19.736 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDBNode.getConnection(PhysicalDBNode.java:127)) - rrs.getRunOnSlave()  default 
2019-09-20 08:30:19.736 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDBPool.getRWBanlanceCon(PhysicalDBPool.java:551)) - select read source hostM2 for dataHost:datahost2
2019-09-20 08:30:19.742 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.sqlengine.mpp.DataMergeService.onRowMetaData(DataMergeService.java:79)) - field metadata keys:[ID, COMM]
2019-09-20 08:30:19.742 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.sqlengine.mpp.DataMergeService.onRowMetaData(DataMergeService.java:80)) - field metadata values:[ColMeta [colIndex=0, colType=3], ColMeta [colIndex=1, colType=253]]
2019-09-20 08:30:19.743 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.rowEofResponse(MultiNodeQueryHandler.java:392)) - io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@597ee8c3on row end reseponse MySQLConnection [id=24, lastTime=1568939419729, user=root, schema=testdb, old shema=testdb, borrowed=true, fromSlaveDB=true, threadId=7828, charset=utf8, txIsolation=3, autocommit=true, attachment=dn1{SELECT *
FROM test1008
LIMIT 100}, respHandler=io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@597ee8c3, host=192.169.10.241, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]  false  2
2019-09-20 08:30:19.743 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.releaseConnection(NonBlockingSession.java:386)) - release connection MySQLConnection [id=24, lastTime=1568939419729, user=root, schema=testdb, old shema=testdb, borrowed=true, fromSlaveDB=true, threadId=7828, charset=utf8, txIsolation=3, autocommit=true, attachment=dn1{SELECT *
FROM test1008
LIMIT 100}, respHandler=io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@597ee8c3, host=192.169.10.241, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
2019-09-20 08:30:19.743 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDatasource.releaseChannel(PhysicalDatasource.java:633)) - release channel MySQLConnection [id=24, lastTime=1568939419729, user=root, schema=testdb, old shema=testdb, borrowed=true, fromSlaveDB=true, threadId=7828, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=192.169.10.241, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
2019-09-20 08:30:19.744 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.rowEofResponse(MultiNodeQueryHandler.java:392)) - io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@597ee8c3on row end reseponse MySQLConnection [id=8, lastTime=1568939419729, user=root, schema=testdb2, old shema=testdb2, borrowed=true, fromSlaveDB=false, threadId=128, charset=utf8, txIsolation=3, autocommit=true, attachment=dn2{SELECT *
FROM test1008
LIMIT 100}, respHandler=io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@597ee8c3, host=192.169.10.242, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]  false  1
2019-09-20 08:30:19.745 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.releaseConnection(NonBlockingSession.java:386)) - release connection MySQLConnection [id=8, lastTime=1568939419729, user=root, schema=testdb2, old shema=testdb2, borrowed=true, fromSlaveDB=false, threadId=128, charset=utf8, txIsolation=3, autocommit=true, attachment=dn2{SELECT *
FROM test1008
LIMIT 100}, respHandler=io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@597ee8c3, host=192.169.10.242, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
2019-09-20 08:30:19.745 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDatasource.releaseChannel(PhysicalDatasource.java:633)) - release channel MySQLConnection [id=8, lastTime=1568939419729, user=root, schema=testdb2, old shema=testdb2, borrowed=true, fromSlaveDB=false, threadId=128, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=192.169.10.242, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
2019-09-20 08:30:19.746 DEBUG [BusinessExecutor3] (io.mycat.sqlengine.mpp.DataMergeService.getResults(DataMergeService.java:307)) - prepare mpp merge result for select * from test1008
2019-09-20 08:30:19.746 DEBUG [BusinessExecutor3] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.outputMergeResult(MultiNodeQueryHandler.java:652)) - last packet id:9

       我們可以看到,對於datahost1,Mycat選擇了hostS2,然後我們再查詢幾次

2019-09-20 08:49:42.334 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDBPool.getRWBanlanceCon(PhysicalDBPool.java:551)) - select read source hostS1 for dataHost:datahost1

       我們可以看到,這次對於datahost1,Mycat選擇了hostS1

MyCat分片

       這裏我們基於datahost1和datahost2做一個簡單的分片

       從這個配置中我們可以看出,test1008使用到了dn1和dn2兩個邏輯節點,分片規則爲testrule,這個testrule是我們在./conf/rule.xml中自定義的

       這裏我們用的規則是io.mycat.route.function.PartitionByMod,即對id字段進行取模運算,count的數量按照實際的分片方案確定,這裏我配置爲邏輯節點的數量。

       來我們測試一下,先通過Mycat業務口登錄,然後進行insert操作

mysql> insert into test1008 values(1,'1');
ERROR 1064 (HY000): partition table, insert must provide ColumnList
mysql> insert into test1008(id,comm) values(1,'1'),(2,'2'),(3,'3'),(4,'4');
Query OK, 4 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test1008;
+----+------+
| id | comm |
+----+------+
|  2 | 2    |
|  4 | 4    |
|  1 | 1    |
|  3 | 3    |
+----+------+
4 rows in set (0.01 sec)

       然後去兩個節點分別查詢:

mysql> select * from test1008;
+----+------+
| id | comm |
+----+------+
|  2 | 2    |
|  4 | 4    |
+----+------+
2 rows in set (0.00 sec)
mysql> select * from test1008;
+----+------+
| id | comm |
+----+------+
|  1 | 1    |
|  3 | 3    |
+----+------+
2 rows in set (0.01 sec)

       OK ,分片完成

總結:

       本次記錄了第一次上手測試Mycat的一些步驟實驗,從整體上先簡單的瞭解了一下Mycat,後續會繼續對Mycat的功能進行更細化的瞭解與測試。

       http://www.mycat.io/document/mycat-definitive-guide.pdf -----Mycat的指南書

我總結的這次實驗中的Mycat的邏輯結構層圖:

邏輯user(root、mycat)
邏輯db(testdb)
邏輯node(dn1、dn2)
物理node(datahost1) 物理node(datahost2)
hostM1 hostS1 hostS2 hostM2

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章