根據指定的欄位及其設定的範圍與資料節點的對應情況,來決定該資料屬於哪一個分片。
說明1:範圍分片會提前提供一個分片的範圍預設是0-500萬是一個分片,500萬-1000萬是一個分片,1000萬-1500萬是一個分片,超過1500萬要重新設定。
說明2:這個範圍我們可以根據自己的需要去自定義使用。
說明3:在設定schema.xml的時候,預設的分片規則 rule="auto-sharding-long" 就是範圍分片規則
說明4:在rule.xml中有auto-sharding-long的定義,其分片的依據是 id 主鍵
說明5:在rule.xml中有auto-sharding-long的定義,其採用的演演算法是 rang-long 演演算法
說明6:在function rang-long中有一個property 屬性,該屬性參照了一個外部檔案 「autopartition-long.txt」 檔案,在這個檔案中就是定義分片的範圍,如果我們要實現自定義資料分片即修改該檔案中的範圍即可。
說明1:在三個資料資料節點上都先建立好需要使用的資料庫range_db
說明1:新增schema標籤,邏輯庫的名稱為range_db,邏輯表的名稱為tb_range
說明2:分片規則為 rule="auto-sharding-long" 即範圍分片
說明3:dn7,dn8,dn9對應的資料節點依然是dbhost1,dbhost2,dbhost3.
說明4:dbhost1資料節點為192,168.3.90
說明5:dbhost2資料節點為192.168.3.91
說明5:dbhost3資料節點為192.168.3.92
說明1:給root使用者新增range_db的操作許可權
首先重啟Mycat
登入Mycat
檢視邏輯庫邏輯表
這裡的tb_range只是邏輯庫,而在MySQL中還並沒有tb_range這個表,需要在Mycat中建立
create table tb_range (id int auto_increment primary key, name varchar(20));
插入一條資料,然後檢視資料節點中對應的資料變化
insert into tb_range (id, name) values (1,'張三');
說明1:id=1的資料插入到了192.168.3.90的資料節點上了,我們採用的是預設的分片範圍
說明2:繼續新增一個id為5000000的資料看一下是否會繼續插入到192.168.3.90這個資料節點上
insert into tb_range (id, name) values (5000000,'李四');
說明3:沒有問題,id=5000000的也插入到了第一個資料節點上,繼續測試id=5000001的資料
insert into tb_range (id, name) values (5000001,'王五');
說明4:id=5000001的資料,插入到了192.168.3.91第二個資料節點上了,說明5000000是第一個和第二個資料節點的分界線,我們在測試一下id=10000001
insert into tb_range (id, name) values (10000001,'趙六');
說明5:id=10000001的資料插入到了192.168.3.92第三個資料節點上了。繼續測試一下15000001這個id超過了分片範圍,看看是否還能成功?
insert into tb_range (id, name) values (15000001,'侯七');
說明6:這是就報錯了,因為根據分片規則已經找不到15000001應該儲存到那個分片了,如果要繼續新增id的話,就需要在自定義去增加分片範圍了,需要修改 「autopartition-long.txt」這個檔案
修改了組態檔後,我們重新啟動一下Mycat然後再次插入id=15000001資料試試
重新插入id=15000001的資料
insert into tb_range (id, name) values (15000001,'侯七');
說明7:修改分片範圍後,id=15000001的資料也可以儲存了。
總結:如果使用範圍分片的時候,如果預設的分片範圍滿足不了需求,我們只需要修改 "autopartition-long.txt" 這個檔案即可。