一、按天分片
指定一個時間週期,將資料寫入一個資料節點中,例如:第1-10天的資料,寫入到第一個資料節點中,第2-20天的資料寫入到第二個節點中,第3-30天的資料節點寫入到第三個資料節點中。
說明1:按天分片要配置一個起始日期,一個結束日期,一個分片間隔時間三個引數
說明2:按天分片允許當前時間超出配置的開始時間和結束時間,超出時間範圍仍然會按照分片間隔時間,繼續在多個資料節點之間切換的
說明3:該案例中分片的起始時間為2023-12-01,結束時間為2023-12-30,一共30天的時間。但是如果當前日期超過了這個時間段,該規則仍然可以用,繼續按照分片間隔時間10天,繼續分片。
說明4:該案例中分片間隔時間為10,即10天。所以這裡需要至少三個資料節點。因為分片時間範圍是30天除以10天的間隔等於3,而如果只配置了兩個分片伺服器則會報錯,因為第1-10天的資料寫在了第一個分片伺服器上,第10-20天的資料寫入到了第二個分片資料庫中,從第21天-30的資料,就會找不到分片伺服器而報錯。
二、準備工作
邏輯庫:hl_logs,先在各個資料節點上建立好資料庫。
三、配置rule.xml
<!-- rule.xml示例中沒有,需要自己手動實現 --> <tableRule name="sharding-by-date"> <rule> <columns>create_time</columns> <algorithm>sharding-by-date</algorithm> </rule> </tableRule>
說明1:這個按照(天)日期分片,在rule.xml示例中也是沒有寫好的,需要自己實現。
<!-- rule.xml示例中沒有,需要自己手動實現 --> <function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2023-12-01</property> <property name="sEndDate">2023-12-30</property> <property name="sPartionDay">10</property> </function>
說明2:這個按照(天)日期分片的function標籤,在rule.xml示例中也是沒有寫好的,需要自己實現。
說明3:dateFormat屬性設定的分片日期的格式
說明4:sBeginDate是分片的開始日期
說明5:sEndDate是分片的結束日期
說明6:sPartionDay是分片間隔時間
說明7:如果當前時間超過了分片結束日期依然可以繼續按照分片間隔時間,繼續分片使用
四、配置schema.xml
說明1:邏輯庫為:hl_logs
說明2:邏輯表為:tb_day
說明3:分片規則為:"sharding-by-date"
說明4:dn4對應的是dbhost1即192.168.3.90分片
說明5:dn5對應的是dbhost2即192.168.3.91分片
說明6:dn6對應的是dbhost3即192.168.3.92分片
五、配置server.xml
說明1:在之前的文章中已經將tb_logs表新增到root使用者的許可權中了,所以這裡不需要更改即可。
六、按(天)日期分片測試
首先重啟Mycat
登入Mycat
檢視邏輯庫和邏輯表
這裡的tb_day只是邏輯庫,而在MySQL中還並沒有tb_day這個表,需要在Mycat中建立
create table tb_day(id int auto_increment primary key, name varchar(20), create_time varchar(19));
插入資料進行測試:這裡插入一組資料進行測試:
insert into tb_day(name, create_time) values ("張三", "2023-12-02"); insert into tb_day(name, create_time) values ("李四", "2023-12-12"); insert into tb_day(name, create_time) values ("王五", "2023-12-22"); insert into tb_day(name, create_time) values ("趙六", "2023-12-31"); insert into tb_day(name, create_time) values ("侯七", "2024-01-01"); insert into tb_day(name, create_time) values ("孫八", "2024-01-11"); insert into tb_day(name, create_time) values ("周九", "2024-01-21");
說明1:張三的建立時間為2023-12-02在2023-12-01 至 2023-12-10之間,所以張三在192.168.3.90第一個資料分片上。
說明2:趙六的建立時間不在2023-12-01 至 2023-12-30的時間範圍了,所以重新開始以10天為一週期的計算週期,而2023-12-31在新週期的第一個區間,所以趙六也在192.168.3.90第一個資料分片上。
說明3:侯七的建立時間不在2023-12-01 至 2023-12-30的時間範圍了,所以重新開始以10天為一週期的計算週期,而2024-01-01在新週期的第一個區間,所以侯七也在192.168.3.90第一個資料分片上。
說明4:李四的建立時間為2023-12-12在2023-12-11 至 2023-12-20之間,所以張三在192.168.3.91第二個資料分片上。
說明5:孫八的建立時間不在2023-12-01 至 2023-12-30的時間範圍了,所以重新開始以10天為一週期的計算週期,而2024-01-11在新週期的第二個區間,所以孫八也在192.168.3.91第二個資料分片上。
說明6:王五的建立時間為2023-12-22在2023-12-21 至 2023-12-30之間,所以王五在192.168.3.92第三個資料分片上。
說明7:周九的建立時間不在2023-12-01 至 2023-12-30的時間範圍了,所以重新開始以10天為一週期的計算週期,而2024-01-21在新週期的第三個區間,所以周九也在192.168.3.92第三個資料分片上。
說明8:在Mycat上進行查詢的資料是,所有資料節點的全集。按(天)日期分片是水平分庫分表的一種方式。