關於分庫分表,Mycat已經幫我們在內部實現了路由的功能,我們只需要在Mycat中配置以下切分規則即可,對於開發者來說,我們就可以把Mycat看做是一個數據庫,接下來我們開始搭建環境
1、準備:
Mycat是使用java寫的數據庫中間件,所以要運行Mycat前要準備要jdk的環境,要求是jdk1.7以上的環境。所以需要在系統中配置JAVA_HOME的環境變量,如果沒有配置好啓動Mycat會是這樣的提示:
[root@LinuxCentOS6 bin]# ./mycat start
JAVA_HOME environment variable is not set
[root@LinuxCentOS6 bin]#
正確安裝JDK:【運維筆記】Linux 安裝 jdk1.8.0_191 指南
2、下載MyCat安裝包:
從官網下載Mycat,http://dl.mycat.io/1.6-RELEASE/ 我們是基於CentOS6.5
來搭建Mycat環境的,所以下載版本:
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
3、將下載好的安裝包上傳到服務器上並解壓.解壓之後目錄結構如下:
[root@LinuxCentOS6 mycat]# pwd
/usr/local/mycat
[root@LinuxCentOS6 mycat]# ll
total 24
drwxr-xr-x. 2 root root 4096 Oct 30 12:04 bin
drwxrwxrwx. 2 root root 4096 Mar 1 2016 catlet
drwxrwxrwx. 4 root root 4096 Oct 30 13:55 conf
drwxr-xr-x. 2 root root 4096 Oct 30 12:04 lib
drwxrwxrwx. 3 root root 4096 Oct 30 13:55 logs
-rwxrwxrwx. 1 root root 217 Oct 28 2016 version.txt
[root@LinuxCentOS6 mycat]#
4、配置名爲db_sszh_mycat
的邏輯庫
信息,將如下配置複製粘貼覆蓋mycat/conf/schema.xml
的內容:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 配置server.xml將會用到db_sszh_mycat,這是對外提供邏輯的數據庫,rule1在rule.xml中配置 -->
<schema name="db_sszh_mycat" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" dataNode="db_sszh_01,db_sszh_02" rule="rule1" />
</schema>
<!-- 設置dataNode 對應的數據庫信息,及 mycat 連接的地址dataHost,database是真實的物理數據庫名稱 -->
<dataNode name="db_sszh_01" dataHost="db_sszh" database="db_sszh_01" />
<dataNode name="db_sszh_02" dataHost="db_sszh" database="db_sszh_02" />
<!-- mycat 邏輯主機dataHost對應的物理主機.其中也設置對應的mysql登陸信息 -->
<dataHost name="db_sszh" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="192.168.10.88:3306" user="root" password="123456"/>
</dataHost>
</mycat:schema>
說明:
<schema>
:表示的是在mycat中的邏輯庫配置,邏輯庫名稱爲:db_sszh_mycat
<table>
:表示在mycat中的邏輯表配置,邏輯表名稱爲:user
,映射到兩個數據庫節點dataNode
中,切分規則爲:rule1
(在rule.xml配置)<dataNode>
:表示數據庫節點,這個節點不一定是單節點,可以配置成讀寫分離<dataHost>
:真實的數據庫的地址配置<heartbeat>
:用戶心跳檢測<writeHost>
:寫庫的配置
5、配置切分規則,將如下配置複製粘貼覆蓋mycat/conf/rule.xml
的內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
</mycat:rule>
說明:
- 這裏定義的是切分規則,是按照id列進行切分,切分規則是採取取模的方式,
<property name="count">2</property>
:這裏配置了我們有拆分了多個庫(表),需要和前面配置<table name="user" primaryKey="id" dataNode="db_sszh_01,db_sszh_02" rule="rule1" />
中的dataNode個數一致,否則會出錯
6、配置mycat服務器信息,將如下配置複製粘貼覆蓋mycat/conf/server.xml
的內容
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!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">2</property>
<!-- <property name="useCompression">1</property>--> <!--1爲開啓mysql壓縮協議-->
<property name="fakeMySQLVersion">5.6.20</property> <!--設置模擬的MySQL版本號-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默認爲type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</property>
<!--默認是65535 64K 用於sql解析時最大文本長度 -->
<property name="maxStringLiteralLength">65535</property>
<property name="sequnceHandlerType">0</property>
<property name="backSocketNoDelay">1</property>
<property name="frontSocketNoDelay">1</property>
<property name="processorExecutor">16</property>
<property name="serverPort">8066</property> <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>
<!--分佈式事務開關,0爲不過濾分佈式事務,1爲過濾分佈式事務(如果分佈式事務內只涉及全局表,則不過濾),2爲不過濾分佈式事務,但是記錄分佈式事務日誌-->
<property name="handleDistributedTransactions">0</property>
<!-- off heap for merge/order/group/limit 1開啓 0關閉 -->
<property name="useOffHeapForMerge">1</property>
<!-- 單位爲m -->
<property name="memoryPageSize">1m</property>
<!-- 單位爲k -->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!-- 單位爲m -->
<property name="systemReserveMemorySize">384m</property>
<!--是否採用zookeeper協調切換 -->
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火牆設置 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<!-- 配置一個登錄名爲root,密碼爲123456的mycat用戶賬號,只能方位名爲db_sszh_mycat的數據庫 -->
<user name="root">
<property name="password">123456</property>
<property name="schemas">db_sszh_mycat</property>
<!-- 是否爲只讀,默認fasle,設置爲true將無法插入數據 -->
<property name="readOnly">false</property>
<!-- 表級 DML 權限設置 -->
<!--
<privileges check="false">
<schema name="db_sszh_mycat" dml="0110" >
<table name="db_sszh_01" dml="0000"></table>
<table name="db_sszh_02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">db_sszh_mycat</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
7、新建數據庫:在數據庫中創建兩個數據庫 db_sszh_01, db_sszh_01
建庫語句,略...
8、分別在每個庫中執行如下建表語句:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
9、啓動MyCat,進入/usr/local/mycat/bin
目錄,執行命令./mycat start
:
[root@LinuxCentOS6 bin]# pwd
/usr/local/mycat/bin
[root@LinuxCentOS6 bin]# ./mycat start
Starting Mycat-server...
Mycat-server is already running.
[root@LinuxCentOS6 bin]#
10、查看MyCat啓動日誌(位於/usr/local/mycat/logs/wrapper.log
),啓動成功會有如下顯示,默認端口8066
:
STATUS | wrapper | 2019/10/30 15:08:37 | --> Wrapper Started as Daemon
STATUS | wrapper | 2019/10/30 15:08:37 | Launching a JVM...
INFO | jvm 1 | 2019/10/30 15:08:37 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO | jvm 1 | 2019/10/30 15:08:38 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2019/10/30 15:08:38 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2019/10/30 15:08:38 |
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,098 [INFO ][WrapperSimpleAppMain] total resouces of dataHost db_sszh is :1 (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:100)
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,112 [INFO ][WrapperSimpleAppMain] create layer cache pool TableID2DataNodeCache of type encache ,default cache size 10000 ,default expire seconds18000 (io.mycat.cache.CacheService:CacheService.java:125)
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,123 [INFO ][WrapperSimpleAppMain] create child Cache: TESTDB_ORDERS for layered cache TableID2DataNodeCache, size 50000, expire seconds 18000 (io.mycat.cache.DefaultLayedCachePool:DefaultLayedCachePool.java:80)
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,699 [INFO ][WrapperSimpleAppMain] dyna class load from ./catlet,and auto check for class file modified every 60 seconds (io.mycat.config.classloader.DynaClassLoader:DynaClassLoader.java:34)
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,699 [INFO ][WrapperSimpleAppMain] =============================================== (io.mycat.MycatServer:MycatServer.java:266)
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,699 [INFO ][WrapperSimpleAppMain] MyCat is ready to startup ... (io.mycat.MycatServer:MycatServer.java:267)
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,699 [INFO ][WrapperSimpleAppMain] Startup processors ...,total processors:32,aio thread pool size:16
INFO | jvm 1 | 2019/10/30 15:08:39 | each process allocated socket buffer pool bytes ,a page size:2097152 a page's chunk number(PageSize/ChunkSize) is:512 buffer page's number is:40 (io.mycat.MycatServer:MycatServer.java:279)
INFO | jvm 1 | 2019/10/30 15:08:39 | 2019-10-30 15:08:39,699 [INFO ][WrapperSimpleAppMain] sysconfig params:SystemConfig [processorBufferLocalPercent=100, frontSocketSoRcvbuf=1048576, frontSocketSoSndbuf=4194304, backSocketSoRcvbuf=4194304, backSocketSoSndbuf=1048576, frontSocketNoDelay=1, backSocketNoDelay=1, maxStringLiteralLength=65535, frontWriteQueueSize=4096, bindIp=0.0.0.0, serverPort=8066, managerPort=9066, charset=utf8, processors=32, processorExecutor=16, timerExecutor=2, managerExecutor=2, idleTimeout=300000, catletClassCheckSeconds=60, sqlExecuteTimeout=300, processorCheckPeriod=1000, dataNodeIdleCheckPeriod=300000, dataNodeHeartbeatPeriod=10000, clusterHeartbeatUser=_HEARTBEAT_USER_, clusterHeartbeatPass=_HEARTBEAT_PASS_, clusterHeartbeatPeriod=5000, clusterHeartbeatTimeout=10000, clusterHeartbeatRetry=10, txIsolation=3, parserCommentVersion=50148, sqlRecordCount=10, bufferPoolPageSize=2097152, bufferPoolChunkSize=4096, bufferPoolPageNumber=40, maxResultSet=524288, bigResultSizeSqlCount=10, bufferUsagePercent=80, flowControlRejectStrategy=0, clearBigSqLResultSetMapMs=600000, defaultMaxLimit=100, sequnceHandlerType=0, sqlInterceptor=io.mycat.server.interceptor.impl.DefaultSqlInterceptor, sqlInterceptorType=select, sqlInterceptorFile=/usr/local/mycat/logs/sql.txt, mutiNodeLimitType=0, mutiNodePatchSize=100, defaultSqlParser=druidparser, usingAIO=0, packetHeaderSize=4, maxPacketSize=16777216, mycatNodeId=1] (io.mycat.MycatServer:MycatServer.java:280)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,243 [INFO ][WrapperSimpleAppMain] useOffHeapForMerge = 1 (io.mycat.memory.MyCatMemory:MyCatMemory.java:53)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,243 [INFO ][WrapperSimpleAppMain] memoryPageSize = 1m (io.mycat.memory.MyCatMemory:MyCatMemory.java:54)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,243 [INFO ][WrapperSimpleAppMain] spillsFileBufferSize = 1k (io.mycat.memory.MyCatMemory:MyCatMemory.java:55)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,243 [INFO ][WrapperSimpleAppMain] useStreamOutput = 0 (io.mycat.memory.MyCatMemory:MyCatMemory.java:56)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,243 [INFO ][WrapperSimpleAppMain] systemReserveMemorySize = 384m (io.mycat.memory.MyCatMemory:MyCatMemory.java:57)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,249 [INFO ][WrapperSimpleAppMain] totalNetWorkBufferSize = 80MB (io.mycat.memory.MyCatMemory:MyCatMemory.java:58)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,250 [INFO ][WrapperSimpleAppMain] dataNodeSortedTempDir = /usr/local/mycat (io.mycat.memory.MyCatMemory:MyCatMemory.java:59)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,251 [INFO ][WrapperSimpleAppMain] mycat.memory.offHeap.size: 1321MB (io.mycat.memory.MyCatMemory:MyCatMemory.java:122)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,254 [INFO ][WrapperSimpleAppMain] using nio network handler (io.mycat.MycatServer:MycatServer.java:381)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,273 [INFO ][WrapperSimpleAppMain] $_MyCatManager is started and listening on 9066 (io.mycat.MycatServer:MycatServer.java:397)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,273 [INFO ][WrapperSimpleAppMain] $_MyCatServer is started and listening on 8066 (io.mycat.MycatServer:MycatServer.java:401)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,274 [INFO ][WrapperSimpleAppMain] =============================================== (io.mycat.MycatServer:MycatServer.java:403)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,274 [INFO ][WrapperSimpleAppMain] Initialize dataHost ... (io.mycat.MycatServer:MycatServer.java:407)
INFO | jvm 1 | 2019/10/30 15:08:40 | 2019-10-30 15:08:40,274 [INFO ][WrapperSimpleAppMain] init backend myqsl source ,create connections total 10 for server1 index :0 (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:294)
11、啓動失敗中的一種錯誤提示:
INFO | jvm 4 | 2019/10/30 13:51:15 | sun.management.AgentConfigurationError:
java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException:
LinuxCentOS6: LinuxCentOS6: Name or service not known
解決辦法:修改hosts文件,綁定主機名
,我的主機名爲LinuxCentOS6
(這裏要設置成自己的主機名):
[root@LinuxCentOS6 bin]# vim /etc/hosts
~
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.88 LinuxCentOS6 localhost localhost.localdomain localhost6 localhost6.localdomain6
~
~
~
:wq
[root@LinuxCentOS6 bin]#
重新啓動mycat服務,命令:./mycat start
查看MyCat進程,命令:ps -ef |grep mycat
12、測試連接MyCat:
linux連接MyCat操作,命令格式:mysql -u用戶名 -p密碼 -h主機地址 -P端口號 -D數據庫名稱
:
[root@LinuxCentOS6 logs]# mysql -uroot -p123456 -h192.168.10.88 -P8066 -Ddb_sszh_mycat
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.20-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [db_sszh_mycat]> select * from user;
+----+---------+
| id | name |
+----+---------+
| 2 | 張三 |
| 4 | 李四 |
| 6 | 王五 |
| 8 | 趙六 |
| 1 | A米 |
| 3 | T利 |
| 5 | 凱瑞 |
| 7 | 芥末 |
+----+---------+
8 rows in set (0.002 sec)
JDBC連接MyCat,連接字符串:jdbc:mysql://192.168.10.88:8066/db_sszh_mycat?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
Navicat連接工具連接MyCat,如圖所示:
主機192.168.10.88:3306
,Mysql物理數據庫db_sszh_01
數據庫數據:
主機192.168.10.88:3306
,Mysql物理數據庫db_sszh_02
數據庫數據:
主機192.168.10.88:8066
,MyCat邏輯庫db_sszh_mycat
數據庫數據:
注:以上內容僅提供參考和交流,請勿用於商業用途,如有侵權聯繫本人刪除!
持續更新中…
如有對思路不清晰或有更好的解決思路,歡迎與本人交流,QQ羣:273557553
你遇到的問題是小編創作靈感的來源!