一、讀寫分離介紹 讀寫分離,是把資料庫的讀和寫分開操作,以應對不同的資料庫伺服器。主資料庫提供寫操作,從資料庫提供讀操作,這樣能有效的減輕單台資料庫的壓力。 二、一主一從原理 MySQL的主從複製是基於二進位(binlog)實現的 說明1:當主伺服器的MySQL執行了DML,DDL語句之後,會將數據 ...
一、讀寫分離介紹
讀寫分離,是把資料庫的讀和寫分開操作,以應對不同的資料庫伺服器。主資料庫提供寫操作,從資料庫提供讀操作,這樣能有效的減輕單台資料庫的壓力。
二、一主一從原理
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:所以我們已經實現了簡單的數據讀寫分離。
侯哥語錄:我曾經是一個職業教育者,現在是一個自由開發者。我希望我的分享可以和更多人一起進步。分享一段我喜歡的話給大家:"我所理解的自由不是想乾什麼就乾什麼,而是想不幹什麼就不幹什麼。當你還沒有能力說不得時候,就努力讓自己變得強大,擁有說不得權利。"