1. 程式人生 > >Mycat安裝和配置檔案

Mycat安裝和配置檔案

Mycat安裝需要JDK;

    官網下載然後解壓:http://www.mycat.io/   (備註Mycat庫:http://dl.mycat.io/)

    啟動和關閉Mycat命令:

        在bin目錄下輸入命令:  ./mycat start 和 ./mycat stop

配置:(個人理解一些重要的配置檔案)

Mycat目錄格式參照常見格式(bin/conf/logs/lib)

server.xml: Mycat伺服器引數調整和使用者授權

schema.xml:邏輯庫定義和表以及分片定義的配置檔案(設定邏輯庫,表,資料節點資訊)

rule.xml:分片規則的配置檔案,分片規則的具體一些引數資訊單獨存放為檔案

日誌檔案:日誌存放在logs/log,每天一個檔案,日子的配置是在conf/log4j.xml中,可以根據需要調整輸出級別(建議debug,可以輸出更多資訊)

三.Mycat使用:(配置檔案解析)

3.1 server.xml:

3.1.1 <system>標籤:

配置所有mycat引數設定(解析器,埠(預設8066)等),使用<property>標籤配置

注意:q開頭被劃掉的為個人解讀版,待驗證

<system>
        <property name="nonePasswordLogin">0</property> <!-- 0為需要密碼登陸、1為不需要密碼登陸 ,預設為0-->
	<property name="useHandshakeV10">1</property><!-- q:傳送握手資料包 -->
	<property name="useSqlStat">0</property>  <!-- 1為開啟實時統計、0為關閉 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1為開啟全加班一致性檢測、0為關閉 -->
	<property name="sequnceHandlerType">2</property><!--q:"0"表示使用本地檔案的方式配置mycat全域性序列號,對應sequence_conf.properties檔案;"1"表示使用資料庫表的方式配置mycat全域性序列號-->
    <!--  <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> -->
	<property name="processorBufferPoolType">0</property>
    <!--預設為type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool-->		
	<!--預設是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> 
		<!-- 指定連線的空閒超時時間預設30分鐘,配置時,資料來源超時時間要小於 mycat的空閒超時時間-->
		<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">true</property>
	<!-- XA Recovery Log日誌路徑 -->
	<!--<property name="XARecoveryLogBaseDir">./</property>-->
	<!-- XA Recovery Log日誌名稱 -->
	<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
	<!-- 其他屬性:
		charset :連線的初始化字符集,預設utf8
		txlsolation:前端連線的初始化事務隔離級別,預設是和mysql的repeated_read可重複讀隔離級別一致
		sqlExecuteTimeout:sql執行超時時間,預設是300秒
	-->
</system>

3.1.2<user>

配置使用者引數

        <user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</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>

3.1.3其他標籤

防火牆:

<!-- 全域性SQL防火牆設定 -->
	<!--白名單可以使用萬用字元%或著*-->
<!--
	<firewall>
	   <whitehost>
	      <host host="1*7.0.0.*" user="root"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
-->
3.2 schema.xml

3.2.1 <schema>標籤

    邏輯庫配置,可以有多個;如果不配置該標籤,所有表的配置都會屬於一個預設的邏輯庫.

    <shceme>屬性:

        name屬性:定義邏輯庫名,需要跟server.xml中的引用對應

    checkSQLschema屬性:當該值設定為true時,執行SQL語句時,Mycat會去掉schema的字元(eg:"select * from TTESTDB.travelrecord"會被Mycat修改成"select * from travelrecord"),當SQL語句沒有schema指定的名字,則不會更改SQL語句, 如果將存在schema字元的sql語句發往資料庫會報"(ERROR 1146 (42S02): Table 'testdb.travelrecord' doesn’t exist)."錯誤

        sqlMaxLimit屬性:設定每天sql語句自動加上limit屬性

        dataNode屬性:繫結邏輯庫到某個具體的dataNode上,如果定義了這個屬性,這個邏輯庫就不能工作在分庫分表模式下,這個邏輯庫的所有操作都會直接作用到繫結的dataNode上,這個schema就可以用作讀寫分離和主從切換,可以直接方法,注意該屬性只能配置一個databas

     子標籤<table>標籤:定義邏輯表,所有需要拆分的表都必須在這個標籤下定義.

    <table>屬性:

            name屬性:邏輯表表名,同一個schema標籤中table標籤name屬性唯一;

            dataNode屬性:定義這個邏輯表所屬的dataNode,跟後面dataNode標籤name屬性對應(多個對應時可以使用如下方式);

  1. <table name="testdb" dataNode="dn$0-2,multipleDn2$100-199" rule="auto-sharding- long"></table>
  1. <dataNode name="dn" dataHost="localhost1" database="db$0-99"></dataNode>
  2. <dataNode name="dn2" dataHost="localhost1" database=" db$0-99"></dataNode>

            rule屬性:指定邏輯表使用的規則名,需要在rule.xml中有對應<tableRule>標籤.

            ruleRequired屬性:指定是否繫結分片規則,為true時必須配置具體rule.

            primaryKey屬性標記了邏輯表對應真實表的主鍵(例如:分片的規則是使用非主鍵進行分片的,那麼在使用主鍵查詢的時候,就會發送查詢語句到所有配置的DN上,如果使用該屬性配置真實表的主鍵,那麼mycat會快取主鍵與具體DN的資訊,那麼再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接傳送語句給具體的DN,但是儘管配置該屬性,如果快取並沒有命中的話,還是會發送語句給具體的DN 來獲取資料)

            type屬性: 定義邏輯表型別,global(全域性表)&無(普通表)

            autoIncrement屬性mysql對非自增長主鍵,使用last_insert_id() 是不會返回結果的,只會返回0.所以,只有定義了自增長主鍵的表,才可以用last_insert_id()返回主鍵值。 mycat提供了自增長主鍵功能,但是對應的mysql節點上資料表,沒有auto_increment,那麼在mycat層呼叫last_insert_id()也是不會返回結果的。如果使用這個功能,最好配合使用資料庫模式的全域性序列。

            needAddLimit屬性:指定表是否需要自動給sql語句加上limit,這個屬性預設為true,預設100條,可以設定false關閉這個功能

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<!-- auto sharding by id (long) -->
		<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />


		<!-- global table is auto cloned to all defined data nodes ,so can join
			with any table whose sharding node is in the same data node -->
		<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
		<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
		<!-- random sharding using mod sharind rule -->
		<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
			   rule="mod-long" />
		<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
			needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
			rule="mod-long" /> -->
		<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
			   rule="sharding-by-intfile" />
		<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
			   rule="sharding-by-intfile">
			<childTable name="orders" primaryKey="ID" joinKey="customer_id"
						parentKey="id">
				<childTable name="order_items" joinKey="order_id"
							parentKey="id" />
			</childTable>
			<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
						parentKey="id" />
		</table>
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
			/> -->
</schema>

<ChildTable>標籤:  childTable標籤用於定義E-R分片的子表。通過標籤上的屬性與父表進行關聯。

    joinKey屬性: 插入子表的時候會使用這個列的值查詢父表儲存的資料節點。

    parentKey屬性:屬性指定的值一般為與父表建立關聯關係的列名。程式首先獲取joinkey的值,再通過**parentKey**屬性指定的列名產生查詢語句,通過執行該語句得到父表儲存在哪個分片上。從而確定子表儲存的位置。

        <table name="customer" primaryKey="ID" dataNode="dn1,dn2"  
            rule="sharding-by-intfile">  
            <childTable name="orders" primaryKey="ID" joinKey="customer_id"  
                parentKey="id">  
                <childTable name="order_items" joinKey="order_id"  
                    parentKey="id" />  
            </childTable>  
            <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"  
                parentKey="id" />  
        </table>  

3.2.2 <dataNode>標籤

配置分片,表切分後需要配置對映到哪幾個資料庫,mycat的分片其實是庫的別名.

    name屬性:定義資料節點名,唯一.

    dataHost屬性: 定義該分片屬於哪個物理庫,與<datahost>標籤上的name屬性對應

    dataBase屬性:定義該分片屬於資料庫例項上的物理庫

        <dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />

3.2.3 <dataHost>標籤

定義了物理庫分片對映,可配置讀寫分離,單庫和心跳語句

    name屬性:標識dataHost標籤,唯一.

    maxCon屬性:指定每個讀寫例項連線池最大連線.

    minCon屬性:指定每個讀寫例項連線池最小連結,初始化連線池大小.

    balance屬性:指定負載均衡型別

        {"0" : 不開啟讀寫分離,所有操作由發往writeHost--"1" : 所有readHost和stand by writeHost參與select語句的負載均衡,即所有寫操作由第一個writeHost執行,讀操作由其他所有可用host參與-- "2" : 所有select操作隨機分發所有host--"3" : 1.4版本後新加入,所有select操作由writeHost對應的readHost執行,}

    writeType屬性: 配置主從相關屬性

        {"-1" : 不自動切換--"1" 預設值,自動切換--"2": 基於MySql主從同步狀態決定是否切換,心跳語句為show slace status -- "3" : 1.4.1,基於mysql galary cluster 的切換機制(叢集狀態下) ,心跳語句為show status like 'wsrep%'}.

    dbType屬性:指定後端連線的資料庫目前支援二進位制的mysql協議,還有其他使用jdbc連結的資料庫.

    DBDriver屬性: 指定連線後段資料庫使用的driver,目前可選的值有native和JDBC。使用native的話,因為這個值執行的是二進位制的mysql協議,所以可以使用mysql和maridb,其他型別的則需要使用JDBC驅動來支援。如果使用JDBC的話需要符合JDBC4標準的驅動jar 放到mycat\lib目錄下,並檢查驅動jar包中包括如下目錄結構檔案 META-INF\services\java.sql.Driver。  在這個檔案寫上具體的driver類名,例如com.mysql.jdbc.Driver

    connectionInitSql屬性:主要是當使用Oracla資料庫時,需要執行的初始化SQL語句就這個放到這裡面來

<heartbeat>: 指定用於物理庫進行心跳檢測的語句

<writeHost> <readHost>

指定後端資料庫的相關配置給mycat,用於例項化後端連線池。

host屬性:用於標識不同例項,一般writeHost我們使用*M1,readHost我們用*S1。
url屬性:後端例項連線地址,如果是使用native的dbDriver,則一般為address:port這種形式。用JDBC或其他的dbDriver,則需要特殊指定。當使用JDBC時則可以這麼寫:jdbc:mysql://localhost:3306/。
user屬性:後端儲存例項需要的使用者名稱字
password屬性:後端儲存例項需要的密碼

        <dataHost name="localhost1" 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="hostM1" url="localhost:3306" user="root"
				   password="123456">
			<!-- can have multi read hosts -->
			<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
		</writeHost>
		<writeHost host="hostS1" url="localhost:3316" user="root"
				   password="123456" />
		<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
	</dataHost>
3.3 rule.xml

配置具體的表分片規則