1. 程式人生 > >分散式高併發Nginx面試要點

分散式高併發Nginx面試要點

一、分散式快取
硬碟上的資料,快取在別的計算機(不是程式執行的計算機)的記憶體上
而且可以快取的計算機的個數不止一個,可以使n個
使用者通過訪問http伺服器,然後訪問應用伺服器資源,應用伺服器呼叫後端的資料庫,
在第一次訪問的時候,直接訪問資料庫,然後將要快取的內容放入到memcached叢集,叢集
規模根據快取檔案的大小而定。在第二次訪問的時候就直接進入快取讀取,不需要進行
資料庫的操作。這個適合資料變化不頻繁的場景,比如:網際網路站顯示的榜單、閱讀排行等、

redis和memcached的區別
如果簡單地比較redis和memcached的區別,大多數都會得到以下觀點:
1、redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,hash等資料結構的儲存。
2、redis支援資料的備份,即master-slave模式的資料備份
3、redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用
在redis中,並不是所有的資料都一直儲存在記憶體中的。這是和memcached相比一個最大的卻別(我個人是這麼認為的)

redis
使用者發出查詢類似的請求,Nix判斷是pc端還是M端,假如是pc端,先從redis快取裡面查詢所需要的資料
如果有則直接返回,如果沒有則通過API資料介面(做一個查詢的介面)直接從資料庫(DB mysql等)裡面查
把最新查新查詢的結果先放到redis快取裡,再將查詢的結果返回給PC客戶端
nigix有個功能叫靜態代理 先把儲存靜態檔案的nfs給配置到nigix中  nfs檔案系統主要用來儲存靜態得東西,css 圖片 js

redis是一種高階的key:value儲存系統,其中value支援五中資料型別
1、字串(string)
2、字串列表(list)
3、字串集合(sets)
5、雜湊(hashes)
而關於key,有幾點要提醒大家:
1、key不要太長,計量不要超過1024位元組,這不僅消耗記憶體,而且會降低查詢的效率
2、key也不要太短,太短的話,key的可讀性會降低
3、在一個專案中,key最好使用同一的命名模式,例如user:10000:password.
redis中的lists在底層實現上並不是陣列,而是連結串列。
redis的集合是一種無序的集合,集合中的元素沒有先後的順序
redis中的hashes存的是字串和字串之間的對映

redis提供了兩種持久化的方式,分別是RDB(redis dataBase)和AOF(Append Only File)
RDB,簡而言之,就是在不同的時間點,將redis儲存的資料生成快照並存儲到磁碟等介質上
AOF,則是換了一個角度來實現持久化,那就是講redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,
只要把這些寫指令從前到後再重複執行一遍,就可以實現資料恢復了。
其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優先採用AOF方式來進行資料恢復
這是因為AOF方式的資料恢復完整度更高。

redis的事務處理
1、MULTI用來組裝一個事務
2、EXEC用來執行一個事務
3、DISCARD用來取消一個事物
4、WATCH用來監視一些key,一點這些key在事務執行之前被改變,則取消事務的執行
面試題:
1、mysql裡有2000W的資料,redis中值存20W的資料,如何保證redis中的資料都是熱點資料?
設定maxmemory為20W資料的容量,然後用allkeys-lru
2、使用redis有哪些好處?
1、速度快,因為資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1)
2、支援豐富資料型別,支援string,list,set,sorted set,hash
3、支援事務,操作都是原子性,所謂原子性就是對資料的更改要麼全部執行,要麼全部不執行
4、豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除
3、redis相比memcached有哪些優勢?
1、memcached所有的值均是簡單的字串,redis作為其其替代者,支援更為豐富的資料型別
2、redis的速度比memcached快很多
3、redis可以持久化其資料
4、redis常見效能問題和解決方案:
1、Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案
2、如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次
3、為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內
4、儘量避免在壓力河大的主庫上增加從庫
5、主從複製不要用圖狀結構,用單向連結串列結構更為穩定,這樣的結構方便解決單點故障問題,
實現slave對master的替換。如果master掛了,可以立刻啟動slave做master,其他不變
5、redis怎麼和spring進行整合
1.引入jar包
2、配置bean在application.xml加入如下配置jedis配置reids伺服器中心cache配置
不需要加入快取的類不需要快取的方法設定快取失效時間
shiro
6、redis記憶體資料集大小上升到一定大小的時候,就會執行資料淘汰策略。redis提供6中資料淘汰策略:
1、volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最新最少使用的資料淘汰
2、volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰
3、volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
4、allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
5、allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
6、no-enviction(驅逐):禁止驅逐資料
7、redis常見的效能問題都有哪些?如何解決?
1、.Master寫記憶體快照,save命令排程rdbSave函式,會阻塞主執行緒的工作,當快照比較大時對效能影響是非常大的,
會間斷性暫停服務,所以Master最好不要寫記憶體快照
2、.Master AOF持久化,如果不重寫AOF檔案,這個持久化方式對效能的影響是最小的,但是AOF檔案會不斷增大,AOF
檔案過大會影響Master重啟的恢復速度。Master最好不要做任何持久化工作,包括記憶體快照和AOF日誌檔案,特別是
不要日用記憶體快照做持久化,如果資料比較關鍵,某個Slave開啟AOF備份資料,策略為每秒同步一次
3、.Master呼叫BGREWRITEAOF重寫AOF檔案,AOF在重寫的時候會佔大量的CPU和記憶體資源,導致服務load過高,
出現短暫服務暫停現象。
4、.Reids主從複製的效能問題,為了主從複製的速度和連線的穩定性,Slave和Master最好在同一個區域網內
8、請用Redis和任意語言實現一段惡意登入保護的程式碼,限制一小時內每使用者ID最多隻能登入5次。
具體登入函式或功能用空函式即可,不用詳細寫出。
用列表實現:列表中每個元素代表登入時間,只要最後的第5次登入時間和現在時間差不多超過1小時就禁止登入。
用Python寫的程式碼如下:

二、高併發
什麼是高併發?
多個程序或執行緒同時(或者說在同一段時間內)訪問同一資源會產生併發問題。
初期解決方案
1、系統或伺服器級別的解決方案
增大伺服器的CPU
增大記憶體條
增加硬碟個數,對硬碟做Raid5
換掉免費哦的Tomcat,使用商用weblogic(美國Oracle公司出品的)
增加到二塊網絡卡
聘請系統架構師優化Linux核心
甚至花高價直接購買高效能伺服器
2、應用級別的解決方案
網頁HTML靜態化(需要CMS專案支援)
圖片服務期分離(常用解決方案)
快取(常用解決方案)上上策為分散式快取
映象(下載較多)
3、採用負載均衡技術
為了滿足業務量增長的需求,衍生出來的一種臉頰有效透明的方法以擴充套件現有網路裝置
和伺服器的頻寬,增加吞吐量、加強網路資料處理能力,提高網路的靈活性和可用性的技術
就是負載均衡(Load Balance)
三負載均衡
負載均衡有三大作用:1、轉發請求2、故障移除3、恢復新增
負載均衡種類
1、一種是通過硬體來進行解決,常見的硬體有NetScaler、F5、Radware和Array等商用的
負載均衡器,但是它們是比較昂貴。
2、一種是通過軟體來進行解決的,常見的軟體有LVS、Nginx、apache等,它們是基於Linux
系統並且開元的負載均衡策略

負載均衡-然間解決
主流軟體:1.apache+JK2、nginx3、lvs+keepalived

什麼是nginx?
Nginx是一款輕量級的web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在
一個BSD-like協議下發行。由俄羅斯的程式設計師Igor Sysoev所開發,供俄國大型的入口網站及搜尋引擎
Rambler(漫步者)使用。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型
的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:新浪、網易、騰訊等。
優點:
1、可執行linux,並有windows移植版
2、在高連線併發的情況下,Nginx是Apache伺服器不錯的替代品,Nginx在美國是做虛擬主機生意的老闆們
經常選擇的軟體平臺之一。能夠支援高達50000個併發連線數的響應

排程器的實現技術中,IP負載均衡技術是效率最高的,IP虛擬伺服器軟體(IPVS)實在linux核心中實現的

Nginx
nginx功能豐富,可作為HTTP伺服器,也可作為反向代理伺服器,郵件伺服器。
Http代理,反向代理:作為web伺服器最常用的功能之一。Nginx在做反向代理時,提供效能穩定,並且能夠
提供配置靈活的轉發功能。Nginx可以根據不同的正則匹配,採取不同的轉發策略,比如圖片檔案結尾的走
檔案伺服器,動態頁面走web伺服器。並且nginx對返回結果進行錯誤頁面跳轉,異常判斷等。如果被分發的伺服器存在
異常,他可以將請求重新轉發給另外一臺伺服器,然後自動去除異常伺服器。
nigix提供的負載均衡策略有2種:內建策略和擴充套件策略。內建策略為輪詢,加權輪詢。Ip hash。擴充套件策略,
就天馬行空,只有你想不到的沒有他做不到的啦,你可以參照所有的負載均衡演算法,給他一一找出來做下實現。
Ip hash演算法,對客戶端請求的ip進行hash操作,然後根據hash結果將同一個客戶端ip的請求分發給同一臺伺服器
進行護理,可以解決session不共享的問題。
web快取nginx可以對不同的檔案做不同的快取處理,配置靈活,並且支援FastCGI_Cache,主要用於對
FastCGI的動態程式進行快取,配合著第三方的ngx_cache_purge,對制定的URL快取內容可以進行增刪管理。
Nginx配置1、全域性塊:配置影響nginx全域性的指令。一般有執行nginx伺服器的使用者組,nginx進行pid存放路徑,
日誌存放路徑,配置檔案引入,允許生成worker process數等。2、events塊:配置影響nginx伺服器或與使用者的網路連線。
有每個程序的最大連線數,選取哪種時間驅動模型處理連線請求,是否允許同時接受多個忘了連線,開啟多個網路連線序列化等
3、http塊:可以巢狀多個server,配置代理,快取,日誌定義等絕大多數功能和第三方模組的配置。如檔案引入,mime-type定義,
日誌自定義,是否使用sendfile傳輸檔案,連線超時時間,單連線請求數等。4、server塊:配置虛擬主機的相關引數,一個http中
可以有多個server。5、location塊:配置請求的路由,以及各種頁面的處理情況。
還要注意以下幾點:1、$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;2.$remote_user:用來記錄客戶端使用者名稱稱
3、$time_local:用來記錄訪問時間與時區4、$request:用來記錄請求的url與http協議5.$status:用來記錄請求狀態,成功200
6.$body_bytes_s ent:記錄傳送給客戶端檔案主題內容大小;7.$http_user_agent:記錄客戶端瀏覽器的相關資訊
驚群現象:一個網路連線到來,多個睡眠的程序被同時叫醒,但只有一個程序能獲得連線,這樣會影響系統系能。
每個指令必須有分號結束。
ngin是工作在網路7層的
四、叢集間session共享問題
session共享實現方案
session共享有多重解決辦法,常用的有四種:客戶端Cookie儲存,伺服器間session同步、使用叢集管理Session、
把session持久化到資料庫
叢集中session共享解決方案
1、客戶端儲存方案
2、集中式session共享方案
3、session複製方案
4、把session持久化到資料庫

session儲存到redis簡單實現
1、配置web.xml過濾器sessionFilter
2、在spring配置檔案中配置對應的過濾器名字:
3、sessionFilter的實現
4、TerryHttpServletRequestWrapper的實現(關於session增刪改查的四個方法)
5、CacheHttpSession的實現
6、HttpSessionWrapper的實現


五、面試介紹
您好,很高興能來本公司面試,我叫牛建軍,畢業於鄭州輕工業學院,之後在鄭州的一家公司做了2年的
java開發。在工作期間大概參與了三個專案的開發。
第一個專案是二手車競拍管理系統,由於剛到公司所以負責的內容難度不大。第二個專案是一個電器裝置公司的資源管理
系統,在這個專案中,我主要負責了系統管理模組、系統技術資料圖紙管理模組以及登入模組的開發。系統管理模組又分為使用者管理
角色管理、執行監控、資料字典四個子模組,在技術資料圖紙管理模組用了lucene搜尋,並且有高亮效果。
還負責了許可權系統的開發,使用hibernate快取和sql優化來提高網站效能。
整個負責的模組使用了大量的js和jquery元件,比如fck,jxl,jfreechart,Z-tree等等
第三個專案是一個服裝的電商專案。在這個專案中主要負責後臺商品管理頁面,前臺商品列表頁面,以及商品詳情頁和購物車模組。
在前臺商品列表頁面用頁面緩OSCache存來提高效能,商品詳情頁是後臺商品上架時Freemarker自動生成的
網站存在大量的圖片讀寫操作,使用了jersey技術搭建圖片伺服器叢集,這些都緩解了伺服器的壓力,另外還是用了分散式快取redis來
提高網站效能,把session儲存到redis達到叢集下session共享
為了解決網站高併發的問題,在資料庫端使用mysql的讀寫分離和主從複製,在伺服器端使用了負載均衡。
我非常熱愛java,通過這幾年了學習掌握了基本的java開發,但在我面前未知的依然是一片大海,我會努力也希望能夠在這個行業更長遠的發展。

六、工具
visio是微軟的 可以畫業務流程圖、網路圖、工作流圖、資料庫模型圖和軟體圖
Rational Rose是Rational公司出品的一種面向物件的統一建模語言的視覺化建模工具
powerDesigner是設計資料庫模型的,包括面向物件模型、業務流程模型、概念資料模型、物理資料模型等