一、水平分表場景
在業務系統中,有一張日誌表,業務系統每天都會產生大量的日誌資料,單臺伺服器的資料儲存即處理能力是有限的,可以對資料庫表進行拆分,這時候就可以使用水平分表的策略
說明1:水平分表,每個表的結構一致
說明2:水平分表,每個表的資料不同
說明3:水平分表,所有表的合集才是完整的資料
二、準備工作
在192.168.3.90,192.168.3.91,192.168.92 三臺MySQL伺服器上建立hl_logs資料庫
三、配置schema.xml
說明1:之前的schema.xml已經配置過其他的schema,dataNode等標籤都不用動,直接新增我們本次案例需要的就行了,多個標籤只要不衝突是可以並存的
說明2:邏輯庫為hl_logs
說明3:邏輯表為tb_logs
說明4:資料節點為dn4,dn5,dn6
說明5:資料節點dn4,dn5,dn6需要的資料庫配置也是dbhost1,dbhost2,dbhost3,是可以公用的。
說明6:分片規則使用的是 rule="mod-long" 規則,該規則在rule.xml有定義如下
說明7:繼續看 function 中 mod-long 的定義
說明8:這裡的count 3的意思是 id主鍵 按照和3進行取模運算,然後根據取模後的結果,將資料寫入到不同的資料節點,即有幾個資料節點,就會平均的寫入到資料節點中
說明9:我這裡整好配置了三個資料節點,而這裡的預設值也是3,所以不用改了,如果我們想要將資料平均的寫到4個資料節點上,則這裡的count需要改為4
四、配置server.xml
說明1:root 這個使用者可以訪問 shopping 和 hl_logs 兩個資料庫
說明2:而 user 這個使用者只能訪問 shopping 這個資料庫
說明3:我現在測試的都是使用 root 這個賬戶,所以 user 這個可以不用配置
五、水平分表測試
首先重啟Mycat
登入Mycat
檢視邏輯庫和邏輯表
這裡的tb_logs只是邏輯庫,而在MySQL中還並沒有tb_logs這個表,需要在Mycat中建立
create table tb_logs (id int auto_increment primary key, model_name varchar(200), operate_user varchar(20), operate_time varchar(19));
插入一條資料,然後檢視資料節點中對應的資料變化
insert into tb_logs (id, model_name, operate_user, operate_time) values (1, '訪問首頁','張三', '2023-12-17 21:52:54');
說明1:id=1的資料,按照mod-long的演算法,會用 1%3=1, 因為 和3取模 的結果只有 0,1,2, 所以結果為0時, 資料將寫在第一個資料節點,結果為1時,結果會儲存在第二個資料節點,結果為2時,儲存在第三個資料節點上,而 1%3=1 ,所以id=1的資料寫在了192.168.3.91第二個資料節點上。
說明2:第二個資料節點即192.168.3.91這個節點,所以id=1的資料只寫入到這個資料節點上,其他節點上還沒有資料。
繼續驗證
insert into tb_logs (id, model_name, operate_user, operate_time) values (2, '訪問詳情頁','李四', '2023-12-17 22:55:24');
說明3:按照mod-long演算法,id=2的資料被寫入到192.168.3.92,第三個資料節點上,成功,繼續驗證。
insert into tb_logs (id, model_name, operate_user, operate_time) values (3, '訪問評論頁','王五', '2023-12-17 22:03:34');
說明4:按照mod-long演算法,id=3的資料被寫入到192.168.3.90,第1個資料節點上,成功,繼續驗證。
insert into tb_logs (id, model_name, operate_user, operate_time) values (4, '訪問首頁','趙六', '2023-12-17 22:09:34');
說明5:按照mod-long演算法,id=4的資料被寫入到192.168.3.91,第二個資料節點上,成功。