注意:實現MySQL讀寫分離的前提是我們已經將MySQL主從復制配置完畢
一、Mycat實現讀寫分離安裝和配置
架構規划:
192.168.201.150 master 主節點 192.168.201.154 slave 從節點 192.168.201.156 Mycat 代理中間件
1.1、下載Mycat 官方網站:http://www.mycat.org.cn/
http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz //我這里選用的是1.6版本,下載后上傳到mycat服務器
1.2、 解壓mycat
[root@mysqlmycat ~]# java -version //因為mycat是用java開發的,所以需要安裝有java的環境,安裝方法:https://www.cnblogs.com/patrick-yeh/p/14201966.html
[root@mysqlmycat ~]# tar –zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz //注意需要看一下自己下載的哪個版本
1.3、 把mycat文件夾移動到/usr目錄下
[root@mysqlmycat ~]# mv mycat /usr
1.4、 查看解壓之后的目錄
[root@mysqlmycat ~]# cd /usr/mycat
[root@mysqlmycat usr]# ll
bin:存放啟動和關閉mycat的文件的目錄,(重點關注目錄下的mycat)
catlet:存放一些小的程序,內部的應用(無需關注)
conf:存放mycat配置文件的目錄(重點關注,schema.xml、server.xml)
lib:存放mycat啟動依賴的第三方jar包的目錄
logs:存放Mycat日志的目錄
1.5、 修改mycat中conf下的配置文件schema.xml,添加以下內容:
[root@mysqlmycat mycat]# vim /usr/mycat/conf/schema.xml
<!--定義mycat的邏輯庫 dataNode代表映射的真實數據節點--> <schema name="aa" checkSQLschema="false" sqlMaxLimit="100" dataNode="ygbookNode"></schema> <!--定義mycat的數據節點 name:必須和上面dataNode值一致 dataHost:映射真實的主機 database:映射真實的庫--> <dataNode name="ygbookNode" dataHost="ygbookHost" database="ygbook" /> <!--定義數據主機 name:名字必須和datahHost保持一致 --> <dataHost name="ygbookHost" maxCon="1000" minCon="10" balance="1" writeType="0" dbTypte="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> <!--心跳檢測--> <heartbeat>select user()</heartbeat> <!--寫節點 host名字隨便寫,hostM1:master1的簡稱--> <writeHost host="hostM1" url="192.168.201.150:3306" user="root" password="xxx"> <!--從節點 S1即slave1--> <readHost host="hostS1" url="192.168.201.154:3306" user="root" password="xxx" /> </writeHost> </dataHost>
注意:原schema.xml文件中的配置都可以刪除了,只保留以上內容
1.6、修改登錄mycat的權限文件server.xml
[root@mysqlmycat mycat]# vim /usr/mycat/conf/schema.xml <system> <!--這里配置的都是一些系統屬性,可以自己查看mycat文檔--> <property name="defaultSqlPariser">druidparser</property> <!--5.x版本必須是utf8--> <property name="charset">utf8</property> </system> <!--配置用戶信息 name:代表登陸mycat用戶名 password:代表登陸的密碼--> <user name="root"> <property name="password">xxx</property> <!--用來指定可以操作的邏輯庫--> <property name="schemas">aa</property> </user>
注意:原server.xml文件中的配置都可以刪除了,只保留以上內容
1.7、 啟動mycat
[root@mysqlmycat bin]# cd /usr/mycat/bin
[root@mysqlmycat bin]# ./mycat console
1.8、 查看日志
[root@mysqlmycat bin]# tail -f ../logs/mycat.log
1.9、 數據庫連接配置,測試
知識拓展:
1)配置多數據源;
2)使用mysql的proxy中間件代理工具;
第一種方式中,數據庫和Application是有一定侵入性的,即我們的數據庫更換時,application中的配置文件是需要手動修改的。而第二種方式中,我們可選擇mysql proxy固定連接一個數據庫,即使數據庫地址更換也無需更換項目中的數據庫連接配置。
同樣,在開始配置實現MySQL讀寫分離之前,我們會遇到一個選型問題,那就是在諸多的MySQL的proxy中間件工具中,如
mysql-proxy
、
atlas
、
cobar
、
mycat
、
tddl
、
tinnydbrouter
和
mysql router
等,我們該如何取舍呢?所以在擇工具實現前,我們先對以上的proxy中間件做一個簡單的優劣介紹,以便我們根據不同的場景選擇。
二.MySQL的proxy中間件工具優劣
以下主要對比MyCat和MySQL Router。
2.1 MyCat
是基於阿里巴巴的Cobar方案優化而來,支持半自動化分片,join。為什么叫"半自動化"呢?因為需要DBA對每個表的分片策略進行配置和干涉。
優點:
- 功能較豐富,對讀寫分離和分庫分表都有支持;
- 易用,且對原有的應用系統侵入比較小,系統改造比較易於實現;
- 支持故障切換;
不足:
- 在整個系統中,MyCat作為一個單節點來路由其他數據庫,在數據庫比較多的情況下,MyCat本身的CPU性能壓力會越來越大。因此,在生產系統中,MyCat不可避免的會需要一些高可用的手段;
- 同樣,由於MyCat本身需要解析sql,也需要合並各個數據庫返回的結果,本身CPU消耗會比較高,當達到一定臨界點時,CPU可能會不堪重負。
為此,在數據庫較多的情況下,生產環境下的部署可能是這樣的:

2.2 MySQL Router
MySQL Router是MySQL官方提供的一個輕量級中間件,可以在應用程序與MySQL服務器之間提供透明的路由方式。主要用以解決MySQL主從庫集群的高可用、負載均衡、易擴展等問題。Router可以與MySQL Fabric無縫連接,允許Fabric存儲和管理用於路由的高可用數據庫服務器組,使管理MySQL服務器組更加簡單。
MySQL Router是一個可執行文件,可以與應用程序在同一平台上運行,也可以單獨部署。雖然MySQL Router是InnoDB Cluster(MySQL 7.X)的一部分,MySQL 5.6 等版本數據庫仍然可以使用Router作為其中間代理層。MySQL Router的配置文件中包含有關如何執行路由的信息。它與MySQL服務器的配置文件類似,也是由多個段組成,每個段中包含相關配置選項。
MySQL Router是MySQL Proxy的替代方案,MySQL官方不建議將MySQL Proxy用於生產環境,並且已經不提供MySQL Proxy的下載。
優點:
- 類似於nginx,位於Application與MySQL Server之間。Application不再直連MySQL Server,而是與Router相連,根據Router的配置,將會把應用程序的讀、寫請求轉發給下游的MySQL Server;
- 支持故障切換:當下游某個Server失效時,Router可以將其從Active列表中移除,當其online后再次加入Active列表,即提供了Failover特性;
- 當MySQL Server集群拓撲變更時,比如增減Slaves節點,只需要修改Router配置即可,無需修改應用中的數據庫連接配置;
- 如果MySQL Servers為5.7+版本,且構建為InnoDB Cluster模式,那么Router還能基於metaCache(metaServers)機制,感知MySQL Servers的主從切換、從庫增減等集群拓撲變更,而且基於變更能夠實現Master自動切換、Slaves列表自動裝配等。比如Master失效后,Cluster將會自動選舉一個新的Master,此時Router不需要任何調整、可以自動發現此新Master進而繼續為應用服務。
不足:
- Router中間件本身不會對請求“拆包”(unpackage),所以無法在Router中間件上實現比如“SQL審計”、“隔離”、“限流”、“分庫分表”等功能。但是Router提供了plugin(C語言)機制,我們可以開發自己的plugin來擴展Router的額外特性;
- 數據存儲在內存中,數據量較大時,硬件需求會提升;
- 在非InnoDB Cluster架構模式下,如果主從庫拓撲變更,需要手動修改Router配置。且Router不支持“reload”,修改配置后需要重啟,這在一定程度上會影響Application的服務可用性。
*****