MySQL運維7-Mycat水平分表

2023-12-18 12:00:46

一、水平分表場景

  在業務系統中,有一張紀錄檔表,業務系統每天都會產生大量的紀錄檔資料,單臺伺服器的資料儲存即處理能力是有限的,可以對資料庫表進行拆分,這時候就可以使用水平分表的策略

  

  說明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,第二個資料節點上,成功。