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
後面再開一篇單獨介紹。