一、一致性雜湊分片
一致性雜湊分片的實現思路和我們之前介紹的水平分表中的取模分片是類似的。只不過取模分片,採用的是利用主鍵和分片數進行取模運算,然後根據取模後的結果,將資料寫入到不同的分片資料中。但是這種分片方式有一個侷限性就只能對id是整形的資料使用,如果id是個uuid型別這個的非整形的欄位,就沒有辦法使用取模的方式進行分片了。這時候就可以採用一致性hash演算法分片,其分片的原則是根據id 雜湊運算之後,然後再決定寫入到哪個分片,所以我認為一致性雜湊的分表方式是對取模分片的補充。
一致性雜湊分片是將主鍵採用雜湊演算法,將資料分佈到不同的資料庫節點上,以實現分散式儲存和查詢。
說明1:一致性雜湊的規則是 rule="sharding-by-murmur"
說明2:在function標籤中只需要修改count屬性的值即可,即有幾個資料節點就改為幾。
二、準備資料庫
說明1:在三個資料節點上都先建立好hash_db資料庫
三、配置schema.xml
說明1:邏輯庫為hash_db
說明2:邏輯表為tb_hash
說明3:分片規則為 rule="sharding-by-murmur"
說明4:dn10對應的是dbhost1即192.168.3.90分片
說明5:dn11對應的是dbhost2即192.168.3.91分片
說明6:dn12對應的是dbhost3即192.168.3.92分片
四、配置server.xml
說明1:增加 root 使用者對 hash_db 的操作許可權
五、配置rule.xml
說明1:在一致性雜湊分片的rule.xml中name=count這個屬性,要修改為我們指定的3個資料節點
六、一致性雜湊分片測試
首先重啟Mycat
登入Mycat
檢視邏輯庫和邏輯表
這裡的tb_hash只是邏輯庫,而在MySQL中還並沒有tb_hash這個表,需要在Mycat中建立
create table tb_hash (id varchar(255) primary key, name varchar(20));
插入一條資料,然後檢視資料節點中對應的資料變化
insert into tb_hash (id, name) values ("1fc74326-9fd3-45f5-949e-33339f618dbf",'張三');
說明1:id經過hash演算法之後,資料存在了192.168.3.92資料節點上了,繼續插入資料測試。
insert into tb_hash (id, name) values ("9f08bab8-4abe-43e4-97c5-41efcfa45e75",'李四');
說明2:id經過hash演算法之後,資料存在了192.168.3.91資料節點上了,繼續插入資料測試
insert into tb_hash (id, name) values ("7355535e-e1ce-421c-8715-29f41a91dca3",'王五');
說明3:id經過hash演算法之後,資料存在了192.168.3.90資料節點上了,繼續插入三條資料測試
insert into tb_hash (id, name) values ("87558171-e5ce-4b1d-8cde-d911a625b8c9",'趙六'); insert into tb_hash (id, name) values ("596a6d86-6c79-4ffa-8de4-db0a537713a5",'侯七'); insert into tb_hash (id, name) values ("6fc23dd4-9733-4511-9427-bdeea9383b50",'孫八');
說明4:一致性hash會根據id鍵hash運算之後決定寫入到哪個分片,如果資料量足夠大的話,其會盡量保證資料的負載均衡,但不是絕對的,因為這取決於id雜湊運算後的結果。
說明5:在Mycat上進行資料查詢,是全集查詢的,一致性雜湊分片是水平分庫分表的一種。