什么是高并發(fā)?
多個(gè)進(jìn)程或線程同時(shí)(或著說(shuō)在同一段時(shí)間內(nèi))訪問(wèn)同一資源會(huì)產(chǎn)生并發(fā)問(wèn)題。
要想解決高并發(fā),就要先了解高并發(fā)產(chǎn)生的位置.
高并發(fā)一般發(fā)生在兩個(gè)位置,一:訪問(wèn)服務(wù)器時(shí);二:訪問(wèn)數(shù)據(jù)庫(kù)時(shí);
1.1初期解決方案
1.1.1系統(tǒng)或服務(wù)器級(jí)別的解決方案
1)增大服務(wù)器的CPU。
2)增加內(nèi)存條。
3)增加硬盤個(gè)數(shù),對(duì)硬盤做Raid5。
4)換掉免費(fèi)的Tomcat,使用商用weblogic(美國(guó)Oracle公司出品的)
5)增加到二塊網(wǎng)卡。
6)聘請(qǐng)系統(tǒng)架構(gòu)師優(yōu)化Linux內(nèi)核
7)甚至花高價(jià)直接購(gòu)買高性能服務(wù)器
隨著業(yè)務(wù)的不斷增加,服務(wù)器性能很快又到達(dá)瓶頸
1.1.2應(yīng)用級(jí)別的解決方案
1)網(wǎng)頁(yè)HTML靜態(tài)化(需要CMS項(xiàng)目支持)
2)圖片服務(wù)器分離(常用解決方案)
3)緩存(常用解決方案)上上策為分布式緩存
4)鏡像(下載較多)
隨著業(yè)務(wù)的不斷增加,服務(wù)器性能很快又到達(dá)瓶頸
這時(shí)考慮增加服務(wù)器,增加服務(wù)器就會(huì)出現(xiàn)以下問(wèn)題
問(wèn)題1:用戶訪問(wèn)IP多了怎么解決?
問(wèn)題2:數(shù)據(jù)庫(kù)出現(xiàn)瓶頸怎么辦?
解決用戶IP多了的辦法是?
1.1開始:準(zhǔn)備采用DNS
什么是DNS
DNS(Domain Name System,域名系統(tǒng)),因特網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使用戶更方便的訪問(wèn)互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串。通過(guò)主機(jī)名,最終得到該主機(jī)名對(duì)應(yīng)的IP地址的過(guò)程叫做域名解析(或主機(jī)名解析)。DNS協(xié)議運(yùn)行在UDP協(xié)議之上,使用端口號(hào)53。
解決IP多—DNS
DNS服務(wù)器可以解決IP多了的問(wèn)題
http://www.itcast.cn: ?192.168.1.100
192.168.1.101
192.168.1.102
……更多
缺點(diǎn):雖然循環(huán)復(fù)用DNS是一個(gè)普遍使用的在Web服務(wù)器上負(fù)載平衡的解決方案,但是,該方式有它自身的缺陷。循環(huán)復(fù)用DNS將傳入的IP請(qǐng)求映射到定義的一系列循環(huán)形式的服務(wù)器。一旦發(fā)生服務(wù)器故障,循環(huán)復(fù)用DNS繼續(xù)把請(qǐng)求發(fā)送到這個(gè)故障服務(wù)器,一直到把該服務(wù)器從DNS中移走為止。這樣許多用戶必須等到DNS連接超時(shí)以后才能成功地訪問(wèn)目標(biāo)網(wǎng)站
1.2采用負(fù)載均衡技術(shù)
由于目前現(xiàn)有網(wǎng)絡(luò)的各個(gè)核心部分隨著業(yè)務(wù)量的提高,訪問(wèn)量和數(shù)據(jù)流量的快速增長(zhǎng),其處理能力和計(jì)算強(qiáng)度也相應(yīng)地增大,使得單一的服務(wù)器設(shè)備根本無(wú)法承擔(dān)。在此情況下,如果扔掉現(xiàn)有設(shè)備去做大量的硬件升級(jí),這樣將造成現(xiàn)有資源的浪費(fèi),而且如果再面臨下一次業(yè)務(wù)量的提升時(shí),這又將導(dǎo)致再一次硬件升級(jí)的高額成本投入,甚至性能再卓越的設(shè)備也不能滿足當(dāng)前業(yè)務(wù)量增長(zhǎng)的需求。
針對(duì)此情況而衍生出來(lái)的一種廉價(jià)有效透明的方法以擴(kuò)展現(xiàn)有網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性的技術(shù)就是負(fù)載均衡(Load Balance)。
問(wèn)題2:數(shù)據(jù)庫(kù)出現(xiàn)瓶頸怎么辦?
以Mysql為例:
1:對(duì)Mysql進(jìn)行優(yōu)化(重點(diǎn)講解)
2:緩存,主流緩存Memcached,redis…
3: ?mysql讀寫分離+主從復(fù)制 ? ?
4:Oracle
5:Oracle讀寫分離+主從復(fù)制
6:Oracle Partition分區(qū)
7:Oracle RAC集群(終級(jí)解決方案)
此方案:非常貴,即使是淘寶,京東這樣的大公司,也是很難受的。
主要方案:水平拆分,庫(kù)表散列(分庫(kù)分表)
此方案已經(jīng)在阿里運(yùn)行長(zhǎng)達(dá)3年以上? 可以說(shuō)是非常成熟的解決方案
待續(xù)…
備選方案:Mysql主從復(fù)制與讀寫分離
優(yōu)化:解決了高并發(fā)問(wèn)題
缺點(diǎn):沒(méi)有解決高可用問(wèn)題;Mysql-Proxy存在一個(gè)單點(diǎn)問(wèn)題;Mysql主機(jī)是單點(diǎn)問(wèn)題
Tomcat與Mysql-proxy 搭建在一臺(tái)服務(wù)器上就可以 了;
MySQL主從復(fù)制(Master-Slave)與讀寫分離(MySQL-Proxy)實(shí)踐
Mysql作為目前世界上使用最廣泛的免費(fèi)數(shù)據(jù)庫(kù),相信所有從事系統(tǒng)運(yùn)維的工程師都一定接觸過(guò)。但在實(shí)際的生產(chǎn)環(huán)境中,由單臺(tái)Mysql作為獨(dú)立的數(shù)據(jù)庫(kù)是完全不能滿足實(shí)際需求的,無(wú)論是在安全性,高可用性以及高并發(fā)等各個(gè)方面。
因此,一般來(lái)說(shuō)都是通過(guò)主從復(fù)制(Master-Slave)的方式來(lái)同步數(shù)據(jù),再通過(guò)讀寫分離(MySQL-Proxy)來(lái)提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力這樣的方案來(lái)進(jìn)行部署與實(shí)施的。