株洲正規(guī)競價優(yōu)化推薦西安seo技術培訓班
讀寫分離
讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作。數(shù)據(jù)庫復制被用來把事務性操作導致的變更同步到集群中的從數(shù)據(jù)庫
讀寫分離的好處
因為數(shù)據(jù)庫的“寫”(寫10000條數(shù)據(jù)可能要3分鐘)操作是比較耗時的
但是數(shù)據(jù)庫的“讀”(讀10000條數(shù)據(jù)可能只要5秒鐘)
所以讀寫分離,解決的是,數(shù)據(jù)庫的寫入,影響了查詢的效率
mysql支持的復制類型
- STATEMENT:基于語句的復制。在服務器上執(zhí)行sql語句,在從服務器上執(zhí)行同樣的語句,mysql默認采用基于語句的復制,執(zhí)行效率高。
- ROW:基于行的復制。把改變的內(nèi)容復制過去,而不是把命令在從服務器上執(zhí)行一遍。
- MIXED:混合類型的復制。默認采用基于語句的復制,一旦發(fā)現(xiàn)基于語句無法精確復制時,就會采用基于行的復制。
主從復制的工作過程
- Master節(jié)點將數(shù)據(jù)的改變記錄成二進制日志(bin log),當Master上的數(shù)據(jù)發(fā)生改變時,則將其改變寫入二進制日志中
- Slave節(jié)點會在一定時間間隔內(nèi)對Master的二進制日志進行探測其是否發(fā)生改變,如果發(fā)生改變,則開始一個I/O線程請求 Master的二進制事件
- 同時Master節(jié)點為每個I/O線程啟動一個dump線程,用于向其發(fā)送二進制事件,并保存至Slave節(jié)點本地的中繼日志(Relay log)中,Slave節(jié)點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,即解析成 sql 語句逐一執(zhí)行,使得其數(shù)據(jù)和 Master節(jié)點的保持一致,最后I/O線程和SQL線程將進入睡眠狀態(tài),等待下一次被喚醒
MySQL 讀寫分離原理
讀寫分離就是只在主服務器上寫,只在從服務器上讀?;镜脑硎亲屩鲾?shù)據(jù)庫處理事務性操作,而從數(shù)據(jù)庫處理 select 查詢。數(shù)據(jù)庫復制被用來把主數(shù)據(jù)庫上事務性操作導致的變更同步到集群中的從數(shù)據(jù)庫。
MySQL 讀寫分離分類
- 基于程序代碼內(nèi)部實現(xiàn)
在代碼中根據(jù) select、insert 進行路由分類,這類方法也是目前生產(chǎn)環(huán)境應用最廣泛的。
優(yōu)點是性能較好,因為在程序代碼中實現(xiàn),不需要增加額外的設備為硬件開支;缺點是需要開發(fā)人員來實現(xiàn),運維人員無從下手。
- 基于中間代理層實現(xiàn)
代理一般位于客戶端和服務器之間,代理服務器接到客戶端請求后通過判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫,有以下代表性程序。
- MySQL-Proxy。MySQL-Proxy 為 MySQL 開源項目,通過其自帶的 lua 腳本進行SQL 判斷
- Atlas? 是由奇虎360的Web平臺部基礎架構(gòu)團隊開發(fā)維護的一個基于MySQL協(xié)議的數(shù)據(jù)中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優(yōu)化,增加了一些新的功能特性。360內(nèi)部使用Atlas運行的mysql業(yè)務,每天承載的讀寫請求數(shù)達幾十億條。支持事物以及存儲過程
- Amoeba? 由陳思儒開發(fā),作者曾就職于阿里巴巴。該程序由Java語言進行開發(fā),阿里巴巴將其用于生產(chǎn)環(huán)境。但是它不支持事務和存儲過程
MySQL主從復制延遲
- master服務器高并發(fā),形成大量事務
- 網(wǎng)絡延遲
- 主從硬件設備導致? cpu主頻、內(nèi)存io、硬盤io
- 本來就不是同步復制、而是異步復制
從庫優(yōu)化Mysql參數(shù);比如增大innodb_buffer_pool_size,讓更多操作在Mysql內(nèi)存中完成,減少磁盤操作
從庫使用高性能主機,包括cpu強悍、內(nèi)存加大。避免使用虛擬云主機,使用物理主機,這樣提升了i/o方面性;從庫使用SSD磁盤
網(wǎng)絡優(yōu)化,避免跨機房實現(xiàn)同步
實驗
主從復制
master:192.168.154.10
slave1:192.168.154.20
slave2:192.168.154.40
1、配置ntp文件
2、同步時間
3、主服務器配置
192.168.154.10
4、兩臺從服務器配置
192.168.154.20
192.168.154.40
5、驗證
讀寫分離
master:192.168.154.10
slave1:192.168.154.20
slave2:192.168.154.40
amoeba客戶端:192.168.154.50
mariadb:192.168.154.60
接著主從復制的實驗繼續(xù)
1、安裝jdk
192.168.154.10
2、裝amoeba
192.168.154.50
3、主從服務器 開放amoeba權限
192.168.154.10
192.168.154.20
192.168.154.40
4、配置amoeba.xml文件
5、配置dbServers.xml文件
6、安裝mariabd
192.168.154.60
7、測試主從服務器查詢情況
master服務器
8、slave1、slave2
9、測試關閉slave,master的情況
關閉兩個slave服務器?是查詢不到數(shù)據(jù)