配置MySql主從數據庫,MyCat分庫分表,讀寫分離中間件(純乾貨,無美圖)

先點贊,後觀看,伸手纔有好習慣

  • 基於Java環境開發
  • 主要配置文件 schema.xml(邏輯數據庫)、rule.xml(分片規則)、server.xml(一些系統和用戶)

理解:Mycat做爲一個邏輯數據庫,是須要依賴下面的真實數據庫vue

配置主從

  • 坑點及建議:
    一、由於關注點在主從,別花太多時間在一臺單機安裝mysql兩個端口,可嘗試虛擬機兩臺
    二、mysql5.7跟以前的版本不同,windows上面測試的朋友my.ini能夠本身新建
    三、對於my.ini的各個參數的解釋請隨機去百度,這裏有個人轉載node

  • 實操
    假設如今兩臺數據庫的mysql均已正常安裝,配置以下mysql

服務器 IP 帳號 密碼
A AUSER APWD
B BUSER BPWD

通常進my.ini只須要更新如下所給信息(有則改之無則加):web

主庫配置及步驟

[mysqld]
#binlog格式,分三種:statement level,rowlevel,mixed
#三種模式的差異介紹能夠看:https://juejin.im/post/5df32b2a6fb9a01628012fb3
binlog_format=mixed
#爲服務器標識,主從必定不要同樣 
server-id   = 1
#清理二進制日誌的時間間隔
expire_logs_days = 10
#是須要同步的數據庫 
binlog-do-db
#不須要同步的數據庫
binlog-ignore-db = mysql                
binlog-ignore-db = test  

#設置gtid同步方式
gtid_executed_compression_period = 1000 #1000默認
gtid_mode = on #默認off
enforce_gtid_consistency = on #默認off
複製代碼

一、鏈接主庫,並進入mysqlsql

>mysql -u數據庫用戶名 -p數據庫密碼
複製代碼

二、爲從庫建立受權用戶slave,密碼slave ,B爲對應的IPmongodb

grant replication slave on *.* to 'slave'@'B' identified by 'slave' ;
複製代碼

三、刷新權限信息數據庫

flush privileges;
複製代碼

四、自行建立數據庫和數據表並插入相應數據,mysql默認InnoDB,主庫能夠不用修改引擎express

從庫配置及步驟

my.ini文件apache

[mysqld]
#binlog格式,分三種:statement level,rowlevel,mixed
#三種模式的差異介紹能夠看:
binlog_format=mixed
#爲服務器標識,主從必定不要同樣 
server-id   = 13
#清理二進制日誌的時間間隔
expire_logs_days = 10
#是須要同步的數據庫 
binlog-do-db
#設置gtid同步方式
gtid_executed_compression_period = 1000 #1000默認
gtid_mode = on #默認off
enforce_gtid_consistency = on #默認off
複製代碼

一、鏈接從庫,並進入mysqlwindows

>mysql -u數據庫用戶名 -p數據庫密碼
複製代碼

二、複製一份主庫的數據庫到從庫,並賦予slave權限

grant all privileges on *.* to 'slave'@'%' identified by 'slave' with grant option;
複製代碼

三、刷新權限或者退出mysql命令行重啓mysql服務

四、master創建數據同步

change master to master_host='A',master_user='slave',master_password='slave',master_auto_position=1;
複製代碼

重要說明:部分教程用的master_log_file & master_log_pos 參數來指定,可是slave一旦出現問題,沒法確認斷節點,數據容易形成不一致,因此才引入gtid(即global transaction ID全局事務ID),想看相應介紹的能夠去mysql官網裏面搜尋相應的版本而後看看.

五、mysql命令查看從庫數據庫狀態

mysql>show slave status \G;
複製代碼

當顯示的數據內有:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
就說明能夠了

六、自行驗證主庫更新數據對從庫的影響

Mycat

mycat架構圖

avatar

MyCat簡介

簡介個毛線,[MyCat官網](http://mycat.io/)那麼詳細的介紹不看,非要聽我在這摘錄?
複製代碼

環境安裝

因爲Mycat是基於Java開發的,因此JDK環境先安裝好,再去安裝Mycat,安裝教程一大把,我就不贅述了

實現過程

一、爲簡單明瞭的看清配置信息,會刪除不影響結果的註釋,且本記錄只針對一個主庫和一個從庫,分庫分表只須要加對應的配置便可,配置文件中有相應的詳細說明
二、能夠進入mysql把從庫的引擎改爲MyISAM,若是不想從庫有寫的功能,也能夠將mysql設置成只讀數據庫

schema.xml 配置信息(完整的配置信息及解釋在文末):
主要是配置讀寫數據庫信息和對應表信息

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<!-- 每個schema表明一個邏輯數據庫 
	    這裏的name是程序端使用的數據庫名稱,對應的數據庫帳號密碼在server.xml中
	-->
	<schema name="MycatDemo" checkSQLschema="true" sqlMaxLimit="100">
		<!--  auto sharding by id (long)
			每一個邏輯數據庫下面對應的是全部的表,下方RDB表明真實數據庫
			name:對應RDB中的表名
			primaryKey:RDB中該表的主鍵
			dataNode:這些表對應的數據庫
			rule:對應的分片規則
		-->
		<table name="article" primaryKey="article_id" autoIncrement="true" dataNode="dn1"
			   rule="mod-long" />
	</schema>
	
	<!-- 各個數據結點的信息,便於上方schema使用 

	若是是多個數據結點和多個host,那就同步複製一份dataNode和dataHost數據,而後寫上對應的配置信息
		name:結點的名稱
		dataHost:結點的主機地址
		database:RDB數據庫名稱
	-->
	<dataNode name="dn1" dataHost="localhost1" database="demo" />
	
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<!-- 心跳語句檢測,檢測對應的mysql是否正常運行 -->
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="11.11.11.11:3306" user="root"
				   password="root">
			<!-- can have multi read hosts -->
			<readHost host="hostS2" url="22.22.22.22:3306" user="root" password="root" />
		</writeHost>
		<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
	</dataHost>
	
</mycat:schema>

複製代碼

rule.xml 配置信息(完整的配置信息及解釋在文末): 主要定義一些分片規則和生成規則之類的

這裏尤爲要注意一點,有個叫mod-long的function在schema.xml中引用到了,可是我只作了一分數據庫,因此這裏我把默認的3改爲了1,若是你有對應的多個數據庫分表,則改爲相應的數量。

<?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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="rule1">
		<rule>
			<columns>id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="rule2">
		<rule>
			<columns>user_id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="sharding-by-intfile">
		<rule>
			<columns>sharding_id</columns>
			<algorithm>hash-int</algorithm>
		</rule>
	</tableRule>
	<tableRule name="auto-sharding-long">
		<rule>
			<columns>id</columns>
			<algorithm>rang-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="mod-long">
		<rule>
			<columns>article_id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-murmur">
		<rule>
			<columns>id</columns>
			<algorithm>murmur</algorithm>
		</rule>
	</tableRule>
	<tableRule name="crc32slot">
		<rule>
			<columns>id</columns>
			<algorithm>crc32slot</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-month">
		<rule>
			<columns>create_time</columns>
			<algorithm>partbymonth</algorithm>
		</rule>
	</tableRule>
	<tableRule name="latest-month-calldate">
		<rule>
			<columns>calldate</columns>
			<algorithm>latestMonth</algorithm>
		</rule>
	</tableRule>
	
	<tableRule name="auto-sharding-rang-mod">
		<rule>
			<columns>id</columns>
			<algorithm>rang-mod</algorithm>
		</rule>
	</tableRule>
	
	<tableRule name="jch">
		<rule>
			<columns>id</columns>
			<algorithm>jump-consistent-hash</algorithm>
		</rule>
	</tableRule>

	<function name="murmur"
		class="io.mycat.route.function.PartitionByMurmurHash">
		<property name="seed">0</property><!-- 默認是0 -->
		<property name="count">1</property><!-- 要分片的數據庫節點數量,必須指定,不然無法分片 -->
		<property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射爲這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 -->
		<!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引爲key,以節點權重值爲值。全部權重值必須是正整數,不然以1代替 -->
		<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
			用於測試時觀察各物理節點與虛擬節點的分佈狀況,若是指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,若是不指定,就不會輸出任何東西 -->
	</function>

	<function name="crc32slot"
			  class="io.mycat.route.function.PartitionByCRC32PreSlot">
		<property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,不然無法分片 -->
	</function>
	<function name="hash-int"
		class="io.mycat.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
	</function>
	<function name="rang-long"
		class="io.mycat.route.function.AutoPartitionByLong">
		<property name="mapFile">autopartition-long.txt</property>
	</function>
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">1</property><!-- 只有一個數據庫我改爲了1,默認3 -->
	</function>

	<function name="func1" class="io.mycat.route.function.PartitionByLong">
		<property name="partitionCount">8</property>
		<property name="partitionLength">128</property>
	</function>
	<function name="latestMonth"
		class="io.mycat.route.function.LatestMonthPartion">
		<property name="splitOneDay">24</property>
	</function>
	<function name="partbymonth"
		class="io.mycat.route.function.PartitionByMonth">
		<property name="dateFormat">yyyy-MM-dd</property>
		<property name="sBeginDate">2015-01-01</property>
	</function>
	
	<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
        	<property name="mapFile">partition-range-mod.txt</property>
	</function>
	
	<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
		<property name="totalBuckets">3</property>
	</function>
</mycat:rule>

複製代碼

server.xml 配置信息(完整的配置信息及解釋在文末):
主要定義sql服務相關的參數,例如帳號密碼,sql事務及最大文本

<?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>
	-->
	<!-- 至關於Mycat邏輯數據庫的管理員帳號 數據庫名跟schema.xml中定義的保持一致-->
	<user name="mycatuser">
		<property name="password">mycatpwd</property>
		<property name="schemas">MycatDemo</property>
		<property name="defaultAccount">true</property>
		<!-- 表級 DML 權限設置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>
	<!-- 至關於Mycat邏輯數據庫的只讀帳號 數據庫名跟schema.xml中定義的保持一致-->
	<user name="user">
		<property name="password">user</property>
		<property name="schemas">MycatDemo</property>
		<property name="readOnly">true</property>
	</user>

</mycat:server>

複製代碼

程序中鏈接數據庫的時候就再也不是單純的mysql的鏈接和帳號密碼了,而是上面定義的:
數據庫名:MycatDemo(schema.xml中)
帳號:mycatuser(server.xml中)
密碼:mycatpwd(server.xml中)

驗證讀寫分離

進入mysql命令行,開啓主從兩個數據庫的sql日誌,經過sql日誌執行的狀況就能判斷讀寫使用的哪一個庫

#查看日期狀況

mysql>show variables like '%general%';
複製代碼

#開啓日誌

mysql>SET GLOBAL general_log = 'On';
複製代碼

#指定日誌文件

mysql>SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';
複製代碼

Mycat性能監控

mycat有性能監控的WEB管理端軟件,有須要的自行下載安裝

配置文件說明

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="nonePasswordLogin">0</property> <!-- 0爲須要密碼登錄、1爲不須要密碼登錄 ,默認爲0,設置爲1則須要指定默認帳戶-->
	<property name="useHandshakeV10">1</property>
	<property name="useSqlStat">0</property>  <!-- 1爲開啓實時統計、0爲關閉 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->

	<property name="sequnceHandlerType">2</property> <!--0 本地文件方式  1 數據庫方式  2 時間戳方式-->
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查詢中存在關聯查詢的狀況下,檢查關聯字段中是否有分片字段 .默認 false -->
      <!--  <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 | type 2 NettyBufferPool -->
		<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">64k</property>

		<!--
			單位爲k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			單位爲m
		-->
		<property name="systemReserveMemorySize">384m</property>


		<!--是否採用zookeeper協調切換  -->
		<property name="useZKSwitch">false</property>

		<!-- XA Recovery Log日誌路徑 -->
		<!--<property name="XARecoveryLogBaseDir">./</property>-->

		<!-- XA Recovery Log日誌名稱 -->
		<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
		<!--若是爲 true的話 嚴格遵照隔離級別,不會在僅僅只有select語句的時候在事務中切換鏈接-->
		<property name="strictTxIsolation">false</property>
		
		<property name="useZKSwitch">true</property>
		
	</system>
	
	<!-- 全局SQL防火牆設置 -->
	<!--白名單可使用通配符%或着*-->
	<!--例如<host host="127.0.0.*" user="root"/>-->
	<!--例如<host host="127.0.*" user="root"/>-->
	<!--例如<host host="127.*" user="root"/>-->
	<!--例如<host host="1*7.*" user="root"/>-->
	<!--這些配置狀況下對於127.0.0.1都能以root帳戶登陸-->
	<!--
	<firewall>
	   <whitehost>
	      <host host="1*7.0.0.*" user="root"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	-->

	<!--用戶名是mycat-->
	<user name="mycat" defaultAccount="true">
		<!--密碼是123456-->
		<property name="password">123456</property>
		<!---可訪問的邏輯庫有mycatdb-->
		<property name="schemas">mycatdb</property>
		
		<!-- 表級 DML 權限設置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">mycatdb</property>
		<!--是否只讀-->
		<property name="readOnly">true</property>
	</user>

</mycat:server>

複製代碼

schema.xml文件說明

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<!-- checkSQLschema這個屬性默認就是false,官方文檔的意思就是是否去掉表前面的數據庫的名稱,
	」select * from db1.testtable」 ,設置爲true就會去掉db1。可是若是db1的名稱不是schema的名稱,那麼也不會被去掉,
	所以官方建議不要使用這種語法。同時默認設置爲false。-->
	
    <!-- sqlMaxLimit當該值設置爲某個數值時。每條執行的 SQL 語句,若是沒有加上 limit 語句,MyCat 也會自動的加上所對應的值。
	例如設置值爲 100,執行」select * from test_table」,則效果爲「selelct * from test_table limit 100」.
	注意:若是運行的 schema 爲非拆分庫的,那麼該屬性不會生效。-->
	<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">
	
	    <!-- name	該屬性定義邏輯表的表名 -->
		<!-- dataNode	該屬性定義這個邏輯表所屬的 dataNode, 該屬性的值須要和 dataNode 標籤中 name 屬性的值相互對應。 -->
		<!-- rule	該屬性用於指定邏輯表要使用的規則名字,規則名字在 rule.xml 中定義,必須與 tableRule 標籤中 name 屬性屬性值一一對應 -->
		<!-- ruleRequired	該屬性用於指定表是否綁定分片規則,若是配置爲 true,但沒有配置具體 rule 的話 ,程序會報錯。 -->
		<!-- primaryKey	該邏輯表對應真實表的主鍵, -->
		<!-- type	該屬性定義了邏輯表的類型,目前邏輯表只有「全局表」和」普通表」兩種類型。全局表定義type=」global」,不定義的就是普通表。 -->
		<!-- autoIncrement	主鍵是否自增加。 -->
		<!-- subTables	分表,分表目前不支持Join。 -->
		<!-- needAddLimit是否自動添加limit,默認是開啓狀態。關閉請謹慎。 -->
		
		<!--rule="mod-long"  指定規則在rule中配置-->
		<table name="users" primaryKey="id" dataNode="dn1"/>
		<table name="orders" primaryKey="id" dataNode="dn1"/>
		
		
		<table name="product" primaryKey="id" dataNode="dn2"/>
		<table name="news" primaryKey="id" dataNode="dn2"/>
		

	</schema>

	<!--  Name	定義數據節點的名字,這個名字須要是惟一的-->
    <!-- dataHost	該屬性用於定義該分片屬於哪一個數據庫實例 -->
	<!-- Database	該屬性用於定義該分片屬性哪一個具體數據庫實例上的具體庫 -->
	<dataNode name="dn1" dataHost="localhost1" database="sharding1" />
	<dataNode name="dn2" dataHost="localhost2" database="sharding2" />

	<!--  name	惟一標識 dataHost 標籤,供上層的標籤使用-->
    <!-- maxCon	指定每一個讀寫實例鏈接池的最大鏈接。 -->
	<!-- minCon	指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小。 -->
	<!-- balance	負載均衡類型,目前的取值有4 種: 
	「0」, 不開啓讀寫分離機制,全部讀操做都發送到當前可用的 writeHost 上。 
	「1」,所有的 readHost 與 stand by writeHost(非主非從) 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,而且 M1 與 M2 互爲主備),正常狀況下,M2,S1,S2 都參與 select 語句的負載均衡。
	」2」,全部讀操做都隨機的在 writeHost、readhost 上分發。
	」3」,全部讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓writeType 1. writeType=」0」, 全部寫操做發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .2. writeType=」1」,全部寫操做都隨機的發送到配置的 writeHost,1.5 之後廢棄不推薦。默認0就行了!-->
    <!-- dbType	指定後端鏈接的數據庫類型,目前支持二進制的 mysql 協議,還有其餘使用 JDBC 鏈接的數據庫。例如:mongodb、oracle、spark 等. -->
	<!-- dbDriver	指定鏈接後端數據庫使用的 Driver,目前可選的值有 native 和 JDBC。使用 native 的話,由於這個值執行的是二進制的 mysql 協議,因此可使用 mysql 和 maridb。其餘類型的數據庫則須要使用 JDBC 驅動來支持。 -->
	<!-- switchType	「-1」 表示不自動切換; 「1」 默認值,自動切換; 
					「2」 基於 MySQL 主從同步的狀態決定是否切換心跳語句爲 show slave status; 
					「3」 基於 MySQL galary cluster 的切換機制(適合集羣)(1.4.1)心跳語句爲 show status like ‘wsrep%’.					
	-->
	<!--slaveThreshold:指定從節點的最大個數-->
   

	<dataHost name="localhost1" 
			  maxCon="1000" 
			  minCon="10" 
			  balance="0"
			  writeType="0" 
			  dbType="mysql" 
			  dbDriver="native" 
			  switchType="1"  
			  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		
		<!--host	用於標識不一樣實例,通常 writeHost 咱們使用*M1,readHost 咱們用*S1。-->
		<!--url	後端實例鏈接地址。Native:地址:端口 JDBC:jdbc的url-->
		<!--password	後端存儲實例須要的密碼-->
		<!--user	後端存儲實例須要的用戶名字-->
		<!--weight	權重 配置在 readhost 中做爲讀節點的權重-->
		<!--usingDecrypt	是否對密碼加密,默認0。具體加密方法看官方文檔。-->
		<writeHost host="hostM1" url="47.94.158.155:3306" user="root"
				   password="TJXtjx_19991007">
		</writeHost>
	</dataHost>
	
	
	<dataHost name="localhost2" 
			  maxCon="1000" 
			  minCon="10" 
			  balance="0"
			  writeType="0" 
			  dbType="mysql" 
			  dbDriver="native" 
			  switchType="1"  
			  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM2" url="47.94.158.155:3306" user="root"
				   password="TJXtjx_19991007">
		</writeHost>
	</dataHost>

</mycat:schema>
複製代碼

rule.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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="rule1">
		<rule>
			<columns>id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="rule2">
		<rule>
			<columns>user_id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="sharding-by-intfile">
		<rule>
			<columns>sharding_id</columns>
			<algorithm>hash-int</algorithm>
		</rule>
	</tableRule>
	<tableRule name="auto-sharding-long">
		<rule>
			<columns>id</columns>
			<algorithm>rang-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-murmur">
		<rule>
			<columns>id</columns>
			<algorithm>murmur</algorithm>
		</rule>
	</tableRule>
	<tableRule name="crc32slot">
		<rule>
			<columns>id</columns>
			<algorithm>crc32slot</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-month">
		<rule>
			<columns>create_time</columns>
			<algorithm>partbymonth</algorithm>
		</rule>
	</tableRule>
	<tableRule name="latest-month-calldate">
		<rule>
			<columns>calldate</columns>
			<algorithm>latestMonth</algorithm>
		</rule>
	</tableRule>
	
	<tableRule name="auto-sharding-rang-mod">
		<rule>
			<columns>id</columns>
			<algorithm>rang-mod</algorithm>
		</rule>
	</tableRule>
	
	<tableRule name="jch">
		<rule>
			<columns>id</columns>
			<algorithm>jump-consistent-hash</algorithm>
		</rule>
	</tableRule>

	<function name="murmur"
		class="io.mycat.route.function.PartitionByMurmurHash">
		<property name="seed">0</property><!-- 默認是0 -->
		<property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,不然無法分片 -->
		<property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射爲這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 -->
		<!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引爲key,以節點權重值爲值。全部權重值必須是正整數,不然以1代替 -->
		<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
			用於測試時觀察各物理節點與虛擬節點的分佈狀況,若是指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,若是不指定,就不會輸出任何東西 -->
	</function>

	<function name="crc32slot"
			  class="io.mycat.route.function.PartitionByCRC32PreSlot">
	</function>
	<function name="hash-int"
		class="io.mycat.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
	</function>
	<function name="rang-long"
		class="io.mycat.route.function.AutoPartitionByLong">
		<property name="mapFile">autopartition-long.txt</property>
	</function>
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">3</property>
	</function>

	<function name="func1" class="io.mycat.route.function.PartitionByLong">
		<property name="partitionCount">8</property>
		<property name="partitionLength">128</property>
	</function>
	<function name="latestMonth"
		class="io.mycat.route.function.LatestMonthPartion">
		<property name="splitOneDay">24</property>
	</function>
	<function name="partbymonth"
		class="io.mycat.route.function.PartitionByMonth">
		<property name="dateFormat">yyyy-MM-dd</property>
		<property name="sBeginDate">2015-01-01</property>
	</function>
	
	<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
        	<property name="mapFile">partition-range-mod.txt</property>
	</function>
	
	<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
		<property name="totalBuckets">3</property>
	</function>
</mycat:rule>

複製代碼
相關文章
相關標籤/搜索