系統開發中,資料庫是非常重要的一個點。除了程序的本身的優化,如:SQL語句優化、代碼優化,資料庫的處理本身優化也是非常重要的。主從、熱備、分表分庫等都是系統發展遲早會遇到的技術問題問題。Mycat是一個廣受好評的資料庫中間件,已經在很多產品上進行使用了。下面就針對Mycat的基礎知識和應用做一總結性梳理。
MyCat是一個開源的分布式資料庫系統,是一個實現了MySQL協議的伺服器,前端用戶可以把它看作是一個資料庫代理(類似於Mysql Proxy),用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL伺服器通信,也可以用JDBC協議與大多數主流資料庫伺服器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在後端MySQL伺服器裡或者其他資料庫裡。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是哪種存儲方式,在MyCat裡,都是一個傳統的資料庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度。
Mycat可以簡單概括為
Mycat關鍵特性
這裡要先搞清楚Mycat和MySQL的區別(Mycat的核心作用)。我們可以把上層看作是對下層的抽象,例如作業系統是對各類計算機硬體的抽象。那麼我們什麼時候需要抽象?假如只有一種硬體的時候,我們需要開發一個作業系統嗎?再比如一個項目只需要一個人完成的時候不需要leader,但是當需要幾十人完成時,就應該有一個管理者,發揮溝通協調等作用,而這個管理者對於他的上層來說就是對項目組的抽象。
同樣的,當我們的應用只需要一臺資料庫伺服器的時候我們並不需要Mycat,而如果你需要分庫甚至分表,這時候應用要面對很多個資料庫的時候,這個時候就需要對資料庫層做一個抽象,來管理這些資料庫,而最上面的應用只需要面對一個資料庫層的抽象或者說資料庫中間件就好了,這就是Mycat的核心作用。所以可以這樣理解:資料庫是對底層存儲文件的抽象,而Mycat是對資料庫的抽象。
Mycat的原理並不複雜,複雜的是代碼。Mycat的原理中最重要的一個動詞是「攔截」,它攔截了用戶發送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分
片分析、路由分析、讀寫分離分析、緩存分析等,然後將此SQL發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給用戶。
上述圖片裡,Orders表被分為三個分片datanode(簡稱dn),這三個分片是分布在兩臺MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一臺到N臺伺服器來分片,分片規則為(sharding rule)典型的字符串枚舉分片規則,一個規則的定義是分片欄位(sharding column)+分片函數(rule function),這裡的分片欄位為prov而分片函數為字符串枚舉方式。
當Mycat收到一個SQL時,會先解析這個SQL,查找涉及到的表,然後看此表的定義,如果有分片規則,則獲取到SQL裡分片欄位的值,並匹配分片函數,得到該SQL對應的分片列表,然後將SQL發往這些分片去執行,最後收集和處理所有分片返回的結果數據,並輸出到客戶端。以select * from Orders where prov=?語句為例,查到prov=wuhan,按照分片函數,wuhan返回dn1,於是SQL就發給了MySQL1,去取DB1上的查詢結果,並返回給用戶。
如果上述SQL改為select * from Orders where prov in (『wuhan』,『beijing』),那麼,SQL就會發給MySQL1與MySQL2去執行,然後結果集合併後輸出給用戶。但通常業務中我們的SQL會有Order By 以及Limit翻頁語法,此時就涉及到結果集在Mycat端的二次處理,這部分的代碼也比較複雜,而最複雜的則屬兩個表的Jion問題,為此,Mycat提出了創新性的ER分片、全局表、HBT(Human Brain Tech)人工智慧的Catlet、以及結合Storm/Spark引擎等十八般武藝的解決辦法,從而成為目前業界最強大的方案,這就是開源的力量!
需要注意: 在生產環境中, Mycat節點最好使用雙節點, 即雙機熱備環境, 防止Mycat這一層出現單點故障. 可以使用的高可用集群方式有: Keepalived+Mycat+Mysql, Keepalived+LVS+Mycat+Mysql, Keepalived+Haproxy+Mycat+Mysql
1、準備工作
(1)mysql節點的及mycat節點的準備
(2)拓撲結構
2、配置主從同步
(1)配置主庫
39;repl&39;192.168.16.%&39;replication&39;repl&39;192.168.16.%& 配置主庫的server-id及開啟binglog,配置完成後需要重啟mysql[mysqld]log-bin=mysql-bin server-id=1 設置字符集及需要同步的庫replicate-do-db=coursecharacter-set-server=utf8init_connect=&39; 獲取當前日誌信息mysql> SHOW MASTER STATUS\G*************************** 1. row *************************** File: mysql-bin.000001 Position: 1594 mysqldump --all-databases --master-data -u root -p > dbdump.db~] 釋放主庫鎖mysql> unlock tables;
(2)配置從庫
設置字符集及需要同步的庫replicate-do-db=coursecharacter-set-server=utf8init_connect=&39; 在從庫上導入主庫導出的數據~] 登錄資料庫開啟主從同步mysql> reset slave;mysql> CHANGE MASTER TO -> MASTER_HOST=&39;, -> MASTER_PORT=3306, -> MASTER_USER=&39;, -> MASTER_PASSWORD=&39;, -> MASTER_LOG_FILE=&39;, -> MASTER_LOG_POS=194;mysql> start slave;
3、配置mycat
(1)配置schema.xml文件
Schema.xml文件的配置內容如下
<?xml version=&34;?><!DOCTYPE mycat:schema SYSTEM &34;><mycat:schema xmlns:mycat=&34;> <!--定義邏輯庫,TESTDB一定要大寫。由於沒有對表分片,不需要定義table,並且讓語句原封不動的發往後端--> <schema name=&34; checkSQLschema=&34; sqlMaxLimit=&34;> </schema> <!--數據節點dn1,對應的主機c1,對應是資料庫db1 --> <dataNode name=&34; dataHost=&34; database=&34; /> <!-- 定義主機C1,開啟讀寫分離機制--> <dataHost name=&34; maxCon=&34; minCon=&34; balance=&34; writeType=&34; switchType=&34; dbType=&34; dbDriver=&34;> <!--定義心跳檢測機制--> <heartbeat>select user()</heartbeat> <!--定義MySQL的寫的數據,master1 --> <writeHost host=&34; url=&34; user=&34; password=&34;> <!--定義MySQL讀的資料庫,slave1 --> <readHost host=&34; url=&34; user=&34; password=&34; /> </writeHost> </dataHost></mycat:schema>
(2)配置server.xml
通過server.xml定義登錄mycat的庫以及登錄用戶,定義的邏輯庫名與schema.xml中schema標籤中的name欄位定義的庫名要相同。添加定義一個登錄用戶的配置文件如下:
<!--配置用戶名--> <user name=&34;> <!--配置密碼--> <property name=&34;>dayi123</property> <!--配置邏輯庫--> <property name=&34;>testdb</property> </user>
(3)使用mycat
由於沒有使用分片功能所以不用配置rule.xml,配置完成後重啟mycat後即可使用。
./mycat restart mysql -h192.168.16.155 -uroot -p -P8066 登錄mycat管理埠]# mysql -h127.0.0.1 -uuser -puser -P9066
Mycat的主要管理命令如下:
以上就是小編整理的MyCat簡介,只是個人的想法,有哪裡不準確的地方,還請各位大佬多多指出,咱們共同學習進步~~~
感覺文章整理的對自己有幫助的朋友,請關注小編,你們的支持就是小編最大的動力~~~