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-proxyatlascobarmycattddltinnydbroutermysql 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的服務可用性。

 

 

 

*****

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM