1. 程式人生 > 資料庫 >MySQL主從複製與讀寫分離原理及用法詳解

MySQL主從複製與讀寫分離原理及用法詳解

本文例項講述了MySQL主從複製與讀寫分離原理及用法。分享給大家供大家參考,具體如下:

主從複製

在這裡插入圖片描述

概念

影響MySQL-A資料庫的操作,在資料庫執行後,都會寫入本地的日誌系統A中。
假設,實時的將變化了的日誌系統中的資料庫事件操作,在MYSQL-A的3306埠,通過網路發給MYSQL-B。
MYSQL-B收到後,寫入本地日誌系統B,然後一條條的將資料庫事件在資料庫中完成。
那麼,MYSQL-A的變化,MYSQL-B也會變化,這樣就是所謂的MYSQL的複製,即MYSQL replication。
在上面的模型中,MYSQL-A就是主伺服器,即master,MYSQL-B就是從伺服器,即slave。

日誌系統A,其實它是MYSQL的日誌型別中的二進位制日誌,也就是專門用來儲存修改資料庫表的所有動作,即bin log。【注意MYSQL會在執行語句之後,釋放鎖之前,寫入二進位制日誌,確保事務安全】
日誌系統B,並不是二進位制日誌,由於它是從MYSQL-A的二進位制日誌複製過來的,並不是自己的資料庫變化產生的,有點接力的感覺,稱為中繼日誌,即relay log。
可以發現,通過上面的機制,可以保證MYSQL-A和MYSQL-B的資料庫資料一致,但是時間上肯定有延遲,即MYSQL-B的資料是滯後的。
【即便不考慮什麼網路的因素,MYSQL-A的資料庫操作是可以併發的執行的,但是MYSQL-B只能從relay log中讀一條,執行下。因此MYSQL-A的寫操作很頻繁,MYSQL-B很可能跟不上。】

解決問題

資料如何不被丟失
備份
讀寫分離
資料庫負載均衡
高可用

環境搭建

1.準備環境
兩臺windows作業系統 ip分別為: 172.27.185.1(主)、172.27.185.2(從)
2.連線到主服務(172.27.185.1)伺服器上,給從節點分配賬號許可權。
GRANT REPLICATION SLAVE ON . TO ‘root'@‘172.27.185.2' IDENTIFIED BY ‘root';
3.在主服務my.ini檔案新增

server-id=200
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index

重啟mysql服務
4.在從服務my.ini檔案新增

server-id = 210
replicate-do-db =itmayiedu #需要同步資料庫

重啟mysql服務
5.從服務同步主資料庫

stop slave;
change
master to master_host='172.27.185.1',master_user='root',master_password='root';
start slave;
show slave status;

注意事項
①一定要在同一個區域網中
②使用360WiFi建立區域網
③最好把防火牆全部關閉掉

什麼是讀寫分離

在資料庫叢集架構中,讓主庫負責處理事務性查詢,而從庫只負責處理select查詢,讓兩者分工明確達到提高資料庫整體讀寫效能。當然,主資料庫另外一個功能就是負責將事務性查詢導致的資料變更同步到從庫中,也就是寫操作。

讀寫分離的好處

1)分攤伺服器壓力,提高機器的系統處理效率
讀寫分離適用於讀遠比寫的場景,如果有一臺伺服器,當select很多時,update和delete會被這些select訪問中的資料堵塞,等待select結束,併發效能並不高,而主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用;
假如我們有1主3從,不考慮上述1中提到的從庫單方面設定,假設現在1分鐘內有10條寫入,150條讀取。那麼,1主3從相當於共計40條寫入,而讀取總數沒變,因此平均下來每臺伺服器承擔了10條寫入和50條讀取(主庫不承擔讀取操作)。因此,雖然寫入沒變,但是讀取大大分攤了,提高了系統性能。另外,當讀取被分攤後,又間接提高了寫入的效能。所以,總體效能提高了,說白了就是拿機器和頻寬換效能;
2)增加冗餘,提高服務可用性,當一臺資料庫伺服器宕機後可以調整另外一臺從庫以最快速度恢復服務

主從複製原理

依賴於二進位制日誌,binary-log.
二進位制日誌中記錄引起資料庫發生改變的語句
Insert 、delete、update、create table

Scale-up與Scale-out區別

Scale Out是指Application可以在水平方向上擴充套件。一般對資料中心的應用而言,Scale out指的是當新增更多的機器時,應用仍然可以很好的利用這些機器的資源來提升自己的效率從而達到很好的擴充套件性。
Scale Up是指Application可以在垂直方向上擴充套件。一般對單臺機器而言,Scale Up值得是當某個計算節點(機器)新增更多的CPU Cores,儲存裝置,使用更大的記憶體時,應用可以很充分的利用這些資源來提升自己的效率從而達到很好的擴充套件性。

MyCat

什麼是 Mycat

是一個開源的分散式資料庫系統,但是因為資料庫一般都有自己的資料庫引擎,而Mycat並沒有屬於自己的獨有資料庫引擎,所有嚴格意義上說並不能算是一個完整的資料庫系統,只能說是一個在應用和資料庫之間起橋樑作用的中介軟體。
在Mycat中介軟體出現之前,MySQL主從複製叢集,如果要實現讀寫分離,一般是在程式段實現,這樣就帶來了一個問題,即資料段和程式的耦合度太高,如果資料庫的地址發生了改變,那麼我的程式也要進行相應的修改,如果資料庫不小心掛掉了,則同時也意味著程式的不可用,而對於很多應用來說,並不能接受;

引入Mycat中介軟體能很好地對程式和資料庫進行解耦,這樣,程式只需關注資料庫中介軟體的地址,而無需知曉底層資料庫是如何提供服務的,大量的通用資料聚合、事務、資料來源切換等工作都由中介軟體來處理;
Mycat中介軟體的原理是對資料進行分片處理,從原有的一個庫,被切分為多個分片資料庫,所有的分片資料庫叢集構成完成的資料庫儲存,有點類似磁碟陣列中的RAID0.

Mycat安裝

建立表結構

CREATE DATABASE IF NOT EXISTS `weibo_simple`;
-- ------------------------------------
-- Table structure for `t_users` 使用者表
-- ------------------------------------
DROP TABLE IF EXISTS `t_users`;
CREATE TABLE `t_users` (
 `user_id` varchar(64) NOT NULL COMMENT '註冊使用者ID',`user_email` varchar(64) NOT NULL COMMENT '註冊使用者郵箱',`user_password` varchar(64) NOT NULL COMMENT '註冊使用者密碼',`user_nikename` varchar(64) NOT NULL COMMENT '註冊使用者暱稱',`user_creatime` datetime NOT NULL COMMENT '註冊時間',`user_status` tinyint(1) NOT NULL COMMENT '驗證狀態 1:已驗證 0:未驗證',`user_deleteflag` tinyint(1) NOT NULL COMMENT '刪除標記 1:已刪除 0:未刪除',PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- -------------------------------------
-- Table structure for `t_message`微博表
-- -------------------------------------
DROP TABLE IF EXISTS `t_message`;
CREATE TABLE `t_message` (
 `messages_id` varchar(64) NOT NULL COMMENT '微博ID',`user_id` varchar(64) NOT NULL COMMENT '發表使用者',`messages_info` varchar(255) DEFAULT NULL COMMENT '微博內容',`messages_time` datetime DEFAULT NULL COMMENT '釋出時間',`messages_commentnum` int(12) DEFAULT NULL COMMENT '評論次數',`message_deleteflag` tinyint(1) NOT NULL COMMENT '刪除標記 1:已刪除 0:未刪除',`message_viewnum` int(12) DEFAULT NULL COMMENT '被瀏覽量',PRIMARY KEY (`messages_id`),KEY `user_id` (`user_id`),CONSTRAINT `t_message_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置server.xml

	<!-- 新增user -->
  <user name="mycat">
  <property name="password">mycat</property>
  <property name="schemas">mycat</property>
  </user>
	
	<!-- 新增user -->
  <user name="mycat_red">
  <property name="password">mycat_red</property>
  <property name="schemas">mycat</property>
	<property name="readOnly">true</property>
  </user>

配置schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
  <!-- 與server.xml中user的schemas名一致 -->
  <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100">
    <table name="t_users" primaryKey="user_id" dataNode="dn1" rule="rule1"/>
   
    <table name="t_message" type="global" primaryKey="messages_id" dataNode="dn1" />
  </schema>
<dataNode name="dn1" dataHost="jdbchost" database="weibo_simple


" />
  
  <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="1"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"
        slaveThreshold="100">
     <heartbeat>select user()</heartbeat> 
    <writeHost host="hostMaster" url="172.27.185.1:3306" user="root" password="root">
    </writeHost>
    <writeHost host="hostSlave" url="172.27.185.2:3306" user="root" password="root"/>
  </dataHost>
  
</mycat:schema>

配置rule.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License,Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing,software - 
	distributed under the License is distributed on an "AS IS" BASIS,- WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
	 <tableRule name="rule1">
    <rule>
      <columns>user_id</columns>
      <algorithm>func1</algorithm>
    </rule>
  </tableRule>
  <function name="func1" class="org.opencloudb.route.function.AutoPartitionByLong">
 	<property name="mapFile">autopartition-long.txt</property>
  </function>
</mycat:rule>

為了更好地定位錯誤,修改log4j.xml

雙擊startup_nowrap.bat開始啟動

常見問題
SHOW MASTER STATUS 如果為,則在my.ini檔案中新增一行
log-bin=mysql-bin

給賬號分配許可權
grant all privileges on . to ‘root'@‘172.27.185.1' identified by ‘root';

更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL常用函式大彙總》、《MySQL日誌操作技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》及《MySQL資料庫鎖相關技巧彙總》

希望本文所述對大家MySQL資料庫計有所幫助。