Mycat+MySQL實現分表分庫實例

關於分庫分表,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
你遇到的問題是小編創作靈感的來源!


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