重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
至于什么是Mycat,可能在不同的角色下有不同的理解。對(duì)MySQL架構(gòu)有過(guò)了解的話,都知道MySQL實(shí)際上是由Server層和存儲(chǔ)引擎層組成的。所以對(duì)于DBA來(lái)說(shuō),Mycat 就是 MySQL 的Server層。而 Mycat 后面連接的 MySQL Server,就好象是 MySQL 的存儲(chǔ)引擎。因此,Mycat 本身并不存儲(chǔ)數(shù)據(jù),數(shù)據(jù)是在后端的 MySQL 上存儲(chǔ)的,因此數(shù)據(jù)的可靠性
以及事務(wù)等依舊是 MySQL 保證的。
對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),Mycat基本等同于MySQL。因?yàn)橥耆梢允褂眠B接MySQL的方式去連接Mycat,除了默認(rèn)端口不同之外,連接方式上沒(méi)有區(qū)別。所以Mycat對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)是透明的,只不過(guò)在SQL的使用上有一些限制。
而對(duì)于架構(gòu)師來(lái)說(shuō),Mycat 是一個(gè)數(shù)據(jù)庫(kù)中間件,可以用作讀寫(xiě)分離、分表分庫(kù)以及容災(zāi)備份等。對(duì)于使用Mycat的應(yīng)用來(lái)說(shuō),其隱藏了數(shù)據(jù)庫(kù)的存儲(chǔ)邏輯。讓我們無(wú)需在代碼上去對(duì)讀寫(xiě)分離等存儲(chǔ)邏輯進(jìn)行控制,從而達(dá)到不修改應(yīng)用代碼的前提下,擴(kuò)展數(shù)據(jù)庫(kù)架構(gòu)。
由于Mycat是國(guó)內(nèi)的開(kāi)源項(xiàng)目,有非常完善且豐富的中文文檔。所以本文就不對(duì)基礎(chǔ)概念進(jìn)行贅述了,建議參考Mycat權(quán)威指南在線版或到Mycat官網(wǎng)中了解更多關(guān)于Mycat的內(nèi)容。
數(shù)據(jù)庫(kù)中間件,就是介于數(shù)據(jù)庫(kù)與應(yīng)用之間,進(jìn)行數(shù)據(jù)處理與交互的中間服務(wù)。由于對(duì)數(shù)據(jù)進(jìn)行分片處理之后,從原有的一個(gè)庫(kù),被切分為多個(gè)分片數(shù)據(jù)庫(kù),所有的分片數(shù)據(jù)庫(kù)集群構(gòu)成了整個(gè)完整的數(shù)據(jù)庫(kù)存儲(chǔ)。
如上圖所表示,數(shù)據(jù)被分到多個(gè)分片數(shù)據(jù)庫(kù)后,應(yīng)用如果需要讀取數(shù)據(jù),就要需要處理多個(gè)數(shù)據(jù)源的數(shù)據(jù)。
如果沒(méi)有數(shù)據(jù)庫(kù)中間件,那么應(yīng)用將直接面對(duì)分片集群。那么數(shù)據(jù)源切換、事務(wù)處理以及數(shù)據(jù)聚合等問(wèn)題都需要應(yīng)用直接處理。這樣就會(huì)導(dǎo)致原本該是專(zhuān)注于業(yè)務(wù)的應(yīng)用,將會(huì)花大量的工作來(lái)處理分片后的問(wèn)題,最重要的是每個(gè)應(yīng)用處理將是完全的重復(fù)造輪子。
因此有了數(shù)據(jù)庫(kù)中間件,應(yīng)用只需要集中于業(yè)務(wù)處理。而大量的通用的數(shù)據(jù)聚合,事務(wù),數(shù)據(jù)源切換都由中間件來(lái)處理,中間件的性能與處理能力將直接決定應(yīng)用的讀寫(xiě)性能,所以一款好的數(shù)據(jù)庫(kù)中間件至關(guān)重要。
1、作為分布式數(shù)據(jù)庫(kù)中間件使用:
Mycat不僅可以連接mysql還可以連接其他諸如oracle、sql server等數(shù)據(jù)庫(kù),因?yàn)镸ycat是使用Java編寫(xiě)的,理論上只要Java能連接的數(shù)據(jù)庫(kù),Mycat都可以連接。這就可以使得應(yīng)用無(wú)需直連數(shù)據(jù)庫(kù),而是連接Mycat,此時(shí)后端數(shù)據(jù)庫(kù)對(duì)應(yīng)用就是透明的。這樣就可以對(duì)應(yīng)用屏蔽后端數(shù)據(jù)庫(kù)的復(fù)雜性,并保持連接方式的統(tǒng)一。
2、實(shí)現(xiàn)數(shù)據(jù)庫(kù)集群的讀寫(xiě)分離和負(fù)載均衡:
當(dāng)系統(tǒng)發(fā)展到后期,數(shù)據(jù)量上來(lái)后,數(shù)據(jù)庫(kù)架構(gòu)通常會(huì)向集群演進(jìn)。其中Replication集群方案,節(jié)點(diǎn)存在主從角色,也就是常說(shuō)的主從架構(gòu)。在這種集群下通常由主節(jié)點(diǎn)負(fù)責(zé)寫(xiě),從節(jié)點(diǎn)負(fù)責(zé)讀。而Mycat可以作為中間層實(shí)現(xiàn)讀寫(xiě)分離,無(wú)需每個(gè)應(yīng)用都寫(xiě)一套讀寫(xiě)分離邏輯。并且當(dāng)存在多個(gè)從節(jié)點(diǎn)時(shí),Mycat還可以將讀請(qǐng)求負(fù)載均衡到各個(gè)從節(jié)點(diǎn)上。
3、實(shí)現(xiàn)數(shù)據(jù)庫(kù)的高可用:
當(dāng)數(shù)據(jù)庫(kù)架構(gòu)是一主一從時(shí),可以利用Mycat實(shí)現(xiàn)數(shù)據(jù)庫(kù)的高可用。當(dāng)主節(jié)點(diǎn)掛掉后,Mycat可以切換到從節(jié)點(diǎn)上進(jìn)行讀寫(xiě)。但不適用于一主多從的情況,因?yàn)橹鞴?jié)點(diǎn)掛掉后,Mycat只能切換到其中一個(gè)從節(jié)點(diǎn)上,而不能改變節(jié)點(diǎn)的角色。這樣就會(huì)導(dǎo)致剩余的從節(jié)點(diǎn)無(wú)法對(duì)其進(jìn)行數(shù)據(jù)同步。因此,一主多從需采用MMM或MHA等方式來(lái)實(shí)現(xiàn)高可用。
4、對(duì)業(yè)務(wù)數(shù)據(jù)庫(kù)進(jìn)行垂直切分:
當(dāng)系統(tǒng)中的寫(xiě)負(fù)載上來(lái)后,單個(gè)主節(jié)點(diǎn)開(kāi)始無(wú)法承受寫(xiě)請(qǐng)求的壓力,這時(shí)就需要增加主節(jié)點(diǎn)來(lái)分擔(dān)負(fù)載。擁有多個(gè)主節(jié)點(diǎn)后,通常會(huì)將一個(gè)庫(kù)里沒(méi)有依賴(lài)關(guān)系的表拆分到不同的庫(kù)中,或?qū)⒁恍┐蟊聿鸪尚”恚苑稚⒇?fù)載。這也就是數(shù)據(jù)庫(kù)的垂直切分。
存在多個(gè)主節(jié)點(diǎn)就意味著應(yīng)用可能需要對(duì)多個(gè)數(shù)據(jù)庫(kù)進(jìn)行操作,而Mycat可以將多個(gè)數(shù)據(jù)庫(kù)抽象成一個(gè)邏輯庫(kù)。這樣對(duì)于應(yīng)用來(lái)說(shuō)就無(wú)需改動(dòng)代碼去操作多個(gè)數(shù)據(jù)源,只需要操作Mycat中的邏輯庫(kù)即可。
5、對(duì)業(yè)務(wù)數(shù)據(jù)庫(kù)進(jìn)行水平切分:
當(dāng)數(shù)據(jù)庫(kù)進(jìn)行了垂直切分后,可能依舊會(huì)有一些庫(kù)的寫(xiě)負(fù)載比較高,或者數(shù)據(jù)量達(dá)到單表極限。那么就需要考慮進(jìn)行水平切分,所謂水平切分就是分庫(kù)分表。垂直切分與水平切分的區(qū)別在于:水平切分后每個(gè)庫(kù)里的表結(jié)構(gòu)是一樣的,切分的是數(shù)據(jù)。而垂直切分則是不同的庫(kù)里表結(jié)構(gòu)是不一樣的,切分的是表。
當(dāng)數(shù)據(jù)庫(kù)進(jìn)行水平切分后,應(yīng)用在寫(xiě)數(shù)據(jù)時(shí)就需要考慮應(yīng)該將數(shù)據(jù)寫(xiě)入到哪一個(gè)庫(kù)中。而Mycat可以通過(guò)特定的策略將寫(xiě)請(qǐng)求分發(fā)到某個(gè)數(shù)據(jù)庫(kù)上,這樣應(yīng)用就只需要將寫(xiě)請(qǐng)求發(fā)給Mycat即可,無(wú)需考慮應(yīng)該寫(xiě)哪個(gè)庫(kù)。
6、控制數(shù)據(jù)庫(kù)連接數(shù)量:
系統(tǒng)中存在比較多的應(yīng)用,而每個(gè)應(yīng)用都有自己的一個(gè)連接池,那么當(dāng)訪問(wèn)量增大就有可能超出數(shù)據(jù)庫(kù)的大連接數(shù)量。此時(shí)就可以通過(guò)Mycat建立一個(gè)公共的連接池,所有的應(yīng)用都統(tǒng)一通過(guò)這個(gè)連接池來(lái)獲取數(shù)據(jù)庫(kù)的連接。從而控制同時(shí)連接數(shù)據(jù)庫(kù)的應(yīng)用數(shù)量,起到一個(gè)限流的作用,可以保證系統(tǒng)更加的穩(wěn)定。
邏輯庫(kù):
通常對(duì)實(shí)際應(yīng)用來(lái)說(shuō),并不需要知道Mycat的存在,業(yè)務(wù)開(kāi)發(fā)人員只需要知道數(shù)據(jù)庫(kù)的概念,所以數(shù)據(jù)庫(kù)中間件可以被看做是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)集群構(gòu)成的邏輯庫(kù),需要注意的是邏輯庫(kù)不存儲(chǔ)數(shù)據(jù)。所以不管中間件背后是怎么樣的數(shù)據(jù)庫(kù)架構(gòu),對(duì)于應(yīng)用來(lái)說(shuō)都是在操作一個(gè)數(shù)據(jù)庫(kù),而這個(gè)數(shù)據(jù)庫(kù)就是Mycat抽象出來(lái)的邏輯庫(kù)。
邏輯表:
既然有邏輯庫(kù),那么就會(huì)有邏輯表,分布式數(shù)據(jù)庫(kù)中,對(duì)應(yīng)用來(lái)說(shuō),讀寫(xiě)數(shù)據(jù)的表就是邏輯表。邏輯表,可以是數(shù)據(jù)切分后,分布在一個(gè)或多個(gè)分片庫(kù)中。也可以不做數(shù)據(jù)切分,不分片,只有一個(gè)表構(gòu)成。同樣,邏輯表也不存儲(chǔ)數(shù)據(jù)。
邏輯表分類(lèi):
- 分片表:數(shù)據(jù)被拆分到多個(gè)數(shù)據(jù)庫(kù)中的表
- 非分片表:數(shù)據(jù)未被拆分過(guò)的表
- 全局表:結(jié)構(gòu)類(lèi)似于字典并存在于所有分片中的表,目的是解決跨分片數(shù)據(jù) join
- ER 表:按 ER 關(guān)系進(jìn)行分片的表,目的是讓子表的記錄與所關(guān)聯(lián)的父表記錄存放在同一個(gè)數(shù)據(jù)分片上,保證數(shù)據(jù) join不會(huì)跨庫(kù)
環(huán)境:
首先到官方下載地址獲取下載鏈接,然后到linux使用如下命令進(jìn)行下載并解壓:
[root@txy-server ~]# cd /usr/local/src
[root@txy-server /usr/local/src]# wget http://dl.mycat.io/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
[root@txy-server /usr/local/src]# tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local/
解壓后,Mycat的目錄結(jié)構(gòu)如下:
[root@txy-server /usr/local/mycat]# ll -rh
total 24K
-rwxrwxrwx 1 root root 227 Jan 5 16:41 version.txt
drwxrwxrwx 2 root root 4.0K Jan 5 16:40 logs # 日志文件目錄
drwxr-xr-x 2 root root 4.0K Jan 6 20:40 lib # 庫(kù)文件目錄
drwxrwxrwx 4 root root 4.0K Jan 6 20:40 conf # 配置文件目錄
drwxrwxrwx 2 root root 4.0K Oct 22 21:26 catlet
drwxr-xr-x 2 root root 4.0K Jan 6 20:40 bin # 可執(zhí)行文件目錄
[root@txy-server /usr/local/mycat]#
為Mycat創(chuàng)建一個(gè)系統(tǒng)賬戶(hù),并更改mycat
目錄的所屬用戶(hù),因?yàn)樵趯?shí)際的環(huán)境中是不可能讓程序擁有root賬戶(hù)權(quán)限的。命令如下:
[root@txy-server /usr/local]# useradd mycat -s /sbin/nologin
[root@txy-server /usr/local]# chown -R mycat:mycat mycat/
配置環(huán)境變量:
[root@txy-server ~]# vim /etc/profile
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
[root@txy-server ~]# source /etc/profile
由于我這里機(jī)器內(nèi)存只有2G,所以需要修改一下Mycat啟動(dòng)參數(shù),將大內(nèi)存改為1G,該參數(shù)默認(rèn)是2G。當(dāng)然,如果你的機(jī)器內(nèi)存足夠的話就不需要更改:
[root@txy-server /usr/local]# vim mycat/conf/wrapper.conf
wrapper.java.additional.4=-XX:MaxDirectMemorySize=1G
啟動(dòng)Mycat服務(wù):
[root@txy-server ~]# mycat start
查看日志,輸出了successfully
表示啟動(dòng)成功:
[root@txy-server ~]# more /usr/local/mycat/logs/wrapper.log |grep successfully
INFO | jvm 1 | 2020/01/06 21:16:51 | MyCAT Server startup successfully. see logs in logs/mycat.log
[root@txy-server ~]#
Mycat啟動(dòng)后默認(rèn)會(huì)監(jiān)聽(tīng)8066、9066等端口,如果開(kāi)啟了防火墻,還需要對(duì)端口進(jìn)行放行。開(kāi)放端口的命令如下:
[root@txy-server ~]# firewall-cmd --zone=public --add-port=${端口號(hào)}/tcp --permanent
[root@txy-server ~]# firewall-cmd --reload
到此為止,我們就成功將Mycat服務(wù)搭建起來(lái)了。
搭建好Mycat之后,要如何進(jìn)行使用呢?第一步就是要了解其核心配置文件,由于篇幅有限關(guān)于配置的內(nèi)容在下一篇中進(jìn)行介紹:
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。