《Java互聯(lián)網(wǎng)架構(gòu)-分布式架構(gòu)Mycat的前世今生》要點:
本文介紹了Java互聯(lián)網(wǎng)架構(gòu)-分布式架構(gòu)Mycat的前世今生,希望對您有用。如果有疑問,可以聯(lián)系我們。
歡迎參與《Java互聯(lián)網(wǎng)架構(gòu)-分布式架構(gòu)Mycat的前世今生》討論,分享您的想法,維易PHP學院為您提供專業(yè)教程。
概述
Mycat是一個開源的分布式數(shù)據(jù)庫系統(tǒng),其核心功能是分表分庫,即將一個大表水平分割為多個小表,存儲在后端MySQL或者其他數(shù)據(jù)庫里.取名Mycat原因一是簡單好記,另一個則是希望未來能夠入駐 Apache,Apache的開源產(chǎn)物Tomcat也是一只貓.
一丶 MyCAT貓的前世
最近貓為什么這么火,Apache的貓,MyCAT的貓.
差不多都長這個樣
MyCAT本來本沒有想著來生做貓的,因為他的前世是阿里的Cobar,
轉(zhuǎn)世之后,成為了MyCAT,而且開源了,就立志做一個中國的Apache貓.
說道他的前世是阿里的Cobar, Cobar的作者離職了以后,Cobar就幾乎沒有進行后續(xù)開發(fā)和維護了,
后來轉(zhuǎn)為開源的MyCAT,又進行了迅速的發(fā)展,現(xiàn)在初步統(tǒng)計有超過300個項目使用mycat,其中包含:
中國電信/中國聯(lián)通/蒲公英傳媒/天獅集團等等
為什么有這么多的知名公司使用mycat 呢, 我們看看他們的業(yè)務量,
1.安智賬戶系統(tǒng), 數(shù)據(jù)量單表6000萬條,20多張表,上億條數(shù)據(jù), 系統(tǒng)運行良好,偶爾有SQL操作緩慢的現(xiàn)象.
2.公安項目,20個表,30多億條數(shù)據(jù),選取適合的業(yè)務使用mycat
從這些項目中我們可以看出,mycat長于對上億條單表數(shù)據(jù)量的處理,并提供良好的實時查詢服務.
而我們知道,MYSQL的庫中很難處理上億條數(shù)據(jù)的查詢工作,MYCAT提高了MYSQL數(shù)據(jù)庫的處理才能,
從官方的解釋來看,MYCAT適合處置千億條以下的數(shù)據(jù),千億條以上的數(shù)據(jù)更適合HADOOP這些系統(tǒng)來處置.
說了半天,什么是MYCAT呢?
MYCAT便是一個虛擬的MYSQL SERVER, 這么說可能不太理解, 但是對于應用來說,他便是一個MYSQL SERVER,
應用就像連接普通的MYSQL數(shù)據(jù)庫一樣的 去連接他,SQL查詢、操作等等一模一樣.
而MYCAT把數(shù)據(jù)庫復雜的架構(gòu),以及背后復雜的分表分庫的邏輯全部透明化了,MYCAT中間件連接多個MYSQL數(shù)據(jù)庫,
多個數(shù)據(jù)庫之間還可以做主從同步,而這一切的一切,對應用來說,只有一個數(shù)據(jù)庫,那便是MYCAT.
二丶 MyCAT貓的此生
MYCAT發(fā)展到現(xiàn)在已經(jīng)不僅僅是MYSQL的代理了,它還支持SQLSERVER/ORACLE/DB2/POSTGRESQL等主流數(shù)據(jù)庫.
MYCAT還可以將一個表定義為任何一種MYCAT支持的存儲方式,好比MySQL的MyISAM 表、內(nèi)存表、或者MongDB這種
內(nèi)存數(shù)據(jù)庫上.
MYCAT這么強大,那么他的原理是不是特其余復雜,非也,Mycat 的原理可以用一個動詞來形容:”攔截“
它攔截應用發(fā)送過來的SQL, 并對SQL語句進行一些特定的闡發(fā):分片闡發(fā)、路由闡發(fā)、讀寫分離闡發(fā)、緩存闡發(fā)等,然后將
分析后的SQL分別發(fā)送到分歧的真實數(shù)據(jù)庫,最后對數(shù)據(jù)庫返回的結(jié)果進行處理,返回給用戶.
下面列舉幾個MYCAT 典型的應用場景:
· 單純的讀寫分離,在下面我們會有講解如何進行Mycat下面的讀寫分離的配置
· 分表分庫,對于跨越1000萬的表進行分片,最大支持1000億的單表分片
· 多租戶應用,每個應用一個庫,但應用程序只連接MYCAT ,從而不改變程序自己,實現(xiàn)多租戶
· 報表系統(tǒng),借助于MYCAT的分表才能,處理大規(guī)模報表的統(tǒng)計
· 替代HBase, 闡發(fā)大數(shù)據(jù)
· 作為海量數(shù)據(jù)實時查詢的一種簡單有效的辦理方案, 比如100億條數(shù)據(jù)需要在3秒內(nèi)實時查詢出來,此時可以考慮MYCAT
現(xiàn)在MYCAT社區(qū)活躍,MYCAT 周邊的系統(tǒng)也慢慢衍生出來,慢慢的形成了MYCAT生態(tài)圈了,像MYCAT-WEB 監(jiān)控,MYCAT-HA
高可用方案等等,所以MYCAT還是很值得我們學習和研究的.
三丶 十分鐘安裝使用
MYCAT雖然強大,但是他的安裝卻十分簡單, 下面我們進入我們十分鐘安裝教程:
1.下載MYCAT安裝包
在GitHub 的 MyCATApache項目下,我們找到
https://github.com/MyCATApache/Mycat-download/tree/master/1.5-RELEASE
選取 Mycat-server-1.5.1-RELEASE-20160929233042-linux.tar.gz
linux 版本進行 下載
目前1.6版本部分功能還在開發(fā)中,1.5版本比擬穩(wěn)定,建議下載1.5用于生產(chǎn)環(huán)境使用
2. 解壓運行MYCAT安裝包
下載文件是一個tar的linux壓縮包,用解壓命令
tar -zxvf Mycat-server-1.5.1-RELEASE-20160929233042-linux.tar.gz
啟動命令
./mycat start|restart|stop|console 常用幾項內(nèi)容
日志文件
logs/wrapper.log mycat服務器日志
logs/mycat.log 數(shù)據(jù)庫操作日志,闡發(fā)數(shù)據(jù)庫操作路由使用.
啟動MyCat最主要的幾個配置文件:
conf/server.xml 服務器用戶、虛擬Sechma、端口等配置信息.
conf/sechma.xml 物理數(shù)據(jù)庫映射.
使用MyCAT來說的話,最主要的便是修改這兩個文件,接下來我們實現(xiàn)MYCAT下的讀寫分離.
四丶 MYCAT下實現(xiàn)讀寫分離
首先參考上一節(jié)MYSQL配置主從復制,配置好主從數(shù)據(jù)庫之間的數(shù)據(jù)復制功能.
1.登錄主服務器的mysql,查詢master的狀態(tài)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 | 106 | db1,db2,db3 | mysql |
+------------------+----------+--------------+------------------+
Master 重啟后會修改mysql-bin(序號加1)
2.查看Slave機有沒有配置勝利:
mysql> show slave status\G
以下兩個參數(shù)必需為YES:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.MyCAT的配置
不使用Mycat托管的 MySQL主從服務器
schema.xml
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="172.19.4.239:3306" user="root" password="123456"></writeHost>
</dataHost>
支持MySQL主從復制狀態(tài)綁定的讀寫分離機制,讓讀更加平安可靠,配置如下
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM" url="172.19.4.239:3306" user="root" password="123456">
<readHost host="hostS" url="172.19.4.240:3306" user="root" password="123456" />
</writeHost>
</dataHost>
設置 balance="1"與writeType="0"
Balance參數(shù)設置:
1. balance=“0”, 所有讀操作都發(fā)送到當前可用的writeHost上.
2. balance=“1”,所有讀操作都隨機的發(fā)送到readHost.
3. balance=“2”,所有讀操作都隨機的在writeHost、readhost上分發(fā)
WriteType參數(shù)設置:
1. writeType=“0”, 所有寫操作都發(fā)送到可用的writeHost上.
2. writeType=“1”,所有寫操作都隨機的發(fā)送到readHost.
3. writeType=“2”,所有寫操作都隨機的在writeHost、readhost分上發(fā).
這樣配置了以后,就已經(jīng)實現(xiàn)了讀寫分離的功能, 還可以對數(shù)據(jù)庫進行負載均衡
啟動mycat , 用應用或者Navicat等工具 連接mycat ,端口是 8066
insert , select 進行測試.
五丶MyCAT中分表分庫策略
上面只是實現(xiàn)了如何進行讀寫分離,基于數(shù)據(jù)庫的主從同步復制的原理, 我們在之前的課程里已經(jīng)知道,
主從同步復制的數(shù)據(jù)是 ,保證從數(shù)據(jù)庫和主庫的數(shù)據(jù)一模一樣,也便是說數(shù)據(jù)是多復制了一份出來,
而MYCAT 只所以能支持上百億的數(shù)據(jù)量,在于他的另一個功能:分表分庫策略
分表分庫簡單來說,就是MYCAT 下面連接的數(shù)據(jù)庫節(jié)點,打比喻說有dn1,dn2,dn3, 他們每個庫中的數(shù)據(jù)
是各不相同的.
把MYCAT當做一個虛擬數(shù)據(jù)庫來看,travelrecord 是MYCAT下面建的一張表, 應用調(diào)用MYCAT
庫可以調(diào)用到整張表的數(shù)據(jù), 但是如果查詢某一個節(jié)點dn1 , 則只能查詢到一部門數(shù)據(jù)(通常是1/3)的數(shù)據(jù)
dn1, dn2 , dn3 各自存儲了一部門的數(shù)據(jù), 但是可以通過MYCAT 來查詢到整張表的數(shù)據(jù),
這樣增強了每個數(shù)據(jù)庫的數(shù)據(jù)存儲處理能力, 這就是MYCAT的高明之處,也就是為什么他能夠處理上百億條數(shù)據(jù)的奇妙.
這里列出一個簡單的分表分庫的配置:
schema.xml
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
在schema中 我們必要配置mycat 中的虛擬表table ,以及他的rule ,分表規(guī)則
auto-sharding-long 的意思是 事先已經(jīng)定義好每個dn的 范圍,根據(jù)范圍劃分,這個規(guī)則在rule.xml中進行配置.
datanode 的配置:
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost2" database="db2" />
<dataNode name="dn3" dataHost="localhost3" database="db3" />
<dataHost name="localhost1" 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="hostM1" url="172.19.4.3:3306" user="root" password="123456"></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>
<!-- can have multi write hosts -->
<writeHost host="hostM2" url="172.19.4.201:3306" user="root" password="123456"></writeHost>
</dataHost>
<dataHost name="localhost3" 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="hostM2" url="172.19.4.86:3306" user="root" password="123456"></writeHost>
</dataHost>
這樣數(shù)據(jù)便是自動切分到這3個不同的datanode中了, select 取出來也是完整的數(shù)據(jù).
分表分庫還有一點竅門便是,你的數(shù)據(jù)是縱向來切,還是橫向來切,
上面講的那個是 橫向來切:便是把一張表的數(shù)據(jù) 切到不同的 數(shù)據(jù)庫中.
縱向切更簡單,便是以表來分庫, 不同的表 放到不同的庫中, 表中的數(shù)據(jù)在某個庫中是完整的.
六丶 MyCAT的五臟六腑
學會了MYCAT來做讀寫分離和分表分庫的使用以后,我們應該更深入MYCAT的五臟六腑,了解MYCAT的運行機制,這樣對線上的應用處置一些
應急事故,以及辦理一些問題提供思路,非常的有幫助,有能力的童鞋還可以參與到MYCAT的后續(xù)開發(fā)中來.
MYCAT 的后端通信采納了NIO非阻塞 和AIO 異步通信方式, 使得通信效率更高
SQL解析這一塊用到了阿里的Druid進行解析
協(xié)議這一塊,對于MYSQL數(shù)據(jù)庫采納原生的二進制協(xié)議,還支持驅(qū)動方式的連接
而且MYCAT還增加order by , group by ,limit 等聚合功能的支持.
總結(jié)
到這里,分布式架構(gòu)Mycat的前世今生就結(jié)束了,,不足之處還望大家多多原諒!!覺得收獲的話可以點個關注收藏轉(zhuǎn)發(fā)一波喔,謝謝大佬們支持.(吹一波,233~~)
下面和大家交流幾點編程的經(jīng)驗:
1、多寫多敲代碼,好的代碼與扎實的基礎知識必定是實踐出來的
2丶 測試、測試再測試,如果你不徹底測試本身的代碼,那恐怕你開發(fā)的就不只是代碼,可能還會聲名狼藉.
3丶 簡化編程,加快速度,代碼風騷,在你完成編碼后,應回頭而且優(yōu)化它.從長遠來看,這里或那里一些的改進,會讓后來的支持人員更加輕松.
最后,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完.希望在成為一名更優(yōu)秀的Java法式員的道路上,我們可以一起學習、一起進步.
內(nèi)部交流群469717771 歡迎各位前來交流和分享, 驗證:(007)
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/13039.html