入門篇
- 1. 安裝
1.1從https://github.com/MyCATApache/Mycat-download下載壓縮包
1.2解壓縮后復制到相應目錄下面,比如/usr/local/mycat
1.3mycat目錄下面分別是bin conf lib logs。
bin目錄里是啟動腳本
conf目錄里是配置文件
lib目錄里是Mycat和它的依賴jar
logs目錄里是console.log用來保存控制台日志,和mycat.log用來保存mycat的log4j日志
2. 配置環境變量
指定指定MYCAT_HOME,比如按照前文所述,可以把MYCAT_HOME配置為:export MYCAT_HOME=/usr/local/mycat
3. 啟動
Mycat有兩種啟動方式,第一種是運行$MYCAT_HOME/bin/mycat腳本執行wrap模式的啟動;第二種是運行$MYCAT_HOME/bin/startup_nowrap.sh執行nowrap模式的啟動
4. Mycat類加載目錄與JVM參數
以nowrap模式為例,mycat會加載$MYCAT_HOME/lib/classes和$MYCAT_HOME/lib目錄下的所有jar。
如果要修改jvm啟動參數,可以修改$MYCAT_HOME/bin/startup_mycat.sh里的JAVA_OPTS變量
5. 配置文件
重點介紹rule.xml schema.xml router.xml server.xml log4j.xml
5.1 rule.xml
分片規則配置文件,mycat支持的所有分片規則都在這個文件里。定義一個規則需要兩個節點,一個是tableRule,一個是function。
以一致性哈希分片為例,function節點定義了分片規則的實現類與初始化參數和分片規則的算法名稱。
屬性name為規則算法名稱
class為規則實現類
property子節點為初始化規則的參數,使用seed count virtualBucketTimes就可初始化一致性哈希規則
<function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默認是0-->
<property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片-->
<property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射為這么多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍-->
</function>
tableRule節點定義了分片規則名(注意此處是規則名,前面的function節點的name屬性是算法名)rule子節點指定用來分片的數據庫表字段和分片算法名,也就是前面的function節點的name屬性。
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
任何自定義的分片規則也可以這樣配置
5.2 server.xml
此文件用來配置mycat全局參數
<system>節點
<property name="defaultSqlParser">druidparser</property>,指定SQL解析器,默認是fdbparser,經測試druidparser效率更高
<property name="sequnceHandlerType">1</property>,指定mycat自動序列號生成方式。0:在借助本地文件生成序列號,1:借助數據庫生成序列號,更多信息請參考Mycat in action
<property name="serverPort">8066</property>指定mycat服務端口號,mycat通過這個端口接收數據庫客戶端的訪問請求。
另外還有一個9066端口沒有出現在配置文件中,用來接收mycat監控命令、查詢mycat運行狀況、重新加載配置文件等。更多信息請參考Mycat in action。
<user>節點
name屬性指定mycat用戶名
<property name=”password”>password</property><!—用戶密碼-->
<property name=”schema”>database_name</property><!—數據庫名,用客戶端建立連接后要操作的數據庫名 -->
<property name=”readOnly”>false</property><!—指定是不是只讀庫-->
可以有多個user節點。
5.3 router.xml
<queryRouter schema=”schema”><!—沒太搞清楚這個文件的意義,我把schema屬性、<name>、<queryNode>都配置成了一樣的,而且都與要連接的數據庫名保持一致 -->
<!—schema的值會在schema.xml用到 -->
<dataNode>
<name>dataNodeName</name>
<queryNode>queryNode</queryNode>
</dataNode>
</queryRouter>
5.4 schema.xml
<schema name=”schema”><!—就是router.xml命名的schema-->
<table name=”table_name” <!—要與它代理的數據庫物理表名一致-->
primaryKey=”pk” <!—被用作主鍵的字段名-->
dataNode=”dataNodeName” <!—下面將會出現的dataNode節點-->
rule=”sharding-by-murmur”<!—rule.xml的tableRule節點name屬性值,指定這個節點表示用這個規則執行分片-->
authIncrement=”true”><!—插入數據時是否由mycat自動生成分片,指定true時,如果insert sql內沒有指定主鍵的值,而主鍵又是自增長的,mycat會自動插入生成主鍵的代碼,並在生成主鍵時按照指定的分片規則將數據保存到數據庫-->
<!—mycat有自己的自增序列命令,更多信息請參考Mycat in action-->
<!—此處可以指定多個table子節點,一個table節點表示一張表-->
</schema>
<dataNode name=”dataNodeName” dataHost=”localhost“ database=”database”/>
<!—分別是節點名,就是schema節點里的table子節點dataNode屬性
dataHost是節點主機名,在下面要出現的dataHost定義
database數據庫名
-->
<dataHost name=”localhost” maxCon=”1000” minCon=”10” balance=”0”
wrteType=”0” dbType=”mysql” dbDriver=”native>
<!—name屬性是dataHost名
maxCon minCon分別是連接到物理數據庫的最大最小連接數
dbType指定數據庫類型
dbDriver只有兩個取值,分別是native和jdbc。native為mycat自帶驅動,只支持mysql,jdbc為使用jdbc實現連接數據庫,指定什么數據庫的jdbc驅動就可以訪問什么數據庫,更靈活,但效率不如native
可以有多個dataHost節點
-->
<heartbeat>select 1</heartbeat><!—保持連接不斷的心跳sql-->
<writeHost host=”hostM1” url=”localhost:3306” user=”user” password=”password”>
<reeadHost host=”hostS1” url="localhost:3306" user="root" password="123456"/>
</writeHost>
<!—可以有多個writeHost,一個writeHost里要吧有多個readHost-->
</dataHost>
現在所有配置已經完成可以執行bin目錄下的啟動腳本完成啟動了。然后就可以像使用真正的數據庫一樣訪問mycat。如果運行時修改了配置文件,可以用在命令行用mysql命令登錄9066端口,執行show @@help得到相關命令,其中有重新加載全部配置文件的命令,可以運行時重新加載配置
6. 二次開發
6.1 開發新的分片規則
建一個新的類,繼承AbstractPartitionAlgorithm實現RuleAlgorithm。重寫public void init()和public Integer calculate(String columnValue)。
init根據rule.xml指定的分片初始化參數初始化分片規則,calculate(String)接收分片字段的字符串形式計算記錄應該保存的節點。
7. 升級注意事項
7.1 從1.2.*到1.3.*的變化
7.1.1 server.xml 的<property name="processors">32</property>,通常設置為CPU核數的2倍,比如CPU核數是16,此處就設置為32;<property name="processorExecutor">32</property>,默認不用設置了,在1.3.*已經沒有重要影響
7.1.2 對分片規則的類名改了一些拼寫錯誤,注意升級rule.xml。也可以自己修改,變化在地原來的Partion改為Partition。