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