1. 程式人生 > >Mycat實現 分庫分表+讀寫分離(基於主從配置)

Mycat實現 分庫分表+讀寫分離(基於主從配置)

前兩篇文章分別講解了分庫分表 和主從配置

下面來介紹 分庫分表+讀寫分離(基於主從配置)

簡單的架構圖:

配置:

cd進入到mycat的conf目錄下 檢視 server.xml  rule.xml  schema.xml 三個配置檔案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">1</property>  
	<property name="useGlobleTableCheck">0</property>  
		<property name="sequnceHandlerType">2</property>
		<property name="processorBufferPoolType">0</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>

	<user name="root">
		<property name="password">123456</property>
		<property name="schemas">m2</property>			
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">m2</property>
		<property name="readOnly">true</property>
	</user>

</mycat:server>
rule.xml   為了配合測試 新增了根據hash分片規則
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	
	<tableRule name="sharding-by-murmur"> 
		<rule> 
			<columns>order_id</columns>
			<algorithm>murmur</algorithm>
		</rule> 
		</tableRule> 
	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</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 倍--> 
	</function>
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">2</property>
	</function>
	
</mycat:rule>
schema.xml  新增加了一張order表
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<!-- 設定表的儲存方式.schema name="TESTDB" 與 server.xml中的 TESTDB 設定一致  -->  
    <schema name="m2" checkSQLschema="false" sqlMaxLimit="100">  
		<table name="users" primaryKey="id"  dataNode="node_db01,node_db02" rule="mod-long" />
        <table name="order" primaryKey="id"  dataNode="node_db01,node_db02" rule="sharding-by-murmur"/>  
    </schema>  

    <!-- 設定dataNode 對應的資料庫,及 mycat 連線的地址dataHost -->  
    <dataNode name="node_db01" dataHost="dataHost01" database="m2" />  
    <dataNode name="node_db02" dataHost="dataHost02" database="m2" />  
    

    <!-- mycat 邏輯主機dataHost對應的物理主機.其中也設定對應的mysql登陸資訊 -->  
    <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="3"
		writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="m1" url="127.0.0.1:3310" user="root"
		password="123456">
		<readHost host="m2" url="127.0.0.1:3311" user="root"
		  password="123456"/>
		</writeHost>
	</dataHost>
	<dataHost name="dataHost02" maxCon="1000" minCon="10" balance="3"
		writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="s1" url="127.0.0.1:3312" user="root"
		password="123456">
		<readHost host="s2" url="127.0.0.1:3313" user="root"
		  password="123456"/>
		</writeHost>
    </dataHost>


</mycat:schema>
這裡提一點  比較前面分庫分表的配置  我們這裡改動的配置又以下幾點:1.新增一張按照hash分片的order表
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
  `id` int(11) NOT NULL,
  `order_id` varchar(64) DEFAULT NULL,
  `name` varchar(64) DEFAULT NULL,
  `price` decimal(10,0) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.為了實現分庫分表+讀寫分離  配置了倆個dataHost節點   節點中均有writeHost和readHost節點配置讀路徑與寫路徑3.balance屬性改為了3  
負載均衡型別,目前的取值有 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沒有。 
4。switchType屬性改為了 -1(自己選擇哦)
 -1 表示不自動切換 
1  預設值,自動切換 
2  基於MySQL主從同步的狀態決定是否切換 
        心跳語句為 show slave status 
3  基於MySQL galary cluster的切換機制(適合叢集)(1.4.1) 
        心跳語句為 show status like ‘wsrep%’. 
到此,mycat配置已經完了   使用cmd進入bin目錄  執行startup_nowrap.bat 

測試

首先將conf目錄下的log4j2.xml中level級別改為debug 方便檢視sql執行的節點1.使用mavicat連線mycat2.插入兩條資料
INSERT INTO `order`(id,order_id,name,price) VALUES(1,'123abc','木頭',13.1)
INSERT INTO `order`(id,order_id,name,price) VALUES(3,'321efd','木頭',13.1)
我們檢視 debug資訊

我們可以看到分庫分表是沒有問題的 寫入的節點都是我們定義好的wirteHost查詢
SELECT * FROM `order`;
我們可以看到 查詢的時候 走的是我們定義的readHost中的節點  如此  大功告成!!!