MySQL運維12-Mycat分庫分表之按天分片

2023-12-20 12:00:40

一、按天分片

  指定一個時間週期,將資料寫入一個資料節點中,例如:第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上進行查詢的資料是,所有資料節點的全集。按(天)日期分片是水平分庫分表的一種方式。