mycat實現mysql讀寫分離,熱切換,集羣

在互聯網時代,實現mysql讀寫分離,熱切換,集羣能大大提高mysql數據庫訪問壓力,防止數據丟失,使用mycat能幫我們實現這些。我們要實現的是這種架構。

這裏寫圖片描述

1、Mycat能實現數據庫的垂直切分和水平切分,這裏用戶寫數據的時候,通過mycat把數據按照特定的規則存儲到mysql-1,mysql-2,mysq-3…中,讀的時候,分佈從mysql-1,mysql-2,mysql-3…等讀出數據然後由tomcat合併結果給客戶端,這樣子能分發數據庫的壓力,實現mysql的集羣。

2、Mysql自身能支持主從複製和主主複製,能夠在不同服務器的數據庫中相互複製數據,這是實現讀寫分離的前提。

3、Mycat能支持mysql的讀寫分離,還有熱切換,可以在conf下schema.xml配置。

<dataHost name="master1" maxCon="1000" minCon="10" balance="1"
       writeType="0" dbType="mysql" dbDriver="native">
       <heartbeat>show slave status</heartbeat> 
       <writeHost host="host1" url="192.168.137.101:3306" user="root" password="123" >
          <readHost host="host3" url="192.168.137.103:3306" user="root" password="123" />
       </writeHost>
</dataHost><dataHost name="master2" maxCon="1000" minCon="10" balance="1"
       writeType="0" dbType="mysql" dbDriver="native">
       <heartbeat>show slave status</heartbeat> 
       <writeHost host="host2" url="192.168.137.102:3306" user="root" password="123" />
       <writeHost host="host4" url="192.168.137.104:3306" user="root" password="123" /> 
</dataHost>

第一種的缺點是,當主down了之後,從也就不能讀了,第二種,當主掛了,從還可以切換,繼續可以用,上面的架構圖中,我們採用第二種模式,另外在同步數據的時候,我們爲什麼要處理充主主同步,而不是主從同步呢,原因是,當主掛了之後,作爲熱備的mysql可以切換作爲主繼續服務,然後我們可以恢復原先down的mysql機器,那麼他就可以同步數據了。如果是主從的話,當主down了之後,從切換爲主,但是當原因的主重啓之後,就很難同步從的mysq的數據了。那我們就來配置下上面那個架構

1、配置conf/schema.xml,配置切片集羣,還有讀寫分離,熱切換,主主數據的同步,參考http://blog.csdn.net/yingxiake/article/details/51691986http://blog.csdn.net/yingxiake/article/details/51693537

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

    <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
       <table name="tb_fenpian" dataNode="dn1,dn2" rule="rule1" primaryKey="id"/>
    </schema>

    <!--將邏輯數據庫和實際數據庫進行關聯-->
    <dataNode name="dn1" dataHost="master1" database="fenpian" /> 
    <dataNode name="dn2" dataHost="master2" database="fenpian" />

    <!--切片mysql-1-->
    <dataHost name="master1" maxCon="1000" minCon="10" balance="1"
       writeType="0" dbType="mysql" dbDriver="native">
       <heartbeat>show slave status</heartbeat> 
       <!--主,用於寫-->
       <writeHost host="host1" url="192.168.137.101:3306" user="root" password="123" />
         <!--主2,用於讀,host1 down了,自動切換爲主,讀寫都可以-->
       <writeHost host="host3" url="192.168.137.103:3306" user="root" password="123" /> 
    </dataHost> 
    <!--切片mysql-2-->
    <dataHost name="master2" maxCon="1000" minCon="10" balance="1"
       writeType="0" dbType="mysql" dbDriver="native">
       <heartbeat>show slave status</heartbeat> 
       <!--主1,用於寫-->
       <writeHost host="host2" url="192.168.137.102:3306" user="root" password="123" />
       <!--主2,用於讀,host2 down了,自動切換爲主,讀寫都可以-->
       <writeHost host="host4" url="192.168.137.104:3306" user="root" password="123" /> 
    </dataHost>

</mycat:schema>

這裏要說下,mycat讀寫分離的一些關鍵配置,按照官方文檔說明:

a. balance 屬性負載均衡類型,目前的取值有 4 種:
1. balance=”0”, 不開啓讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上。
2. balance=”1”,全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1 ->S1 , M2->S2,並且 M1 與 M2 互爲主備),正常情況下, M2,S1,S2 都參與 select 語句的負載均衡。
3. balance=”2”,所有讀操作都隨機的在 writeHost、 readhost 上分發。
4. balance=”3”, 所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,注意 balance=3 只在 1.4 及其以後版本有, 1.3 沒有。

b. writeType 屬性,負載均衡類型,目前的取值有 3 種:
1. writeType=”0”, 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個
writeHost,重新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .
2. writeType=”1”,所有寫操作都隨機的發送到配置的 writeHost。
3. writeType=”2”,沒實現。

c. switchType 屬性
- -1 表示不自動切換
- 1 默認值,自動切換
- 2 基於MySQL 主從同步的狀態決定是否切換

2、配置conf/schema.xml了,需要配下分片規則,在/conf/rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/"> 
 <tableRule name="rule1">
    <rule>
      <columns>id</columns>
      <algorithm>func1</algorithm>
    </rule>
 </tableRule>

 <function name="func1" class="org.opencloudb.route.function.PartitionByLong">
    <property name="partitionCount">2</property>
    <property name="partitionLength">512</property>
 </function>
</mycat:rule>

3、配置下鏈接mysql的帳號信息等,/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
      <property name="defaultSqlParser">druidparser</property>
    </system>
    <user name="test">
        <property name="password">test</property>
        <property name="schemas">test</property>
    </user>

    <user name="user">
        <property name="password">user</property>
        <property name="schemas">test</property>
        <property name="readOnly">true</property>
    </user>
</mycat:server>

4、進行測試步驟,可以按如下方式進行,本人測試通過,mycat是放在windows上,四個mysql是放在linux rhel7的四個虛擬機上。

a.驗證分片規則集羣,在mycat分別插入id爲1還有id爲513的數據,看看是否能根據id的分片規則,分佈差到倆個數據庫中,1在0~512,應該到101的數據庫中,513在512~1024應該到102的數據庫中

b.驗證主主數據是否同步,查看年103還有104的數據是否和101和102的數據庫數據一致

c.驗證熱切換,將101down掉,103是否能繼續服務,讀寫是否正常,然後再啓動101,是否正常

d.讀寫分離在主主同步的架構下,還沒想出測試的方式,再看看。

現在這個架構還存在一個問題,就是mycat單點問題,由於篇幅問題,就留在下一篇博客寫吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章