教程 | MySql都會了,肯定不學習一下MyCat分片?



這是小小本週的第二篇,我是小小,本週將會介紹MyCat以及MyCat分片。node

MyCat 介紹

什麼是MyCat

官方網站::http://www.mycat.org.cn/ http://www.mycat.io/ db proxy Mycatmysql

MyCat 架構

MyCat 核心概念

Schema

Schema:由它指定邏輯數據庫(至關於MySQL的database數據庫)linux

Table

Table:邏輯表(至關於MySQL的table表)web

DataNode

DataNode:真正存儲數據的物理節點算法

DataHost

DataHost:存儲節點所在的數據庫主機(指定MySQL數據庫的鏈接信息)sql

User

User:MyCat的用戶(相似於MySQL的用戶,支持多用戶)數據庫

MyCat 主要解決問題

  1. 海量數據保存 2。查詢優化

MyCat 對多數據庫的支持

MyCat 分片策略

MyCAT支持水平分片與垂直分片:水平分片:一個表格的數據分割到多個節點上,按照行分隔。垂直分片:一個數據庫中多個表格A,B,C,A存儲到節點1上,B存儲到節點2上,C存儲到節點3 上。MyCAT經過定義表的分片規則來實現分片,每一個表格能夠捆綁一個分片規則,每一個分片規則指定一個分 片字段並綁定一個函數,來實現動態分片算法。後端

Schema

Schema:邏輯庫,與MySQL中的Database(數據庫)對應,一個邏輯庫中定義了所包括的Table。緩存

Table

Table:表,即物理數據庫中存儲的某一張表,與傳統數據庫不一樣,這裏的表格須要聲明其所存儲的 邏輯數據節點DataNode。在此能夠指定表的分片規則。微信

DataNode

DataNode:MyCAT的邏輯數據節點,是存放table的具體物理節點,也稱之爲分片節點,經過 DataHost來關聯到後端某個具體數據庫上

DataHost

DataHost:定義某個物理庫的訪問地址,用於捆綁到Datanode上

MyCat 安裝

下載MyCat

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

解壓縮

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

進入mycat/bin,啓動MyCat

- 啓動命令:./mycat start
- 中止命令:./mycat stop
- 重啓命令:./mycat restart
- 查看狀態:./mycat status

訪問MyCat

使用mysql的客戶端直接鏈接mycat服務。默認服務端口爲【8066】
mysql -uroot -p123456 -h127.0.0.1 -P8066

MyCat 分片

配置schema.xml

什麼是schema.xml

schema.xml做爲Mycat中重要的配置文件之一,管理着Mycat的邏輯庫、表、分片規則、DataNode 以及DataHost之間的映射關係。弄懂這些配置,是正確使用Mycat的前提。schema 標籤用於定義MyCat實例中的邏輯庫 Table 標籤訂義了MyCat中的邏輯表 dataNode 標籤訂義了MyCat中的數據節點,也就是咱們一般說所的數據分片。dataHost標籤在mycat邏輯庫中也是做爲最底層的標籤存在,直接定義了具體的數據庫實例、讀 寫分離配置和心跳語句。

Schema.xml 配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--
schema : 邏輯庫 name:邏輯庫名稱
sqlMaxLimit:一次取多少條數據 要超過用limit xxx
table:邏輯表
dataNode:數據節點 對應datanode標籤
rule:分片規則,對應rule.xml
subTables:子表
primaryKey:分片主鍵 可緩存
-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
配置Server.xml
server.xml介紹
server.xml幾乎保存了全部mycat須要的系統配置信息。最經常使用的是在此配置用戶名、密碼及權限。
server.xml配置
配置rule.xml
rule.xml裏面就定義了咱們對錶進行拆分所涉及到的規則定義。咱們能夠靈活的對錶使用不一樣的分片算
法,或者對錶使用相同的算法但具體的參數不一樣。這個文件裏面主要有tableRule和function這兩個標
籤。在具體使用過程當中能夠按照需求添加tableRule和function。
此配置文件能夠不用修改,使用默認便可。
<table name="item" dataNode="dn1,dn2,dn3" rule="mod-long"
primaryKey="ID"/>
</schema>
<!-- <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" />
<!--
dataHost : 數據主機(節點主機)
balance:1 :讀寫分離 0 :讀寫不分離
writeType:0 第一個writeHost寫, 1 隨機writeHost寫
dbDriver:數據庫驅動 native:MySQL JDBC:Oracle、SQLServer
switchType:是否主動讀
一、主從自動切換 -1 不切換 2 當從機延時超過slaveThreshold值時切換爲主讀
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.24.129:3306" user="root"
password="root" >
</writeHost>
</dataHost>
</mycat:schema>

配置server.xml

server.xml 介紹

server.xml幾乎保存了全部mycat須要的系統配置信息。最經常使用的是在此配置用戶名、密碼及權限。

server.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
</user>
</mycat:server>

配置rule.xml

rule.xml裏面就定義了咱們對錶進行拆分所涉及到的規則定義。咱們能夠靈活的對錶使用不一樣的分片算 法,或者對錶使用相同的算法但具體的參數不一樣。這個文件裏面主要有tableRule和function這兩個標 籤。在具體使用過程當中能夠按照需求添加tableRule和function。此配置文件能夠不用修改,使用默認便可

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat=」http://io.mycat/「 >
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
</mycat:rule>

tableRule 標籤配置說明:

name 屬性指定惟一的名字,用於標識不一樣的表規則 rule 標籤則指定對物理表中的哪一列進行拆分和使用什麼路由算法。columns 內指定要拆分的列名字。algorithm 使用 function 標籤中的 name 屬性。鏈接表規則和具體路由算法。固然,多個表規則 能夠鏈接到同一個路由算法上。table 標籤內使用。讓邏輯表使用這個規則進行分片。

function 標籤配置說明:

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

幾個經常使用的分片規則

連續分片

日期列分區法

<!--按固定時間分片-->
<tableRule name="sharding-by-date">
<rule>
<columns>create_time</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
<function name="sharding-by-date"
class="io.mycat.route.function..PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2014-01-01</property>
<property name="sPartionDay">10</property>
</function>
<!--按天然月分片-->
<tableRule name="sharding-by-month">
<rule>
配置說明:
tableRule標籤:
columns :標識將要分片的表字段
algorithm :指定分片函數
function標籤:
dateFormat :日期格式
sBeginDate :開始日期
sPartionDay :分區天數,即默認從開始日期算起,分隔10天一個分區
2、範圍約定
配置說明:
tableRule標籤:
<columns>create_time</columns>
<algorithm>sharding-by-month</algorithm>
</rule>
</tableRule>
<function name="sharding-by-month"
class="io.mycat.route.function..PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2014-01-01</property>
</function>
<!--
按單月小時分片
適合作日誌,每個月末,手工清理
-->
<tableRule name="sharding-by-hour">
<rule>
<columns>create_time</columns>
<algorithm>sharding-by-hour</algorithm>
</rule>
</tableRule>
<function name="sharding-by-hour"
class="io.mycat.route.function..LastestMonthPartition">
<property name="splitOneDay">24</property>
</function>

配置說明 tableRule標籤:columns :標識將要分片的表字段 algorithm :指定分片函數 function標籤:dateFormat :日期格式 sBeginDate :開始日期 sPartionDay :分區天數,即默認從開始日期算起,分隔10天一個分區

範圍約定

<tableRule name="auto-sharding-long">
<rule>
<columns>user_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>

配置說明 tableRule標籤:columns :標識將要分片的表字段 algorithm :指定分片函數 function標籤:mapFile :指定分片函數須要的配置文件名稱

autopartition-long.txt文件內容:全部的節點配置都是從0開始,及0表明節點1,此配置很是簡單,即預先制定可能的id範圍對應某個分 片

# range start-end ,data node index
# K=1000,M=10000.
0-500M=0 0-100 0
500M-1000M=1 101-200 1
201-300 2
1000M-1500M=2
default=0
# 或如下寫法
# 0-10000000=0
# 10000001-20000000=1

優點:擴容無需遷移數據 缺點:熱點數據,併發受限

離散分片

枚舉法

<tableRule name="sharding-by-intfile">
<rule>
<columns>user_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>

配置說明 tableRule標籤:columns :標識將要分片的表字段 algorithm :指定分片函數 function標籤:mapFile :指定分片函數須要的配置文件名稱 type :默認值爲0,0表示Integer,非零表示String defaultNode :指定默認節點,小於0表示不設置默認節點,大於等於0表示設置默認節點,0表明節 點1。

默認節點的做用:枚舉分片時,若是碰到不識別的枚舉值,就讓它路由到默認節點。若是不配置默認節點(defaultNode值小於0表示不配置默認節點),碰到不識別的枚舉值 就會報錯:

partition-hash-int.txt 配置:

10000=0 列等於10000 放第一個分片
10010=1
男=0
女=1
beijing=0
tianjin=1
zhanghai=2

求模法

<tableRule name="mod-long">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long"
class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>

tableRule標籤:columns :標識將要分片的表字段 algorithm :指定分片函數 function標籤:count :節點數量

一致性hash

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

等,還有一些其餘分片,這裏,暫時不說明

測試分片

把商品表分片存儲到三個數據節點上。

建立表

配置完畢後,從新啓動mycat。使用mysql客戶端鏈接mycat,建立表。

CREATE TABLE item (
id int(11) NOT NULL,
name varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

分片測試

分片策略指定爲「auto-sharding-long」 分片規則指定爲「mod-long」

關於做者

我是小小,來自雙魚座的,外太空的一枚小孩紙,目前漂泊在一線城市,成爲一枚正經的北漂人,我是小小,本期MyCat分片結束,咱們下期再見。

小明菜市場

推薦閱讀


● 教程 | Hadoop集羣搭建和簡單應用

● 文末送書 | WAF 那些事

● 爲何系列之不能重寫service方法

● 細說 | "失效"的private修飾符

● 知道 | 同窗,你都瞭解關係型數據庫,肯定不瞭解一下這種數據庫嗎?


給我個好看再走好嗎?



本文分享自微信公衆號 - 小明菜市場(fileGeek)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索