什麼是資料庫分片
簡單來說,就是指通過某種特定的條件,将我們存放在同一個資料庫中的資料分散存放到多個資料庫(主機)上面,以達到分散單台裝置負載的效果。
資料的切分(Sharding)根據其切分規則的類型,可以分為兩種切分模式。
(1)一種是按照不同的表(或者Schema)來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分
(2)另外一種則是根據表中的資料的邏輯關系,将同一個表中的資料按照某種條件拆分到多台資料庫(主機)上面,這種切分稱之為資料的水準(橫向)切分。
如何實作資料庫分片
當資料庫分片後,資料由一個資料庫分散到多個資料庫中。此時系統要查詢時需要切換不同的資料庫進行查詢,那麼系統如何知道要查詢的資料在哪個資料庫中?當添加一條記錄時要向哪個資料庫中插入呢?這些問題處理起來都是非常的麻煩。
這種情況下可以使用一個資料庫中間件mycat來解決相關的問題。接下來了解一下什麼是mycat。
什麼是Mycat?
Mycat提供高可用性資料分片叢集。你可以像使用mysql一樣使用mycat。對于開發人員來說根本感覺不到mycat的存在。
Mycat的分片政策
- 邏輯庫(schema) :通常對實際應用來說,并不需要知道中間件的存在,業務開發人員隻需要知道資料庫的概念,是以資料庫中間件可以被看做是一個或多個資料庫叢集構成的邏輯庫。是以我們在開發中,就隻需要操作邏輯庫就好。
-
邏輯表(table):既然有邏輯庫,那麼就會有邏輯表,分布式資料庫中,對應用來說,讀寫資料的表就是邏輯表。邏輯表,可以是資料切分後,分布在一個或多個分片庫中,也可以不做資料切分,不分片,隻有一個表構成。
分片表:是指那些原有的很大資料的表,需要切分到多個資料庫的表,這樣,每個分片都有一部分資料,所有分片構成了完整的資料。 總而言之就是需要進行分片的表。
非分片表:一個資料庫中并不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表來說的,就是那些不需要進行資料切分的表。
- 分片節點(dataNode):資料切分後,一個大表被分到不同的分片資料庫上面,每個表分片所在的資料庫就是分片節點(dataNode)。一個節點就對應一個資料庫。
- 節點主機(dataHost) :資料切分後,每個分片節點(dataNode)不一定都會獨占一台機器,同一機器上面可以有多個分片資料庫,這樣一個或多個分片節點(dataNode)所在的機器就是節點主機(dataHost),為了規避單節點主機并發數限制,盡量将讀寫壓力高的分片節點(dataNode)均衡的放在不同的節點主機(dataHost)。
- 分片規則(rule) :前面講了資料切分,一個大表被分成若幹個分片表,就需要一定的規則,這樣按照某種業務規則把資料分到某個分片的規則就是分片規則,資料切分選擇合适的分片規則非常重要,将極大的避免後續資料處理的難度。
Mycat的下載下傳及安裝
jdk:要求jdk必須是1.7及以上版本
Mysql:推薦mysql是5.5以上版本
Mycat:
Mycat的官方網站:http://www.mycat.org.cn/
下載下傳位址:https://github.com/MyCATApache/Mycat-download
安裝步驟(這裡是linux下的安裝):
第一步:下載下傳Mycat-server-xxxx-linux.tar.gz
第二步:将壓縮包解壓縮。建議将mycat放到/usr/local/mycat目錄下。
第三步:進入mycat目錄,啟動mycat:./mycat start
停止: ./mycat stop
mycat 支援的指令{ console | start | stop | restart | status | dump }
Mycat的預設端口号為:8066(mysql是3306)
Mycat分片的測試
-
準備兩個安裝了mysql的linux系統:
Host1:192.168.25.132(建立兩個資料庫:db1,db3)
Host2:192.168.25.134(建立一個資料庫:db2)
其中,在Host1上安裝Mycat,是以需要在Host1上面安裝jdk
-
配置Mycat中的schema.xml配置檔案
Schema.xml作為MyCat中重要的配置檔案之一,管理着MyCat的邏輯庫、表、分片規則、DataNode以及DataSource。弄懂這些配置,是正确使用MyCat的前提。這裡就一層層對該檔案進行解析:
1、schema 标簽用于定義MyCat執行個體中的邏輯庫
2、Table 标簽定義了MyCat中的邏輯表
3、dataNode 标簽定義了MyCat中的資料節點,也就是我們通常說所的資料分片。
4、dataHost标簽在mycat邏輯庫中也是作為最底層的标簽存在,直接定義了具體的資料庫執行個體、讀寫分離配置和心跳語句
5、修改schema.xml(在mycat/conf目錄下):
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost2" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<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="192.168.25.132:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
<dataHost name="localhost2" 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="192.168.25.134:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
</mycat:schema>
1)、通過schema标簽來定義一個邏輯庫:e3mall
2)、通過teble标簽定義一個邏輯表:tb_item,分片到是三個節點上dn1,dn2,dn3,分片規則是mycat預設的一個值auto-sharding-long,也可以自己定義分片規則,在與schema.xml同級的rule.xml中配置,auto-sharding-long這個規則表示通過id的值的範圍進行分片,一個節點中最多隻能存放5000000條資料
3)、通過dataNode标簽來定義三個節點,分别指定節點所在的伺服器的ip以及對應的資料庫名稱
4)、通過dataHost标簽來指明節點中的mysql資料庫的位址,使用者名和密碼,裡面的writeHost标簽一般隻配置一個就好
6、修改server.xml(與schema.xml同級)
<user name="user">
<property name="password">user</property>
<property name="schemas">e3mall</property>
</user>
裡面的user标簽隻留下一個即可,是配置連接配接邏輯庫的使用者名和密碼
測試
可以通過mysql的連接配接工具,直接連接配接邏輯庫
在mycat這個連接配接上,使用sql語句建立一個表tb_item,則db1,db2,db3中都有了這一個表,是以我們開發就隻需要對mycat這個連接配接,把他當做一個資料庫操作即可
在mycat這個連接配接上,使用insert語句往tb_item表中插入一些資料,當插入的記錄的id的值小于5000000時,資料都是插入了db1中的tb_item表,
當id的值是5000001~10000000,資料都是插入了db2中的tb_item表,
當id的值是10000001~15000000,資料都是插入了db3中的tb_item表
當id的值大于15000000時,就不能插入了,此時需要增加節點。
這就是auto-sharding-long這個分片規則。