1. 程式人生 > 實用技巧 >Mycat實現讀寫分離

Mycat實現讀寫分離

Mycat是什麼?

Mycat 是資料庫中介軟體。主要是做資料分散式儲存,也有Atlas普通版的讀寫分離功能,其最重要還是分散式

Mycat是java語言開發的。是一個開源的分散式資料庫系統,是一個實現了MySQL協議的的Server,前端使用者可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令列訪問,而其後端可以用MySQL原生(Native)協議與多個MySQL伺服器通訊,也可以用JDBC協議與大多數主流資料庫伺服器通訊,其核心功能是分表分庫,即將一個大表水平分割為N個小表,儲存在後端MySQL伺服器裡或者其他資料庫裡

  • 支援Mysql叢集,可以作為Proxy使用

  • 支援JDBC連線多資料庫

  • 支援各種資料庫,包括Mysql、mongodb、oracle、sqlserver、hive 、db2 、 postgresql。

  • 支援galera for mysql叢集,percona-cluster或者mariadb cluster,提供高可用性資料分片叢集

  • 自動故障切換,高可用性

  • 支援讀寫分離,支援Mysql雙主多從,以及一主多從的模式

  • 支援全域性表,資料自動分片到多個節點,用於高效表關聯查詢

  • 支援獨有的基於E-R 關係的分片策略,實現了高效的表關聯查詢

  • 支援一致性Hash分片,有效解決分片擴容難題

  • 多平臺支援,部署和實施簡單

  • 支援Mysql儲存過程呼叫

  • 以外掛方式支援SQL攔截和改寫

  • 支援自增長主鍵、支援Oracle的Sequence機制

Mycat應用場景:

  • 單純的讀寫分離,此時配置最為簡單,支援讀寫分離主從切換

  • 分表分庫,對於超過1000萬的表進行分片,最大支援1000億的單表分片

  • 多租戶應用,每個應用一個庫,但應用程式只連線Mycat,從而不改造程式本身,實現多 租戶化

  • 報表系統,藉助於Mycat的分表能力,處理大規模報表的統計

Mycat分片規則:

  • 分表分庫雖然能解決大表對資料庫系統的壓力,但它並不是萬能的,也有一些不利之處,因此首要問題是,分不分庫,分哪些庫,什麼規則分,分多少分片。

  • 總體上來說,分片的選擇是取決於最頻繁的查詢SQL的條件

    ,因為不帶任何Where語句的查詢SQL,會便利所有的分片,效能相對最差,因此這種SQL越多,對系統的影響越大,所以我們要儘量避免這種SQL的產生。

Mycat讀寫分離部署:

搭建一主一從,一個主機用於處理所有寫請求,一臺從機負責所有讀請求,架構圖如下:

  • 安裝Java環境
    yum -y install java-openjdk
  • 下Mycat軟體包
    wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz  
  • 解壓到指定路徑
    tar -zxf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz  -C  /usr/local/
    
  • 配置環境變數
    echo 'export PATH=/usr/local/mycat/bin:$PATH' >> /etc/profile
    source /etc/profile
    
  • /usr/local/mycat/conf 配置檔案說明:

schema.xml 主配置檔案(讀寫分離、高可用、分表、節點控制)
server.xml mycat軟體本身相關的配置
rule.xml 分片規則配置檔案(分片規則列表、使用方法)

  • /usr/local/mycar/log 日誌檔案說明:

mycat.log Mycat工作日誌
mycat.pid pid檔案
wrapper.log Mycat啟動相關日誌

  • 編輯schema.xml主配置檔案
    mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak
    
    
    vim /usr/local/mycat/conf/schema.xml
    <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mycat_testdb" checkSQLschema="flase" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database= "school" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.1.128:3306" user="root" password="abc123"> <readHost host="hostS1" url="192.168.1.130:3306" user="root" password="abc123" /> </writeHost> </dataHost> </mycat:schema> 
  • 修改server.xml配置檔案 在server.xml配置檔案最底部
  • schema.xml 配置檔案說明
    #定義mycat工作庫mycat_testdb是mycat的一個邏輯庫,可以自定義,但是涉及另外一個server.xml配置檔案。mycat_testdb邏輯庫對應dn1這個資料節點
    <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    </schema>
    
    # 定義名為dn1這個資料節點的邏輯主機地址。和真實的後端資料庫中的school庫名。
        <dataNode name="dn1" dataHost="host1" database="school" />

    # host1這個邏輯主機的最大併發連線數。最小連線(類似預熱資料,提前連線好,節省臨時連線的消耗)。balance預設為1,為負載均衡到所有從庫讀操作。 writeType預設為0,寫操作只分配到第一個writeHost資料庫例項組。指定後端資料庫軟體型別。 dbDriver是驅動。 switchType="1"是主庫宕機,自動切換到其他預備主資料庫例項組 dbDriver(使用native的話,因為這個值執行的是二進位制的mysql協議,所以可以使用mysql和maridb,其他型別的則需要使用JDBC驅動來支援。) <dataHost name="ost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">

    # mycat監控後端mysql是否可用,走的心跳資訊 <heartbeat>select user()</heartbeat>

    # 定義localhost1邏輯主機中的真實主機,這是邏輯主機中的一個真實“可寫”節點 <writeHost host="hostM1" url="192.168.1.128:3306" user="root" password="abc123">
    # 定義localhost1邏輯主機中的真實主機,這是邏輯主機中的一個真實“可讀”節點 <readHost host="hostS1" url="192.168.1.130:3306" user="root" password="abc123" />
  • server.xml說明

  • 啟動Mycat
    mycat start
    
  • 檢視日誌是否啟動成功