先點贊,後觀看,伸手纔有好習慣
理解: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官網](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>
複製代碼