1. 程式人生 > >window下使用MyCat實現簡單的讀寫分離

window下使用MyCat實現簡單的讀寫分離

穩定版 情況 pri efault utf utf8 strong handler ear

參考文檔

MyCat權威指南
MyCat項目主頁
學會數據庫讀寫分離、分表分庫——用Mycat,這一篇就夠了!

MyCat安裝

Java SDK下載(必須JDK7或更高版本)
MYSQL下載 (MyCat支持多種數據庫接入 如:MYSQL、SQLService、Oracle、MongDB等)
MyCat下載(選擇穩定版且適合自己系統的壓縮包)

MyCat目錄介紹

目錄 說明
bin 封裝成服務的命令
catlet mycat擴展功能
conf 配置信息
lib 引用的jar包
log 日誌文件,包括mycat啟動和運行日誌

其中著重說明下conf目錄下的配置文件信息

文件 說明
server.xml 定義用戶以及系統相關變量
schema.xml 定義邏輯庫,表,分片節點
rule.xml 定義分片規則

前置

服務器 IP 說明
MyCat 127.0.0.1 mycat服務器
MYSQL DB 1 127.0.0.1:3306 mysql數據庫
MYSQL DB 2 127.0.0.1:3307 mysql數據庫

mycat服務端口8806,可以通過shell或者sql管理工具來直接連接。
mycat管理端口9906,連接後可以根據命令查看mycat的運行情況。可以使用mycat-web來配置一個可視化的UI管理後臺。

DB1和DB2先建立主從同步功能,DB1為主DB2為從,具體配置請參考上一節隨筆。

配置信息

server.xml

<!-- 用戶節點配置 -->
<!-- name:連接mycat的用戶名 -->
<user name="root" defaultAccount="true">
    <!-- password:連接mycat的密碼 -->
    <property name="password">123456</property>
    <!-- 數據庫名,與schema.xml中的配置關聯,多個用逗號分開 -->
    <property name="schemas">TESTDB</property>
     
    <!-- 表級 DML 權限設置 -->
    <!--        
    <privileges check="false">
        <schema name="TESTDB" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>     
     -->
</user>

schema.xml

<!-- 數據庫配置,與server.xml中的數據庫對應 -->
<!-- 
    name:邏輯數據庫名,與server.xml中的schema對應
    checkSQLschema:數據庫前綴相關設置
    sqlMaxLimit:查詢時默認limit,避免全表查詢
-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- 分片配置 -->
<dataNode name="dn1" dataHost="localhost1" database="db01" />
<!-- 物理數據庫配置 -->
<!--
    minCon:指定每個讀寫實例連接池的最小連接,初始化連接池的大小
    maxCon:指定每個讀寫實例連接池的最大連接。也就是說,標簽內嵌套的 writeHost、readHost 標簽都會使用這個屬性的值來實例化出連接池的最大連接數。
    dbDriver:指定連接後端數據庫使用的 Driver,目前可選的值有 native 和 JDBC。從 1.6 版本開始支持 postgresql 的 native 原始協議。
    balance:均衡負載方式
        0:不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上
        1:全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡
        2:所有讀操作都隨機的在 writeHost、readhost 上分發
        3:所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力
    writeType:均衡負載方式
        0: 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost,重新啟動後已切換後的為準,切換記錄在配置文件中:dnindex.properties .
        1:所有寫操作都隨機的發送到配置的 writeHost,1.5 以後廢棄不推薦
    switchType:切換方式
        -1: 表示不自動切換
        1:默認值,自動切換
        2:基於 MySQL 主從同步的狀態決定是否切換
        3:基於 MySQL galary cluster 的切換機制(適合集群),心跳語句為 show status like ‘wsrep%’.
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="0"  slaveThreshold="100">
    <!--心跳檢測-->
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostMaster" url="127.0.0.1:3306" user="root"
               password="123456">
        <readHost host="hostSlave" url="127.0.0.1:3307" user="root" password="123456" />
    </writeHost>
</dataHost>

預期效果

開啟MYSQL3306和3307服務,啟動MyCat(mycat安裝目錄bin下,點擊startup_nowrap.bat即可),使用Navicat Premium可視化管理工具,連接三者。在mycat服務端下,為表CRUD時,可看到相應的效果。
技術分享圖片
在查詢時,查看mycat運行日誌mycat
.log可以看到連接的是配置的讀數據庫3307。

INFO [$_NIOREACTOR-3-RW] (io.mycat.backend.mysql.nio.handler.NewConnectionRespHandler.connectionAcquired(NewConnectionRespHandler.java:44)) - connectionAcquired MySQLConnection [id=17, lastTime=1526867502288, user=root, schema=db01, old shema=db01, borrowed=true, fromSlaveDB=true, threadId=34, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=127.0.0.1, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]

非查詢語句時則操作的是數據庫3306。

可使用@@port來追蹤操作的是哪個庫

window下使用MyCat實現簡單的讀寫分離