一、讀寫分離介紹
讀寫分離,是把資料庫的讀和寫分開操作,以應對不同的資料庫伺服器。主資料庫提供寫操作,從資料庫提供讀操作,這樣能有效的減輕單臺資料庫的壓力。
二、一主一從原理
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資料庫
然後再在主伺服器上的rw庫中建立一個tb_test用於測試的表
create table tb_test(id int auto_increment primary key, name varchar(20));
四、配置schema.xml
說明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 ("王五");
這時主庫和從庫的tb_test表中都有了資料,進行查詢測試。
但是這個時候,我們並分不清這個查詢出來的資料是主表的還是從表的,這時我們將從表中的“張三”改為“張三1”,因為主從複製,只是單向的從主到從複製,即主表改了,從表會跟著一起改,但是從表改了,主表的資料是不會改的。
再次查詢驗證
說明1:透過查詢的資料得知,我們讀取的資料是來自我們配置的從庫的資料,即實現了讀的資料是從庫中的資料。
說明2:因為主從複製是從到主到從單向的複製,所以說明我們寫資料一定是寫入到主庫的,不然從庫是不會有資料的。
說明3:所以我們已經實現了簡單的資料讀寫分離。