Mysql系列五:數據庫分庫分表中間件mycat的安裝和mycat配置詳解

 一、mycat的安裝

環境準備:準備一臺虛擬機192.168.152.128

1. 下載mycat

cd /software
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

2. 解壓mycat

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

 

3. 剪切mycat到/usr/local目錄下

mv /software/mycat /usr/local

 

4. 啓動mycat

 /usr/local/mycat/bin/mycat start 啓動 
 /usr/local/mycat/bin/mycat status  查看啓動狀態

說明:這裏有個小插曲,啓動一會mycat又會自己停止

通過查看日誌

vim /usr/local/mycat/logs/wrapper.log

報:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0

這是因爲使用的是jdk8的版本,jdk8以後就沒有永久代了,而mycat的wrapper.conf裏面配置了jdk8以前的永久代的內存大小,我們只需要註釋這個配置就可以了

重新啓動mycat:

/usr/local/mycat/bin/mycat start

就不會出現啓動一會又自己停止的問題了

連接mycat:

mysql -uroot -p123456 -h192.168.152.128 -P8066

可以看到mycat連接成功

5. linux下mycat常用命令

 /usr/local/mycat/bin/mycat start 啓動 
 /usr/local/mycat/bin/mycat stop 停止 
 /usr/local/mycat/bin/mycat console 前臺運行 
 /usr/local/mycat/bin/mycat restart 重啓服務 
 /usr/local/mycat/bin/mycat pause  暫停 
 /usr/local/mycat/bin/mycat status  查看啓動狀態

二、mycat配置詳解

1. 首先查看mycat的文件目錄

mycat的主要配置文件都在conf目錄下,核心的配置文件是schema.xml、server.xml、rule.xml這3個配置文件,下面我們來對這3個配置文件進行詳細介紹

2. schema.xml

是Mycat最重要的配置文件之一。主要管理Mycat邏輯庫、邏輯表、表、分片規則、DataSource。

複製代碼

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!--
    schema標籤:指定Mycat的邏輯庫(mycat的Schema,可以指定多個schema標籤)
    
    checkSQLschema屬性:
        False 過濾schema定義。
        select * from testdb.company;=> select * from company;
        True  不過濾schema定義,當我們把testdb輸錯了或者沒有設置大小寫敏感就會報錯
    
    sqlMaxLimit屬性:
        Limit 自動加入limit,查詢語句如果沒有加入分頁參數,當數據量很大的時候,mycat認爲會有問題時就啓用這個參數只返回100條。例如:select * from company。    
    -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> 
        <!-- 
        
        table標籤:指定Mycat中的邏輯表。最後要做數據分片的表。mycat中的表,可以和實體有具體映射關係,也可以沒有具體映射關係(如果沒有映射關係會報錯)。
        dataNode屬性:數據節點,把相應的表存到對應的DB中。
        rule屬性:分片規則。對應rule.xml中的規則。
        ruleRequired屬性:指定該屬性的表是否需要分片規則。True 必須制定,如果沒有制定,就會報錯。        
     primaryKey屬性:值爲具體的物理表的主鍵id,如果使用非主鍵進行分片,那麼Mycat會緩存主鍵和具體dataNode的信息,如果下次再使用非主鍵進行查詢的時候,就不用廣播所有dn。
        type屬性:邏輯表的類型。普通表和全局表,全局表不需要分片,是爲了解決跨庫join的,全局表一般是數據量比較小、基本不會增長的表
        autoIncrement屬性:Mycat根據last_insert_id()返回結果。這個需要和mysql自增長主鍵配合。
        needAddLimit屬性:是否自動在每一條SQL語句後面加上limit限制。
        -->
        <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

        <!-- global table is auto cloned to all defined data nodes ,so can join
            with any table whose sharding node is in the same data node -->
        <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
        <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
        <!-- random sharding using mod sharind rule -->
        <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
               rule="mod-long" />
        <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
            needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
            rule="mod-long" /> -->
        <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
               rule="sharding-by-intfile" />
        <table name="customer" primaryKey="ID" dataNode="dn1,dn2"
               rule="sharding-by-intfile">
            <childTable name="orders" primaryKey="ID" joinKey="customer_id"
                        parentKey="id">
                <childTable name="order_items" joinKey="order_id"
                            parentKey="id" />
            </childTable>
            <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
                        parentKey="id" />
        </table>
        <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
            /> -->
    </schema>
    <!-- 
    dataNode標籤:定義數據節點
        dataHost屬性: 主機的名稱
        database屬性: 數據庫
    
        
    -->
    <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
        /> -->
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />
    <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
     <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
    <dataNode    name="jdbc_dn2" dataHost="jdbchost" database="db2" />
    <dataNode name="jdbc_dn3"     dataHost="jdbchost" database="db3" /> -->
    
    <!--
    dataHost標籤:主要定義和Mysql集羣有關的信息,數據實例、讀寫分離配置和心跳檢測語句。
    balance屬性:讀操作負載均衡配置
          0 代表不開啓讀寫分離,所有的讀操作都發送到writeHost上。
          1 writeHost和readHost都要參與select語句的負載均衡。例如:雙主雙從模式 M1->S1,  M2->S2, M1和M2互爲主備。M2/S1/S2都要參與select語句的負載均衡。
          2 所有讀操作都隨機分配給writeHost/readHost
          3 所有的讀操作隨機分發到writeHost下面的readHost上執行。
    writeType屬性:寫操作負載均衡配置
          0 所有的寫操作都分發到第一個writeHost。如果第一個掛了,分發到第二個。
          1 所有的寫操作都要隨機分發到所有配置的writeHost上。1.5以後不推薦。
    dbType屬性:支持的數據庫類型,mycat支持多種db類型:mysql、oracle等
    switchType屬性:切換類型,主備切換,主主切換。
          -1 代表不自動切換
          1 默認值,自動切換。對應的心跳檢測語句select user();
          2 基於Mysql主從同步的狀態決定是否切換。對應的心跳檢測語句show slave status;
          3 基於MySQL Galera Cluster切換機制。對應的心跳檢測語句show status like ‘wsrep%’;
    maxCon屬性:單個writeHost/readHost節點的最大連接數
    minCon屬性:單個writeHost/readHost節點的最小連接數
    -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="123456">
            <!-- can have multi read hosts -->
            <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
        </writeHost>
        <writeHost host="hostS1" url="localhost:3316" user="root"
                   password="123456" />
        <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>
    <!--
        <dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
        <heartbeat>         </heartbeat>
         <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng"     password="jifeng"></writeHost>
         </dataHost>

      <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0"     dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
        <connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
        <writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base"     password="123456" > </writeHost> </dataHost>

        <dataHost name="jdbchost" maxCon="1000"     minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
        <heartbeat>select     user()</heartbeat>
        <writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>

        <dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
        <heartbeat> </heartbeat>
         <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng"     password="jifeng"></writeHost> </dataHost> -->

    <!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
        dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
        url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
        </dataHost> -->
</mycat:schema>

複製代碼

3. server.xml

主要用於管理Mycat的用戶名,權限,黑白名單等等設置。這個文件主要和Mycat 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/">
    <system>
    <property name="useSqlStat">0</property>  <!-- 1爲開啓實時統計、0爲關閉 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->

        <property name="sequnceHandlerType">2</property>
      <!--  <property name="useCompression">1</property>--> <!--1爲開啓mysql壓縮協議-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--設置模擬的MySQL版本號-->
    <!-- <property name="processorBufferChunk">40960</property> -->
    <!-- 
    <property name="processors">1</property> 
    <property name="processorExecutor">32</property> 
     -->
        <!--默認爲type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
        <property name="processorBufferPoolType">0</property>
        <!--默認是65535 64K 用於sql解析時最大文本長度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <!--分佈式事務開關,0爲不過濾分佈式事務,1爲過濾分佈式事務(如果分佈式事務內只涉及全局表,則不過濾),2爲不過濾分佈式事務,但是記錄分佈式事務日誌-->
        <property name="handleDistributedTransactions">0</property>
        
            <!--
            off heap for merge/order/group/limit      1開啓   0關閉
        -->
        <property name="useOffHeapForMerge">1</property>

        <!--
            單位爲m
        -->
        <property name="memoryPageSize">1m</property>

        <!--
            單位爲k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            單位爲m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否採用zookeeper協調切換  -->
        <property name="useZKSwitch">true</property>


    </system>
    
    <!-- 
    Firewall標籤:全局SQL防火牆設置
        定義訪問控制策略:如白名單/黑名單
    -->
    <!-- 
    <firewall> 
       <whitehost>
          <host host="127.0.0.1" user="mycat"/>
          <host host="127.0.0.2" user="mycat"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>
    -->
    
    <!--
    User標籤:定義可訪問mycat的用戶名稱/密碼/是否只讀
    -->
    <user name="root">
        <property name="password">123456</property>
        <property name="schemas">TESTDB</property>
        
        <!--
        Privileges標籤:表級 DML 權限設置
          控制DML:insert/update/select/delete
          單獨給select權限:0010
          單獨給insert權限:1000
        -->
        <!--         
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>        
         -->
    </user>

    <user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">true</property>
    </user>

</mycat:server>

複製代碼

下面附一個表格說明server.xml的system標籤下的各個標籤和屬性的說明:

屬性

說明

備註

useSqlStat

開啓實時統計

1爲開啓,0爲關閉

useGlobleTableCheck

全局表一致性檢測

1爲開啓,0爲關閉

sequnceHandlerType

Mycat全局ID類型

0本地文件方式
1數據庫方式
2時間戳序列方式
3分佈式ZK ID生成器
4 ZK遞增ID生成

useCompression

mysql壓縮協議

1爲開啓,0爲不開啓

fakeMySQLVersion

僞裝的MySQL版本號

 

processorBufferChunk

每次分配Socket Direct Buffer大小

默認4096字節

processors

系統可用線程數

默認Runtime.getRuntime().availableProcessors()返回值

processorExecutor

NIOProcessor共享businessExecutor線程池大小

 

processorBufferPoolType

每次分配Socket Direct Buffer大小

默認是4096個字節

maxStringLiteralLength

sql解析時最大文本長度

默認是65535(即64K)

backSocketNoDelay

TCP連接相關屬性

默認值1

frontSocketNoDelay

TCP連接相關屬性

默認值1

serverPort

指定服務端口

默認8066

managerPort

指定管理端口

默認9066

idleTimeout

連接空閒時間

默認30分鐘,單位毫秒

bindIp

Mycat服務監聽的IP地址

 

frontWriteQueueSize

前端連接寫隊列長度

爲了讓用戶知道是否隊列過長(SQL結果集返回太多)。當超過指定閥值後,會產生一個告警日誌

handleDistributedTransactions

分佈式事務開關

0不過濾分佈式事務
1過濾分佈式事務
2不過濾分佈式事務但記錄分佈式事務日誌

useOffHeapForMerge

是否讓Mycat開啓非堆內存

1 開啓,0關閉

memoryPageSize

內存分頁大小

 

useStreamOutput

是否使用流輸出

 

systemReserveMemorySize

系統保留內存大小

 

useZKSwitch

是否採用zookeeper協調切換

true/false

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. rule.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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <!--
        tableRule標籤:定義table分片策略
    -->
    <tableRule name="rule1">
        <!--
        rule標籤:策略定義標籤
        -->
        <rule>
            <!--
            columns標籤:對應的分片字段
            -->
            <columns>id</columns>
            <!--
            algorithm標籤:tableRule分片策略對應的function名稱
            -->
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="rule2">
        <rule>
            <columns>user_id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>sharding_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-murmur">
        <rule>
            <columns>id</columns>
            <algorithm>murmur</algorithm>
        </rule>
    </tableRule>
    <tableRule name="crc32slot">
        <rule>
            <columns>id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-month">
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="latest-month-calldate">
        <rule>
            <columns>calldate</columns>
            <algorithm>latestMonth</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="auto-sharding-rang-mod">
        <rule>
            <columns>id</columns>
            <algorithm>rang-mod</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="jch">
        <rule>
            <columns>id</columns>
            <algorithm>jump-consistent-hash</algorithm>
        </rule>
    </tableRule>

    <!--
    function標籤:定義分片函數
    -->
    <function name="murmur"
        class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property><!-- 默認是0 -->
        <property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->
        <property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射爲這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 -->
        <!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引爲key,以節點權重值爲值。所有權重值必須是正整數,否則以1代替 -->
        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
            用於測試時觀察各物理節點與虛擬節點的分佈情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 -->
    </function>

    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->
    </function>
    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
        class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
        class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>
    
    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
            <property name="mapFile">partition-range-mod.txt</property>
    </function>
    
    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>

複製代碼

rule是定義分片規則的

三、mycat工作原理

四、mycat基礎概念

1. mycat支持的數據庫

 

2. 邏輯庫(Schema)

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

3. 邏輯表

在分佈式數據庫中,讀寫數據的表就是邏輯表。邏輯表,可以是數據切分後分布在一個或多個分片庫中,也可以不做數據切分不分片,只有一個表構成 

4. DataNode、DataHost、Rule

DataNode:數據切分後,一個大表被分到不同的分片數據庫上面,每個分片所在的數據庫就是分片節點

DataHost:數據切分後,每個分片節點(DataNode)不一定都會獨佔一臺機器,同一機器上面可以有多個分片數據庫。一個或多個分片節點(DataNode)所在的機器就是節點主機(DataHost)

Rule:分片規則,選擇合適的分片規則很重要,將極大的避免後續處理數據的難度

5. myca分片原則

5.1 數據拆分之前的思考

分片規則雖然能解決大表對數據庫系統的壓力,但它並不是萬能的,也有一些不利之處。因此首要問題是:

1)分不分庫

2)分哪些庫

3)什麼規則分

4)分多少片

5.2 mycat數據切分原則

1)達到一定數量級才分,一般是單表達到800萬數據就要考慮數據拆分了。

2)不到800萬,但跟大表(超800萬的表)有關聯查詢的表也要拆分,在此稱爲大表關聯表

3)大表關聯表如何拆分:小於100萬的使用全局表;大於100萬小於800萬跟大表使用同樣的拆分策略;無法跟大表使用相同規則的,可以考慮從java代碼上分步驟查詢,不用關聯查詢,或者破例使用全局表。

4)全局表:如品牌表250萬,跟大表order關聯,又無法跟大表使用同樣的拆分策略,也做成了全局表。全局表必須滿足的條件:沒有太激烈的併發update(如多線程同時update同一條記錄);雖有多線程update,但不是操作同一條記錄;批量insert沒問題。

5)拆分字段是不可修改的

6)拆分字段只能是一個字段,如果想按照兩個字段拆分,必須新建一個冗餘字段,冗餘字段的值使用兩個字段的值拼接而成(如大區+年月拼接成:“區域_年月日” 字段)

7)拆分算法的選擇和合理性判斷:按照選定的算法拆分後每個庫中單表不得超過800萬記錄

8)能不拆分的儘量不拆分。如果某個表不跟其他表關聯查詢,數據量又少、直接不拆分,使用單庫即可

5.3 Mycat分庫分表原則

1)能不分就不分,1000萬以內的表,不建議分片,通過合適的索引,讀寫分離等方式,可以很好的解決性能問題

2)分片數量儘量少,分片儘量均勻分佈在多個DataHost上,因爲一個查詢SQL跨分片越多,則總體性能越差,雖然要好於所有數據在一個分片的結果,只在必要的時候進行擴容,增加分片數量。

3)分片規則需要慎重選擇,分片規則的選擇,需要考慮數據的增長模式,數據的訪問模式,分片關聯性問題,以及分片擴容問題,最近的分片策略爲範圍分片,枚舉分片,一致性Hash分片,這幾種分片都有利於擴容

4)儘量不要在一個事物中的SQL跨越多個分片,分佈式事物一直是一個不好處理的問題

5)查詢條件儘量優化,儘量避免select * 的方式,大量數據結果集下,會消耗大量的CPU資源和帶寬,查詢應儘量避免返回大的結果集,並且應儘量爲頻繁使用的查詢語句建立索引

5.4 mycat常用分片規則

1)時間類:按天分片、自然月分片、單月小時分片

2)哈希類:Hash固定分片、日期範圍Hash分片、截取數字Hash求模範圍分片、截取數字Hash分片、一致性Hash分片

3)取模類:取模分片、取模範圍分片、範圍求模分片

4)其他類:枚舉分片、範圍約定分片、應用指定分片、冷熱數據分片

發佈了49 篇原創文章 · 獲贊 59 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章