使用者資訊表水平拆表方案

來源:互聯網
上載者:User

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/225U043W-0.jpg" />

下面650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/225U05603-1.jpg" />

方法就是利用使用者ID進行模數,MOD(new.id,3),3就代表拆分到3張表裡。

以下是步驟:

第一步、在主庫上(M)建立拆分的三張表,t0,t1,t2

 
  1. create table t0 like t; 
  2. create table t1 like t; 
  3. create table t2 like t; 

第二步、在主庫上(M)建立三個觸發器插入、更新、刪除)

 
  1. DELIMITER $$ 
  2.  
  3. USE `test`$$ 
  4.  
  5. DROP TRIGGER /*!50032 IF EXISTS */ `t_insert`$$ 
  6.  
  7. CREATE 
  8.     /*!50017 DEFINER = 'admin'@'%' */ 
  9.     TRIGGER `t_insert` AFTER INSERT ON `t`  
  10.     FOR EACH ROW BEGIN 
  11.     DECLARE v_result INT; 
  12.     SET v_result=MOD(new.id,3); 
  13.     IF v_result = 0 THEN 
  14.       INSERT INTO t0(id,NAME,age,address) VALUES(new.id,new.name,new.age,new.address); 
  15.     ELSEIF v_result = 1 THEN 
  16.       INSERT INTO t1(id,NAME,age,address) VALUES(new.id,new.name,new.age,new.address); 
  17.     ELSE 
  18.       INSERT INTO t2(id,NAME,age,address) VALUES(new.id,new.name,new.age,new.address); 
  19.     END IF; 
  20.     END; 
  21. $$ 
  22.  
  23. DELIMITER ; 
  24.  
  25.  
  26. /*============================================*/ 
  27.  
  28. DELIMITER $$ 
  29.  
  30. USE `test`$$ 
  31.  
  32. DROP TRIGGER /*!50032 IF EXISTS */ `t_update`$$ 
  33.  
  34. CREATE 
  35.     /*!50017 DEFINER = 'admin'@'%' */ 
  36.     TRIGGER `t_update` AFTER UPDATE ON `t`  
  37.     FOR EACH ROW BEGIN 
  38.     DECLARE v_result INT; 
  39.     SET v_result=MOD(new.id,3); 
  40.     IF v_result = 0 THEN 
  41.       REPLACE INTO t0(id,NAME,age,address) VALUES(new.id,new.name,new.age,new.address); 
  42.     ELSEIF v_result = 1 THEN 
  43.       REPLACE INTO t1(id,NAME,age,address) VALUES(new.id,new.name,new.age,new.address); 
  44.     ELSE 
  45.       REPLACE INTO t2(id,NAME,age,address) VALUES(new.id,new.name,new.age,new.address); 
  46.     END IF; 
  47.     END; 
  48. $$ 
  49.  
  50. DELIMITER ; 
  51.  
  52.  
  53. /*============================================*/ 
  54.  
  55. DELIMITER $$ 
  56.  
  57. USE `test`$$ 
  58.  
  59. DROP TRIGGER /*!50032 IF EXISTS */ `t_delete`$$ 
  60.  
  61. CREATE 
  62.     /*!50017 DEFINER = 'admin'@'%' */ 
  63.     TRIGGER `t_delete` AFTER DELETE ON `t`  
  64.     FOR EACH ROW BEGIN 
  65.     DECLARE v_result INT; 
  66.     SET v_result=MOD(old.id,3); 
  67.     IF v_result = 0 THEN 
  68.       DELETE FROM t0 WHERE id = OLD.id; 
  69.     ELSEIF v_result = 1 THEN 
  70.       DELETE FROM t1 WHERE id = OLD.id; 
  71.     ELSE 
  72.       DELETE FROM t2 WHERE id = OLD.id; 
  73.     END IF; 
  74.     END; 
  75. $$ 
  76.  
  77. DELIMITER ; 

這樣t表資料變更時,就會按照模數的結果更新到t0,t1,t2這三張表裡

第三步、確保同步複製延時為0時,在從庫上(S)stop slave關閉同步複製,並show slave status\G記錄到文本裡,以便後面時用到。

第四步、在從庫上建立一個執行個體(S2),並匯出t,t0,t1,t2四張表匯出時只要資料,不要表結構)

 
  1. /usr/local/mysql/bin/mysqldump -uroot -p123456 --dump-slave=2 -nt --skip-triggers -q --single-transaction test t t0 t1 t2 > t_all.sql

--dump-slave是MySQL5.5的一個特性,具體你可參考我這一篇文章

http://hcymysql.blog.51cto.com/blog/5223301/889971

如果你是5.1的,就要用到第三步我們記錄的show slave status\G到文本,找到change master to的那個點,這樣就保證了拆分後的增量資料。

第五步,在從庫上S2執行個體上,建立表t,t0,t1,t2,也同樣建立那三個觸發器,這樣做的目的是,當我們匯入的時候,就會通過觸發器模數,把資料分散到t0,t1,t2這三張表裡,然後開啟同步複製主庫M。

第六步,上面五步做完以後,請檢查下資料的增長情況,並觀察同步是否正常,都沒問題的話,就可以把資料分散到新的3台伺服器裡。

在S2執行個體上,把t0表dump出來並匯入到M_new1機器上,然後在M_new1機器上,在my.cnf裡增加

 
  1. replicate-ignore-table=test.t1 
  2. replicate-ignore-table=test.t2 

忽略t1,t2表的同步複製。

把t1表dump出來並匯入到M_new2機器上,然後在M_new2機器上,在my.cnf裡增加

 
  1. replicate-ignore-table=test.t0  
  2. replicate-ignore-table=test.t2  

忽略t0,t2表的同步複製。

把t2表dump出來並匯入到M_new3機器上,然後在M_new3機器上,在my.cnf裡增加

 
  1. replicate-ignore-table=test.t0   
  2. replicate-ignore-table=test.t1  

忽略t0,t1表的同步複製。

第七步,到目前為止,基本上我們已經做完了,剩下的就要開發改他們的代碼,告訴他們拆分的規則,按使用者ID模數,拆分幾個表,拆分到哪台機器上,IP是什麼。

等淩晨0:00點,開發讓營運重啟前端應用,這樣就順利實現了使用者資訊表的拆分。

過程可能有些複雜,有興趣的朋友,可以按照我上面的操作,做下測試。

 

本文出自 “賀春暘的技術專欄” 部落格,請務必保留此出處http://hcymysql.blog.51cto.com/5223301/1179880

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.