讀寫分離,基本的原理是讓主數據庫處理事務性增、改、刪操做(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操做。數據庫複製被用來把事務性操做致使的變動同步到集羣中的從數據庫。html
爲何要分庫、分表、讀寫分?mysql
單表的數據量限制,當單表數據量到必定條數以後數據庫性能會顯著降低。數據多了以後,對數據庫的讀、寫就會不少。分庫減小單臺數據庫的壓力。接觸過幾個分庫分表的系統,都是經過主鍵進行散列分褲分表的。這類數據比較特殊,主鍵就是惟一的獲取該條信息的主要途徑。好比:京東的訂單、財付通的交易記錄等。。。該類數據的用法,就是經過訂單號、交易號來查詢該筆訂單、交易。linux
以oracle爲例,主庫負責寫數據、讀數據。讀庫僅負責讀數據。每次有寫庫操做,同步更新cache,每次讀取先讀cache在讀DB。寫庫就一個,讀庫能夠有多個,採用dataguard來負責主庫和多個讀庫的數據同步。sql
mysql的讀寫分離的基本原理是:讓master(主數據庫)來響應事務性操做,讓slave(從數據庫)來響應select非事務性操做,而後再採用主從複製來把master上的事務性操做同步到slave數據庫中。數據庫
讀寫分離就是利用mysql的主從複製完成的,A不間斷的把binlog信息發送給B,保持B和A的數據一致,若是還須要在B上寫的話,你須要開啓主主模式。關於第三點,你若是採起的是A-B A-C A-D模式的話確定是須要A給每一個從庫都須要發送binlog信息的,若是是A-B-C這種級聯的模式,是隻須要A給B發送一次binlog信息,而後B給C發一次。緩存
Mysql的 Replication 是一個異步的複製過程,從一個 Mysql instace(咱們稱之爲 Master)複製到另外一個 Mysqlinstance(咱們稱之 Slave)。在 Master 與 Slave 之間的實現整個複製過程主要由三個線程來完成,其中兩個線程(Sql線程和IO線程)在 Slave 端,另一個線程(IO線程)在 Master 端。 MySQL 複製的基本過程以下:安全
1. Slave 上面的IO線程鏈接上 Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)以後的日誌內容;服務器
2. Master 接收到來自 Slave 的 IO 線程的請求後,經過負責複製的 IO 線程根據請求信息讀取指定日誌指定位置以後的日誌信息,返回給 Slave 端的 IO 線程。返回信息中除了日誌所包含的信息以外,還包括本次返回的信息在 Master 端的 BinaryLog 文件的名稱以及在 Binary Log 中的位置;架構
3. Slave 的 IO 線程接收到信息後,將接收到的日誌內容依次寫入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,並將讀取到的Master端的bin-log的文件名和位置記錄到master- info文件中,以便在下一次讀取的時候可以清楚的高速Master「我須要從某個bin-log的哪一個位置開始日後的日誌內容,請發給我」併發
4. Slave 的 SQL 線程檢測到 Relay Log 中新增長了內容後,會立刻解析該 Log 文件中的內容成爲在 Master 端真實執行時候的那些可執行的 Query 語句,並在自身執行這些 Query。這樣,實際上就是在 Master 端和 Slave 端執行了一樣的 Query,因此兩端的數據是徹底同樣的。
利用mysql proxy來實現的。 MySQL Proxy最強大的一項功能是實現「讀寫分離(Read/Write Splitting)」。基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫複製被用來把事務性查詢致使的變動同步到集羣中的從數據庫。 固然,主服務器也能夠提供查詢服務。使用讀寫分離最大的做用無非是環境服務器壓力。
Mysql做爲目前世界上使用最普遍的免費數據庫,相信全部從事系統運維的工程師都必定接觸過。但在實際的生產環境中,由單臺Mysql做爲獨立的數據庫是徹底不能知足實際需求的,不管是在安全性,高可用性以及高併發等各個方面。
所以,通常來講都是經過 主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離(MySQL-Proxy)來提高數據庫的併發負載能力 這樣的方案來進行部署與實施的。
以下圖所示:
Mycat是一個開源的分佈式數據庫系統,可是因爲真正的數據庫須要存儲引擎,而Mycat並無存儲引擎,因此並非徹底意義的分佈式數據庫系統。Mycat是數據庫中間件,就是介於數據庫與應用之間,進行數據處理與交互的中間服務。對數據進行分片處理以後,從原有的一個庫,被切分爲多個分片數據庫,全部的分片數據庫集羣構成了整個完整的數據庫存儲。
什麼是MyCAT
mysql主從複製實現的基礎上,利用mycat作讀寫分離,架構圖以下:
二、Demo
2.1 在mysql master上建立數據庫建立db1
2.2 在數據庫db1建立表student
同時,由於配置好了mysql主從複製,在mysql slave上也有同樣數據庫和表
注意 dataHost節點的下面三個屬性
balance, switchType, writeType
balance="0", 不開啓讀寫分離機制,全部讀操做都發送到當前可用的writeHost上。
balance="1",所有的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,而且M1與M2互爲主備),正常狀況下,M2,S1,S2都參與select語句的負載均衡。
balance="2",全部讀操做都隨機的在writeHost、readhost上分發。
balance="3",全部讀請求隨機的分發到writeHost下的readhost執行,writeHost不負擔讀壓力
writeType表示寫模式
writeType="0",全部的操做發送到配置的第一個writehost
writeType="1",隨機發送到配置的全部writehost
writeType="2",不執行寫操做
switchType指的是切換的模式,目前的取值也有4種:
switchType=‘-1‘ 表示不自動切換
switchType=‘1‘ 默認值,表示自動切換
switchType=‘2‘ 基於MySQL主從同步的狀態決定是否切換,心跳語句爲show slave status
switchType=‘3‘基於MySQL galary cluster的切換機制(適合集羣)(1.4.1),心跳語句爲show status like ‘wsrep%‘。
參考連接:http://jayluns.iteye.com/blog/2275690
不停庫不鎖表在線主從配置 http://seanlook.com/2015/12/14/mysql-replicas/ mysql主從常見問題 http://www.10tiao.com/html/706/201603/403220961/1.html mysql主從延遲 http://f.dataguru.cn/thread-461916-1-1.html 深刻探究主從延遲 http://ningg.top/inside-mysql-master-slave-delay/ mysql主從不一樣步如何作 http://www.jb51.net/article/33052.htm mysql 主主 http://www.cnblogs.com/ygqygq2/p/6045279.html mysql-proxy 實現讀寫分離 http://my.oschina.net/barter/blog/93354 mycat實現讀寫分離 http://www.th7.cn/db/mysql/201708/250280.shtml atlas相關 http://www.oschina.net/p/atlas mysql一主多從 http://blog.sina.com.cn/s/blog_4c197d4201017qjs.html mysql環形主從 http://ask.apelearn.com/question/11437 cobar實現分庫分表 http://blog.csdn.net/huoyunshen88/article/details/37927553 mysql分庫分表方案 http://my.oschina.net/ydsakyclguozi/blog/199498 mysql架構演變 http://www.aminglinux.com/bbs/thread-8025-1-1.htmlf MHA架構 http://www.dataguru.cn/thread-457284-1-1.html 比較複雜的mysql集羣架構 http://ask.apelearn.com/question/17026