Mysql數據庫讀寫分離

image.png

image.png


image.png

(先對數據庫操作進行讀寫分離,使得具有master角色的主服務器主要用於執行寫操作,這樣就能大大減少主服務器由於讀操作而產生的負載過大的問題。讀交給slave。對於多臺讀服務器,還要把讀操作的壓力分攤到不同的slave服務器上。通常來說,讀寫分離和多臺slave服務器的讀負載均衡也是兩個不同的問題,也要分別進行解決。先讀寫分離,再將讀操作平均分攤到各slave服務器)

redis和memcache差距不大,還具有更多的數據類型,還能持久化,主從複製,集羣等功能


image.png

image.png

(比如庫存的查詢就必須在主庫上進行,如果從庫上就可能出現超賣的情況。因此,不是什麼查詢都要進行讀寫分離的。所以,由開發人員自行判斷比較靈活)


還可以通過數據庫中間層完成讀寫分離(如mysql proxy、maxscale、one proxy、proxySQL等):

image.png

image.png

image.png

(通過中間層對sql語句的解析,如果是select操作,則發送到從服務器處理,非select操作,全發送到主服務器處理。對於存儲過程這種無法通過調用語法分析出是讀操作還是寫操作的sql就只能全部由主數據庫服務器去完成。由於存儲過程可能很大一部分只是進行查詢處理,這無疑加大了主數據庫服務器的負載。雖然使用中間層很方便,但也會付出一些代價)

(由於讀寫分離是通過中間層自動進行的,而中間層無法區分哪些是對延遲敏感的,哪些不敏感,所以無法把對延遲敏感的查詢自動分配到主庫上執行,而要實現這些功能就要在查詢語句中加入提示的關鍵字,而增加提示不得不對原來程序進行修改,這樣就失去了對程序透明的好處了)


常用的讀服務器負載均衡方式:

image.png


對於數據庫服務器來說,讀負載和寫負載是兩個完全不同的問題,所以,對於讀負載和寫負載要分開對待,因爲寫操作只能在master上進行,而讀操作可以在master上,也可以在slave上,因此,相對寫負載,解決讀負載更加容易。

image.png

(lvs是工作在網絡協議的四層上的,只進行流量分發,不會對數據包內容進行解析,性能強,對內存和cpu消耗低,當然,由於不會對數據進行解析,所以也不會知道數據包中sql的具體內容,自然不能做讀寫分離

(lvs只分發請求,流量並不從他本身出去,所以無流量消耗,這點就保障了io性能不會受到大流量影響)

image.png


image.png


主從複製流程就不貼出來了...


在.100和.101服務器都安裝lvs管理工具:

image.png

加載ipvs模塊(所有參加lvs集羣的三臺服務器都要安裝):

image.png

lvs腳本的編寫:

        先看下slave(.101服務器)上的腳本:

                image.png

                image.png

                (注意,這個腳本要有可執行權限)

                執行腳本:

                image.png

                查看:

                image.png

        同樣在.102上也要執行:

                image.png

                查看:

                image.png

        .100上的keepalived配置:

                image.png

                image.png

                查看check_slave腳本:

                image.png

                image.png

                ......

        .100上建立lvs可操作的賬號:

                image.png

                

        未完待續......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章