- 相關(guān)推薦
機械工程師英語(yǔ)面試
應屆生在面試的時(shí)候,大公司偶爾也會(huì )遇到一些系統設計題,而這些題目往往只是考一下你的知識面,或者對系統架構方面的了解,不會(huì )涉及編碼。很多人感覺(jué)難以應對這樣的題目,也不知道從何說(shuō)起,在本文中,總結了回答這類(lèi)題目需要哪些基礎知識,以及怎樣使用這些知識回答這些問(wèn)題。
在正式介紹基礎知識之前,先羅列幾個(gè)常見(jiàn)的系統設計相關(guān)的筆試面試題:
(1)(百度)要求設計一個(gè)DNS的Cache結構,要求能夠滿(mǎn)足每秒5000以上的查詢(xún),滿(mǎn)足IP數據的快速插入,查詢(xún)的速度要快。(題目還給出了一系列的數據,比如:站點(diǎn)數總共為5000萬(wàn),IP地址有1000萬(wàn),等等)
解決方案:DNS服務(wù)器實(shí)現域名到IP地址的轉換。
每個(gè)域名的平均長(cháng)度為25個(gè)字節(在域名的命名標準中,對于域名長(cháng)度是有明顯限制的。其中,中國國家域名不得超過(guò)20個(gè)字符,國際通用域名不得超過(guò)26個(gè)字符),每個(gè)IP為4個(gè)字節,所以Cache的每個(gè)條目需要大概30個(gè)字節。
總共50M個(gè)條目,所以需要1.5G個(gè)字節的空間?梢苑胖迷趦却嬷。(考慮到每秒5000次操作的限制,也只能放在內存中。)
可以考慮的數據結構包括hash_map,字典樹(shù),紅黑樹(shù)等等。
我覺(jué)得比較好的解決方法是,將每一個(gè)URL字符串轉化為MD5值,作為key,建立最大或最小堆,這樣插入和查找的效率都是O(log(n))。
MD5是128bit的大整數也就是16byte,比直接存放URL要節省的多。
具體可應用方法:每秒5000的查詢(xún)不算高啊,最土的方法使用MySQL+Memcached架構應該都能滿(mǎn)足吧?
數據結構建議以域名的md5值為主鍵來(lái)存儲,值可以只存儲目標IP就行。Memcached用戶(hù)支撐前端查詢(xún),MySQL用戶(hù)存儲數據,還要看總數量會(huì )有多大,如果不是特別大,直接使用MyISAM引擎來(lái)存儲就行,更新插入都非?,如果超千萬(wàn),可以使用InnoDB來(lái)存儲,每次有新數據插入時(shí)直接使用replace into table就行,Memcached數據的更新直接使用set。
Memcached隨便用得好些,每秒上萬(wàn)次的get是容易達到的,MySQL你別小看,在有的測試里,以主鍵查詢(xún)的測試,一臺普通的服務(wù)器上,MySQL/InnoDB 5.1服務(wù)器上獲得了750000+QPS的成績(jì)。
總結:關(guān)于高并發(fā)系統設計。主要有以下幾個(gè)關(guān)鍵技術(shù)點(diǎn):緩存,索引,數據分片,鎖粒度盡可能小。。
(2)有N臺機器,M個(gè)文件,文件可以以任意方式存放到任意機器上,文件可任意分割成若干塊。假設這N臺機器的宕機率小于1/3,想在宕機時(shí)可以從其他未宕機的機器中完整導出這M個(gè)文件,求最好的存放與分割策略。
解決方案:涉及到現在通用的分布式文件系統的副本存放策略。一般是將大文件切分成小的block(如64MB)后,以block為單位存放三份到不同的節點(diǎn)上,這三份數據的位置需根據網(wǎng)絡(luò )拓撲結構配置,一般而言,如果不考慮跨數據中心,可以這樣存放:兩個(gè)副本存放在同一個(gè)機架的不同節點(diǎn)上,而另外一個(gè)副本存放在另一個(gè)機架上,這樣從效率和可靠性上,都是最優(yōu)的(這個(gè)google公布的文檔中有專(zhuān)門(mén)的證明,有興趣的可參閱一下。)。如果考慮跨數據中心,可將兩份存在一個(gè)數據中心的不同機架上,另一份放到另一個(gè)數據中心。
(3)假設有三十臺服務(wù)器,每個(gè)上面都存有上百億條數據(有可能重復),如何找出這三十臺機器中,根據某關(guān)鍵字,重復出現次數最多的前100條?要求用Hadoop來(lái)做。
方案:針對每一臺機器有100億,類(lèi)似100萬(wàn)時(shí)的處理方法,對數據進(jìn)行切片,可以都切為100萬(wàn)的記錄,對100萬(wàn)、取最前100,不同在于這前100也存入hash,如果key相同則合并value,顯然100億的數據分割完后的處理結果也要再進(jìn)行類(lèi)似的處理,hash表不能過(guò)長(cháng),原理其實(shí)也就是map和reduce。然后合并這30臺機器的結果。
(4)設計一個(gè)系統,要求寫(xiě)速度盡可能高,說(shuō)明設計原理。
解決方案:涉及到BigTable的模型。主要思想是將隨機寫(xiě)轉化為順序寫(xiě),進(jìn)而大大提高寫(xiě)速度。具體是:由于磁盤(pán)物理結構的獨特設計,其并發(fā)的隨機寫(xiě)(主要是因為磁盤(pán)尋道時(shí)間長(cháng))非常慢,考慮到這一點(diǎn),在BigTable模型中,首先會(huì )將并發(fā)寫(xiě)的大批數據放到一個(gè)內存表(稱(chēng)為“memtable”)中,當該表大到一定程度后,會(huì )順序寫(xiě)到一個(gè)磁盤(pán)表(稱(chēng)為“SSTable”)中,這種寫(xiě)是順序寫(xiě),效率極高。說(shuō)到這,可能有讀者問(wèn),隨機讀可不可以這樣優(yōu)化?答案是:看情況。通常而言,如果讀并發(fā)度不高,則不可以這么做,因為如果將多個(gè)讀重新排列組合后再執行,系統的響應時(shí)間太慢,用戶(hù)可能接受不了,而如果讀并發(fā)度極高,也許可以采用類(lèi)似機制。
(5)設計一個(gè)高并發(fā)系統,說(shuō)明架構和關(guān)鍵技術(shù)要點(diǎn)。
方案:分布式系統中的核心的服務(wù)器的實(shí)現?梢允莌ttp服務(wù)器,緩存服務(wù)器,分布式文件系統等的內部實(shí)現。下邊主要從一個(gè)高并發(fā)的大型網(wǎng)站出發(fā),看一個(gè)高并發(fā)系統的設計。下邊是一個(gè)高并發(fā)系統的邏輯結構:
1)緩存系統:緩存是每一個(gè)高并發(fā),高可用系統不可或缺的模塊。常見(jiàn)的緩存系統:Squid(前端緩存)、Ehcache(對象緩存系統),動(dòng)態(tài)頁(yè)面靜態(tài)化(頁(yè)面緩存)
2)負載均衡系統:負載均衡策略有隨機分配,平均分配,分布式一致性hash等。軟件負載均衡有:基于DNS的負載均衡、基于LVS的負載均衡和基于lptables的負載均衡。硬件負載均衡:路由上配置nat實(shí)現負載均衡、對萬(wàn)網(wǎng)一個(gè)虛擬ip,內網(wǎng)映射幾個(gè)內網(wǎng)ip。數據庫負載均衡:數據庫集群等。
(6)有25T的log(query->queryinfo),log在不段的增長(cháng),設計一個(gè)方案,給出一個(gè)query能快速返回queryinfo?
方案:1)建立適當索引;2)優(yōu)化sql語(yǔ)句;3)實(shí)現小數據量和海量數據的通用分頁(yè)顯示存儲過(guò)程;4)合理選擇聚集索引
以上所有問(wèn)題中凡是不涉及高并發(fā)的,基本可以采用google的三個(gè)技術(shù)解決,分別為:GFS,MapReduce,Bigtable,這三個(gè)技術(shù)被稱(chēng)為“google三駕馬車(chē)”,google只公開(kāi)了論文而未開(kāi)源代碼,開(kāi)源界對此非常有興趣,仿照這三篇論文實(shí)現了一系列軟件,如:Hadoop、HBase、HDFS、Cassandra等。
在google這些技術(shù)還未出現之前,企業(yè)界在設計大規模分布式系統時(shí),采用的架構往往是database+sharding+cache,現在很多公司(比如taobao,weibo.com)仍采用這種架構。在這種架構中,仍有很多問(wèn)題值得去探討。如采用什么數據庫,是SQL界的MySQL還是NoSQL界的Redis/TFS,兩者有何優(yōu)劣? 采用什么方式sharding(數據分片),是水平分片還是垂直分片?據網(wǎng)上資料顯示,weibo.com和taobao圖片存儲中曾采用的架構是Redis/MySQL/TFS+sharding+cache,該架構解釋如下:前端cache是為了提高響應速度,后端數據庫則用于數據永久存儲,防止數據丟失,而sharding是為了在多臺機器間分攤負載。最前端由大塊大塊的cache組成,要保證至少99%(該數據在weibo.com架構中的是自己猜的,而taobao圖片存儲模塊是真實(shí)的)的訪(fǎng)問(wèn)數據落在cache中,這樣可以保證用戶(hù)訪(fǎng)問(wèn)速度,減少后端數據庫的壓力,此外,為了保證前端cache中數據與后端數據庫中數據一致,需要有一個(gè)中間件異步更新(為啥異步?理由簡(jiǎn)單:同步代價(jià)太高。異步有缺定,如何彌補?)數據,這個(gè)有些人可能比較清楚,新浪有個(gè)開(kāi)源軟件叫memcachedb(整合了Berkeley DB和Memcached),正是完成此功能。另外,為了分攤負載壓力和海量數據,會(huì )將用戶(hù)微博信息經(jīng)過(guò)片后存放到不同節點(diǎn)上(稱(chēng)為“sharding”)。
這種架構優(yōu)點(diǎn)非常明顯:簡(jiǎn)單,在數據量和用戶(hù)量較小的時(shí)候完全可以勝任。但缺定早晚一天暴露出來(lái),即:擴展性和容錯性太差,維護成本非常高,尤其是數據量和用戶(hù)量暴增之后,系統不能通過(guò)簡(jiǎn)單的增加機器解決該問(wèn)題。
于是乎,新的架構便出現了。主要還是google的那一套東西,下面分別說(shuō)一下:
GFS是一個(gè)可擴展的分布式文件系統,用于大型的、分布式的、對大量數據進(jìn)行訪(fǎng)問(wèn)的應用。它運行于廉價(jià)的普通硬件上,提供容錯功能,F在開(kāi)源界有HDFS(Hadoop Distributed File System),該文件系統雖然彌補了數據庫+sharding的很多缺點(diǎn),但自身仍存在一些問(wèn)題,比如:由于采用master/slave架構,因而存在單點(diǎn)故障問(wèn)題;元數據信息全部存放在master端的內存中,因而不適合存儲小文件,或者說(shuō)如果存儲的大量小文件,那么存儲的總數據量不會(huì )太大。
MapReduce是針對分布式并行計算的一套編程模型。他最大的優(yōu)點(diǎn)是:編程接口簡(jiǎn)單,自動(dòng)備份(數據默認情況下會(huì )自動(dòng)備三份),自動(dòng)容錯和隱藏跨機器間的通信。在Hadoop中,MapReduce作為分布計算框架,而HDFS作為底層的分布式存儲系統,但MapReduce不是與HDFS耦合在一起的,你完全可以使用自己的分布式文件系統替換掉HDFS。當前MapReduce有很多開(kāi)源實(shí)現,如Java實(shí)現Hadoop MapReduce,C++實(shí)現Sector/sphere等,甚至有些數據庫廠(chǎng)商將MapReduce集成到數據庫中了。
BigTable俗稱(chēng)“大表”,是用來(lái)存儲結構化數據的,個(gè)人覺(jué)得,BigTable在開(kāi)源界最火爆,其開(kāi)源實(shí)現最多,包括:HBase,Cassandra,levelDB等,使用也非常廣泛。
除了google的這三家馬車(chē),還有其他一些技術(shù):
Dynamo:亞馬遜的key-value模式的存儲平臺,可用性和擴展性都很好,采用DHT(Distributed Hash Table)對數據分片,解決單點(diǎn)故障問(wèn)題,在Cassandra中,也借鑒了該技術(shù),在BT和電驢的中,也采用了類(lèi)似算法。
虛擬節點(diǎn)技術(shù):該技術(shù)常用于分布式數據分片中。具體應用場(chǎng)景是:有一大坨數據(maybe TB級或者PB級),我們需按照某個(gè)字段(key)分片存儲到幾十(或者更多)臺機器上,同時(shí)想盡量負載均衡且容易擴展。傳統的做法是:Hash(key) mod N,這種方法最大缺點(diǎn)是不容易擴展,即:增加或者減少機器均會(huì )導致數據全部重分布,代價(jià)忒大。于是乎,新技術(shù)誕生了,其中一種是上面提到的DHT,現在已經(jīng)被很多大型系統采用,還有一種是對“Hash(key) mod N”的改進(jìn):假設我們要將數據分不到20臺機器上,傳統做法是hash(key) mod 20,而改進(jìn)后,N取值要遠大于20,比如是20000000,然后我們采用額外一張表記錄每個(gè)節點(diǎn)存儲的key的模值,比如:
node1:0~1000000
node2:1000001~2000000
。。。。。。
這樣,當添加一個(gè)新的節點(diǎn)時(shí),只需將每個(gè)節點(diǎn)上部分數據移動(dòng)給新節點(diǎn),同時(shí)修改一下這個(gè)表即可。
Thrift:Thrift是一個(gè)跨語(yǔ)言的RPC框架,分別解釋一下“RPC”和“跨語(yǔ)言”,RPC是遠程過(guò)程調用,其使用方式與調用一個(gè)普通函數一樣,但執行體發(fā)生在遠程機器上?缯Z(yǔ)言是指不同語(yǔ)言之間進(jìn)行通信,比如c/s架構中,server端采用C++編寫(xiě),client端采用PHP編寫(xiě),怎樣讓兩者之間通信,thrift是一種很好的方式。
【機械工程師英語(yǔ)面試】相關(guān)文章:
機械工程師英語(yǔ)自我介紹12-09
應聘機械工程師英語(yǔ)句型表達07-04
接到華大基因設備工程師面試,我本來(lái)也是學(xué)機械的07-11
機械工程師簡(jiǎn)歷07-03
機械工程師崗位04-23
機械工程師簡(jiǎn)歷02-27
機械結構工程師的職責10-18
機械的看過(guò)來(lái),機械工藝工程師工資?07-14
英語(yǔ)面試04-09
機械面試問(wèn)題及答案09-19