Mycat分布式數據庫架構解決方案--Mycat實現讀寫分離


echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!!


安裝完成之后,我們對Mycat的重要配置文件進行了解析,到這里已經對Mycat有了一定的認識,那么我們開始來啟動Mycat並連接,做一些簡單的配置和使用操作。

Mycat快速入門

Mycat配置所可能使用的命令

  • 進入mycat安裝的bin目錄,啟動命令:./startup_nowrap.sh
  • 進入mycat安裝的bin目錄,停止命令:./mycat stop
  • 查看是否存在運行mycat的進程: ps -ef
  • 查看mycat時時運行日志,進入logs目錄:more mycat.log
  • 配置文件中刪除一整行:vi打開配置文件,然后雙擊d鍵就會刪除光標所在的一行
  • 配置文件中刪除一整塊:點擊v,然后移動左右鍵,光標移動就會選中移動區域,再點擊x即可刪除

配置Mycat

使用Mycat實現讀寫分離其實比較簡單,只要關注他的兩個配置文件schema.xml/server.xml。

  • schema.xml主要負責數據庫的連接配置
  • server.xml主要負責Mycat登錄連接配置

schema

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="userDB" checkSQLschema="true" sqlMaxLimit="100">
        <table name="user" primaryKey="id" dataNode="dn1" />
    </schema>

    <dataNode name="dn1" dataHost="host1" database="test" />

    <!-- 讀寫分離 -->
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM" url="192.168.222.132:3306" user="root" password="123456">
            <readHost host="hostS1" url="192.168.222.133:3306" user="root" password="123456" />
            <readHost host="hostS2" url="192.168.222.134:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

server

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
        - you may not use this file except in compliance with the License. - You
        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
        - - Unless required by applicable law or agreed to in writing, software -
        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
        License for the specific language governing permissions and - limitations
        under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <!-- Mycat中有兩個重要的標簽,分別是user、system -->
    <!-- system標簽與系統配置有關 -->
    <system>
        <!-- 配置該屬性的時候一定要保證mycat的字符集和mysql 的字符集是一致的。
        如果需要配置特殊字符集,如:utf8mb4,則可以在index_to_charset.properties中配置,配置格式
        為“ID=字符集”,例如:“224=utf8mb4”-->
        <property name="charset">utf8</property>
        <!-- 1為開啟實時統計、0為關閉 -->
        <property name="useSqlStat">0</property>
        <!-- 0為需要密碼登陸、1為不需要密碼登陸 ,默認為0,設置為1則需要指定默認賬戶-->
        <property name="nonePasswordLogin">0</property>
        <property name="useHandshakeV10">1</property>
        <!-- 1為開啟全加班一致性檢測、0為關閉 -->
        <property name="useGlobleTableCheck">0</property>
        <!-- SQL 執行超時 單位:秒-->
        <property name="sqlExecuteTimeout">300</property>
        <!-- 指定使用 Mycat 全局序列的類型。 0 為本地文件方式,1 為數據庫方式,2 為時間戳序列方式,3 為分布式ZK ID 生成器,4 為 zk 遞增 id 生成。 -->
        <property name="sequnceHandlerType">5</property>
        <!-- 必須帶有MYCATSEQ_或者 mycatseq_進入序列匹配流程 注意MYCATSEQ_有空格的情況 -->
        <property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
        <!-- 子查詢中存在關聯查詢的情況下,檢查關聯字段中是否有分片字段 .默認 false -->
        <property name="subqueryRelationshipCheck">false</property>
        <property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
        <!-- 默認為type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
        <property name="processorBufferPoolType">0</property>
        <!-- 分布式事務開關,0為不過濾分布式事務,1為過濾分布式事務(如果分布式事務內只涉及全局表,則不過濾),2為不過濾分布式事務,但是記錄分布式事務日志-->
        <property name="handleDistributedTransactions">0</property>
        <!-- off heap for merge/order/group/limit      1開啟   0關閉 -->
        <property name="useOffHeapForMerge">0</property>
        <!-- 單位為m -->
        <property name="memoryPageSize">64k</property>
        <!-- 單位為k -->
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <!-- 單位為m -->
        <property name="systemReserveMemorySize">384m</property>
        <!--是否采用zookeeper協調切換  -->
        <property name="useZKSwitch">false</property>
        <!--如果為 true的話 嚴格遵守隔離級別,不會在僅僅只有select語句的時候在事務中切換連接-->
        <property name="strictTxIsolation">false</property>
        <property name="useZKSwitch">true</property>
    </system>

        <!-- name="root" 定義登錄用戶名 -->
    <user name="root">
        <!-- 定義了登錄密碼 -->
        <property name="password">123456</property>
        <property name="schemas">userDB</property>
    </user>
</mycat:server>

配置完成之后,我們啟動Mycat即可:

進入bin目錄
./mycat start

驗證是否已經成功實現讀寫分離

首先我們在主服務器上增加兩條數據,由於我們實現mysql主從復制,這個時候增加的兩條數據,其他兩台從服務器都會同時增加。數據如下:

在這里插入圖片描述

在主服務器上添加的數據由於MySQL主從復制,所以在每一台服務器上看到的都是一樣的數據,但是在從服務器上添加的數據主服務器和另外一台服務器上不會有,我們就利用這個特性添加。

在從服務器192.168.222.134上添加一條數據,如下:

在這里插入圖片描述

134服務器上就具備了其他服務器不具備的數據,由於我們在schema中配置了寫功能服務器132、讀133/134兩台,所以Mycat讀取數據的時候應該是隨機讀取133/134中的某一台,我們登陸Mycat然后打開user表,多刷新幾次就可以看到id為5的那條數據時有時無

登陸Mycat報錯,先檢查Mycat是否已經成功啟動,如果沒有啟動可以進入mycat文件下logs目錄中,打開wrapper.log查看原因
在這里插入圖片描述

注意:

  • 配置登錄用戶的時候,我們的server要對應上我們schemas中的邏輯庫,不然會報錯。
  • 訪問不到Mycat的時候檢查端口8066,查看是否開放了端口

做一個有底線的博客主


免責聲明!

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



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