mycat 10 分钟轻松入门
??點擊上方?好好學java?,選擇?星標?公眾號
重磅資訊、干貨,第一時間送達 今日推薦:分享一個牛逼的 Java 開源后臺管理系統,不要造輪子了!個人原創+1博客:點擊前往,查看更多 作者:sf4y 來源:https://segmentfault.com/a/1190000022237732基本原理
mycat是一個把自己偽裝成mysql服務的中間件,推薦閱讀Mycat權威指南官方下載[:下載地址]:https://github.com/MyCATApache/Mycat-Server/blob/4135f25df8239d52d220529cbf7cb697ede40e12/mycat-definitive-guide.pdf
安裝
下載安裝包解壓即用 [點擊我下載]:http://dl.mycat.io/ ,下載對應的版本:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz,建議安裝在 usr/local/mycat,解壓到當前目錄,目錄結構:
bin catlet conf lib logs version.txt
環境變量配置MYCAT_HOME,vim /etc/profile 添加 MYCAT_HOME=/usr/local/mycat
運行
linux:
./mycat start 啟動
./mycat stop 停止
./mycat console 前臺運行
./mycat restart 重啟服務
./mycat pause 暫停
./mycat status 查看啟動狀態
windows:
startup_nowrap.bat
基本配置:
啟動需要配置一些jvm 參數,這個根據系統的需要來設置,打開conf/wrapper.conf文件,里面有一些我們平時常用的jvm參數,一般只要調整Xmx、Xms、MaxDirectMemorySize 內存大小就可以, JVM 參數,必須設置- XX:MaxDirectMemorySize 和 -Xmx 例如:-Xmx1024m -Xmn512m -XX:MaxDirectMemorySize=2048m -Xss256K -XX:+UseParallelGC了, MaxDirectMemorySize 盡可能設置大些,可以加快結果集處理時間
# Java Additional Parameters wrapper.java.additional.1=-DMYCAT_HOME=. wrapper.java.additional.2=-server wrapper.java.additional.3=-XX:MaxPermSize=64M wrapper.java.additional.4=-XX:+AggressiveOpts wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G wrapper.java.additional.6=-Dcom.sun.management.jmxremote wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984 wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false wrapper.java.additional.10=-Xmx1G wrapper.java.additional.11=-Xmn512M規則配置
Mycat最重要的3大配置文件:
server.xml
主要有user 和 system 標簽。這個user標簽主要用于定義登錄 mycat的用戶和權限。例如上面的例子中,我定 義了一個用戶,用戶名為 mycat、密碼也為 mycat,可訪問的 schema 也只有 TESTDB 一個。如果我在 schema.xml 中定義了多個 schema,那么這個用戶是無法訪問其他的 schema。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"> <user name="mycat"><property name="password">mycat</property><property name="schemas">TESTDB</property> </user></mycat:server>同時訪問多個 schema 的話使用 , 隔開,例如:
<property name="schemas">TESTDB,db1,db2</property>system 這個標簽內嵌套的所有 property 標簽都與系統配置有關,如果沒有特殊需求默認即可
<system> <property name="charset">utf8</property> <!--這個屬性主要用于指定系統可用的線程數,默認值為機器 CPU 核心線程數。--> <property name="processors">1</property> <!--這個屬性主要用于指定 NIOProcessor 上共享的 businessExecutor 固定線程池大小。 mycat 在需要處理一 些異步邏輯的時候會把任務提交到這個線程池中。 新版本中這個連接池的使用頻率不是很大了,可以設置一個較 小的值。--> <property name="processorExecutor">32</property> <!--分布式事務開關,0為不過濾分布式事務,1為過濾分布式事務 (如果分布式事務內只涉及全局表,則不過濾),2為不過濾分布式事務, 但是記錄分布式事務日志--> <property name="handleDistributedTransactions">0</property> ... </system>schema.xml
文件地址 mycat/conf/schema.xml,這個xml 是mycat配置的重頭戲,里面有幾個很關鍵的標簽 schema table dataNode dataHost 等等。首先配置schema 標簽:
table : schema標簽中包含了table 屬性,mycat中table有2種類型,一種是全局廣播表,一種是分片表,如果沒有在這里面配置的表呢,schema 標簽有個 dataNode 屬性,沒有配置默認讀寫在這個庫里面, table中還有一個屬性 subTables,是指把一個表拆分成多個子表,例如下面表示有3個表 t_order1,t_order2,t_order3
目前分表 1.6 以后開始支持 并且 dataNode 在分表條件下只能配置一個,分表條件下不支持各種條件的 join 語句, 這種適合單個數據庫需要分表的情況。
dataNode : 標簽定義了 MyCat 中的數據節點,也就是我們通常說所的數據分片。一個 dataNode 標簽就是 一個獨立的數據分片
dataHost : 該標簽在 mycat 邏輯庫中也是作為最底層的標簽存在,直接定義了具 體的數據庫實例、讀寫分離配置和心跳語句。writeHost 標簽、readHost 標簽, writeHost 指 定寫實例、readHost 指定讀實例, 用來做讀寫分離。
<!-- 配置默認的name邏輯庫名稱,checkSQLschema屬性為false的時候,sql查詢是會帶上邏輯庫的名稱TESTDB.tableName,如果不想帶上邏輯庫名稱,設置為true,sqlMaxLimit表示分頁最大limit,dataNode表示沒有分片的表默認使用這個庫--><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><!-- mycat中table有2種類型,一種是全局廣播表,一種是分片表,type="global" 表示全局表,會同步到所有的庫,一般是用于數據字典表,方便join 操作,分片表只type不用指定,默認就是分片,需要配置分片規則, primaryKey對應邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那么在使用主鍵查詢的時候,就會發送查詢語句到所有配置的 DN 上,如果使用該屬性配置真實表的主鍵。那么 MyCat 會緩存主鍵與具體 DN 的 信息,那么再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,--><table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" /><table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /><!-- 設置dataNode 對應的數據庫,及 mycat 連接的地址dataHost 對應dataHost 標簽上定義的 name 屬性,使用名字為 dh01 數據庫實例上的 db1 物理數據庫 --><dataNode name="dn01" dataHost="dh01" database="db01" /><dataNode name="dn02" dataHost="dh02" database="db02" /><!-- balance為0 不開啟讀寫分離機制,writeType="0"所有寫操作發送到配置的第一個 writeHost,switchType=1 默認值,自動切換 --><dataHost name="dh01" writeType="0" switchType="1" balance="0" dbType="mysql" maxCon="1000" minCon="10" dbDriver="native"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" ><!-- 配置讀寫分離, can have multi read hosts --><readHost host="hostS1" url="192.168.1.200:3306" user="root" password="123456" /></writeHost></dataHost><!-- 如果是用多臺數據庫實例,需要配置多個dataHost,如果只是單實例多個數據庫,只要配置一個就可以了 --><dataHost name="dh02" writeType="0" switchType="1" balance="0" dbType="mysql" maxCon="1000" minCon="10" dbDriver="native"><heartbeat>select user()</heartbeat><writeHost host="hostM2" url="192.168.11.123:3306" user="root" password="root" ></writeHost></dataHost></schema>rule.xml
/usr/local/mycat/conf/rule.xml
這個標簽定義表規則,這個文件里面主要有 tableRule 和 function 這兩個標簽。tableRule標簽中的 name 對應上面table標簽中的rule 屬性,columns 內指定要拆分的列名字。algorithm 使用 function 標簽中的 name 屬性。
<tableRule name="rule1"> <rule> <columns>id</columns> <algorithm>func1</algorithm> </rule> </tableRule>name 指定算法的名字。class 制定路由算法具體的類名字。
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"><property name="mapFile">partition-hash-int.txt</property> </function>Mycat 常用的分片規則
這個是本次分庫分表的核心所在,直接影響到后續的sql執行效率,所以在分片規則的選擇上,需要對表有比較清楚的認識
1. 分片枚舉
通過在配置文件中配置可能的枚舉 id,自己配置分片,本規則適用于特定的場景,比如有些業務需要按照省 份或區縣來做保存,而全國省份區縣固定的,這類業務使用本條規則
<tableRule name="sharding-by-intfile"> <rule> <columns>user_id</columns> <algorithm>hash-int</algorithm> </rule> </tableRule> <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> <property name="type">0</property> <property name="defaultNode">0</property> </function> partition-hash-int.txt 配置: 10000=0 10010=1 DEFAULT_NODE=1其中分片函數配置中,mapFile 標識配置文件名稱,type 默認值為 0,0 表示 Integer,非零表示 String, 所有的節點配置都是從 0 開始,及 0 代表節點 1 /**
defaultNode 默認節點:小于 0 表示不設置默認節點,大于等于 0 表示設置默認節點 * 默認節點的作用:枚舉分片時,如果碰到不識別的枚舉值,就讓它路由到默認節點
如果不配置默認節點(defaultNode 值小于 0 表示不配置默認節點),碰到
不識別的枚舉值就會報錯,
like this:can’t find datanode for sharding column:column_nameval:ffffffff */
2. 固定分片 hash 算法
本條規則類似于十進制的求模運算,區別在于是二進制的操作,是取 id 的二進制低 10 位,即 id 二進制 &1111111111。此算法的優點在于如果按照 10 進制取模運算,在連續插入 1-10 時候 1-10 會被分到 1-10 個分片,增 大了插入的事務控制難度,而此算法根據二進制則可能會分到連續的分片,減少插入事務事務控制難度。
<tableRule name="rule1"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <function name="func1" class="io.mycat.route.function.PartitionByLong"> <!-- dataNote 個數,這邊表示3個--> <property name="partitionCount">2,1</property> <property name="partitionLength">256,512</property> </function>分區長度:默認為最大 2^n=1024 ,即最大支持 1024 分區 約束: count,length 兩個數組的長度必須是一致的。1024 = sum((count[i]*length[i])). count 和 length 兩個向量的點積恒等于 1024 ,例如: 2*256 + 1*512 = 1024。
例如:以上分為二個分區:0-512,512-1023
1023的二進制&1111111111運算后為1023,故落入第二個分區
1024的二進制&1111111111運算后為0,故落入第一個分區
0266 的二進制&1111111111運算后為266,故落入第一個分區內
如果只需要平局分配,配置如下
<!--平均分為 4 分片,partitionCount*partitionLength=1024 --> <function name="func1" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">4</property> <property name="partitionLength">256</property> </function>3. 范圍約定
此分片適用于,提前規劃好分片字段某個范圍屬于哪個分片
<tableRule name="auto-sharding-long"> <rule> <columns>user_id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule> <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> <property name="defaultNode">0</property> </function>rang-long 函數中 mapFile 代表配置文件路徑 defaultNode 超過范圍后的默認節點。所有的節點配置都是從 0 開始,及 0 代表節點 1,此配置非常簡單,即預先制定可能的 id 范圍到某個分片
0-500M=0 500M-1000M=1 1000M-1500M=2 或 0-10000000=0 10000001-20000000=14. 取 模
此種配置非常明確即根據 id 進行十進制求模預算,相比固定分片 hash,此種在批量插入時可能存在批量插入單 事務插入多數據分片,增大事務一致性難度。
<tableRule name="mod-long"> <rule> <columns>user_id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">2</property> </function>按日期(天)分片
按天分片
<tableRule name="sharding-by-date"> <rule> <columns>create_time</columns> <algorithm>sharding-by-date</algorithm> </rule> </tableRule> <function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2014-01-01</property> <property name="sEndDate">2014-01-02</property> <property name="sPartionDay">10</property> </function>配置說明: dateFormat :日期格式
sBeginDate :開始日期
sEndDate:結束日期
sPartionDay :分區天數,即默認從開始日期算起,分隔 10 天一個分區 如果配置了 sEndDate 則代表數據達到了這個日期的分片后后循環從開始分片插入
取模范圍約束
截取數字做 hash 求模范圍約束
應用指定
截取數字 hash 解析
一致性 hash
按單月小時拆分
....
日志排查
設置 conf/log4j2.xml,設置mycat 日志地址
<RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"filePattern="${sys:MYCAT_HOME}/logs/${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">后面可以在logs 中查看mycat.log 文件
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的mycat 10 分钟轻松入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 听说用 Lombok 可以早点下班?
- 下一篇: 自己构建一个高效缓存服务!