mycat之配置詳解

1.mycat簡介和目錄結構

--Mycat是什麼

  Mycat 是開源的分佈式數據庫中間件,基於阿里的cobar的開源框架之上。它處於數據庫服務與應用服務之間。它是進行數據處理與整合的中間服務。通俗點講,應用層可以將它看作是一個數據庫的代理(或者直接看成加強版數據庫)。

--在架構中的位置

 

--Mycat目錄結構

 

 

 bin 程序目錄:存放了 window 版本和 linux 版本可執行文件./mycat {start|restart|stop|status…}

conf 目錄下存放配置文件:

  ---server.xml 是 Mycat 服務器參數調整和用戶授權的配置文件

  ---schema.xml 是邏輯庫定義和表

  ---rule.xml 是分片規則的配置文件,分片規則的具體一些參數信息單獨存放爲文件,也在這個目錄下

  ---log4j2.xml配置logs目錄日誌輸出規則

  ---wrapper.conf JVM相關參數調整

lib 目錄:主要存放 mycat 依賴的一些 jar 文件

logs目錄:存放日誌文件

2.Mycat配置文件詳解

--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="db_store" checkSQLschema="false" sqlMaxLimit="100">
		<table name="store" dataNode="db_store_dataNode" primaryKey="storeID"/>
		<table name="employee" dataNode="db_store_dataNode" primaryKey="employeeID"/>
	</schema>
	  <!-- name   該屬性定義邏輯表的表名 -->
        <!-- dataNode   該屬性定義這個邏輯表所屬的 dataNode, 該屬性的值需要和 dataNode 標籤中 name 屬性的值相互對應。 -->
        <!-- rule   該屬性用於指定邏輯表要使用的規則名字,規則名字在 rule.xml 中定義,必須與 tableRule 標籤中 name 屬性屬性值一一對應 -->
        <!-- ruleRequired   該屬性用於指定表是否綁定分片規則,如果配置爲 true,但沒有配置具體 rule 的話 ,程序會報錯。 -->
        <!-- primaryKey 該邏輯表對應真實表的主鍵, -->
        <!-- type   該屬性定義了邏輯表的類型,目前邏輯表只有“全局表”和”普通表”兩種類型。全局表定義type=”global”,不定義的就是普通表。 -->
        <!-- autoIncrement  主鍵是否自增長。 -->
        <!-- subTables  分表,分表目前不支持Join。 -->
        <!-- needAddLimit是否自動添加limit,默認是開啓狀態。關閉請謹慎。 -->
	<schema name="db_user" checkSQLschema="false" sqlMaxLimit="100">
		<table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>
		<table name="users" dataNode="db_user_dataNode$1-2"  rule="mod-userID-long" primaryKey="userID">
			<childTable name="user_address"  joinKey="userID" parentKey="userID" primaryKey="addressID"/>
		</table>
	</schema>
	
	
	<!-- 節點配置 -->
	 <!--  Name  定義數據節點的名字,這個名字需要是唯一的-->
    <!-- dataHost   該屬性用於定義該分片屬於哪個數據庫實例 -->
    <!-- Database   該屬性用於定義該分片屬性哪個具體數據庫實例上的具體庫 -->
	<!-- db_store -->
	<dataNode name="db_store_dataNode" dataHost="db_storeHOST" database="db_store" />
	
	<!-- db_user -->
	<dataNode name="db_user_dataNode1" dataHost="db_userHOST1" database="db_user" />
	<dataNode name="db_user_dataNode2" dataHost="db_userHOST2" database="db_user" />
	
	
	<!-- 節點主機配置 -->
	
	 <!--  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:指定從節點的最大個數-->
    
	<!-- 配置db_store的節點主機 -->
	<dataHost name="db_storeHOST" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="47.110.42.138:3306" user="root"  password="root123">
			<!-- can have multi read hosts -->
			<readHost host="hostS1" url="127.0.0.1:3306 " user="root" password="root" />
		
		</writeHost>
	</dataHost>
	
	<!-- 配置db_user的節點主機 -->
	<dataHost name="db_userHOST1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="userHost1" url="127.0.0.1:3306" user="root"  password="root">
		</writeHost>
	</dataHost>
	
	<dataHost name="db_userHOST2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="userHost2" url="47.110.42.138:3306" user="root"  password="root123">
		</writeHost>
	</dataHost>
	
</mycat:schema>

--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">0</property>  <!-- 1爲開啓實時統計、0爲關閉 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->
    <property name="nonePasswordLogin">0</property> <!-- 0爲需要密碼登陸、1爲不需要密碼登陸 ,默認爲0,設置爲1則需要指定默認賬戶-->
	<property name="sequnceHandlerType">2</property> <!--0 本地文件方式  1 數據庫方式  2 時間戳方式-->
	<!-- 子查詢中存在關聯查詢的情況下,檢查關聯字段中是否有分片字段 .默認 false -->
	<property name="subqueryRelationshipCheck">false</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">false</property>
        <!-- XA Recovery Log日誌路徑 -->
        <!--<property name="XARecoveryLogBaseDir">./</property>-->

        <!-- XA Recovery Log日誌名稱 -->
        <!--<property name="XARecoveryLogBaseName">tmlog</property>-->
        <!--如果爲 true的話 嚴格遵守隔離級別,不會在僅僅只有select語句的時候在事務中切換連接-->
        <property name="strictTxIsolation">false</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="127.0.0.1" user="mycat"/>
	      <host host="127.0.0.2" user="mycat"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	-->
	
	<user name="root">
		<property name="password">123456</property>
		<property name="schemas">db_store,db_user</property>
		<!--是否只讀-->
        <property name="readOnly">false</property>
		<!-- 表級 DML 權限設置 -->
		<!-- 		
		<privileges check="false">
			<schema name="db_user" dml="0110" >
				<table name="users" dml="1111"></table>  IUSD
				<table name="useraddres" dml="1110"></table>
			</schema>
		</privileges>		
		 -->
	</user>

</mycat:server>

--rule.xml 

後面再開一篇單獨介紹。

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