1. 程式人生 > >安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(四)-- MyCat讀寫分離

安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(四)-- MyCat讀寫分離

零、說在前面

    先吐個槽,這點東西折騰了我四五天,最後還是一條告警拯救了我,下面進入正文

    看了幾個MySQL的讀寫分離的中介軟體,貌似這個是比較流行的一個,雖然我不是BAT的粉絲,但是有好用的也可以拿過來用用

    這東西的介紹我就不多說了,感興趣的諸位可以去它的官網看看,而且它上面有簡易文件提供下載,大家請自行閱讀吧

    同時,本篇僅說方法和過程,問題集中在另一篇中彙總

一、規劃

    1:在原有的21伺服器上,部署Mycat

主機名
IP
CPU
記憶體
用途
備註
centos7One
192.168.122.21
2
4
主/寫

Mysql/Redis/Mycat

centos7Two192.168.122.22
1
2
從/讀
Mysql/Redis
centos7Three192.168.122.231
2
從/讀Mysql/Redis(暫空)

     令21作為寫伺服器,22作為讀伺服器存在。23暫時不用

二、下載安裝

    1:安裝JKD

        既然作業系統都是Centos7了,那麼jdk起碼也得1.8才像話吧。二話不說下載安裝

        具體過程不細說了,下載後,解壓,然後修改/etc/profile檔案,新增以下內容

#設定java的環境變數
JAVA_HOME=/usr/local/jdk1.8
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

        然後source /etc/profile就可以讓環境變數生效

        再執行java -version,如果可以成功看到java的版本資訊,那麼你的java環境就配置成功了。否則。。重啟試試吧。。

        但是我的1.8jdk有問題了,沒有解決,所以改成1.7版本的jdk

    2:安裝Mycat

        同理,這個我也是下載的gz格式的壓縮包,將壓縮包放到/usr/local路徑下,解壓縮

        得到一個名為“mycat”的資料夾,如下圖所示

      

        然後修改/etc/profile檔案,在最後面加上這樣如下內容

#設定mycat的目錄
export MYCAT_HOME=/usr/local/mycat
        然後source /etc/profile使配置生效。        到這裡,進入/usr/local/mycat/bin下面,就可以執行 ./mycat start啟動mycat了。

三、修改配置

        僅僅上面的程度不算完,還需要修改兩個重要的配置檔案 server.xml和schema.xml

        前者之中,只需要新增使用者即可,其他配置我暫時沒做任何修改

        後者需要根據你的需要(比如是分片還是讀寫分離)來配置

        其他暫時無用的內容可以不用管,下面是我的樣例

        server.xml

<?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/">
        <system>
            <property name="useSqlStat">0</property>
            <property name="useGlobleTableCheck">0</property>
            <property name="sequnceHandlerType">2</property>
            <property name="processorBufferPoolType">0</property>
            <property name="handleDistributedTransactions">0</property>
            <property name="useOffHeapForMerge">1</property>
            <property name="memoryPageSize">1m</property>
            <property name="spillsFileBufferSize">1k</property>
            <property name="useStreamOutput">0</property>
            <property name="systemReserveMemorySize">384m</property>
            <property name="useZKSwitch">true</property>
        </system>
        <user name="root">                                 <!-- 這裡的賬號和密碼與你的資料庫的一致即可 -->
            <property name="password">987654</property>
            <property name="schemas">TESTDB</property>     <!-- 這裡的TESTDB的名字可以隨意寫,只需與schema.xml中的一致即可 -->
        </user>
</mycat:server>

    schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        
    <!-- 這裡的name屬性的值TESTDB與上面server.xml中的一致即可,
        sqlMaxLimit屬性代表每次只查詢前n條符合條件的記錄,避免全表掃描 -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 下面名叫“t_a1”的表是在我的庫中真實存在的一個表,
            同時,下面的dataNode屬性的值對應的是下面dataNode標籤的name屬性的值 -->
        <table name="t_a1" primaryKey="ID" type="global" dataNode="dn1" />
    </schema>
    
    <!-- dataNode標籤的主要作用是指明對哪一個資料庫進行操作和管理,
        其中的dataHost屬性對應的下面dataHost標籤的name屬性的值 -->
    <dataNode name="dn1" dataHost="localhost1" database="xxtest" />    
    
    <!-- 下面的localhost1的名字是隨便取的,balance=1表示讀寫分離、
            writeType=0表示寫操作集中到第一個寫資料庫
            switchType=1代表自動切換 -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        
        <!-- 檢測心跳的方法,可以用下面的語句,也可以用其他的 -->
        <heartbeat>select user()</heartbeat>

        <!-- 下面是讀和寫的mysql的ip和埠,以及登入的賬號和密碼。 -->
        <writeHost host="hostM1" url="192.168.122.21:3306" user="root" password="987654">
            <readHost host="hostS2" url="192.168.122.22:3306" user="root" password="987654" />
        </writeHost>
    </dataHost>
</mycat:schema>

一般來說,配置寫成上面的樣子,應該就可以啟動起來mycat了。

為了方便對比,我把我的資料庫的情況也放上來,大家對比一下就更容易明白了


四、啟動

    配置無誤,啟動一下看看,如果看到類似下面的截圖,說明你成功了


    初始化十個執行緒,success了10個,成功!

五、最後

    還有一些配置上的說明和我遇到的問題,會在後面單獨拿出來講