3.1 來(lái)自海豚的告白
3.2 單節(jié)點(diǎn)數(shù)據(jù)庫(kù)
3.3 一主一從架構(gòu)
3.4 Master/Slave 復(fù)制原理及方式
3.5 一主多從架構(gòu)
3.6 雙主多從架構(gòu)
3.7 Mysql Sharding
3.8 小張講解
3.9 課后作業(yè)
3.1 來(lái)自海豚的告白
"我是一只海豚,我很孤獨(dú),我遨游在我的世界里彩倚,有很多人喜歡我,也有很多人厭惡我腋舌,可是,我還是我渗蟹。"
這是一只Mysql 海豚的獨(dú)白块饺。
他是那么的清高赞辩,那么的傲慢,好像動(dòng)物世界里的一朵奇葩授艰,正是因?yàn)樗妮p盈辨嗽、他的開放,即使他這樣傲慢無(wú)理淮腾,
還是有很多粉絲的追捧糟需。
幾乎大部分的互聯(lián)網(wǎng)公司都會(huì)選用Mysql做為數(shù)據(jù)庫(kù),體現(xiàn)在它的擴(kuò)展性谷朝,mysql 可以架構(gòu)出一個(gè)分布式集群洲押,
相對(duì)于oracle 這種大型數(shù)據(jù)庫(kù)來(lái)說(shuō),他顯得靈活徘禁,輕盈诅诱,而且他還是開源免費(fèi)的髓堪。
為什么mysql 在互聯(lián)網(wǎng)公司那么受到青睞送朱, 因?yàn)榛ヂ?lián)網(wǎng)公司相對(duì)于傳統(tǒng)企業(yè)來(lái)說(shuō),他的數(shù)據(jù)量增長(zhǎng)的很快干旁,單點(diǎn)數(shù)據(jù)庫(kù)
已經(jīng)無(wú)法滿足數(shù)據(jù)的實(shí)時(shí)查詢和存儲(chǔ)的要求了驶沼,所以需要擴(kuò)展數(shù)據(jù)庫(kù)架構(gòu)。
Mysql數(shù)據(jù)庫(kù)架構(gòu)的演化分為幾個(gè)階段:
單節(jié)點(diǎn)數(shù)據(jù)庫(kù)
一主一從架構(gòu)
一主多從架構(gòu)
雙主多從架構(gòu)
對(duì)比上面的架構(gòu)圖争群,來(lái)具體看看這幾種架構(gòu)的區(qū)別回怜。
3.2 單節(jié)點(diǎn)數(shù)據(jù)庫(kù)
大部分的童鞋接觸到的都是這種單節(jié)點(diǎn)的數(shù)據(jù)庫(kù)架構(gòu),
一個(gè)JAVA程序使用數(shù)據(jù)庫(kù)連接池操作一個(gè)數(shù)據(jù)庫(kù)换薄,這個(gè)是不是很熟悉玉雾,就是J2EE的典型應(yīng)用。
上點(diǎn)代碼看看轻要,更熟悉一點(diǎn)
架構(gòu)上面來(lái)說(shuō)就是 一個(gè)應(yīng)用連接一個(gè)數(shù)據(jù)庫(kù) 复旬,十分簡(jiǎn)單,也就不多說(shuō)了冲泥,如下圖:
3.3 一主一從架構(gòu)
隨著互聯(lián)網(wǎng)訪問量的迅速增加驹碍、以及數(shù)據(jù)量的增大,單點(diǎn)數(shù)據(jù)庫(kù)會(huì)出現(xiàn)延遲凡恍,假死志秃,更嚴(yán)重的出現(xiàn)崩潰的情況,在用戶端看到的現(xiàn)象會(huì)是這樣的
這種情況下嚼酝,數(shù)據(jù)庫(kù)已經(jīng)負(fù)擔(dān)不起這么大的壓力了浮还,海豚自恃清高也沒用,于是有人想出用兩個(gè)海豚來(lái)解決這個(gè)問題闽巩,最簡(jiǎn)單的就是這種一主一從的架構(gòu)
為什么要這樣子來(lái)架構(gòu)呢钧舌?
這樣我們先來(lái)分析一下 造成系統(tǒng)性能的瓶頸在哪里
從硬件計(jì)算機(jī)系統(tǒng)來(lái)說(shuō) 流码, 系統(tǒng)的性能主要取決于
CPU, 內(nèi)存, 磁盤I/O, 網(wǎng)絡(luò)I/O
再仔細(xì)分析
內(nèi)存的 讀寫速度 是 24165M/s
機(jī)械硬盤的讀寫速度 在100M/s
網(wǎng)絡(luò)帶寬一般機(jī)房可以到 千兆帶寬
很明顯我們可以看出, 硬盤的讀寫速度跟內(nèi)存 相差200多倍
很容易找出延刘,我們系統(tǒng)的瓶頸在硬盤讀寫這一塊漫试,當(dāng)然這里只是簡(jiǎn)單的推理
也有一些專業(yè)的工具對(duì)其進(jìn)行測(cè)試
現(xiàn)在我們有兩個(gè)方法來(lái)解決這個(gè)問題:
1. 提高硬盤的讀寫速度,讓其達(dá)到內(nèi)存的速度
2. 分?jǐn)倝毫Φ饫担延脖P讀寫的壓力分?jǐn)偟讲煌墓?jié)點(diǎn)上面
第一個(gè)方法那是硬盤廠商的事情了驾荣,我們控制不了,當(dāng)然現(xiàn)在市面上也有讀寫快的普泡,例如固態(tài)硬盤可以選配
我們要說(shuō)的就是如何用現(xiàn)有的硬件來(lái)解決問題播掷,也就是第二種方法。
我們?cè)賮?lái)分析業(yè)務(wù):
數(shù)據(jù)庫(kù)的操作 insert ?, delete ,update ,select
在正式的生產(chǎn)環(huán)境中撼班,我們會(huì)發(fā)現(xiàn)歧匈,對(duì)比insert ?寫的操作,用戶更多的在 select ?查詢上面的操作.
例如: 我們經(jīng)常瀏覽新聞砰嘁、逛淘寶件炉,還在看我寫的這篇文章,這些都是在 進(jìn)行 讀查詢.
那么我們一主一從的架構(gòu) 就是 讓應(yīng)用從 2個(gè)節(jié)點(diǎn)上面讀取矮湘, 來(lái)進(jìn)行分?jǐn)倝毫Γ?br>
而這種從兩個(gè)節(jié)點(diǎn)上面讀取的策略 可以 通過 負(fù)載均衡來(lái)實(shí)現(xiàn)斟冕,意思就是說(shuō) 如果有10個(gè)請(qǐng)求過來(lái)
把5個(gè)讀的請(qǐng)求轉(zhuǎn)發(fā)到 A 節(jié)點(diǎn), 另外5個(gè)轉(zhuǎn)發(fā)到B節(jié)點(diǎn)上面缅阳。
那么這個(gè)一主一從是如何實(shí)現(xiàn)的呢磕蛇?
可以通過 MySQL replication 復(fù)制的方式來(lái)做
選定一個(gè)節(jié)點(diǎn)的MySQL作為 master
另外一個(gè)節(jié)點(diǎn)的MySQL作為 slave
插入更新數(shù)據(jù) 我們通過 master 完成 ,
master 會(huì)通過 replication 的方式來(lái)完成 對(duì) slave 的同步更新.
這時(shí) slave 就會(huì)有相同的數(shù)據(jù)十办, 應(yīng)用就可以通過 從 slave 讀取數(shù)據(jù) 來(lái)減輕 master 的壓力.
3.4 Master/Slave 復(fù)制原理及方式
1. Master 所有的數(shù)據(jù)更新會(huì)記錄到 日志 binlog 中秀撇,Master A 把binlog日志傳給 Slave B
2. B 先把 A 的binlog日志 放到 稱為 relaylog 中繼日志的 地方
3. 最后 B 通過relaylog 日志中的內(nèi)容對(duì)自己的binlog 進(jìn)行更新,復(fù)制數(shù)據(jù)向族。
從這種機(jī)制上我們可以看出呵燕,可以保證A 和 B 的數(shù)據(jù)一致,但是同步或許會(huì)有延時(shí)(不考慮網(wǎng)絡(luò)因素)
A 的執(zhí)行可以并發(fā)執(zhí)行炸枣, 等A 的 binlog 日志寫 到 B 的 relaylog 虏等,然后 B 從relaylog 讀取復(fù)制到binlog
這個(gè)過程中會(huì)發(fā)生延時(shí).
于是出現(xiàn)了
同步復(fù)制 的方式 :
同步復(fù)制 是 ?用戶在前端訪問,Master收到 insert 請(qǐng)求适肠,這個(gè)時(shí)候 需要 等待 slave 復(fù)制完成后確認(rèn)霍衫,
才能返回結(jié)果給用戶,
顯然這種方式不可取侯养,因?yàn)闀?huì)造成用戶請(qǐng)求變的很慢的情況敦跌。
而這種方式也不是 MySQL的默認(rèn)方式。
異步復(fù)制:
Master 只要完成自己的數(shù)據(jù)更新就返回結(jié)果給 用戶,
而同步在異步狀態(tài)下進(jìn)行柠傍。 MySQL 默認(rèn)設(shè)置麸俘。
半同步復(fù)制:
即是 如果slave 有很多個(gè) , 也是后面講的 一主多從的 架構(gòu)下惧笛, master只要保證 其中一個(gè)slave 同步復(fù)制成功从媚,
就返回結(jié)果給用戶端。
3.5 一主多從架構(gòu)
一主一從 是 一主多從 架構(gòu)中的特例患整, 一主一從學(xué)會(huì)了拜效,很容易理解 一主多從的架構(gòu)了
在Mysql 的配置上面區(qū)別不大,后面實(shí)戰(zhàn)進(jìn)行架構(gòu)的搭建會(huì)講到各谚。
這里就不衍生開了紧憾。
3.6 雙主多從架構(gòu)
為什么會(huì)有雙主多從架構(gòu)出現(xiàn)呢,肯定是為了解決某種問題而產(chǎn)生的昌渤。
是的赴穗,當(dāng)我們用了一主多從架構(gòu)以后,我們會(huì)發(fā)現(xiàn)一個(gè)致命的問題膀息, 當(dāng)我有5個(gè)節(jié)點(diǎn)般眉,
肯定是 1個(gè)Master ,另外4 個(gè)是 slave , 這個(gè)時(shí)候 master 就相當(dāng)于是中心領(lǐng)導(dǎo)的地位履婉,
他這么重要煤篙,如果master 崩掉了怎么辦斟览,整個(gè)系統(tǒng)就不能正常運(yùn)行了毁腿,
這個(gè)時(shí)候采用 雙主多從,來(lái)用副領(lǐng)導(dǎo)保證苛茂。
就像master1 是一個(gè)總經(jīng)理已烤, 如果總經(jīng)理不舒服或者有事走開了
這個(gè)時(shí)候就由 master2 副總 來(lái)接替他的工作。
3.7 Mysql Sharding
master-slave 這種架構(gòu)妓羊,不管是 一主多從 還是 雙主多從胯究,我們發(fā)現(xiàn)他的性能瓶頸是在
master 上面,整個(gè)系統(tǒng)也并不是可以通過增加master 來(lái)達(dá)到性能的倍數(shù)增長(zhǎng)的躁绸。
slave 越多裕循,master 復(fù)制到 slave 的 日志越多,master 的負(fù)擔(dān)就越重净刮,同步的延時(shí)就越大
會(huì)出現(xiàn)讀取到臟數(shù)據(jù)剥哑,以及數(shù)據(jù)不一致的問題。
問題出現(xiàn)了淹父,新的架構(gòu)也隨之而來(lái)株婴。
一種分表分庫(kù)的分布式架構(gòu)就出現(xiàn)了。
簡(jiǎn)單來(lái)講暑认,分表分庫(kù) 不是 在master 和 slave 之間進(jìn)行數(shù)據(jù)復(fù)制 以減輕 讀的壓力困介。
而是把數(shù)據(jù)內(nèi)容進(jìn)行切分大审,分別放到不同的節(jié)點(diǎn)上 ?。
例如 : 現(xiàn)在有10個(gè)用戶的數(shù)據(jù)
master-slave 的做法是 復(fù)制10個(gè)用戶的數(shù)據(jù)到 slave 下面去座哩,這個(gè)時(shí)候整個(gè)系統(tǒng)就有10 * N個(gè)slave的數(shù)據(jù)量了徒扶。
而 分表分庫(kù)則是 ?其中5個(gè)用戶數(shù)據(jù)放到 A 節(jié)點(diǎn)上 , 另外5個(gè)用戶數(shù)據(jù)放到B節(jié)點(diǎn)上根穷,整個(gè)系統(tǒng)數(shù)據(jù)還是10個(gè)數(shù)據(jù)量酷愧。
這里簡(jiǎn)單講這些,詳細(xì)的放到后面章節(jié)中來(lái)講缠诅。
在分表分庫(kù)我們用Mycat 中間件溶浴, 在每個(gè)節(jié)點(diǎn)的分庫(kù)中 ,我們還可以采用Master-Slave 這種架構(gòu) 作為 混合架構(gòu)使用管引。
3.8 小張講解
讀寫分離
通過MySQL replication 我們可以復(fù)制數(shù)據(jù)到不同的數(shù)據(jù)庫(kù)中士败, 但是上面講到讀取需要從不同的節(jié)點(diǎn)中讀取,
還要有策略作負(fù)載均衡褥伴,這個(gè)功能邏輯就需要應(yīng)用來(lái)進(jìn)行實(shí)現(xiàn)谅将。(應(yīng)用要連接不同的數(shù)據(jù)庫(kù)節(jié)點(diǎn),分離讀寫)
市面上有很多成熟的中間件可以實(shí)現(xiàn) 負(fù)載均衡重慢、讀寫分離饥臂,例如:MySQL-Proxy ,
應(yīng)用層可以像 剛開始那樣代碼不變,所有的 讀寫分離工作交給 MySQL-Proxy中間件來(lái)實(shí)現(xiàn)似踱。
MySQL replication
下一節(jié)中 隅熙,我們具體來(lái)動(dòng)手來(lái)做一個(gè)一主一從這種架構(gòu),通過配置MySQL的 replication ,以及在應(yīng)用層進(jìn)行
負(fù)載均衡核芽、讀寫分離的實(shí)現(xiàn)囚戚,用最輕的方式來(lái)進(jìn)行性能的最大提升。
3.9 課后作業(yè)
1. 什么是一主一從轧简?
2. 同步有哪幾種方式驰坊?
3. 實(shí)驗(yàn):
> 安裝centos 7 操作系統(tǒng)
> 安裝mysql5.7 數(shù)據(jù)庫(kù)
> 進(jìn)行一主一從的Mysql 數(shù)據(jù)庫(kù)架構(gòu)
> 應(yīng)用層實(shí)現(xiàn)一個(gè)DEMO , 進(jìn)行讀寫分離以及負(fù)載均衡