1. 程式人生 > >mycat 表分片

mycat 表分片

分表分庫雖然能解決大表對資料庫系統的壓力,但它並不是萬能的,也有一些不利之處,因此首要問題是,
分不分庫,分哪些庫,什麼規則分,分多少分片。
原則一:能不分就不分,1000 萬以內的表,不建議分片,通過合適的索引,讀寫分離等方式,可以很好的解決效能問題。
原則二:分片數量儘量少,分片儘量均勻分佈在多個DataHost 上,因為一個查詢SQL 跨分片越多,則總體
效能越差,雖然要好於所有資料在一個分片的結果,只在必要的時候進行擴容,增加分片數量。
原則三:分片規則需要慎重選擇,分片規則的選擇,需要考慮資料的增長模式,資料的訪問模式,分片關聯
性問題,以及分片擴容問題,最近的分片策略為範圍分片,列舉分片,一致性Hash 分片,這幾種分片都有利於擴容。
原則四:儘量不要在一個事務中的SQL 跨越多個分片,分散式事務一直是個不好處理的問題。
原則五:查詢條件儘量優化,儘量避免Select * 的方式,大量資料結果集下,會消耗大量頻寬和CPU 資源,
查詢儘量避免返回大量結果集,並且儘量為頻繁使用的查詢語句建立索引。
這裡特別強調一下分片規則的選擇問題,如果某個表的資料有明顯的時間特徵,比如訂單、交易記錄等,則
他們通常比較合適用時間範圍分片,因為具有時效性的資料,我們往往關注其近期的資料,查詢條件中往往帶有
時間欄位進行過濾,比較好的方案是,當前活躍的資料,採用跨度比較短的時間段進行分片,而歷史性的資料,則採用比較長的跨度儲存。


總體上來說,分片的選擇是取決於最頻繁的查詢SQL 的條件,因為不帶任何Where 語句的查詢SQL,會便
利所有的分片,效能相對最差,因此這種SQL 越多,對系統的影響越大,所以我們要儘量避免這種SQL 的產生。
如何準確統計和分析當前系統中最頻繁的SQL 呢?有幾個簡單做法:
- 採用特殊的JDBC 驅動程式,攔截所有業務SQL,並寫程式進行分析
- 採用Mycat 的SQL 攔截器機制,寫一個外掛,攔截所欲SQL,並進行統計分析
- 開啟MySQL 日誌,分析統計所有SQL
找出每個表最頻繁的SQL,分析其查詢條件,以及相互的關係,並結合ER 圖,就能比較準確的選擇每個表的分片策略。

mysql> create database db1;
mysql> create database db2;

mysql> create database db3;
mysql> create database db4;
mysql> create database db5;

分別在每個庫裡面建表

create table test (
        id int(11) not null auto_increment ,
        name varchar(10) default '' not null,
         primary key(id)
);

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db2                |
| db3                |
| db4                |
| db5                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
9 rows in set (0.00 sec)

[[email protected] conf]# cat schema.xml 
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="testdb" checkSQLschema="true" sqlMaxLimit="100">
        <table name="travelrecord" dataNode="dn1" autoIncrement="true" primaryKey="ID"  /> 
           <table name="t1" dataNode="dn1" autoIncrement="true" primaryKey="ID"  />
             <table name="test" dataNode="dn$1-5" autoIncrement="true"  rule="auto-sharding-long"  primaryKey="ID"  />

       </schema>
       <dataNode name="dn1" dataHost="shard" database="db1" />
         <dataNode name="dn2" dataHost="shard" database="db2" />
         <dataNode name="dn3" dataHost="shard" database="db3" />
         <dataNode name="dn4" dataHost="shard" database="db4" />
         <dataNode name="dn5" dataHost="shard" database="db5" />

    <dataHost name="shard" maxCon="1000" minCon="10" balance="2"  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="127.0.0.1:3306" user="root"  password="qwe123">
            <readHost host="hostS2" url="127.0.0.1:3307" user="root" password="qwe123" />
        </writeHost>
    </dataHost>
</mycat:schema>


[[email protected] conf]# cat rule.xml 

    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>

    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>

    
    
[[email protected] backup]# cat autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-5=0
5-10=1
10-15=2
15-20=3
20-25=4

配置好後,重啟reload mycat,插入資料測試


[[email protected] bin]# /mnt/mysql5641/bin/mysql -uroot -pqwe123 -P8066 -h127.0.0.1    
mysql> insert into test(id,name) values(1,'a');
mysql> insert into test(id,name) values(5,'b');
mysql> insert into test(id,name) values(10,'c');
mysql> insert into test(id,name) values(15,'d');
mysql> insert into test(id,name) values(20,'e');
mysql> insert into test(id,name) values(25,'e');


mysql> insert into test(id,name) values(1000,'ssss');
ERROR 1064 (HY000): can't find any valid datanode :TEST -> ID -> 1000

說明沒有在分片範圍內的,就會報錯

mysql> use db1;
mysql> select *From test;
+----+------+
| id | name |
+----+------+
|  1 | a    |
+----+------+
1 row in set (0.00 sec)

mysql> use db2
mysql> select *from test;
Empty set (0.00 sec)

mysql> select *from test;
+----+------+
| id | name |
+----+------+
| 10 | c    |
+----+------+
1 row in set (0.00 sec)

mysql> use db3
mysql> select *from test;
+----+------+
| id | name |
+----+------+
| 15 | d    |
+----+------+
1 row in set (0.00 sec)

mysql> use db4
mysql> select *from test;
+----+------+
| id | name |
+----+------+
| 20 | e    |
+----+------+
1 row in set (0.00 sec)

mysql> use db5
mysql> select *From test;
+----+------+
| id | name |
+----+------+
| 25 | e    |
+----+------+
1 row in set (0.00 sec)
 

相關推薦

mycat 分片

分表分庫雖然能解決大表對資料庫系統的壓力,但它並不是萬能的,也有一些不利之處,因此首要問題是, 分不分庫,分哪些庫,什麼規則分,分多少分片。 原則一:能不分就不分,1000 萬以內的表,不建議分片,通過合適的索引,讀寫分離等方式,可以很好的解決效能問題。 原則二:分片數量儘量

mycat分離分片

mysql innobackupex mysql主從 mycat rename table 背景:當前分片中有5張表,計劃將按月分片的日誌表分離到其他服務器。 要求:不影響業務情況下進行分離日誌表。 實驗計劃: 1.使用pt工具導出部分庫、部分表,並應用備份集。 2.搭建部分表主

mycat安裝以及分庫分,分片操作

一、準備環境 172.16.1.230   mycat 172.16.1.231  mysql (主) 172.16.1.232  mysql (從) mysql5.7安裝參考: mysql主從配置: 二、安裝mycat 解壓到目錄 /usr/l

mycat 離散分片 -&gt; 程序指定分區的分片

spa ssi ica arc direct ted def cut roo 1。程序指定分區的分片 此規則是在運行階段有應用自主決定路由到那個分片。 此方法為直接依據字符子串(必須是數字)計算分區號(由應用傳遞參數。顯式指定分區號)。 2

網際網路架構之Mycat分片規則

常用的分片規則一共有10個 一、列舉法 <tableRule name="sharding-by-intfile"> <rule> <columns>user_id</columns> <algorithm>hash-int

mycat+mysql分片

下載mycat完成環境變數配置: name:MYCAT_HOME value:D:\user\mycat 加入系統路徑 name:path value:;%MYCAT_HOME%\bin; server,rule的xml檔案為預設mycat配置和分片規則,主要

Mycat分片方法

概述   本篇文章主要介紹Mycat以月進行分片的方法,包括配置方法、注意事項等。 mycat版本:1.4 資料節點:dn1,dn2,dn3 架構:主從 配置    建立測試表 CREATE TABLE `tdate` ( `id` int(11) NOT NULL, `cr

mycat 連續分片 -> 按日期(天)分片

1,按日期(天)分片 按日期(天)分片:從開始日期算起,按照天數來分片 例如,從2016-01-01,每10天一個分片 注意事項:需要提前將分片規劃好,建好,否則有可能日期超出實際配置分片數 2,新增配置檔案 在function.xml裡面進行

Mycat分片(水平分片)例項

要求: 把一個表分片儲存到三個資料節點上。 節點環境: mysql節點1環境 作業系統版本 : centos6.4 資料庫版本 : mysql-5.6 mycat版本 :1.4 releas

mycat讀寫分離+垂直切分+水平切分+er分片+全局 測試

mysql cal style st2 create 提交 org 方法 一起 原文http://blog.163.com/[email protected]/blog/static/172718064201683031639683/ 讀寫分離:利用最基礎的m

MySQL 高可用:mysql+mycat實現數據庫分片(分庫分

native 分布 for 成功 img 問題 represent apache 新一代 本文引用於http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat實現數據庫分片(

mycat垂直分庫、垂直分片mycat的多跨庫的一次實戰

mycat垂直分庫: userinfo庫包括,表user、表company userorder庫包括:表order 涉及多表查詢:  配置如下:schema.xml配置如下: <?xml version="1.0"?> <!DOCTYPE mycat:

MySQL 高可用:mysql+mycat實現資料庫分片(分庫分

什麼是MYCAT: 一個徹底開源的,面向企業應用開發的大資料庫叢集 支援事務、ACID、可以替代MySQL的加強版資料庫 一個可以視為MySQL叢集的企業級資料庫,用來替代昂貴的Oracle叢集 一個融合記憶體快取技術、NoSQL技術、HDFS大資料的新型SQL Se

MyCat分片規則(全域性,ER分片,多對多關聯,主鍵分片VS非主鍵分片),MyCat常用的分片規則(15中分片規則),自定義MyCat分片規則

1 MyCat分片規則 資料切分中重要的幾條原則,其中有幾條資料冗餘,表分組(Table Group)。 1.1全域性表 如果你的業務中有些資料類似於資料字典,比如配置檔案的配置,常用業務的配置或資料量不是很大,很少變動的表,這些表往往不是特別大,而且大部分的業務場景都

Mycat之——讀寫分離+垂直切分+水平切分+er分片+全域性 測試

今天,給大家帶來一篇基於Mycat的讀寫分離+垂直切分+水平切分+er分片+全域性表 測試 ,我們直接進入主題 一、垂直切分測試 1、schema.xml裡面加入 <schema name="weixin" checkSQLschema="false" sqlM

讀書筆記-Mycat權威指南-10-分片規則

line -m 字典 取模運算 連接 兩個 範圍查詢 技術分享 取數 分片規則概述 在數據切分處理中,特別是水平切分中,中間件最終要的兩個處理過程就是數據的切分、數據的聚合。 選擇 合適的切分規則,至關重要,因為它決定了後續數據聚合的難易程度,甚至可以避免跨庫的數據聚

mycat分片規則

ext 擴容 難題 begin att func 跨庫 -a 方法 配置:schema文件rule字段,rule文件name字段 (1)分片枚舉:sharding-by-intfile (2)主鍵範圍:auto-sharding-long (3)一致性hash:shardi

mysql 第二十篇文章~mycat 分片規則的初步講解

場景 fault XML 配置文件 理解 fun int 完全 文本 一 簡介:今天咱們來聊聊分片規則的初步理解 二 前沿:mycat的分片規則是十分豐富的,此外還可以根據java進行擴展 三 文件:rule.xml 四 具體分片規則: <tableRule

Mycat學習實戰-Mycat分片

mysql mycat 分片 詳情:http://blog.csdn.net/ygqygq2/article/details/78390985本文出自 “ygqygq2” 博客,請務必保留此出處http://ygqygq2.blog.51cto.com/1009869/1981540Mycat學習

MyCat:對MySQL數據庫進行分庫分

文件 res names sel reg l數據庫 esp chan 規則 本篇前提: mycat配置正確,且能正常啟動。1、schema.xml<table>