mysql進階學習三之mycat讀寫分離和分庫分表

  前面已經配置了mysql的主從複製,其實很容易,主節點寫入了數據,從節點進行同步,所以寫操作使用主節點,讀操作使用從節點,這樣就有效降低了數據庫的壓力

  但是我們用java程序不可能去連接多個數據源,執行sql的時候還要判斷是使用主節點還是從節點,所以使用mycat,一端對java提供一個統一的接口,另外一端可以連接多個數據源,最好是我們可以跟以前一樣連接數據庫一樣,讓使用者感覺不到mycat的存在;

  mycat就是實現了這些功能,把連接多個數據庫的操作交給了mycat,在mycat中配置哪個節點是讀,哪個是寫,在執行sql的時候就會自動的去連接該節點;

  還有一點,mycat是國人使用java開發並開源了的,啓動mycat需要jdk環境

 

1.mycat安裝

  本來是想用linux版的mycat的,由於雲服務器只有一臺,在服務器上沒法鏈接上本地的mysql,就是用了windows版的mycat,用法和配置文件和linux版的都是一樣的;

  mycat官網

  mycat的github

  自行下載對應的版本,這裏下載的是1.6.7.4版本,解壓之後的目錄:

 

2. mycat的配置

  首先我們修改一下mycat的用戶名和密碼,在安裝目錄/conf/server.xml中

 

  然後需要配置一下schema.xml:

 

   我這裏測試用的是balance="2",將主節點和從節點中mydb數據庫stu表中相同id的數據改成不一樣的,然後去連接mycat查詢該表數據,每次查詢都不一樣

   想測試讀寫分離,這裏設置爲1或者3

    balance="0": 不開啓讀寫分離,讀操作和寫操作都是用的writeHost;

    balance="1": 開啓讀寫分離,這種情況是存在多主多從的時候,一個主節點提供寫操作,其他的主節點和所有從節點提供負載均衡的讀操作

    balance="2": 讀操作隨機讀選擇主節點和從節點

    balance="3": 開啓讀寫分離,寫操作使用寫主機(主節點也就是寫主機,從節點是讀主機),讀操作使用讀主機

 

3. mycat啓動

  進入mycat安裝目錄下的bin目錄,兩種方式:

    (1)前臺啓動,可以看到啓動情況:./mycat.bat console

    (2)後臺啓動: ./mycat.bat start

 

  連接mycat,就跟連接mysql一樣,打開cmd,mysql -umycat -p123456 -h 127.0.0.1 -P 8066   //注意端口是8066端口

  使用mycat向stu表插入一條數據,然後將主節點和從節點數據數據改成不一樣的,你再去讀幾次,可以看到是隨機的,說明我們mycat配置的沒問題;

  還是說一句,想測試讀寫分離的,記得把schema.xml中設置爲balance="1"或者balance="3"

 

4 數據分片

  數據分片也就是俗話說的分庫分表

  4.1 分庫

  當一個數據庫中的數據太多了,效率也就低了,我們需要將後續插入A主機中mydb數據庫中表tab1的數據,都插入到B主機中mydb數據庫tab1表中,除此之外,還需要將A主機中的tab1中的數據遷移到B主機中

  至於數據遷移工具,可以看看這個老哥博客,寫得挺不錯的

  schema.xml文件

  然後測試在mycat中只要是對stu2表的任何操作,都是使用的是第二個主機,從而實現了分庫

 

  4.2 分表

  分庫:X主機中A數據庫中有表tab1,tab2,tab3,由於每個表數據都很多,根據分析可以將tab1拿出來,放到Y主機中A數據庫下,使得以後所有對tab1的所有操作都是來訪問Y主機

  分表:X主機A數據庫中有表tab4,但是這個tab4中數據有一千萬條,我們將這個表用一定的方法,分成兩份,分別放到當前主機中和Y主機中A數據庫表tab4

  不管分庫還是分表,都要配合數據遷移工具才能實現的!

  

  首先配置schema.xml文件

 

  然後配置rule.xml,這種規則其實很好立理解,就是取餘,在mycat中向stu3中插入數據,會根據id對2進行取餘,得到的結果肯定是0或者1,當等於0時就放在一臺主機中,等於1就放在另外一個主機中,這個跟redis集羣放入數據一樣;

 

   4.3 測試

  我們在mycat中執行以下6條sql:

insert into stu3 (id,name) values(1,"jack01");
insert into stu3 (id,name) values(2,"jack02");
insert into stu3 (id,name) values(3,"jack03");
insert into stu3 (id,name) values(4,"jack04");
insert into stu3 (id,name) values(5,"jack05");
insert into stu3 (id,name) values(6,"jack06");

 

  然後我們就可以分別在兩臺主機中各看到三條數據:

            

 

  然後我們在mycat中查詢所有的數據,可以看到id沒有經過排序,只是將主機A中的stu3的數據+主機B中stu3中的數據,所以使用mycat查詢分表之後的數據,就是將所有該表所在的主機中數據都查出來,然後再進行拼接;

         

 

  4.4 關聯表分表

  舉個例子:現在我們是對stu3表進行分表,但是現在有個addr表記錄這每個用戶的具體住址,stu3和addr是一對一,兩個表通過s_id關聯

  在查詢addr表的時候肯定會根據s_id查詢用戶姓名,那麼分表肯定需要相同的規則進行分,比如將stu3表中id=1的數據分到A主機中,那麼addr表中id=2的數據也就要分到A主機中,不然跨主機做連表查詢就太麻煩了

 

  我們需要在schema.xml中進行配置,這樣配置了之後每次向addr表中插入數據的時候,會根據s_id找到對應的stu3表中記錄是在哪個主機上,就把addr數據也放在那個主機上

 

  測試了一下,是可以的,這樣的話可以保證有關聯的表即使分表也會相應的分到同一個主機中,去連表查詢的時候效率會高點

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章