微博 請(qǐng)問(wèn)你是怎么優(yōu)化數(shù)據(jù)庫(kù)的?
原創(chuàng)【51CTO綜合報(bào)道】圍脖,織圍脖——這是什么?冬天到了,織條圍脖保暖嗎?錯(cuò),這是網(wǎng)絡(luò)流行用語(yǔ)。這還是大家的生活方式,生活態(tài)度。“找我?來(lái)我微博?。?rdquo;最近身邊的朋友都在織啊織,你不織?你就是“奧特曼”。那么大家是否知道微博的開發(fā)模式嗎?數(shù)據(jù)庫(kù)是如何部署的?又是如何優(yōu)化的?這些問(wèn)題一出,必要找達(dá)人為我們解惑。51CTO有幸請(qǐng)到新浪***DBA楊海潮先生來(lái)為我們解一解上述的疑惑。
專訪人物介紹
楊海潮,新浪***DBA,在大規(guī)模高并發(fā),海量訪問(wèn)有豐富的管理經(jīng)驗(yàn)。熱衷于數(shù)據(jù)庫(kù)設(shè)計(jì),性能優(yōu)化,分布式部署方案和高可用性方面的研究。
之前從事大訪問(wèn)量網(wǎng)站的部署以及優(yōu)化工作,加入新浪后主要負(fù)責(zé)整個(gè)公司的數(shù)據(jù)庫(kù)管理工作。
51CTO:新浪現(xiàn)在的開發(fā)模式還是LAMP嗎?
楊海潮:目前大部分業(yè)務(wù)還是使用LAMP方式,也有部分采用LNMP方式。
51CTO:新浪數(shù)據(jù)庫(kù)是如何部署的?
楊海潮:目前NoSQL和MySQL是結(jié)合使用的,根據(jù)應(yīng)用的特點(diǎn)選擇合適存儲(chǔ)方式。
51CTO:Sharding策略是很好的數(shù)據(jù)庫(kù)擴(kuò)展方案,但是這種方案也不是***的,新浪是如何選取sharding的形式,來(lái)適應(yīng)不同的應(yīng)用場(chǎng)景?
楊海潮:如圖:
sharding只用于數(shù)據(jù)量大同時(shí)有性能瓶頸的庫(kù),大部分庫(kù)不進(jìn)行sharding處理。
對(duì)于數(shù)據(jù)量比較大的庫(kù),在一開始就考慮sharding策略,例如索引數(shù)據(jù)和內(nèi)容數(shù)據(jù)分開設(shè)計(jì),每類數(shù)據(jù)庫(kù)根據(jù)業(yè)務(wù)邏輯選擇恰當(dāng)?shù)膒artitioning key,拆分成一定數(shù)量的表。
然后隨著壓力的增加進(jìn)行垂直拆分,垂直拆分后的庫(kù)再遇到性能瓶頸時(shí)首先考慮用硬件來(lái)解決。
當(dāng)硬件解決不了時(shí)才開始考慮水平拆分。
在選擇sharding方案時(shí)仔細(xì)考慮業(yè)務(wù)邏輯。對(duì)于讀密集型應(yīng)用,基本上通過(guò)增加slave來(lái)解決,對(duì)于寫密集型應(yīng)用才進(jìn)行垂直和水平拆分工作。
51CTO:跨越越多的sharding,帶來(lái)的開銷就越大,這個(gè)數(shù)量是如何控制的?
楊海潮:目前我在設(shè)計(jì)之前就避免跨表操作,選擇適當(dāng)?shù)?a >paritioning key,也即合適的拆分維度,避免對(duì)后期業(yè)務(wù)的影響。
根據(jù)業(yè)務(wù)邏輯的重要程度,如果業(yè)務(wù)邏輯是查詢某一個(gè)用戶的信息,那么會(huì)按用戶進(jìn)行拆分,那么保證一個(gè)用戶的數(shù)據(jù)是落在一張表里面。按時(shí)間維度進(jìn)行拆分,那么會(huì)分析數(shù)據(jù)的冷熱程度,把80%以上的數(shù)據(jù)放在一個(gè)表,避免過(guò)多的跨表查詢。
在這種拆分維度滿足不了業(yè)務(wù)需求時(shí),我們會(huì)利用空間換時(shí)間的思想,同一份數(shù)據(jù)按多種維度進(jìn)行拆分,讓每種業(yè)務(wù)邏輯的查詢語(yǔ)句都有很高的效率。
51CTO:很多用戶都會(huì)把sharding和partitioning混淆,您能講講您是怎么區(qū)分sharding與partitioning的異同。
楊海潮:sharding通常是指垂直拆分和水平拆分,是一個(gè)總體的概念,mysql的partitioning是實(shí)現(xiàn)sharding的一種技術(shù)。
51CTO:新浪現(xiàn)在采用SQL+NoSQL結(jié)合的數(shù)據(jù)庫(kù)部署,那么對(duì)于兩種數(shù)據(jù)庫(kù),分別是如何進(jìn)行優(yōu)化的呢?
楊海潮:目前NoSQL和MySQL是結(jié)合使用的,根據(jù)應(yīng)用的特點(diǎn)選擇合適存儲(chǔ)方式。譬如:關(guān)系型數(shù)據(jù),例如:索引使用MySQL存儲(chǔ),非關(guān)系數(shù)據(jù)庫(kù),例如:一些K/V需求的,對(duì)并發(fā)要求比較高的放入NoSQL產(chǎn)品存儲(chǔ),或者通過(guò)關(guān)系數(shù)據(jù)復(fù)制到NoSQL(redis)來(lái)顯示不同的應(yīng)用需求。
針對(duì)MySQL做的優(yōu)化比較多,從硬件(使用SSD,Fusion-IO,Cachecade等),文件系統(tǒng)(嘗試XFS),調(diào)整IO調(diào)度,優(yōu)化參數(shù),調(diào)整索引到減少應(yīng)用對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和交換等。
NoSQL(redis)通過(guò)修改源碼滿足自己的業(yè)務(wù)需求:完善它的replication機(jī)制,加入position的概念,讓維護(hù)更容易,同時(shí)failover能力也大大增強(qiáng)。改善Hashset在rdb里面的存儲(chǔ)方式,提升復(fù)雜數(shù)據(jù)類型的加載速度。
51CTO:如何保證數(shù)據(jù)庫(kù)的安全性的呢?
楊海潮:主要通過(guò)幾個(gè)方面進(jìn)行考慮:
- 只通過(guò)內(nèi)網(wǎng)進(jìn)行訪問(wèn)。
- 對(duì)來(lái)源IP做限制。
- 使用一定復(fù)雜度的密碼策略。
- 從程序的角度對(duì)于輸入進(jìn)行檢查,例如使用綁定變量防止SQL注入。
- 對(duì)一些敏感的信息會(huì)記錄上操作日志,定期以報(bào)表的形式發(fā)給相關(guān)人員。
【編輯推薦】