《大型分散式網站架構設計與實踐》
一、面向服務的體系架構SOA
1、RPC:遠端過程呼叫
2、OutputStream中直接寫入一個int型別,會擷取其低8位,丟棄其高24位
3、HTTP請求與響應過程:
1)瀏覽器根據所使用的http協議,解析出url對應的域名
2)通過DNS域名解析,查詢出該域名對應的IP地址
3)通過url解析出對應的埠號
4)瀏覽器發起並建立到目的ip和埠的連線
5)瀏覽器向伺服器傳送請求
6)伺服器響應瀏覽器的請求,瀏覽器讀取響應,渲染網頁
7)瀏覽器關閉與伺服器的連線
4、
1)RPC風格:直接在HTTP請求的引數中標明需要遠端呼叫的服務介面名稱、服務需要的引數
2)RESTful風格:符合REST原則的設計
注:a、REST架構原則:表現層狀態轉換;b、HTTP協議是一種無狀態協議。
5、服務配置中心:一個能夠動態註冊和獲取服務資訊的地方,來統一管理服務名稱和其對應的伺服器列表資訊
6、常見的負載均衡演算法包括:輪詢法、隨機法、源地址雜湊法、加權輪詢法、加權隨機法、最小連線法等
1)輪詢法:將請求按順序輪流地分配到後端伺服器上
注:a、服務消費者的實現端需要考慮伺服器新增、下線、宕機的情況
b、輪詢策略使用悲觀鎖synchronized,效能代價大,併發吞吐量下降
2)隨機法:通過系統隨機函式,根據後端伺服器列表的大小值來隨機選取其中一臺進行訪問
3)源地址雜湊法:獲取客戶端訪問的IP地址值,通過雜湊函式計算得到一個數值,用該數值對伺服器列表的大小進行取模運算,得到的結果便是要訪問的伺服器的序號
4)加權輪詢法:將請求順序且按照權重分配到後端
5)加權隨機法:按照權重來隨機選取伺服器
6)最小連線數法:根據後端伺服器當前的連線情況,動態地選取其中當前積壓連線數最少的一臺伺服器來處理當前請求。
7、Groovy指令碼語言能夠直接編譯成java的class位元組碼,執行在java虛擬機器上,且能夠很好的跟java進行互動
8、ZooKeeper:是Hadoop下的一個子專案,是一個針對大型分散式系統的可靠的協調系統,提供的功能包括配置維護、名字服務、分散式同步、組服務等,可以叢集複製。通過Zab協議來保持資料的一致性。包括:leader election階段和Atomic broadcas階段。
1)leader election階段:叢集中將選舉出一個leader,其他的機器則稱為follower,所有的寫操作都被傳送給leader,並通過broadcas將所有的更新告訴follower。當leader崩潰或者leader失去大多數的follower時,需要重新選舉出一個新的leader,讓所有的伺服器都恢復到一個正確的狀態。
2)Atomic broadcas階段:同步leader和follow之間的資訊,保證leader和follower具有相同的系統狀態。
注:ZooKeeper的核心其實類似一個精簡的檔案系統
9、ZooKeeper API:1)建立節點;2)刪除節點;3)設定和獲取節點內容;4)新增子節點;5)判斷節點是否存在;6)watcher的實現
注:常見兩種異常:a、ConnectionLossException:客戶端與其中的一臺伺服器socket連接出現異常、連線丟失;b、SessionExpiredException:客戶端的session已經超過sessionTimeout,未進行任何操作
10、第三方客戶端工具包zkClient:將znode的事件重新定義為子節點的變化、資料的變化、連線及狀態的變化三類。
11、對於單點故障問題,採用雙機高可用的部署方案,能部分解決問題,但負載均衡裝置的昂貴成本,導致難以全面推廣。
二、分散式系統基礎設施
1、分散式系統的基礎設施:1)分散式協作及配置管理系統;2)分散式快取系統;3)持久化儲存;4)分散式訊息系統;5)搜尋引擎;6)CDN系統;7)負載均衡系統;8)運維自動化系統;9)實時計算系統;10)離線計算系統;11)分散式檔案系統;12)日誌收集系統;13)監控系統;14)資料倉庫
2、memcache是一款開源的高效能的分散式記憶體物件快取系統,使用key-value形式儲存和訪問資料,在記憶體中維護一張巨大的HashTable,將高層抽象的物件轉化成二進位制資料儲存。
1)其通過構建在TCP協議之上的memcache協議來進行通訊
2)支援文字行和非結構化資料
注:非結構化資料採用位元組流的形式在客戶端和服務端之間進行傳輸和儲存
3)API:a、set;b、add;c、replace;d、append;e、prepend;f、cas:提供對變數的原子操作;g、get;h、incr:對計數器進行增量操作;i:decr:對計數器進行減量操作;j:delete
4)memcache本身並不是一種分散式的快取系統,它的分散式是由訪問它的客戶端來實現的。
5)consistent Hash:將Hash函式的值域空間組織成一個圓環,整個空間按照順時針方向進行組織,然後對相應的伺服器節點進行Hash,將它們對映到Hash環上,即將該key對映在該位置的下一個節點伺服器。
注:節點的分佈可能不均勻,為了避免這種情況,引入虛擬節點機制,對每一個伺服器節點都計算多個Hash值,即多了一步從虛擬節點再對映到真實節點的過程。
3、解決分散式session的方法
1)通過將一部分資料儲存在cookie中,來規避分散式環境下session的操作
2)將session統一儲存在快取叢集上
4、IOE解決方案:IBM、oracle、EMC高階儲存
5、一種分庫分表的路由策略:
1)中間變數=user_id%(庫數量*每個庫的表數量)
2)庫=取整(中間變數/每個庫的表數量)
3)表=取餘(中間變數%每個庫的表數量)
注:要考慮分散式事務問題
6、HBase是ApacheHadoop專案下的一個子專案,設計實現了高可靠性、高可擴充套件性、實時讀/寫的列儲存資料庫。其本質上是一張稀疏的大表,用來儲存粗粒度的結構化資料,並且能夠通過簡單的增加節點來實現系統的線性擴充套件。
1)HBase執行在分散式檔案系統HDFS之上
2)HBase的資料以表的形式進行組織,每個表由行列組成;每個列屬於一個特定的列族,通過行和列來確定一個儲存單元,而每個儲存單元又可以有多個版本,通過時間戳來標識。
3)HBase叢集包含兩種角色:HMaster和HRegionServer。一個HRegionServer可以管理多個Region,並由HMaster來負責HRegionServer的排程及叢集狀態的監管
注:當表隨著記錄條數的增加而不斷變大後,將會分裂成一個個Region,每個Region可以由(startkey,endkey)來表示
4)HBase shell 命令:
a、status:檢視HBase叢集狀態
b、create ‘表名’、’列族名稱1’、’列族名稱2’…:建立一個表,並制定列族的名稱
c、list:列出已有的表,並查看錶的描述
d、alter ‘表名’ ,NAME=>’列族名稱’:給表新增一個列族
e、alert ‘表名’,NAME=>’列族名稱’, METHOD=>’delete’:刪除表的一個列族
f、disable ‘表名’ drop ’表名’ :刪除一個表
注:在使用drop刪除一個表之前,必須先將該表disable
g、put ‘表名’,‘rowkey’, ‘列族名稱:列名稱’, ‘值’:給表新增記錄
h、get ‘表名稱’,‘rowkey’:根據rowkey檢視資料
i:get ‘表名稱’, ‘rowkey’,‘列族名稱:列名稱’:根據rowkey檢視對應列的資料
j:count ‘表名稱’:查看錶中的記錄總數
k:scan ‘表名’ :查看錶中所有記錄
l:scan ‘表名’, {COLUMNS=> ‘列族’} :查看錶中指定列族的所有記錄
m:scan ‘表名’, {COLUMNS=> ‘列族’, LIMIT => 記錄數, STARTROW => ‘開始rowkey’, STOPROW => ’結束rowkey’}
n:delete ‘表名’, ‘rowkey’,‘列族名稱’:根據rowkey刪除列資料
o:deleteall ‘表名’ ,‘rowkey’:根據rowkey刪除一行資料
5)訪問HBase三種方式:
a、通過指定rowkey進行訪問
b、指定rowkey的range進行scan
c、全表掃描
注:HBase的行是按照rowkey來排序的
7、快取操作,可通過批量操作,避免多次請求帶來的網路開銷,提高效能
1)lpush和rpush分別在list的首部和尾部新增元素
2)lpop和rpop分別在list的首部和尾部刪除元素
3)lrange,獲取list指定區間的元素
8、訊息的非同步接收降低了系統整合的耦合度,提升了分散式系統協作的效率,使得系統能夠更快地響應使用者,提供更高的吞吐。作為緩衝,削峰填谷,緩解叢集的壓力,避免整個系統被壓垮。
9、JMS(Java MessageService)java訊息服務:支援兩種訊息傳送和接收模型
1)P2P:點對點,基於佇列(queue)
2)Pub/Sub:釋出/訂閱模型,基於主題(topic)
注:訂閱模式設定為持久訂閱:斷開à儲存à連線à重發
10、訊息叢集Master-Slave模式:包括基於共享檔案系統的Master-Slave架構和基於共享資料庫的Master-Slave架構。
Master啟動時,獲得排他鎖,其他Slave則stand-by,不對外提供服務,同時等待獲取排他鎖。Master連線中斷或異常,排他鎖會立即釋放,另一個Slave能夠爭奪到Master的排他鎖,成為Master對外提供服務。
注:1)真正提供服務的只有一臺,其它節點只為保障高可用
2)對於ActiveMQ來說,可以採用broker拆分的方式,將不相關的queue和topic拆分到多個broker,來達到提升系統吞吐能力的目的
11、垂直化的搜尋引擎主要針對企業內部的自有資料的檢索;搜尋引擎平臺,採用網路爬蟲對全網資料進行抓取,從而建立索引並提供給使用者進行檢索
12、Lucene相關概念
1)倒排索引:也稱反向索引,將文件中的詞作為關鍵字,建立詞與文件的對映關係,通過倒排索引的檢索,可以根據詞快速獲取包含這個詞的文件列表
2)分詞:又稱切詞,將句子或者段落進行切割,從中提取包含固定語義的詞
3)停止詞:需要被忽略掉
4)排序:需要將相關度更大的內容排在前面
5)文件:是一系列域的組合,相當於表
6)域:相當於列
7)詞:搜尋的基本單元
8)查詢
9)分詞器:提取關鍵的語義單元,常見有一元分詞、二元分詞、詞庫分詞等
13、Lucene的使用:
1)對某個Field進行關鍵字查詢
2)根據某個範圍對Field的值進行區間查詢
3)通過萬用字元來對Field進行查詢
注:a、萬用字元:?表示0個或一個字母;*表示0個或多個字母
b、兩個Field之間所允許的最大距離稱為slop
4)結果排序:按照指定的Field
5)高亮:對匹配的內容進行突出展現
6)中文分詞工具:Lucene自帶的中日韓文分詞器CJKAnalyzer,IK分詞,MM分詞,庖丁分詞,imdict分詞器
7)索引優化:Lucene的索引是由段組成的,每個段可能又包含多個索引檔案,即每個段包含了一個或者多個Document。當索引段的數量達到設定上限時,Lucene會自動進行索引段的優化,將索引段合併成為一個,以提高查詢的效能
14、Solr:是一個基於Lucene的搜尋引擎工具,提供了一系列功能強大的HTTP操作介面,支援通過Data Schema來定義欄位、型別和設定文字分析,使得使用者可以通過HTTP POST請求,向伺服器提交Document,生成索引,以及進行索引的更新和刪除操作。對於複雜的查詢條件,Solr提供了一整套表示式查詢語言
三、網際網路安全架構
1、常見的Web攻擊手段:xss攻擊、CRSF攻擊、SQL注入攻擊、檔案上傳攻擊、DDoS攻擊等。
2、XSS攻擊:跨站指令碼攻擊
1)定義:指的是攻擊者在網頁中嵌入惡意指令碼程式,當用戶開啟該網頁時,指令碼程式便開始在客戶端的瀏覽器上執行,以盜取客戶端cookie、使用者名稱密碼,下載執行病毒木馬程式,甚至是獲取客戶端admin許可權等。
2)原理:使用者輸入的資料變成了程式碼
3)措施:需要對使用者輸入的資料進行HTML轉義處理,將其中的“尖括號”、“單引號”、“引號”之類的特殊字串進行轉義編碼
3、CRSF攻擊:跨站請求偽造
1)原理:使用者訪問A站點後未登出,訪問攻擊站點B,B站點要求使用使用者在A的cookie訪問A站點
2)措施:a、將cookie設定為HttpOnly,這樣通過程式就無法讀取到cookie資訊,避免了攻擊者偽造cookie的情況出現
b、增加token:在請求中放入攻擊者所不能偽造的資訊,並且該資訊不存在於cookie之中
c、通過Referer識別:在HTTP頭中有一個欄位叫Referer,它記錄了該HTTP請求的源地址
4、SQL注入攻擊:通過把SQL命令偽裝成正常的HTTP請求引數,傳遞到服務端,欺騙伺服器最終執行惡意的SQL命令,達到入侵目的。措施:
1)使用預編譯語句:即變數使用佔位符替代
2)使用ORM框架:對一些關鍵字元進行轉義
3)避免密碼明文存放:對儲存的密碼進行單向hash,如md5
注:a、雜湊加鹽法:在生成hash時給予一個擾動,使hash值與標準的hash結果不同,這樣就可以對抗彩虹表了
b、拖庫:從資料庫中匯出資料
4)處理好相應的異常
5、檔案上傳攻擊:利用一些站點沒有對檔案的型別做很好的校驗,上傳了可執行的檔案或者指令碼,並且通過指令碼獲得伺服器上相應的權利,或者是通過誘導外部使用者訪問下載上傳的病毒或木馬檔案,達到攻擊的目的
1)魔數:根據檔案起始的幾個位元組內容可以確定檔案型別
2)imagemagick:是一套功能強大、穩定並且開源的針對圖片處理的開發工具包,能夠處理多種格式的圖片檔案,可以利用imagemagick來對圖片進行縮放處理
6、DDoS攻擊:分散式拒絕服務攻擊,是目前最為強大、最難以防禦的攻擊方式之一,一般採用一對一的方式。
1)原理:攻擊者藉助公共網路,將數量龐大的計算機裝置聯合起來作為攻擊平臺,對一個或多個目標發動攻擊,從而達到癱瘓目標主機的目的。
注:通常在攻擊開始前,攻擊者會提前控制大量的使用者計算機,稱之為“肉雞”,並通過指令使大量的肉雞在同一時刻對某個主機進行訪問,從而達到癱瘓目標主機的目的。
2)常見的攻擊手段
a、SYN Flood:利用TCP協議三次握手的過程來達成攻擊的目的。攻擊者偽造大量的IP地址給伺服器傳送SYN報文,由於偽造的IP幾乎不可能存在,也就不可能從客戶端得到任何迴應,服務端維護一個非常大的半連線等待列表,並且不斷對這個列表中的IP地址進行遍歷和重試,佔用了大量的系統資源
b、DNS QueryFlood:UDP Flood攻擊的一種變形,向被攻擊的伺服器傳送海量的域名解析請求,並且通過偽造埠和客戶端IP,防止查詢請求被ACL(訪問控制列表)過濾
c、CC攻擊:基於應用層HTTP協議發起的DDos攻擊,也被稱為HTTPFlood。攻擊者通過控制大量的“肉雞”或者從網際網路上搜尋的大量匿名的HTTP代理,模擬正常使用者給網站發起請求直到該網站拒絕服務為止。
注:其他攻擊手段還有:DNS域名劫持、CDN回源攻擊、伺服器許可權提升等
7、常用的安全演算法有:摘要演算法、對稱加密演算法、非對稱加密演算法、資訊編碼等
8、數字摘要:也稱訊息摘要,是一個唯一對應一個訊息或文字的固定長度的值,由一個單向Hash函式對訊息進行計算而產生
1)訊息摘要的特點:
a、無論輸入的訊息有多長,計算出來的訊息摘要的長度總是固定的
b、輸入不同,訊息摘要一般也不同;輸入相同,則輸出必相同
c、單向性
2)常見演算法:
a、MD5:資訊摘要演算法5,用於確保資訊傳輸完整性和一致性,摘要長度為128位
b、SHA:安全雜湊演算法:SHA-1是基於MD4演算法的,公認的最安全的雜湊演算法之一,摘要資訊的長度為160位
c、十六進位制編碼
d、Base64編碼:一種基於64個可列印字元來表示二進位制資料的方法,每6位為一個單元。
注:Base64演算法僅僅只是一種編碼演算法而已,不是加密演算法。
e、彩虹表破解Hash演算法:彩虹表就是一張採用各種Hash演算法生成的明文和密文的對照表,在彩虹表中,表內的每一條記錄都是一串明文對應一種Hash演算法生成的一串密文。通過對彩虹表進行查詢、比較、運算,能夠迅速得出此加密字串對應的明文。
9、對稱加密演算法
1)特點:演算法公開、計算量小、加密速度快、加密效率高、祕鑰私有、使用演算法的逆演算法
2)常見演算法:
a、DES:明文按64位進行分組,祕鑰長64位,事實上只有56位參與DES運算,8的倍數位是校驗位,分組後的明文和56位的祕鑰按位替代或交換的方法形成密文
b、3DES演算法:使用3條64位的金鑰對資料進行3次加密,是DES的一個更安全的變形
c、AES:高階加密標準,有三個祕鑰長度(128、192、256位)
10、非對稱加密演算法:公開祕鑰加密演算法,公鑰對資料進行加密,只有私鑰才能進行解密;私鑰對資料進行加密,只有公鑰才能進行解密
1)過程:甲方生成一對祕鑰並將其中的一把作為公鑰向其他人公開,得到該公鑰的乙方使用該祕鑰對機密資訊進行加密後再發送給甲方,甲方在使用自己儲存的另一把專用祕鑰(即私鑰)對加密後的資訊進行解密
2)RSA演算法:基於“將兩個大素數相乘十分容易,但反過來想要對其乘積進行因式分解卻極其困難,因此可以將乘積作為公鑰”。其keysize位數越高,其產生祕鑰對及加密、解密的速度越慢
11、數字簽名:
1)原理:a、數字簽名的生成:通訊正文à摘要演算法à摘要à傳送者私鑰à數字簽名
b、數字簽名的校驗:通訊正文通過摘要演算法獲得摘要1,數字簽名通過傳送者公鑰解密得到摘要2,若摘要1和摘要2相同則表示內容沒有被篡改過
2)常見的數字簽名演算法
a、MD5withRSA:採用MD5演算法生成需要傳送正文的數字摘要,並使用RSA演算法來對正文進行加密和解密
b、SHA1withRSA:採用SHA-1演算法生成正文的數字摘要,並且使用RSA演算法來對摘要進行加密和解密
12、數字證書:也稱電子證書,用於標識網路中的使用者身份
1)數字證書包含內容:a、物件的名稱(人、伺服器、組織);b、證書的過期時間;c、證書的頒發機構(誰為證書擔保);d、證書頒發機構對證書資訊的數字簽名;e、簽名演算法;f、物件的公鑰
2)X.509:大多數的數字證書都以一種標準的格式(X.509)來儲存它們的資訊
3)證書籤發:由數字證書認證機構CA來進行頒發
4)證書校驗:用簽發該證書的證書來驗證,形成一條證書鏈,終結於根證書。
注:下載安裝根證書就表明對該根證書及其所簽發的證書都表示信任
5)證書的使用:Java提供了完善證書管理工具keytool
注:使用OpenSSL生成的數字證書和私鑰,如需在Java環境下使用,需要先將其轉換成PKCS#12編碼格式的祕鑰庫,才能夠使用keytool工具進行相應的管理
13、摘要認證的實現:1)客戶端引數摘要生成;2)服務端引數摘要校驗;3)服務端響應摘要生成;4)客戶端響應摘要校驗
注:使用HTTPS有效能上的成本,而且需要額外申請CA證書
14、簽名認證的實現:1)客戶端引數簽名生成;2)服務端引數簽名校驗;3)服務端響應簽名生成;4)客戶端響應簽名校驗
15、HTTPS協議:基於SSL的HTTP協議,它能夠確保整個通訊過程都是經過加密的,祕鑰隨機產生,並且能夠通過數字證書驗證通訊雙方的身份,以此來保障資訊保安。
注:1)通訊的內容使用對稱加密方式進行加密
2)HTTPS協議在HTTP協議與TCP協議增加了一層安全層,所有請求和響應資料在經過網路傳輸之前,都會先進行加密,然後在進行傳輸
3)HTTPS既支援單向認證,也支援雙向認證。單向認證只校驗服務端證書的有效性,雙向認證既校驗服務端證書也校驗客戶端證書的有效性
16、SSL全稱安全套接層,保障網路通訊的安全,校驗通訊雙方的身份,加密傳輸資料,與應用層協議獨立無關。
1)SSL的繼任者是TLS,全稱傳輸層安全協議,同樣位於應用層與傳輸層之間
2)SSL/TLS可分為兩層,一層為RecordProtocol(記錄協議),另一層為Handshake Protocol(握手協議)。記錄協議建立在可靠的傳輸協議(如TCP)之上,提供資料封裝、加密解密、資料壓縮、資料校驗等基本功能。握手協議建立在記錄協議之上,在實際的資料傳輸開始前,進行加密演算法的協商,通訊祕鑰的交換,通訊雙方身份的認證等工作
17、JSSE是Sun公司為了解決網際網路資訊保安傳輸提出的一個解決方案,它實現了SSL和TSL協議,包含了資料加密、伺服器驗證、訊息完整性和客戶端驗證等技術
18、OAuth協議旨在為使用者資源的授權訪問提供一個安全、開放的標準。平臺商通過OAuth協議,提示使用者對第三方軟體廠商(ISV)進行授權,使得第三方軟體廠商能夠使用平臺商的部分資料,對使用者提供服務
注:一次OAuth授權涵蓋了三個角色:普通使用者、第三方應用、平臺商
四、系統穩定性
1、日誌分析常用命令
1)cat:檢視檔案的內容
2)more:分頁顯示檔案
3)tail:顯示檔案尾
4)head:顯示檔案頭
5)sort:內容排序,預設是按字元排列的,-n 指定按數字順序排序,-r 指定逆序排列,-k 指定排序的列
6)wc:用來統計指定檔案中的字元數、字數、行數,並輸出統計結果
7)uniq:用來顯示檔案中行重複的次數,或者顯示僅出現一次的行,以及僅僅顯示重複出現的行,uniq的去重針對的知識連續的兩行
8)grep:字串查詢
9)find:檔案查詢
注:whereis命令,能夠方便地定位到檔案系統中可執行檔案的位置
10)expr:能夠對運算表示式或者字串進行運算求值
11)tar:生成歸檔檔案或將歸檔檔案展開
12)curl:在命令列下通過HTTP協議訪問網頁文件
2、sed編輯器:也稱流編輯器,在編輯資料之前,預先指定資料的編輯規則,然後按照規則將資料輸出到標準輸出
3、awk程式:提供一種程式語言而不僅僅是一組文字編輯的命令,再程式語言的內部,可以定義儲存資料的變數,使用算術和字串操作函式對資料進行運算,支援結構化程式設計概念,能夠使用if和迴圈語句等
awk [option] ‘pattern {action}’ file
其中:option為命令的選項,pattern為行匹配規則,action為執行的具體操作,file為輸入的檔案
注:如果沒有pattern,則對所有執行action;如果沒有action,則列印所有匹配的行
4、監控指標
1)load:特定時間間隔內執行佇列中的平均執行緒數,可通過top和uptime來檢視
注:每個CPU的核都維護了一個執行佇列
2)CPU利用率:top |grep Cpu
使用者時間us、系統時間sy(核心態所花費的時間)、Nice時間ni(調整程序優先順序的時候所花費的時間)、空閒時間id、等待時間wa、硬體中斷處理時間hi、軟體中斷處理時間si、丟失時間st(被強制等待虛擬CPU的時間)
3)磁碟剩餘空間 df –h 或 df –l
4)網路traffic :sar –n DEV 11
5)磁碟I/O:iostat –d –k
6)記憶體使用:free –m 注:Linux的記憶體包括實體記憶體Mem和虛擬記憶體swap
7)qps:每秒查詢數
8)rt:請求的響應時間
9)select/ps:每秒處理的select語句的數量
10)update/ps、delete/ps
11)GC
5、心跳檢測
1)ping
2)應用層檢測
3)業務檢測:a、通過頁面的大小來判斷頁面是否出現了異常;b、檢測頁面的返回值;c、可在response的header中約定一個值,來標識返回的結果是否正常
6、流量控制,對於超載的流量:1)將這部分流量丟棄;2)通過單擊記憶體佇列來進行有限的等待;3)通過分散式訊息佇列來將使用者的請求非同步化
7、服務穩定性:
1)依賴管理
2)優雅降級:暫時不可用,後期恢復
3)服務分級:非常時期,只為優先順序高的消費者提供服務
4)開關
5)應急預案
8、高併發系統設計
1)操作原子性
2)多執行緒同步:指的是執行緒之間執行的順序,多個執行緒併發地訪問和操作同一資料,並且執行的結果與訪問或者操作的次序有關
注:公平鎖指的是多個執行緒在等待同一個鎖時,必須按照申請鎖的先後順序來依次獲得鎖
3)資料一致性
a、強一致性:無論資料的更新操作是在哪個副本上執行,之後所有的讀操作都要能夠獲取到更新的最新資料
b、弱一致性:系統的某個資料被更新後,後續對該資料的讀取操作取到的可能是更新前的值,也可能是更新後的值
c、最終一致性:是若一致性的一種特殊形式,使用者最終能夠讀取到某個操作對系統的更新
注:分散式系統中採用最終一致性的例子很多
4)系統可擴充套件性,也稱可伸縮性
注:CAP理論指出:系統的一致性、可用性和可擴充套件性這三個要素對於分散式系統來說,很難同時滿足
5)併發減庫存
9、如何尋找效能瓶頸:前端優化工具——YSlow、頁面響應時間、方法響應時間、GC日誌分析、資料庫查詢(慢查詢日誌)、系統資源使用
10、效能測試:通過一些自動化的測試工具模擬多種正常、峰值,以及異常負載的條件來對系統的各項效能指標進行測試
1)ab全稱ApacheBench
2)Apache JMeter:純java實現,支援多種協議(HTTP、SOAP、FTP、TCP、SMTP、POP3等)
3)HP LoadRunner:商業付費效能測試工具,幾乎是應用效能測試領域的行業標準
4)反向代理引流
5)TCPCopy:請求複製工具
11、效能優化措施:
1)前端效能優化:a、頁面的HTTP請求數量;b、是否使用CDN網路;c、是否使用壓縮
2)Java程式優化
a、單例
b、Future模式:非同步處理,主執行緒使用處理結果時若未完成則阻塞
c、執行緒池:避免因過多執行緒導致的記憶體溢位,減少了執行緒建立和銷燬本身的消耗
d、選擇就緒:使用NIO代替阻塞I/O
e、減少上下文切換
f、降低鎖競爭:一種有效的方式是儘可能地縮短鎖持有的時間;另一種方式是減小鎖的粒度;第三種是放棄使用獨佔鎖,而使用其他更友好的併發方式來保障資料的同步
3)壓縮
4)結果快取
5)資料庫查詢效能優化:
a、合理使用索引
b、反正規化設計:適當冗餘,減少聯表
c、使用查詢快取
d、使用搜索引擎
e、使用key-value資料庫
f、GC優化
g、硬體提升效能:針對需求進行適當配置
12、Java應用故障排查
1)jps:輸出JVM虛擬機器程序的一些資訊
2)jstat:是一個可以用來對虛擬機器各種執行狀態進行監控的工具,通過它可以檢視到虛擬機器的類載入與解除安裝情況,管理記憶體使用和垃圾收集等資訊,監視JIT即時編譯器的執行情況等
3)jinfo:用於檢視應用程式的配置引數
4)jstack:用來生成虛擬機器當前的執行緒快照資訊
5)jmap:可以用來檢視等待回收物件的佇列,檢視堆的概要資訊,包括採用的是哪種GC收集器,堆空間的使用情況,以及通過JVM引數指定的各個記憶體空間的大小等
6)BTrace:是一個開源的Java程式動態跟蹤工具
7)JConsole:是一款JDK內建的圖形化效能分析工具,可以用來連線本地或者遠端正在執行的JVM,對執行的Java應用程式的效能及資源消耗情況進行分析和監控,並提供視覺化的圖表對相關資料進行展現
8)Memory Analyzer(MAT):是一款功能強大的Java堆分析工具
9)VisualVM:涵蓋了JVM記憶體消耗監視、效能分析、執行緒,以及堆轉儲分析、垃圾回收監視等幾乎所有能包含進來的功能
五、資料分析
1、inotify機制:對檔案系統的變化進行監控
注:1)觀察者模式:響應式地對檔案寫入進行監控,讀取檔案每一次更改
2)inotify解決了日誌收集的效率問題,ActiveMQ解決了日誌資料分發的問題
3)削峰填谷的思想
2、Storm是一個實時的分散式流處理系統,要處理的物件是沒有終點的資料流。Storm使得資料消費的工作能夠以topology的形式提交到叢集,叢集來進行任務的排程、資料流的切割、容錯處理等一系列操作,而這一切對使用者透明,使用者只需定義好他的topology、spout、bolt即可,其他的邏輯則交由叢集來處理
3、Chukwa:是基於Hadoop開發的資料採集與分析的框架,用來支援大型分散式系統的海量日誌的收集與分析工作,它具有良好的適應性和可擴充套件性,天生支援與MapReduce協同進行資料處理,能提供完整的資料收集與分析的解決方案,五個關鍵部分:
1)Agent:負責採集每個節點上的原始資料,併發送資料給Collector
2)Collector:負責接收Agent所傳送的資料,並且寫入到穩定的儲存當中
3)ETL資料處理任務,負責資料解析和歸檔
4)資料分析指令碼任務:負責對收集的資料進行分析
5)HICC:Hadoop基礎管理平臺,提供資料展現的Web頁面
4、Hadoop專案的核心是分散式檔案系統HDFS和程式設計模型MapReduce。HDFS用來對海量的資料提供高可靠性、高容錯性、高可擴充套件性、高吞吐的儲存解決方案,而MapReduce則是一種用來處理海量資料的並行程式設計模型和計算框架,用於對大規模的資料集進行平行計算。
注:高效能分散式協作服務ZooKeeper,可伸縮的支援大表結構化儲存的分散式資料庫Hbase,提供類SQL查詢功能的資料倉庫平臺Hive,大規模分散式系統的資料收集系統Chukwa,海量資料平行計算的程式語言和執行框架Pig,可擴充套件的機器學習和資料探勘庫Mahout
1)HDFS:主從結構,叢集擁有一個NameNode和一些DataNode,NameNode負責管理檔案系統的名稱空間,維護著每個檔名稱到對應的檔案分塊的對映,以及每個檔案分塊對應的機器列表;DataNode則負責它們所在的物理節點上的儲存管理。
注:副本的數量預設為3
2)MapReduce可以分為map和reduce兩個階段。在map階段:a、將任務的輸入資料切割為固定大小的片段(split);b、將這些片段進一步分解為鍵值對;c、為每一個split建立一個map任務,執行使用者定義的map處理邏輯,並將split中的鍵值對作為輸入傳遞給map進行處理;d、map處理後得到的中間結果輸出也是鍵值對形式,結果會被排序,並將鍵值相同的值合併到一個列表;e、根據鍵值的排序結果,將中間結果分配到不同的reduce任務。
在reduce階段:會對中間結果資料進行相應的加工處理,得到最終結果的鍵值對,並以鍵值對的形式輸出到HDFS檔案系統上。
5、HDFS基本操作命令:HDFSShell命令使用hadoop fs <args> 的形式,並使用URI路徑作為引數,URI格式是scheme://authority/path,對於HDFS,scheme為hdfs,對於本地檔案系統,scheme是file
1)touchz:hadoop fs –touchzURI[URI …] 建立一個檔案
2)text:hadoop fs –text<src> 以文字的形式展現檔案的內容
3)rmr:hadoop fs –rmr[-skipTrash] URI[URI …] 遞迴刪除,該命令將會遞迴刪除目錄和目錄下的檔案
4)mkdir:hadoop fs –mkdir<paths> 建立paths指定的目錄
5)ls:hadoop fs –ls<args> 列出args路徑下的檔案
6)cp:hadoop fs –cpURI [URI …] <dest> 從源地址將檔案複製到目的地址
7)mv:hadoop fs –mvURI[URI …]<dest> 將檔案從源地址移動到目的地址
6、MapReduce:map方法中value值儲存的是HDFS檔案中的一行,而key值為該行的首字元相對於檔案首地址的偏移量;reduce方法輸入的key為map中輸出的key值,values則對應了map過程中該key輸出的value集合
7、Hive是基於Hadoop的一個數據倉庫工具,可以將HDFS儲存的結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能。支援資料型別:
1)基本資料型別:數值型、布林型、字元型;
2)複雜型別:ARRAY、MAP、STRUCT
8、Storm是一個開源的分散式實時計算系統。MapReduce執行的是批處理任務,Storm所提出的Topology原語執行的是實時處理任務。
注:Toplogy任務會永遠地執行,直到使用者手動kill掉
1)Storm特點:a、程式設計模型簡單;b、高容錯性和高可靠性;c、高效,ZeroMQ作為底層的訊息佇列;d、多語言支援;e、可擴充套件性
2)叢集架構:Storm叢集包含了兩種型別的節點,管理節點和工作節點。管理節點上執行著一個稱為Nimbus的後臺程序,負責在叢集中分發程式碼,分配任務給其他機器,並且監控叢集的異常狀態。每一個工作節點上執行著一個叫做Supervisor的後臺程序,負責接收Nimbus分配給當前的節點任務,啟動或者是關閉相應的工作程序。
注:a、每一個工作程序負責執行Topogy的一個子集,而一個執行著的Topology由執行在多個節點上的工作程序所組成。
b、Nimbus和Supervisor間的所有協調工作都是由ZooKeeper來完成的,Nimbus和Supervisor程序都是快速失敗且無狀態的,所有狀態都儲存在ZooKeeper或者本地磁碟上。
9、Storm的一個核心抽象便是stream(流),stream是一個沒有邊界的tuple(元組)序列,而Storm則提供了在分散式環境中進行可靠的流轉換的原語。Storm提供的最基本的處理stream的原語是spout和blot。
注:訊息源spout是一個Topology裡邊的訊息產生者
10、流分組將告訴Topology如何在兩個元件之間傳送tuple序列,Storm裡有7種類型的流分組:1)隨機分組;2)按照欄位進行分組;3)廣播發送;4)全域性分組;5)不分組;6)直接分組;7)Local orShuffle Grouping
11、Sqoop是Apache下的一個開源同步工具,支援關係型資料到Hadoop的資料匯入和匯出功能,既能夠通過Sqoop將關係型資料庫(如MySQL、Orcale)中的資料匯入到HDFS,也能通過Sqoop從HDFS中將資料同步回關係型資料庫。
12、Highcarts是一個非常流行、介面美觀、功能豐富的Javascript圖表庫,它包含兩個部分:Highcharts和Highstock。前者主要是為web站點提供直觀的、互動式的圖表體驗,目前支援線圖、條形圖、曲面圖、條形曲面圖、柱狀圖、餅圖、散佈圖等圖表樣式;後者能方便快捷地用Javascript建立時間軸圖表,提供複雜精緻的導航選項,支援預設日期範圍、日期選擇器、滾動和平移等功能。