傳統(tǒng)關系型數據庫的分布式開發(fā)通常需要自己做飒硅,不僅耗時耗力而且效果不是很理想徒蟆,當想快速搭建時,最初想到的是看有沒有第三方沟启,網上牛人還是很多的忆家,做得比較好的其中之一Mycat,它是開源的分布式數據庫系統(tǒng)德迹,解決數據庫的負載均衡芽卿,主備復制,讀寫分離胳搞,簡單來說就是你只管直接與mycat通訊卸例,至于分離什么的交給它里面自己做称杨,其它啥都不用操心。
至于什么是MyCat有什么優(yōu)勢筷转,可以看看官網介紹Mycat 數據庫分庫分表中間件姑原。
上圖是MyCat架構圖。
MyCat可以與HAProxy使用實現高可用數據庫集群呜舒,更深入的內容自己去查锭汛,本章只詳講從0開始使用MyCat 基礎篇,至少能先跑起來阴绢。
一店乐、下載
本次運行環(huán)境為windows,Linux下更好吧呻袭,然后數據庫用mysql,需要java環(huán)境腺兴,下載jdk8
jdk安裝配置
1. 首先去oracle官網下載并安裝jdk8,添加環(huán)境變量左电,JAVA_HOME設置為D:\Java\jdk1.8
2. CLASSPATH設置為.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
3. path系統(tǒng)變量追加%JAVA_HOME%\bin;
安裝Mysql镶殷,需要注意的是數據庫惰许,表刘莹,字段的編碼都采用utf8吧猪钮,否則插入的中文顯示為亂碼堤魁,具體解決方法網上查一查泵督,去試一試司草。
下載MyCat授段,http://dl.mycat.io/ ? 選擇最新的版本下載没陡。(下圖可以看到還有其它前面需要的資源都可以從這里下載)
二涩哟、配置
下載解壓后就要先配置MyCat了,(這里不是exe文件盼玄,沒有安裝贴彼,配置好后直接運行startup_nowrap.bat)
打開mycat\conf里面的startup_nowrap.bat?為了降低資源占用,mycat的jvm設置在startup_nowrap.bat?可以清楚看到如下配置:
“%JAVA_CMD%” -server -Xms1G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=1G -DMYCAT_HOME=%MYCAT_HOME% -cp “..\conf;..\lib*” io.mycat.MycatStartup
這里將-Xms1G改成-Xms512M埃儿,-Xmx2G改成-Xmx1024M器仗,保存后重新啟動即可。
添加Windows環(huán)境變量童番,MYCAT_HOME設置為安裝目錄D:\MycatServer1.5
修改wrapper.conf文件里的改成wrapper.java.command=D:\jdk1.8\bin\java.exe
三精钮、連接MySQL
Mycat綁定MySQL 啟動的配置
conf 配置文件存放配置文件:
--server.xml:是Mycat服務器參數調整和用戶授權的配置文件。--schema.xml:是邏輯庫定義和表以及分片定義的配置文件剃斧。--rule.xml:? 是分片規(guī)則的配置文件轨香,分片規(guī)則的具體一些參數信息單獨存放為文件,也在這個目錄下悯衬,配置文件修改需要重啟MyCAT弹沽。--log4j.xml: 日志存放在logs/log中檀夹,每天一個文件,日志的配置是在conf/log4j.xml中策橘,根據自己的需要可以調整輸出級別為debug? ? ? ? ? ? ? ? ? ? ? ? ? debug級別下炸渡,會輸出更多的信息,方便排查問題丽已。--autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties蚌堵, sequence_db_conf.properties 分片相關的id分片規(guī)則配置文件--lib? ? MyCAT自身的jar包或依賴的jar包的存放目錄。--logs? ? ? ? MyCAT日志的存放目錄沛婴。日志存放在logs/log中吼畏,每天一個文件
具體什么意思后面慢慢看。
先解決主配置嘁灯,server.xml配置文件配置訪問用戶及權限,?修改高亮處信息泻蚊,其中mycat、user為訪問mycat的用戶丑婿,TESTDB為mycat虛擬的數據庫性雄,供上層應用訪問。
123456TESTDB-->
-->123456TESTDBtrue
mycat的數據庫配置是在schema.xml中配置,這部分不太好理解羹奉,精簡了一下秒旋,主要分schema、dataNode诀拭、dataHost三個主要配置迁筛。
節(jié)點定義了mycat的虛擬數據庫為TESTDB,下面借用園友的說明:
dataNode的意義很簡單,這個邏輯表的數據存儲在后端的哪幾個數據庫里面rule代表的是這個邏輯表students的具體切分策略,目前MyCAT只支持按照某一個特殊列,遵循一些特殊的規(guī)則來切分,如取模,枚舉等,具體的留給之后細說-->
這意味著耕挨,childtable的joinkey會按照父表的parentKey的策略一起切分细卧,當父表與子表進行連接酒甸,
且連接條件是childtable.joinKey=parenttable.parentKey時,不會進行跨庫的連接.-->
這里的測試過程比較麻煩赋铝,所以直接貼結論:
1.balance=0時,讀操作都在localhost上(localhost失敗時,后端直接失敗)
2.balance=1時,讀操作會隨機分散在localhost1和兩個readhost上面(localhost失敗時,寫操作會在localhost1,如果localhost1再失敗,則無法進行寫操作)
3.balance=2時,寫操作會在localhost上革骨,讀操作會隨機分散在localhost1,localhost1和兩個readhost上面(同上)
4.writeType=0時,寫操作會在localhost上,如果localhost失敗,會自動切換到localhost1,localhost恢復以后并不會切換回localhost進行寫操作
5.writeType=1時,寫操作會隨機分布在localhost和localhost1上,單點失敗并不會影響集群的寫操作,但是后端的從庫會無法從掛掉的主庫獲取更新,會在讀數據的時候出現數據不一致
舉例:localhost失敗了,寫操作會在localhost1上面進行,localhost1的主從正常運行,但是localhost的從庫無法從localhost獲取更新,localhost的從庫于其他庫出現數據不一致-->select user()-->
以上配置注意高亮部分良哲,配置的是每個dn對應哪個實體服務器里面哪個實體庫(此處只有本機筑凫,所以都綁定到本機localhost并村,再添加3個不同的數據庫TESTDB1\TESTDB2\TESTDB3哩牍,手動都添加要測試的表膝昆,若有多余的服務器可以將ip替換掉測試)荚孵,詳細的內容參考文中的注釋纬朝。
經過實驗 goods表:在mycat的TESTDB的虛擬表goods中添加一行記錄會在?TESTDB1和TESTDB2中的表goods同步添加一行記錄。
hotnews表:在mycat的TESTDB的虛擬表hotnews中添加的一行記錄會隨機插入 TESTDB1滔驾、TESTDB2、TESTDB3的其中一個庫中的hotnews表俄讹。
其它表的測試你們自己試試。
這就是分片绕德,靠的是分片規(guī)則患膛,下面就來看rule。
(每個數據庫中相同的表要手工提前生成表結構耻蛇,否則會提示找不到此表踪蹬,操作mycat時它并不能自動同步實體數據庫生成,可能有方法臣咖,現在還沒深入了解)
rule.xml配置文件跃捣,可以先不管。
- 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.-->idfunc1user_idfunc1sharding_idhash-intidrang-longidmod-longidmurmurcreate_datepartbymonthcalldatelatestMonthidrang-modidjump-consistent-hash02160weightMapFile 節(jié)點的權重夺蛇,沒有指定權重的節(jié)點默認是1。以properties文件的格式填寫刁赦,以從0開始到count-1的整數值也就是節(jié)點索引為key甚脉,以節(jié)點權重值為值丸升。所有權重值必須是正整數牺氨,否則以1代替-->/etc/mycat/bucketMapPath-->
用于測試時觀察各物理節(jié)點與虛擬節(jié)點的分布情況狡耻,如果指定了這個屬性墩剖,會把虛擬節(jié)點的murmur hash值與物理節(jié)點的映射按行輸出到這個文件,沒有默認值夷狰,如果不指定,就不會輸出任何東西-->partition-hash-int.txtautopartition-long.txt3812824yyyy-MM-dd2015-01-01partition-range-mod.txt3
四蒲障、運行
用管理員權限運行startup_nowrap.bat啟動MyCat背捌。
若出現上面的問題,檢查java的環(huán)境是否正確和mycat的環(huán)境配置毅否。
啟動成功后會出現:
#如果啟動失敗捆探,請修改D:\mycat\bin\startup_nowrap.bat文件中的以下參數。默認占用內存為2G
D:\dev-bin\mycat\bin>"C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java" -server-Xms512m -Xmx512m -XX:MaxPermSize=64M-XX:+AggressiveOpts -XX:MaxDirectMemorySize=768m-DMYCAT_HOME=D:\
p "..\conf;..\lib\*" io.mycat.MycatStartup
然后dos中會不停的出現心跳檢測,有錯誤信息可去mycat\logs中查看日志恰起。
注意:如日志中出現192.168.xxx not connected 等信息翘单,請允許對應的mysql遠程訪問柬唯,且先提前獨自檢查mysql都能正確訪問。
使用navicat連接mycat剧腻,操作方式和連接物理mysql庫一致拘央,用戶mycat,密碼123456儒旬,端口8066
連接成功后栏账,將看到TESTDB數據庫和hotnews等數據表
在hotnews表中添加一些數據,保存
執(zhí)行select * from hotnews 查看操作栈源,然后去TESTDB1挡爵、TESTDB2了讨、TESTDB3中查詢hotnews表
MyCat中TESTDB是中間件邏輯數據庫,MySQL中的testdb制轰、testdb2垃杖、testdb3是真實的數據庫。
在mycat中添加數據時若提示testdb2.hotnews不存在丈屹,則要手動在testdb2中添加相同表結構调俘。
添加完后,可以看到hotnews記錄在三個testdb旺垒、testdb2彩库、testdb3中是均衡隨機插入的。
而goods在testdb先蒋、testdb2中是一樣的骇钦。
至此可以配置出MyCat了,敬請期待下篇 net下如何使用竞漾。