Mycat 快速入門

什麼是Mycat

至於什麼是Mycat,可能在不同的角色下有不同的理解。對MySQL架構有過了解的話,都知道MySQL實際上是由Server層和存儲引擎層組成的。所以對於DBA來說,Mycat 就是 MySQL 的Server層。而 Mycat 後面連接的 MySQL Server,就好象是 MySQL 的存儲引擎。因此,Mycat 本身並不存儲數據,數據是在後端的 MySQL 上存儲的,因此數據的可靠性
以及事務等依舊是 MySQL 保證的。

對於開發人員來說,Mycat基本等同於MySQL。因爲完全可以使用連接MySQL的方式去連接Mycat,除了默認端口不同之外,連接方式上沒有區別。所以Mycat對於開發人員來說是透明的,只不過在SQL的使用上有一些限制。

而對於架構師來說,Mycat 是一個數據庫中間件,可以用作讀寫分離、分表分庫以及容災備份等。對於使用Mycat的應用來說,其隱藏了數據庫的存儲邏輯。讓我們無需在代碼上去對讀寫分離等存儲邏輯進行控制,從而達到不修改應用代碼的前提下,擴展數據庫架構。

由於Mycat是國內的開源項目,有非常完善且豐富的中文文檔。所以本文就不對基礎概念進行贅述了,建議參考Mycat權威指南在線版或到Mycat官網中瞭解更多關於Mycat的內容。


什麼是數據庫中間件

數據庫中間件,就是介於數據庫與應用之間,進行數據處理與交互的中間服務。由於對數據進行分片處理之後,從原有的一個庫,被切分爲多個分片數據庫,所有的分片數據庫集羣構成了整個完整的數據庫存儲。

Mycat 快速入門

如上圖所表示,數據被分到多個分片數據庫後,應用如果需要讀取數據,就要需要處理多個數據源的數據。

如果沒有數據庫中間件,那麼應用將直接面對分片集羣。那麼數據源切換、事務處理以及數據聚合等問題都需要應用直接處理。這樣就會導致原本該是專注於業務的應用,將會花大量的工作來處理分片後的問題,最重要的是每個應用處理將是完全的重複造輪子。

因此有了數據庫中間件,應用只需要集中於業務處理。而大量的通用的數據聚合,事務,數據源切換都由中間件來處理,中間件的性能與處理能力將直接決定應用的讀寫性能,所以一款好的數據庫中間件至關重要。


Mycat的主要作用

1、作爲分佈式數據庫中間件使用:

Mycat不僅可以連接mysql還可以連接其他諸如oracle、sql server等數據庫,因爲Mycat是使用Java編寫的,理論上只要Java能連接的數據庫,Mycat都可以連接。這就可以使得應用無需直連數據庫,而是連接Mycat,此時後端數據庫對應用就是透明的。這樣就可以對應用屏蔽後端數據庫的複雜性,並保持連接方式的統一。

2、實現數據庫集羣的讀寫分離和負載均衡:

當系統發展到後期,數據量上來後,數據庫架構通常會向集羣演進。其中Replication集羣方案,節點存在主從角色,也就是常說的主從架構。在這種集羣下通常由主節點負責寫,從節點負責讀。而Mycat可以作爲中間層實現讀寫分離,無需每個應用都寫一套讀寫分離邏輯。並且當存在多個從節點時,Mycat還可以將讀請求負載均衡到各個從節點上。

3、實現數據庫的高可用:

當數據庫架構是一主一從時,可以利用Mycat實現數據庫的高可用。當主節點掛掉後,Mycat可以切換到從節點上進行讀寫。但不適用於一主多從的情況,因爲主節點掛掉後,Mycat只能切換到其中一個從節點上,而不能改變節點的角色。這樣就會導致剩餘的從節點無法對其進行數據同步。因此,一主多從需採用MMM或MHA等方式來實現高可用。

4、對業務數據庫進行垂直切分:

當系統中的寫負載上來後,單個主節點開始無法承受寫請求的壓力,這時就需要增加主節點來分擔負載。擁有多個主節點後,通常會將一個庫裏沒有依賴關係的表拆分到不同的庫中,或將一些大表拆成小表,以分散負載。這也就是數據庫的垂直切分。

存在多個主節點就意味着應用可能需要對多個數據庫進行操作,而Mycat可以將多個數據庫抽象成一個邏輯庫。這樣對於應用來說就無需改動代碼去操作多個數據源,只需要操作Mycat中的邏輯庫即可。

5、對業務數據庫進行水平切分:

當數據庫進行了垂直切分後,可能依舊會有一些庫的寫負載比較高,或者數據量達到單表極限。那麼就需要考慮進行水平切分,所謂水平切分就是分庫分表。垂直切分與水平切分的區別在於:水平切分後每個庫裏的表結構是一樣的,切分的是數據。而垂直切分則是不同的庫裏表結構是不一樣的,切分的是表。

當數據庫進行水平切分後,應用在寫數據時就需要考慮應該將數據寫入到哪一個庫中。而Mycat可以通過特定的策略將寫請求分發到某個數據庫上,這樣應用就只需要將寫請求發給Mycat即可,無需考慮應該寫哪個庫。

6、控制數據庫連接數量:

系統中存在比較多的應用,而每個應用都有自己的一個連接池,那麼當訪問量增大就有可能超出數據庫的最大連接數量。此時就可以通過Mycat建立一個公共的連接池,所有的應用都統一通過這個連接池來獲取數據庫的連接。從而控制同時連接數據庫的應用數量,起到一個限流的作用,可以保證系統更加的穩定。


Mycat基本元素

邏輯庫:

通常對實際應用來說,並不需要知道Mycat的存在,業務開發人員只需要知道數據庫的概念,所以數據庫中間件可以被看做是一個或多個數據庫集羣構成的邏輯庫,需要注意的是邏輯庫不存儲數據。所以不管中間件背後是怎麼樣的數據庫架構,對於應用來說都是在操作一個數據庫,而這個數據庫就是Mycat抽象出來的邏輯庫。

邏輯表:

既然有邏輯庫,那麼就會有邏輯表,分佈式數據庫中,對應用來說,讀寫數據的表就是邏輯表。邏輯表,可以是數據切分後,分佈在一個或多個分片庫中。也可以不做數據切分,不分片,只有一個表構成。同樣,邏輯表也不存儲數據。

邏輯表分類:

  • 分片表:數據被拆分到多個數據庫中的表
  • 非分片表:數據未被拆分過的表
  • 全局表:結構類似於字典並存在於所有分片中的表,目的是解決跨分片數據 join
  • ER 表:按 ER 關係進行分片的表,目的是讓子表的記錄與所關聯的父表記錄存放在同一個數據分片上,保證數據 join不會跨庫

Mycat安裝

環境:

  • 系統:CentOS 7
  • JDK:11
  • Mycat:1.6.7.4

首先到官方下載地址獲取下載鏈接,然後到linux使用如下命令進行下載並解壓:

[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的目錄結構如下:

[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  # 庫文件目錄
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  # 可執行文件目錄
[root@txy-server /usr/local/mycat]#

爲Mycat創建一個系統賬戶,並更改mycat目錄的所屬用戶,因爲在實際的環境中是不可能讓程序擁有root賬戶權限的。命令如下:

[root@txy-server /usr/local]# useradd mycat -s /sbin/nologin
[root@txy-server /usr/local]# chown -R mycat:mycat mycat/

配置環境變量:

[root@txy-server ~]# vim /etc/profile
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
[root@txy-server ~]# source /etc/profile

由於我這裏機器內存只有2G,所以需要修改一下Mycat啓動參數,將最大內存改爲1G,該參數默認是2G。當然,如果你的機器內存足夠的話就不需要更改:

[root@txy-server /usr/local]# vim mycat/conf/wrapper.conf
wrapper.java.additional.4=-XX:MaxDirectMemorySize=1G

啓動Mycat服務:

[root@txy-server ~]# mycat start

查看日誌,輸出了successfully表示啓動成功:

[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啓動後默認會監聽8066、9066等端口,如果開啓了防火牆,還需要對端口進行放行。開放端口的命令如下:

[root@txy-server ~]# firewall-cmd --zone=public --add-port=${端口號}/tcp --permanent
[root@txy-server ~]# firewall-cmd --reload

到此爲止,我們就成功將Mycat服務搭建起來了。


搭建好Mycat之後,要如何進行使用呢?第一步就是要了解其核心配置文件,由於篇幅有限關於配置的內容在下一篇中進行介紹:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章