MySQL運維15-一主一從讀寫分離

Se7eN_HOU發表於2023-12-25

一、讀寫分離介紹

  讀寫分離,是把資料庫的讀和寫分開操作,以應對不同的資料庫伺服器。主資料庫提供寫操作,從資料庫提供讀操作,這樣能有效的減輕單臺資料庫的壓力。

  

二、一主一從原理

  MySQL的主從複製是基於二進位制(binlog)實現的

  

  說明1:當主伺服器的MySQL執行了DML,DDL語句之後,會將資料的變更寫入到binlog日誌中

  說明2:在從伺服器上有一個IOThread執行緒會讀取主伺服器上的binlog日誌,然後寫入到自己的中繼日誌(relay log)中

  說明3:在從伺服器上還有一個SQLThread執行緒會從自己的中繼日誌(relaylog)中讀取資料變更,然後反映到自身的資料庫上

三、主從複製準備

  兩臺MySQL主機

  192.168.3.91:角色master

  192.168.3.90:角色slave

  具體主從複製的配置如果不會的請參考《MySQL運維2-主從複製》

  

  在從伺服器上檢視主從配置。

  然後在主伺服器上建立rw資料庫,這時在從庫上就會自動建立rw資料庫  

  MySQL運維15-一主一從讀寫分離

  然後再在主伺服器上的rw庫中建立一個tb_test用於測試的表

create table tb_test(id int auto_increment primary key, name varchar(20));  

  MySQL運維15-一主一從讀寫分離

四、配置schema.xml

  MySQL運維15-一主一從讀寫分離

  說明1:在業務中如果邏輯庫中的所有表都要做讀寫分離,則可以在schema標籤中省略所有的表

  說明2:在dataHost資料節點中的配置中注意balance的值只能是“1”或者“3”,balance值的釋義

    • 0:不開啟讀寫分離機制,所有讀操作都傳送當前可用的writeHost上
    • 1:全部的readHost與備用的writeHost都參與select語句的負載均衡(主要針對於雙主雙從模式)
    • 2:所有的讀寫操作都隨機在writeHost,readHost上分發
    • 3:所有的讀請求隨機分發到writeHost對應的readHost上執行,writeHost不負擔讀壓力

  說明3:一組讀寫分離的庫,其中readHost標籤是嵌在writeHost標籤中的

  說明4:因為要讀寫分離,所以讀寫節點上的url是不同的

五、配置server.xml

  

  說明1:為root使用者增加rw庫的許可權

六、讀寫分離測試

  首先重啟Mycat  

  

  登入Mycat

  

  檢視邏輯庫和邏輯表

  

  說明1:我們在schema.xml沒有配置邏輯表,所以會把rw資料庫中的表,全部當做邏輯表,即我們之前建立的tb_test表會查詢出來。

  插入資料進行測試

insert into tb_test(name) values ("張三");
insert into tb_test(name) values ("李四");
insert into tb_test(name) values ("王五");

  

  MySQL運維15-一主一從讀寫分離

  這時主庫和從庫的tb_test表中都有了資料,進行查詢測試。

  

  但是這個時候,我們並分不清這個查詢出來的資料是主表的還是從表的,這時我們將從表中的“張三”改為“張三1”,因為主從複製,只是單向的從主到從複製,即主表改了,從表會跟著一起改,但是從表改了,主表的資料是不會改的。

  MySQL運維15-一主一從讀寫分離

  再次查詢驗證

  

  說明1:透過查詢的資料得知,我們讀取的資料是來自我們配置的從庫的資料,即實現了讀的資料是從庫中的資料。

  說明2:因為主從複製是從到主到從單向的複製,所以說明我們寫資料一定是寫入到主庫的,不然從庫是不會有資料的。

  說明3:所以我們已經實現了簡單的資料讀寫分離。

 

相關文章