mycat基本概念及配置文件詳解


在介紹mycat之前,首先來了解一下數據庫切分。

對於海量數據處理,按照使用場景,主要分為兩類:聯機事務處理(OLTP)和聯機分析處理(OLAP).

  •   聯機事務處理也稱為面向交易的處理系統,其基本特征是原始數據可以立即傳送到計算中心進行處理,並在很短時間內給出處理結果。
  •   聯機分析處理是指通過多維的方式對數據進行分析,查詢和報表,可以同數據挖掘工具,統計分析工具配合使用,增強決策分析功能。

數據切分

簡單來說,就是通過某種特定的條件,將我們存放在同一個數據庫中的數據分散存放到多個數據庫上,以達到分散單台設備負載的效果。
數據的切分根據其切分規則的類型,可以分為兩種切分模式。一種是按照不同的表(或者Schema)來切分到不同的數據庫之上,這種切分可以稱之為數據的垂直切分;另外一種則是根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多台數據庫上面,這種切分稱為水平切分。

數據切分的一些經驗及參考:

第一:能不切分盡量不要切分。
第二:如果要切分一定要選擇合適的切分規則,提前規划好。
第三:數據切分盡量通過數據冗余或表分組來降低跨庫join的可能。
第四:由於數據庫中間件對數據join實現優劣難以把握,而且實現高性能難度極大,業務讀取盡量少用join。

mycat的原理:

Mycat的原理中最重要的一個動詞是“攔截”,它攔截了用戶發送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分片分析,路由分析,讀寫分離分析,緩存分析等,然后將此SQL發往后端的真實數據庫,並將返回的結果做適當的處理,最終返回給用戶。

應用場景

Mycat發展到現在,適用的場景已經很豐富,而且不斷有新用戶給出新的創新性方案,應用場景如下:

  •  單純的讀寫分離,此時配置最為簡單,支持讀寫分離,主從切換。
  •  分表分庫,對於超過1000萬的表進行分片,最大支持1000億的單表分片
  •  報表系統,借助於Mycat的分表能力,處理大規模報表的統計
  •  替代Hbase,分析大數據
  •  作為海量數據實時查詢的一種簡單有效方案,比如100億條頻繁查詢的記錄需要在3秒內查詢出來結果,除了基於主鍵的查詢,還可能存在范圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇。

mycat中間件中的一些概念

Mycat是數據庫中間件,就是介於數據庫和應用之間,進行數據處理與交互的中間服務。由於對數據進行分片處理之后,從原有的一個庫,被划分為多個分片數據庫,所有的分片數據庫集群構成了整個完整的數據庫存儲。

有了數據庫中間件,應用只需要集中於業務處理,大量的通用的數據聚合,事務,數據源切換都由中間件來處理,中間件的性能與處理能力將直接決定應用的讀寫性能,所以一款好的數據庫中間件至關重要

邏輯庫(schema)

通常對實際應用來說,並不需要知道中間件的存在,業務開發人員只需要知道數據庫的概念,所以數據庫中間件可以被看做是一個或多個數據庫集群構成的邏輯庫。

邏輯表(table)

對應用來說,讀寫數據的表就是邏輯表。邏輯表,可以是數據切分后,分布在一個或多個分庫中,也可以不做數據切分,不分片,只有一個表構成。

分片表

是指那些原有的很大數據的表,需要切分到多個數據庫的表,這樣,每個分片都有一部分數據,所有分片構成了完整的數據。

如圖所示,apply_form,apply_info就是分片表,數據按照規則被分配到8個節點上。

非分片表

一個數據庫中並不是所有的表都很大,某些表是可以不用進行切分的,非分片表是相對分片表來說的,就是那些不需要進行數據切分的表。

如下user_userinfo表只存在分片節點dn1上面。

E-R表

關系型數據庫是基於實體關系模型之上,通過其描述了真實世界中事物與關系,Mycat中的ER表即是來源於此。根據這一思路,提出了基於E-R關系的數據分片策略,子表的記錄與所關聯的父表記錄存放在同一個數據分片上,即子表依賴父表,通過表分組保證數據join不會跨庫操作。
表分組(Table Group)是解決跨分片數據join的一種很好的思路,也是數據切分規划的重要一規則。

全局表

一個真實的業務系統中,往往存在大量的類似字典的表,這些表基本上很少變動,字典表具有以下幾個特性。

  • 變動不頻繁
  • 數據量總體變化不大
  • 數據規模不大,很少有超過數十萬條記錄

對於這類的表,在分片的情況下,當業務表因為規模而進行分片以后,業務部與這些附屬的字典表之間的關聯,就成了比較棘手的問題,所以mycat中通過數據庫冗余來解決這類表的join,即所有的分片都都有一些數據的備份,所有將字典表或者符合字典表特性的一些表定義為全局表。
數據冗余是解決跨分片數據join的一種很好的思路,也是數據庫切分規划的另外一條重要規則。


分片節點

數據切分后,一個大表被分到不同的分片數據庫上面,每個表分片所在的數據庫就是分片節點(dataNode).

 

節點主機

數據切分后,每個分片節點不一定會獨占一台機器,同一機器上面可以有多個分片,這樣一個或多個分片節點所在的機器就是節點主機,為了避免單節點主機並發數限制,盡量將讀寫壓力高的分片節點均衡放置在不同的節點主機。

分片規則(rule)

數據切分后,一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把數據分到某個分片的規則就是分片規則,數據分片選擇合適的分片規則非常重要,將極大的避免后續數據處理的難度。


全局序列號

數據切分后,原有的關系數據庫中的主鍵約束在分布式條件下將無法使用,因此需要引入外部機制保證數據唯一性標識,這種保證全局性的數據唯一標識的機制就是全局序列號(sequence)。

mycat安裝

mycat依賴java,因此首先需要安裝java環境:

[root@test1 ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
[root@test1 ~]# echo $JAVA_HOME
/usr/local/jdk/jdk1.7.0_79
[root@test1 ~]#

JAVA環境安裝完成之后,安裝mycat插件,直接在官網下載mycat壓縮包即可。

tar zxvf Mycat-server-1.6.tar.gz
mv mycat /usr/local/mycat
useradd  mycat
chown -R mycat:mycat  /usr/local/mycat

解壓之后目錄結構如下:

[root@test1 mycat]# tree -d
.
├── bin
├── catlet
├── conf
│   ├── zkconf
│   └── zkdownload
├── lib
└── logs

7 directories

conf目錄下存放的配置文件,

  • server.xml是Mycat服務器參數調整和用戶授權的配置文件,
  • schema.xml是邏輯庫定義和表以及分片定義的配置文件,rule.xml是分片規則的配置文件,分片規則的具體一些參數信息單獨存放為文件,也在這個目錄下,配置文件修改,需要重啟mycat或者通過9066端口reload。

lib目錄下主要存放mycat依賴的一些jar文件。
日志存放在logs/mycat.log中,每天一個文件,日志配置是在conf/log4.xml中,根據自己的需要可以調整輸出級別.


注意:Linux下部署安裝MySQL,默認不忽略表名大小寫,需要手動到/etc/my.cnf 下配置 lower_case_table_names=1 使Linux環境下MySQL忽略表名大小寫,否則使用MyCAT的時候會提示找不到表的錯誤!

服務啟動與啟動設置

如果是在多台linux系統中組建mycat集群,那需要在mycat server所在的服務器上配置對ip和主機名的映射,即解析。修改mycat server主機中/etc/hosts文件即可。
目前Mycat的啟動是經過warapper封裝成啟動腳本,所以日志也會有其相關的日志文件:${MYCAT_HOME}/logs/warapper.log,在啟動時候如果系統環境配置錯誤或缺少配置時,導致Mycat無法啟動,可以通過查看warrpper.log查看具體錯誤原因。

[root@test1 bin]# ./startup_nowrap.sh         #啟動mycat
"/usr/local/jdk/jdk1.7.0_79/bin/java" -DMYCAT_HOME="/usr/local/mycat" -classpath "/usr/local/mycat/conf:/usr/local/mycat/lib/classes:/usr/local/mycat/lib/asm-4.0.jar:/usr/local/mycat/lib/commons-collections-3.2.1.jar:/usr/local/mycat/lib/commons-lang-2.6.jar:/usr/local/mycat/lib/curator-client-2.11.0.jar:/usr/local/mycat/lib/curator-framework-2.11.0.jar:/usr/local/mycat/lib/curator-recipes-2.11.0.jar:/usr/local/mycat/lib/disruptor-3.3.4.jar:/usr/local/mycat/lib/dom4j-1.6.1.jar:/usr/local/mycat/lib/druid-1.0.26.jar:/usr/local/mycat/lib/ehcache-core-2.6.11.jar:/usr/local/mycat/lib/fastjson-1.2.12.jar:/usr/local/mycat/lib/guava-19.0.jar:/usr/local/mycat/lib/hamcrest-core-1.3.jar:/usr/local/mycat/lib/hamcrest-library-1.3.jar:/usr/local/mycat/lib/jline-0.9.94.jar:/usr/local/mycat/lib/joda-time-2.9.3.jar:/usr/local/mycat/lib/jsr305-2.0.3.jar:/usr/local/mycat/lib/kryo-2.10.jar:/usr/local/mycat/lib/leveldb-0.7.jar:/usr/local/mycat/lib/leveldb-api-0.7.jar:/usr/local/mycat/lib/log4j-1.2.17.jar:/usr/local/mycat/lib/log4j-1.2-api-2.5.jar:/usr/local/mycat/lib/log4j-api-2.5.jar:/usr/local/mycat/lib/log4j-core-2.5.jar:/usr/local/mycat/lib/log4j-slf4j-impl-2.5.jar:/usr/local/mycat/lib/mapdb-1.0.7.jar:/usr/local/mycat/lib/minlog-1.2.jar:/usr/local/mycat/lib/mongo-java-driver-2.11.4.jar:/usr/local/mycat/lib/Mycat-server-1.6-RELEASE.jar:/usr/local/mycat/lib/mysql-binlog-connector-java-0.4.1.jar:/usr/local/mycat/lib/netty-3.7.0.Final.jar:/usr/local/mycat/lib/objenesis-1.2.jar:/usr/local/mycat/lib/reflectasm-1.03.jar:/usr/local/mycat/lib/sequoiadb-driver-1.12.jar:/usr/local/mycat/lib/slf4j-api-1.6.1.jar:/usr/local/mycat/lib/univocity-parsers-2.2.1.jar:/usr/local/mycat/lib/velocity-1.7.jar:/usr/local/mycat/lib/wrapper.jar:/usr/local/mycat/lib/zookeeper-3.4.6.jar" -server -Xms2G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G io.mycat.MycatStartup >> "/usr/local/mycat/logs/console.log" 2>&1 &
[root@test1 mycat]# netstat -lntp             #查看端口,有兩個端口,一個是8066,另一個是9066;存在端口說明服務器已經啟動。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1027/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1104/master         
tcp        0      0 :::22                       :::*                        LISTEN      1027/sshd           
tcp        0      0 :::8066                     :::*                        LISTEN      11211/java          
tcp        0      0 :::9066                     :::*                        LISTEN      11211/java          
[root@test1 mycat]# 

mycat服務器已經啟動,下面來詳細介紹一下mycat的配置文件。

mycat配置文件

mycat從1.5開始支持兩種配置方式: zookeeper及本地xml方式。mycat默認以本地加載xml方式啟動,如果需要配置成以zk方式啟動,則應把conf目錄下面zk.conf文件中loadfromzk參數設置為true。zk配置方式解決了統一配置和管理問題,同時解決了mycat與周邊組件的協調問題。

如果使用了zk配置方式,則所有的配置參數都在zk-create.yaml文件中,該文件涵蓋了conf目錄下面的schema,server等文件中所有的配置項。

下面會詳細介紹mycat幾個配置文件:

server.xml配置文件

server.xml配置文件包含了mycat的系統配置信息,對應的源碼使systemconfig.jar.它有兩個重要的標簽,分別是user和system,system標簽的各屬性時mycat調憂的關鍵。

  • user標簽
             <user name="user">
                    <property name="password">user</property>
                    <property name="schemas">TESTDB</property>
                    <property name="readOnly">true</property>
                    <property name="benchmark">1111</property>
                    <property name="usingDecrypt">1</property>
            </user>
    #介紹下后面兩個屬性
    benchmark: 通過該屬性來限制前端的整體連接數量。如果其值為0或者不對其進行設置,則表示不限制連接數量、
    usingDecrypt: 通過設置該屬性來開啟密碼加密功能。默認值是0,表示不開啟加密,值為1說明開啟密碼加密功能。

    user標簽主要用於定義登錄mycat的用戶和權限。如上面定義用戶名和密碼均為user,該用戶可以訪問的schema只有TESTDB。

    可以直接修改對應的屬性值來修改密碼,如果需要同時訪問多個schema,則多個schema之間使用英文逗號隔開。
  • system標簽,這個標簽的屬性與系統配置有關,下面會一一介紹其屬性。
    • charset屬性,配置字符集時一定要保證mycat字符集與數據庫字符集的一致性。
    • defaultSqlParser屬性: 由於mycat最初是時候Foundation DB的sql解析器,而后才添加的Druid的解析器。所以這個屬性用來指定默認的解析器。目前的可用的取值有:druidparser和 fdbparser。使用的時候可以選擇其中的一種,目前一般都使用druidparser。mycat1.4之后的版本中fdbparser屬性作廢。
    • processors屬性:這個屬性主要用於系統可用的線程數,默認值為機器每個CPU核心*每個核心運行線程的數量。主要影響processorBufferPool、processorBufferLocalPercent、processorExecutor屬性。NIOProcessor的個數也是由這個屬性定義的,所以調優的時候可以適當的調高這個屬性。

    • processorBufferChunk屬性:這個屬性指定每次分配Socket Direct Buffer的大小,默認是4096個字節。這個屬性也影響buffer pool的長度。
    • processorBufferPool屬性:該屬性指定bufferpool的計算比例。由於每次執行NIO讀,寫操作都需要使用到buffer,所以mycat初始化時會建立一定長度的buffer池來加快NIO讀,寫效率,減少建立buffer的時間。mycat中有兩個主要的buffer池:BufferPool,ThreadLocalPool。BufferPool使用ThreadLocalPool作為二級緩存,每次從BufferPool中獲取時都會優先獲取ThreadLocalPool中的buffer值,如果ThreadLocalPool未命中,則會獲取BufferPool中的Buffer值。ThreadLocalPool中的Buffer在每個線程內部使用。然而,BufferPool是每個NIOProcessor共享的。
      processorBufferPool的默認值為:bufferChunkSize(4096)XprocessorX1000.
      processorBufferPoll的總長度為bufferpool與bufferchunk的比。如果bufferpool的長度不是bufferchunk的整數倍,則其總長度為前面計算得出的比值的整數部分加1.
      假設系統線程數為4,其他屬性為默認值。
      bufferpool=4096*4*1000
      processorBufferPoll=4096*4*1000/4096=4000

       

    • processorBufferLocalPercent屬性:該屬性用來控制ThreadLocalPool分配pool的比例大小,這個屬性默認值是100.線程緩存百分比=bufferlocalpercent/processor.
      例如,系統可以同時運行4個線程,使用默認值。根據上面的公式每個線程的百分比是25,最后根據這個百分比可以計算出具體的ThreadLocalPool的長度公式如下:
      ThreadLocalPool=線程緩存百分比 X BufferPool長度/100
      假設BufferPool的長度為4000,其他保持默認值,則最后每個線程ThreadLocalPool長度為100,即25*4000/100
    • processorExecutor屬性: 這個屬性主要用於指定NIOProcessor上共享的businessExecutor固定線程池大小。mycat在需要處理一些異步邏輯的時候會把任務提交到這個線程池中。新版本中這個連接池的使用頻率不是很大了,可以設置一個較小的值。
    • sequenceHandlerType屬性: 指定使用Mycat全局序列的屬性。0為本地文件方式,1為數據庫方式,2為本地時間戳方式,3為分布式zk ID生成器,4為zk遞增ID生成。默認是使用本地文件方式,文件方式主要只是用於測試使用。從1.6增加兩種zk的全局ID生成算法。
    • TCP連接相關屬性
      • StandardSocketOptions.SO_RCVBUF
      • StandardSocketOptions.SO_SNDBUF
      • StandardSocketOptions.TCP_NODELAY  
        以上三個屬性衍生出針對前端和后端的TCP屬性如下:
      • frontSocketSoRcvbuf: 默認值為1024*1024
      • frontSocketSoSndbuf:默認值為4*1024*1024
      • frontSocketNoDelay:默認值為1
      • backSocketSoRcvbuf:默認值為4*1024*1024
      • backSocketSoSndbuf:默認值為1024*1024
      • backSocketNoDelay:默認值1

        mycat在每次建立前,后端連接都會使用這些參數初始化TCP屬性。可以根據系統的實際情況適當地調整這些參數的大小。

    • MySQL連接相關屬性:初始化MySQL的前后端連接所涉及的屬性如下。
      • packetHeaderSize: 指定MySQL協議中報文長度,默認值為4個字符。
      • maxPacketSize:指定MySQL協議可以攜帶的數據的最大大小,默認值為16MB。
      • idleTimeout:指定連接的空閑時間的超時長度。如果某個連接的空閑時間超過idleTimeout的值,則該連接將關閉,並回收資源,單位為毫秒,默認為30分鍾。
      • charset:初始化連接字符集,默認是utf8。
      • txIsolation:初始化連接的事務隔離級別。ru-1,rc-2,rr-3,se-4;這個值取整數,表示對應的隔離級別。
      • sqlExecuteTimeout:執行SQL語句的超時時間,若SQL語句的執行時間超過這個值,則會直接關閉連接,單位為秒,默認值為300秒。    
    • 心跳屬性
      • processorCheckPeriod: 清理NIOProcessor前后端空閑,超時,關閉連接的時間間隔,單位為毫秒,默認為1秒。
      • dataNodeidleCheckPeriod:對后端連接進行空閑,超時檢查的時間間隔,單位毫秒,默認為300秒。
      • dataNodeHeaderbeatPeriod:對后端連接的所有讀,寫庫發起心跳的間隔時間,單位為毫秒,默認為10秒。 
    • 服務相關屬性 :這里介紹與mycat服務相關的屬性,主要影響外部系統對mycat的感知。
      • bindIP: 服務器監聽的IP地址,默認為0.0.0.0
      • serverPort: 定義mycat的使用端口,默認值為8066
      • managerPort:定義mycat管理端口,默認值為9066
    • fakeMySQLversion屬性:mycat使用mysql的通信協議模擬了一個mysql服務器,默認為5.6版本。若非特許,不需要更改,從Mycat1.6開始支持此屬性。
    • 分布式事務開關屬性: handleDistributedTransaction是分布式事務開關:0為不過濾分布式事務,1為過濾分布式事務(如果分布式事務只涉及全舉表,則不過濾);2為不過濾分布式事務,但是記錄分布式事務日志。從mycat1.6版本開始支持此屬性。
    • useOffHeapForMerge屬性: 該屬性用於配置是否啟用非堆內存處理跨分片結果集,1為開啟,0為關閉,mycat從1.6開始支持。
    • 全局表一致性檢測: 其原理是通過在全局表中增加_MYCAT_OP_TIME字段來進行一致性檢測,為bigint類型。create語句通過mycat執行時會自動添加上該字段,其他情況需要手動添加。1為開啟,0為關閉,mycat從1.6版本開始支持。
      <property name="useGlobaleTableCheck">0</property>
      全局表一致性檢測功能的使用說明及步驟如下:
      1:在所有全局表中增加一個BIGINT類型的內部列,列名為_mycat_op_time,同時建議在該列添加索引。
      2:在對全局表進行crud時,可以將內部列當做不存在,建議不要對內部列進行update,insert等操作,否則會在log日志出現警告語句“不用操作內部列”
      3:因為全局表中多了一個內部列,所以在對全局表進行insert時必須帶有列名。
    • useSqlStat屬性: 開啟SQL實時統計,1為開啟,0為關閉。  

 schema.xml配置文件

schema.xml作為mycat中重要的配置文件之一,涵蓋了mycat的邏輯庫,表,分片規則,分片節點及數據源。schema.xml配置文件中有7個標簽,下面來一一介紹。

  • schema標簽:schema標簽用於定義mycat實例中的邏輯庫,mycat可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。可以使用schema標簽來划分這些不同的邏輯庫。如果不配置schema標簽,所有的表配置,會屬於同一個默認的邏輯庫。
    邏輯庫的概念和mysql數據庫中Datebase的概念相同,我們在查詢這兩個邏輯庫中的表的時候,需要切換到該邏輯庫下才可以查到所需要的表。
    <schema name="TESTDB" checkSQLschema="false" >
    .....
    </schema>
    1. dataNode屬性:該屬性用於綁定邏輯庫到某個具體的database上,如果定義了這個屬性,那么這個邏輯庫就不能工作在分庫分表模式下了。也就是說對這個邏輯庫的所有操作會直接作用到綁定的dataNode上,這個schema就可以用作讀寫分離和主從切換,具體如下配置:
      <schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
      <!—這里不能配置任何邏輯表信息-->
      </schema>

      那么現在USERDB就綁定到dn1所配置的具體database上,可以直接訪問這個database。當然該屬性只能配置綁定到一個database上,不能綁定多個dn。

    2. checkSQLschema屬性:當該值設置為 true 時,如果我們執行語句**select * from TESTDB.travelrecord;**則MyCat會把語句修改為**select * from
      travelrecord;**。即把表示schema的字符去掉,避免發送到后端數據庫執行時報**(ERROR 1146 (42S02): Table‘testdb.travelrecord’ doesn’t exist)**
      不過,即使該值設置為true,如果語句所帶的schema名字不是shcema指定的名字,那么mycat不會刪除這個schema。

    3. sqlMaxlimit屬性: 當該值設置為某個數值時。每條執行的sql語句,如果沒有加上limit語句,mycat也會自動的加上所對應的值。如果不設置該值,mycat會默認把查詢到的信息全部展示處理,造成過多的輸出。所以,正常使用中,還是盡量加入該值,用於減少過多的數據返回。如果sql語句中顯式指定了limit的大小,不受該屬性的約束。需要注意的是,如果運行的schema為非拆分庫的,那么該屬性不會生效。需要手動添加limit語句。

  • table標簽: table標簽定義了邏輯表,所有需要拆分的表都需要在這個標簽中定義。
    <table name="address" primaryKey="autoIndex" rule="sharding-by-murmur" dataNode="dn1,dn2" />

    table標簽的屬性如下:

    1. name屬性:定義邏輯表的表名,這個名字就如同在數據庫中執行create table命令指定的名字一樣,同一個schema標簽中定義的表名必須是唯一的。
    2. dataNode屬性: 定義這個邏輯表所屬的dataNode,該屬性的值需要和dataNode標簽中name屬性的值相互對應。
    3. rule屬性:該屬性用於指定邏輯表要使用的規則的名字,規則名字在rule.xml中定義,必須與tableRule標簽中name屬性屬性值對應。
    4. ruleRequired屬性:該屬性用於指定表是否綁定分片規則,如果配置為true,但沒有配置具體rule的話,程序會報錯。
    5. primaryKey屬性:該邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那么在使用主鍵查詢的時候,就會發送查詢語句到所有配置的DN上,如果使用該屬性配置真實表的主鍵。難么MyCat會緩存主鍵與具體DN的信息,那么再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接發送語句給具體的DN,但是盡管配置該屬性,如果緩存並沒有命中的話,還是會發送語句給具體的DN,來獲得數據。
    6. type屬性:該屬性定義了邏輯表的類型,目前邏輯表只有“全局表”和“普通表”兩種。 全局表:global。  普通表:不指定該值為global的所有表
    7. autoincrement屬性:MySQL對於自增長主鍵使用last_insert_id()是不會返回結果的,只會返回0.所以,只有對定義了自增長主鍵的表應用last_insert_id()才可以返回主鍵的值。mycat目前提供了自增長主鍵功能,但是如果對應的mysql沒有定義auto_increment屬性,那么mycat層調用last_insert_id()也是不會返回結果的。由於insert操作時沒有帶入分片鍵,所以mycat會先取下這個表對應的全局序列,然后賦值給分片鍵。如果要使用這個功能,則最好配合數據庫模式的全局序列。使用autoIncrement="true"指定這個表使用自增長主鍵,這樣mycat才不會拋出“分片鍵找不到”的異常。這個功能默認是禁用的,值為false。
    8. subTables: 使用subTable="t_order$1-2, t_order3"方式添加,目前mycat在1.6版本以后才開始支持分表,並且dataNode在分表條件下只能配置一個,不支持各種條件的join查詢。
    9.  needAddlimit限制:指定表是否需要自動的在每個語句后面添加limit限制,由於使用了分庫分表,數據量有時會特別巨大,這時候執行查詢語句,如果恰巧又忘記了添加數量限制,那么就會查詢所有的數據。所以mycat就自動的為我們加上limit 100.如果,語句中有limit就不會再次添加了。該屬性默認值為true。
  • childTable標簽: childTable標簽用於定義E-R分片的子表,通過標簽上的屬性與父表進行關聯。
    1. name屬性 定義子表的表名
    2. joinKey屬性: 插入子表的時候會使用這個列的值查找父表存儲的數據節點。
    3. parentKey屬性: 屬性指定的值一般為與父表建立關聯關系的列名。程序首先獲取joinkey的值,再通過parentKey屬性指定的列名產生的查詢語句,通過執行該語句得到父表存儲在那個分片上,從而確定子表存儲位置。
    4. primarykey屬性: 同table標簽
    5. needAddLimit屬性: 同table標簽
          
  • dataNode標簽: dataNode標簽定義了mycat中的數據節點,也就是數據分片。一個dataNode標簽就是一個獨立的數據分片。
    <dataNode name="dn2" dataHost="host02" database="db" />

    #使用host02主機上數據實例中db物理數據庫,這就組成一個數據分片,使用dn2標識這個分片。
    1. name屬性,定義數據節點的名字,這個名字需要是唯一的,我們需要在table標簽上應用這個名字,來建立表與分片對應的關系。
    2. dataHonet屬性:該屬性用於定義該分片屬於那個數據庫實例,屬性值是引用datahost標簽定義的name屬性。
    3. database屬性:該屬性用於定義該分片屬於那個具體數據庫實例上的具體庫,因為這里使用兩個緯度來定義分片,就是:實例+具體的庫。因為每個庫上建立的表和表結構是一樣的。所以這樣做就可以輕松的對表進行水平拆分。
  • dataHost標簽: 作為Schema.xml中最后的一個標簽,該標簽在mycat邏輯庫中也是作為最底層的標簽存在,直接定義了具體的數據庫實例、讀寫分離配置和心跳語句。現在我們就解析下這個標簽。一個dataHost標簽的屬性如下:
    1. name屬性: 唯一標識dataHost標簽,供上層標簽使用。
    2. macCon屬性:指定每個讀寫實例連接池的最大連接。也就是說,標簽內嵌套的writeHost、readHost標簽都會使用這個屬性的值來實例化出連接池的最大連接數。
    3. minCon屬性:指定每個讀寫實例連接池的最小連接,初始化連接池的大小。
    4. balance屬性: 負載均衡類型,目前的取值有以下4種。
      balance=0: 不開啟讀寫分離,所有讀操作都發送到當前可用的writeHost上。
      balance=1: 全部的readHost與Stand by writeHost都參與select語句的負載均衡,簡而言之,當雙主雙從模式(M1-->S1, M2--->S2,並且M1與M2互為主備)時,在正常情況下,M2,S1和S2都參與select的負載均衡。
      balance=2: 所有的讀操作都隨機在writeHost,readHost上分發。
      balance=3: 所有的讀請求都隨機分配到writeHost對應的readHost上執行,writeHost不負擔讀壓力,注意balance=3只在mycat1.4之后版本中有效。

       

    5. writeType屬性:負載均衡類型,目前的取值有3種:
      1. writeType=“0”, 所有寫操作都發送到可用的writeHost上。
      2. writeType=“1”,所有寫操作都隨機的發送到readHost。
      3. writeType=“2”,所有寫操作都隨機的在writeHost、readhost分上發。
    6. dbType屬性:指定后端連接的數據庫類型,目前支持二進制的mysql協議,還有其他使用JDBC連接的數據庫。如mongodb,spark等。
    7. dbDriver屬性: 指定連接后端數據庫使用的Driver,目前可選的值有native和JDBC。使用native的話,因為這個值執行的是二進制的mysql協議,所以可以使用mysql和maridb。其他類型的數據庫則需要使用JDBC驅動來支持。
    8. switchType屬性:
      -1:表示不自動切換。
      1  :默認值,表示自動切換
      2:表示基於MySQL主從同步狀態決定是否切換,心跳語句: show slave status.
      3:表示基於mysql galary cluster的切換機制,適合mycat1.4之上的版本,心跳語句show status like "%esrep%";

       

    9. tempReadHostAvailable屬性: 如果配置了writehost,下面的readhost依舊可用。
  • heratbeat標簽: 這個標簽內指明用於和后端數據庫進行心跳檢查的語句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。mycat1.4中主從切換語句必須是show slave status.
  • writeHost標簽,readHost標簽:這兩個標簽指定后端數據庫的相關配置給mycat,用於實例化后端連接池。唯一不同的是,writeHost指定寫實例、readHost指定讀實例,組合這些讀寫實例來滿足系統的要求。
    在一個dataHost內可以定義多個writeHost和readHost。但是,如果writeHost指定的后端數據庫宕機,那么這個writeHost綁定的所有readHost都將不可用。另一方面,這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去。
    • host屬性:用於標識不同的實例,對於writehost,一般使用*M1;對於readhost一般使用*S1.
    • url屬性:后端實例連接地址,如果使用native的dbDriver,則一般為address:port這種形式,用JDBC或其他的dbDriver,則需要特殊指定。當使用JDBC時則可以這么寫:jdbc:mysql://localhost:3306/。
    • user屬性:后端存儲實例的用戶名。
    • password屬性:后端存儲實例的密碼
    • weight屬性:在readHost中作為讀節點的權重(mycat1.4版本之后才有的)
    • usingDecrypt屬性:同server.xml中。

rule配置文件

rule.xml里面就定義了我們對表進行拆分所涉及到的規則定義。我們可以靈活的對表使用不同的分片算法,或者對表使用相同的算法但具體的參數不同。這個文件里面主要有tableRule和function這兩個標簽。在具體使用過程中可以按照需求添加tableRule和function。

  • tableRule標簽: 這個標簽定義表規則。定義的表的規則在schema.xml中引用。

            name屬性指定唯一的名字,用於標識不同的表規則,內嵌的rule標簽則指定對物理表中的那一列進行拆分和使用什么路由算法。columns內指定要拆分的列名字。
            algorithm使用function標簽中的name屬性。連接表規則和具體路由算法。當然,多個表規則可以連接到同一個路由算法上。

  • function標簽:

          name指定算法的名字。
    class指定路由算法具體的類名字。
    property為具體算法需要用到的一些屬性。

 


免責聲明!

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



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