摘要:伴隨Web2.0興起后出現(xiàn)的新一輪的網(wǎng)站開發(fā)創(chuàng)業(yè)大潮
中,網(wǎng)站用戶不僅是內(nèi)容的瀏覽者,而且成為了網(wǎng)站內(nèi)容的制造者。這決定了網(wǎng)站結(jié)構(gòu)上以數(shù)據(jù)庫為中心,以用戶為導(dǎo)向的新網(wǎng)站建設(shè)概念,使得新網(wǎng)站具有高并發(fā)、高流量、大數(shù)據(jù)量、邏輯復(fù)雜等特點。筆者圍繞網(wǎng)站的高并發(fā)特性,討論數(shù)據(jù)庫優(yōu)化、分布式網(wǎng)站的編程要點、以及程序核心優(yōu)化三方面的技巧。
關(guān)鍵詞:服務(wù)器 數(shù)據(jù)庫 分布式開發(fā)
1 數(shù)據(jù)庫優(yōu)化技巧
現(xiàn)在網(wǎng)站的特點,就是以數(shù)據(jù)庫為中心。如何最大化地利用數(shù)據(jù)庫的能力,包括提高緩存命中、降低IO開銷、優(yōu)化查詢等,是目前需要進一步研究的課題。
1.1 確定主鍵 主鍵是能唯一標識表中數(shù)據(jù)行的屬性或者組合屬性。主鍵中該表中的值必須唯一。如果數(shù)據(jù)更新不頻繁,必須需要對主鍵進行排序,一定要是聚集索引;如果數(shù)據(jù)更新頻繁,主鍵上一定要使用非聚集索引。
1.2 優(yōu)化索引 數(shù)據(jù)庫表索引是避免全表掃描,降低數(shù)據(jù)庫磁盤IO的最重要的手段。關(guān)系型數(shù)據(jù)庫中,每個數(shù)據(jù)表不是孤立存在的,而是通過主、外鍵聯(lián)系起來,共同形成完整的數(shù)據(jù)庫結(jié)構(gòu)。所以,除了主鍵必須有索引外,外鍵通常也需要有非聚集索引,以方便對數(shù)據(jù)進行分類查詢和匯總。幾乎每個表中,都需要有和時間相關(guān)的字段。常用的網(wǎng)站用例中,多對數(shù)據(jù)的時間段進行查詢、匯總,所以對這些時間字段,一定要建立聚集索引,方便進行排序查詢,避免全表掃描。
1.3 合理選用共享鎖和排它鎖 死鎖對數(shù)據(jù)庫的性能、可用性、吞吐量都有重要的影響。但在現(xiàn)在企業(yè)的信息化管理系統(tǒng)中,經(jīng)常是可以由多個人同時對同個表進行操作,造成死鎖的概率大大增加。一般情況下,如果對數(shù)據(jù)的一致性要求很高,使用排它鎖,其它都應(yīng)該使用共享鎖來提高性能。
1.4 分表 在實踐工作中,數(shù)據(jù)表中的每列的數(shù)據(jù)都有其特定的使用場景。例如新聞表,在對新聞進行列表時,常使用新聞標識、新聞分類、新聞添加人、新聞時間信息,但不會使用新聞內(nèi)容字段。并且新聞內(nèi)容的字段一般為“Text”類型。對于這種情況,我們一般把新聞表拆分成兩個表,一個新聞表(包含常用用于檢查的字段),一個新聞內(nèi)容表(只有新聞的內(nèi)容)。從而讓程序員使用常規(guī)方法,只檢索出來常用的小數(shù)據(jù)量屬性,只要表示新聞時,才加載超大的“Text”類型的新聞內(nèi)容,大大降低了數(shù)據(jù)的IO開銷和網(wǎng)絡(luò)開銷、提高數(shù)據(jù)庫的吞吐量。
1.5 數(shù)據(jù)冗余 在關(guān)系型數(shù)據(jù)庫中,有些查詢頻次很高,但需要的數(shù)據(jù)字段又分屬于不同的表,需要多達4個表以上才能選到所需要的全部數(shù)據(jù)。此時,會造成表關(guān)聯(lián)造成的開銷過大,查詢時間較長。此時,可以通過空間來換時間。把表中的某個常用屬性,依業(yè)務(wù)需要,在其它的表中冗余存儲,這樣就減少了表關(guān)聯(lián)的次數(shù),提高了性能。
2 分布式網(wǎng)站編程要點
2.1 面向服務(wù)編程便于橫向擴展 復(fù)雜的網(wǎng)站由許多功能模塊組成,有的系統(tǒng)之間的模塊是相同的。隨著業(yè)務(wù)的拓展,有的功能模塊逐漸成為系統(tǒng)的“瓶頸”,需要單獨擴容。面向服務(wù)的模塊可以支持單獨擴容。
企業(yè)信息化是整體的信息化。在設(shè)計每個局部的信息化產(chǎn)品時,如果站在企業(yè)的角度,就可以更合理地抽象出來服務(wù)模塊。對這些服務(wù)模塊定義接口,然后單實現(xiàn)和部署。
面向服務(wù)是全面實現(xiàn)企業(yè)信息化的有利工具。對服務(wù)的良好規(guī)劃,有利于將來平衡地引入企業(yè)服務(wù)總線,更好地統(tǒng)計、監(jiān)控每個服務(wù)的運行狀態(tài),及時地發(fā)現(xiàn)信息化的性能瓶頸并定位解決。
2.2 分布式緩存減少數(shù)據(jù)庫交互 企業(yè)信息化中,大部分系統(tǒng)數(shù)據(jù)展示的頻次遠大于被更新的頻次。利用這些,我們可以把近一段經(jīng)常被展示的數(shù)據(jù)緩存到分布式緩存中。這樣下一次相同的頁面被打開或查詢被執(zhí)行時,可以在緩存中直接命中結(jié)果,省去了查詢數(shù)據(jù)庫和運算加工的開銷,加快頁面展示速度,提高用戶體驗。分面式緩存使用淘汰算法,來保證緩存在內(nèi)存中的數(shù)據(jù)不會造成內(nèi)存溢出。常用的算法有最近最少使用算法(LRU)。
2.3 Client Cookie方便分布式部署 企業(yè)網(wǎng)站被打開時,一般是具有用戶的身份信息的。傳統(tǒng)的網(wǎng)站中,身份信息保存在Session(會話)中,而Session默認保存到每個服務(wù)器的進程中。服務(wù)器中的Session信息不能被其它服務(wù)器上的網(wǎng)站使用。還有共享式Session,單獨出來某服務(wù)器保存Session信息,其它的網(wǎng)站都訪問讀寫共享Session服務(wù)器。這解決了分布式環(huán)境中,用戶從一臺網(wǎng)站跳到別一臺網(wǎng)站身份丟失的情況,但使共享式Session成為單點,性能也因為共享式Session的集中性而損失。
為了解決上述問題,在分布式環(huán)境中,通過把Session信息,加密后保存在Cookie中是更好的方案。用戶瀏覽器訪問網(wǎng)站的時候,總是會把Cookie信息提交到服務(wù)器,服務(wù)器進行解密后,就可以得到訪問用戶的信息,繼續(xù)為用戶服務(wù)。同時,因為Cookie保存在每個用戶的計算機上,同時加解密同時在每個服務(wù)器上運行,不存在單點問題,理論上可以無限進行擴容。
3 結(jié)束語
設(shè)計高并發(fā)網(wǎng)站不是一日之功,上述只是闡述了最基本的原理。相信只要努力做到設(shè)計精致化,并時時考慮如何更有效地實現(xiàn)并行計算和運行,網(wǎng)站的并發(fā)性能一定會步步高升。
參考文獻:
[1]梅華威,張銘泉,李天.高并發(fā)高負載網(wǎng)站系統(tǒng)架構(gòu)研究[J].計算機與網(wǎng)絡(luò),2009(14).
[2]李宇,曾志文,湯明.大型高并發(fā)高負載網(wǎng)站優(yōu)化策略探討[J].希望月報(上半月),2007(11).
[3]劉軍.高并發(fā)數(shù)據(jù)庫下的索引創(chuàng)建和使用技巧[J].中小企業(yè)管理與科技(下旬刊),2012(12).