mysql資料庫讀寫分離教程
注意:實現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的服務可用性。
*****