天天看點

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

前言:

Mycat讀寫分離和自動切換機制,需要mysql的主從複制機制配合,即讀從從機(slave)中讀取,寫向主機(master)中寫入!

是以我們需要先完成mysql的主從備份

一 mysql主從備份

因為我之前以及寫過一篇文章了,大家可以看完寫的部落格,或者,在網上找一些其它配置資料

點選跳轉

二 安裝mycat

第一步:mycat需要jdk環境,請安裝jdk

第一步: 我這裡在master中安裝mycat,即直接下載下傳mycat安裝包,解壓即可

mycat-1.6下載下傳

tar -zxvf mycat-1.6

其一級目錄如下

  • mycat
    • bin

      mycay的執行檔案目錄

    • catlet
    • conf

      mycat的配置檔案其中(server.xml,rule.xml以及schema.xml最為重要)

    • lib

      mycat自身需要的依賴

    • logs

      mycat的日子檔案。發生錯誤,可以到這裡檢視

    • version.txt

      mycat的版本資訊

三 conf配置檔案

使用mycat隻需要配置相關檔案即可,其中以server.xml,rule.xml以及schema.xml最為重要、

  • server.xml

    配置使用邏輯庫和邏輯表的使用者情況

  • rule.xml

    配置分庫分表的規則

  • schema.xml

    配置邏輯庫與邏輯表,以及實際庫和實際表

這裡說到了邏輯庫和邏輯表是說,mycat對外提供一個資料庫和一個表,你可以向操作MySQL一樣操作它,不用關心其中真實的資料在那個分庫那個分表。如下

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試
MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

3.1 在schema.xml中配置邏輯庫與邏輯表

schema.xml中

  • 定義邏輯庫
定義邏輯庫,名字為TESTDB,不檢查輸入的sql語句的規範,每條sql語句預設加上limit 100,如果你加入limit則該sqlMaxLimit失效
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
           
  • 定義邏輯表
#定義邏輯庫中的邏輯表travelrecord,其真實資料在dn1,dn2,dn3的MySQL中(後面定義的),其mycat的資料分布規則為auto-sharding-long(預設)改為crc32slot這樣會根據算法将寫入的資料也會分布到不同的資料庫中,這個規則需要在rule.xml中配置
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="crc32slot" />

#定義dataNode,即真實的MySQL資料的位址name為代表,其真實位址為localhost1(後面有定義),資料庫為db1
 <dataNode name="dn1" dataHost="localhost1" database="db1" />
 <dataNode name="dn2" dataHost="localhost1" database="db2" />
 <dataNode name="dn3" dataHost="localhost1" database="db3" />

#定義dataHost,即真實的MySQL資料的IP主機位址dbType(資料庫類型mysql),dbDriver驅動(mysql,因為mycat本身就是為MySQL做的,是以你寫native就是MySQL,其它資料庫則需要你寫完整的dbDriver),balance為平衡政策,一般用3(balance="3":表示寫請求隻發給節點,讀請求隻發給讀節點這裡要改,否則後面讀寫無效)
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
          <heartbeat>select user()</heartbeat>
          <!-- 寫入資料向那個真實的資料庫寫入,一般是MySQL的主-->
          <writeHost host="hostM1" url="localhost:3306" user="root"
                     password="123456">
              <!--讀資料向那個真實的資料庫讀,一般是MySQL的從-->
             <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
          </writeHost>
 </dataHost>
           

使用crc32slot隻會将資料配置設定到兩個資料庫中,再配置檔案rule.xml中有,但是我們配置設定到了3個資料庫(db1,db2,db3後面會配置),是以我們需要修改配置,改為3

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

如果你這裡忘記配置,并且以及開始mycat,那麼你再修改為3時,必須将conf/ruledata目錄(這個目錄會在你使用mycat插入資料的時候生成)删除,再重新啟動mycat,否則沒有效果,因為分片規則以及生成,隻有将其删除運作再生成!

下面這張圖就是我後面使用mycat插入資料後,ruledata/crc32slot_MYCATTEST.properties 的内容

一共分三片,如果你沒有該為3,這裡就隻有0 和1

  • 0 = 0- 34132

    表示_slot為0-34132的在資料庫0中

  • 1 = 34133 - 68266

    表示_slot為34133 - 68266的在資料庫1中

  • 2 = 68266 - 102399

    表示_slot為 68266 - 102399的在資料庫2中

其中_slot為你建立表以後,mycat會自動在每張表加一個_slot字段

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

根據自身的MySQL的主從的資訊配置如下(删掉了注釋以及不需要的部分)

1 <?xml version="1.0"?>
  2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3 <mycat:schema xmlns:mycat="http://io.mycat/">
  4 
  5     <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
  6         <!-- auto sharding by id (long) -->
  7         <table name="mycattest" dataNode="dn1,dn2,dn3" rule="crc32slot" />
  9     </schema>
 10 
 11     <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
 12         /> -->
 13     <dataNode name="dn1" dataHost="localhost1" database="db1" />
 14     <dataNode name="dn2" dataHost="localhost1" database="db2" />
 15     <dataNode name="dn3" dataHost="localhost1" database="db3" />
 16 
 17     <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
 18               writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
 19         <heartbeat>select user()</heartbeat>
 20         <!-- can have multi write hosts -->
 21         <writeHost host="hostM1" url="192.168.25.5:3306" user="root"
 22                    password="123456">
 23             <!-- can have multi read hosts -->
 24             <readHost host="hostS2" url="192.168.25.6:3306" user="root" password="123456" />
 25         </writeHost>
 26     </dataHost>
 27 </mycat:schema>```
           

3.2 在server.xml中配置使用者登陸mycat的資訊

主要檢視server.xml中的使用者配置資訊

# 登陸mycat的使用者配置
 <user name="root">
           使用者是root,密碼是123456,該使用者隻能操作TESTDB邏輯庫
          <property name="password">123456</property>
          <property name="schemas">TESTDB</property>
  
         這裡你可以設定該使用者對邏輯庫TESTDB的DML的權限設定
         <!-- 表級 DML 權限設定 -->
         <!--        
         <privileges check="false">
             <schema name="TESTDB" dml="0110" >
                  <table name="tb01" dml="0000"></table>
                  <table name="tb02" dml="1111"></table>
              </schema>
          </privileges>       
           -->
     </user>
  
    # 使用者名為user密碼為user,可以操作的邏輯庫是TESTDB,但是是隻讀的
      <user name="user">
          <property name="password">user</property>
          <property name="schemas">TESTDB</property>
          <property name="readOnly">true</property>
      </user> 
           

四 測試

4.1 根據之前的配置,我們需要修改MySQL主從中的使用者登陸權限,讓mycat可以登陸進去

  • mysql_master 192.168.25.5

grant all privileges on . to root@’%’ identified by “123456”; #on 後面是* 點 *

再重新整理權限

FLUSH PRIVILEGES;

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試
  • mysql_slave 192.168.25.6

grant all privileges on . to root@’%’ identified by “123456”; #on 後面是* 點 *

再重新整理權限

FLUSH PRIVILEGES;

結果同上

4.2 測試讀寫分離

  • 進入mycat安裝目錄的bin,啟動
cd /root/mycat/bin
           
MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試
  • 登陸mycat
mysql -h192.168.25.5 -uroot -p123456 -P8066

-u為你在mycat中的server.xml中配置的使用者名,-p(小寫)為該使用者密碼,-h為mycat的安裝主機

-P (大寫) 為mycat的端口

9066為管理端口管理端口用于執行管理指令:

8066指令端口使用者執行增删改查等 SQL 語句:

如果出現 Unsupported statement 說明你使用的是9066端口操作(改為8066登陸),或者登陸的使用者在mycat中的server.xml中權限受到了限制

  • 檢視邏輯資料庫
    MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試
  • 檢視邏輯表
    MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試
  • 為mysql_master配置資料庫

    因為在前面的schena.xml中配置了真實資料庫的名字,但是我們還有沒有建立,是以需要先建立出來,直接在master中寫sql,語句即可,因為以及配置了主從,slave也會執行

create database db1;
create database db2;
create database db3;
           
MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試
  • 測試

    為已存在的邏輯表跟新你需要的完整資訊

mysql> use TESTDB;
mysql> CREATE TABLE `mycattest` (
  `id` int(255) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
mysql>desc mycattest
           

這裡我需要說明一下,為什麼這裡建立表結構,因為,表必須現在mycat中聲明配置其相關屬性(但是沒有結構),後面mycat會自動為你生成一個邏輯表(mycattest),并會在你配置的主從資料庫(db1,db2,db3)中加入該表(mycattest),此時該表是沒有資料結構的,但是其分片分庫的規則都以完成,是以你隻需要完善其你需要的表結構即可!邏輯表必須先在schema.xml中聲明配置規則

  • 檢視MySQL的主從資料結構

    随意選擇一個資料庫(db1,db2,db3),注意mycat會自動增加一個字段_slot,根據該字段,mycat會把資料分散到你定義的片中(db1,db2,db3)

    MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試
  • 測試寫

    使用mycat寫入5條資料

INSERT INTO mycattest(id,username,password)  VALUES('2','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('3','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('4','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('5','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('6','gxm','123456');
           

檢視master與slave是否都已插入資料,如果主從都已有資料,說明寫是分離的,因為隻有mycat向master中寫入資料,slave才會隻有相同的一份資料,因為如果同時向master與slave寫入

  • 第一種報錯主鍵重複(如果不是,我這裡就應該報錯,id為主鍵)
  • 第二種,資料會重複,master與slave每個都會會有10條資料(如果沒有主鍵的話)

但是現在這裡上述2中情況沒有出現說明,是單獨向master寫入,由slave同步master的結果

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

因為我們配置是rule是crc32slot配置了分片是以資料會根據_slot大緻均勻的分到到db1,db2,db3中

  • 測試讀

    我向slave中寫入一條記錄

master不會同步slave,是以slave的資料會比master多一條’999’,‘slave’,‘99999’

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

此時我再使用mycat查詢資料如果沒有999号資料說明從master中讀取,有999号資料說明從slave中讀取

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

或者你可以使用9066端口登陸,檢視sql語句的執行狀況

show @@datasource;

MyCat配置MySQL讀寫分離一 mysql主從備份二 安裝mycat三 conf配置檔案四 測試

關于使用9066或者8066端口的使用的一些常用指令,檢視mycat狀态等等,這片部落格感覺寫的挺好的!

點選跳轉