1. 程式人生 > 實用技巧 >mysql資料庫讀寫分離教程

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

*****