練習題

1、如何刪除一個文本中的空白行,比如一行有字,然後一行空白,再有一行字?

[root@www]cat 1.txt

===========================

yhc

is

very

good !

===========================

答:sed ‘/^$/d’ 1.txt ##注意這裏不能加-n靜默選項。另外可以使用cat 1.txt|tr “\n” " " 讓它變成一行英語語句

2、請解釋下怎麼進行location匹配的規則?(我覺得這個非常難以理解,多虧有視頻啊!看懂這個,對Nginx自信爆漲)

答:精確匹配>普通匹配>正則匹配

分析:首先是URI解析,找到第一個精確匹配的,如果命中精確匹配,那麼徹底結束了,不再進行下面的location匹配了,如果沒有精確命中,那麼就去尋找多個普通匹配的,普通匹配跟編輯location語句的順序沒有關係,如果普通匹配命中多個,那麼記憶匹配最長的(比如/aaa/bbb/)的結果,如果命中一個,那麼也記憶普通匹配的結果(注意,這裏並未徹底結束),無論普通匹配有無命中,都要去尋找正則匹配,正則匹配跟編輯location的順序有關(一定是正則1不滿足才找正則2),如果第一個正則匹配成功,則立即跳出,返回該正則匹配下的結果,也徹底結束了,如果正則一個都沒有匹配成功,則返回前面普通匹配記憶的結果。

參考視頻:(燕十八location流程圖解) http://www.icoolxue.com/play/7027

3、Nginx如何拒絕某一個人來訪問?(對比上篇博客提到的apache只允許某個IP訪問)

答:在location上下文中添加If語句,如果$remote_addr是某個IP的話,直接返回403 forbidden


location / {

	root html;

	index index.php index.html;

	if ($remote_addr = 192.168.1.100) {         ##if 空格 (條件),不要忘了空格

		return 403;

	}

}


4、當瀏覽器訪問一個Nginx不存在的頁面時,如何返回404頁面?(感覺這些問題很常見,但是沒怎麼想過具體怎麼做)

答:在location字段添加if語句,如果請求的文件名不存在,rewrite重寫到我們人爲定義的404頁面,但是必須要加break,不再進行下一輪UEI的匹配。rewrite到新的uri後進入另外一個location,恰好這個location也有rewrite,再次重寫的uri又調回原來的location,這樣就是死循環了,最多執行10次,然後報500錯誤。本例中documentrootdocument_rootfastcgi_script_name是客戶端傳過來的參數(比如test.html),而不是我們服務端定義的網頁文檔!


location / {

	root html;

	index index.php index.html;

	if (!-e $document_root$fastcgi_script_name){

			rewrite ^.*$ /404.html break;  ##這條語句表示任意文件名到/usr/local/nginx/html/404.html

	}

}


5、用什麼命令可以看到整個目錄下的內容。

答:tree /usr/local/svn/svndata/

6、介紹下prefork和worker?(唉,這一點表述的不好,記不住了,event模式應該是nginx和apache都有的,都是一個進程處理多個請求)

答:(1)Prefork MPM實現了一個非線程的、預派生的web服務器。它在Apache啓動之初,root控制進程在最初建立“StartServers”個子進程後,

爲了滿足MinSpareServers設置的需要創建一個進程,等待一秒鐘,繼續創建兩個,再等待一秒鐘,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值爲止。這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。然後等待連接;可以減少頻繁創建和銷燬進程的開銷,每個子進程只有一個線程,在一個時間點內,只能處理一個請求。這是一個成熟穩定,可以兼容新老模塊,也不需要擔心線程安全問題,但是一個進程相對佔用資源,消耗大量內存,不擅長處理高併發的場景。

(2)worker使用了多進程和多線程的混合模式,worker模式也同樣會先預派生一些子進程,然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,因爲線程是通過共享父進程的內存空間,因此,內存的佔用會減少一些,在高併發的場景下會比prefork有更多可用的線程,表現會更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是多個線程出現問題,也只是影響Apache的一部分,而不是全部。由於用到多進程多線程,需要考慮到線程的安全了。

參考文檔:http://www.mamicode.com/info-detail-1212491.html

7、Nginx的master進程和worker進程工作原理?

答:Nginx採用異步非阻塞的方式來處理網絡事件,類似於Libevent。Nginx服務一啓動後,master進程先建好需要listen的socket後,然後再fork出多個worker子進程,這樣每個worker進程都可以去accept這個socket。當一個client連接到來時,所有accept的worker進程都會受到通知,但只有一個進程可以accept成功,其它的則會accept失敗。Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個worker進程在accept連接,從而解決驚羣問題。當一個worker進程accept這個連接後,就開始讀取請求,解析請求,處理請求,產生數據後,再返回給客戶端,最後才斷開連接,這樣一個完整的請求就結束了。

參考文檔:http://blog.chinaunix.net/uid-24517549-id-3977650.html

8、描述系統的啓動過程?當用戶登錄上系統後,linux系統爲用戶做了什麼任務?(拓麻的這個問題我吞吞吐吐的才說出好幾個,以前沒思考過這些問題,謝天謝地終於問了我那個背了很久的啓動過程,還好避免了悲劇)

答:(1)讀取/etc/passwd文件進行身份驗證。

(2)將用戶登錄信息寫入安全日誌裏面。

(3)啓動該用戶的環境變量 (然後引申出環境變量的一系列問題,我不知道)

(4)

9、如何讓域名擁有多個IP地址?客戶端來解析的時候,返回的是哪條記錄?(後面這個問題我不清楚,當時猜測是第一條,現在想起來,真尼瑪×××,這特麼不就是DNS輪詢嗎?肯定是一個客戶端返回第一個,另一個客戶端返回第二個,然後這樣週期性的順序調度)

答:DNS給域名設置多條主機A記錄即可。不同客戶端可能返回不同記錄,根據輪詢指定哪個IP地址返回給哪些客戶端。

10、說說TCP的擁塞控制。(果然是雲計算企業呀,畢竟互聯網,拓麻的這個問題勞資一時想不起來呀,我還寫的精通TCP/IP,其實這個問題

我整理過,表現不太完美)

答:(1)慢啓動算法作用在TCP數據傳輸的開始階段,當主機開始發送數據時,因爲不知道網絡中的負荷情況,如果立即發送大量的數據,有可能會引起網絡的擁塞。因此,TCP採用試探的方法,逐漸增大擁塞窗口。通常在剛開始發送數據報文段時,先將擁塞窗口cwnd設置爲一個TCP最大段長度MSS的值。而在每收到N個數據報文段的確認後,cwnd就增加一個MSS的數值(就是增大一倍,所以是指數型)。這樣就可以逐漸增大發送端的擁塞窗口,使數據注入網絡的速率比較合理。

(2)爲了防止擁塞窗口增長過快而引起網絡擁塞,TCP還需要設置一個慢啓動閾值ssthresh,當擁塞窗口的值增加到ssthresh時,就要減緩擁塞窗口的增長速度,具體的做法是每經過一個RTT,擁塞窗口cwnd的值加1(單位爲MSS),這樣就可以使cwnd按線性規律緩慢增長

(3)快速重傳算法的基本思想是:接收端每收到一個失序的數據報文段後就立即發出重複確認,以便更早地通知發送端有丟包的情況發生。

(4)快速恢復是配合快速重傳使用的算法,其基本思想是:當發送端連續收到三個重複確認時,就將慢啓動閾值ssthresh減半,以預防網絡擁塞的發生,並且將擁塞窗口cwnd的值置爲減半後的ssthresh,然後開始執行擁塞避免算法,使得cwnd緩慢地加性增大。

參考文檔:https://www.nowcoder.com/discuss/6175

11、用過啥抓包軟件?如何判斷網絡出現擁塞、攻擊、延遲以及各種異常情況?TCP的窗口在哪?(答得不好,根據序列號來判斷是我瞎說的,還好面試官原諒我沒經驗)

答:wireshark、tcpdump。

(1)分析是否有大量數據包的序列號混亂。

(2)分析是否有廣播地址存在。

(3)分析延遲多不多。(但是感覺不容易,因爲一般是看不出來延遲的,只是觀測一個源IP地址的數據包發出請求,然後看什麼位置目的端進行響應了該請求)

12、如果我是小白,什麼叫做反向代理,Nginx的反向代理和負載均衡有什麼區別嗎?Nginx根據什麼來進行反向代理到後端服務器。(其實最後

一個問題當時除了URI根本答不出來其他的)

答:反向代理:代理服務器監聽外網上的客戶端發出來的請求,並把該請求轉發給內網後臺的真實服務器進行處理,處理完畢後,先經過代理服務器緩存一份,而後,再通過代理服務器封裝http應答報文返回給客戶端。Nginx的通過location正則匹配URI代理到後端的服務器,並且在負載均衡upstream模塊,根據域名和端口代理到多臺後端服務器。(域名和端口這個怎麼能叫問題呢)

區別:(1)Nginx的反向代理和負載均衡沒有太大區別,基本的配置指令都一樣,但是反向代理提供緩存功能,所以可以添加一些緩存命令行。

(2)代理到後端一臺服務器就可以稱之爲反向代理,代理到後端多臺服務器就稱爲負載均衡,負載均衡是每臺機器都會分擔一些處理請求的壓力,負載均衡完全可以認爲是反向代理。

參考文檔:https://www.oschina.net/question/126236_119223

13、爲什麼慢啓動算法中擁塞窗口要按指數級進行增長呢?擁塞窗口到底代表什麼意思?(以前真沒有好好想過擁塞控制,一旦自己面試遇到了,知道這玩意重要了)

答:擁塞窗口就是發送方在某次會話交互過程中,在一個RTT(round trip time)週期內,能夠發送的TCP報文段的數量多少。

原因:(1)當TCP連接剛剛建立,準備要數據傳輸的時候,由於不知道網絡的負載情況,所以要去試探性檢測,只發出很少的數據包,擁塞窗口的值設的很小,我每發出N個數據幀,如果網絡不擁塞丟包,那麼就應該返回給我N個確認包,而後我的擁塞窗口就會在以前的基礎上增大一倍,說明我之前發出N個數據包是沒有問題的,不會堵塞,同時增大一倍提高發送效率。

(2)那麼每增大一倍,擁塞窗口的大小就是按着指數級別增長了。當增大到一定程度上,必須減緩發送速率,於是使用擁塞避免算法,讓擁塞窗口可以線性增長,每收到一個確認,窗口就增大1個單位,當達到最大MSS(max segment size)時,擁塞窗口大小驟降,變爲原來慢啓動算法時候的窗口大小,通常爲1,並且門限值變爲MSS的一半,而後,如此往復。

14、在OpenStack中,用戶PUT和GET都是同一個對象,說說存儲節點Swift存取的工作原理?

答:(1)上傳文件時,PUT請求經過負載均衡機器通過一致性哈希算法隨機選擇一臺代理服務器,再將請求轉發數據存儲節點,代理服務器通過查找本地的Ring(環)文件,包括account環、container環、object環選擇3個不同的區域(zone),zone保證了數據的副本不會都放在同一個存儲節點上,從而避免了單點故障的可能性,可以使用3個磁盤來替代3個節點。而後,向3個數據節點都進行寫操作,只有當至少2個節點都確認寫成功後,再向用戶返回寫成功信息。

(2)而後,當用戶需要get請求該對象(對象=元數據+內容)下載文件時,也需要經過負載均衡隨機挑選一臺代理服務器,代理服務器上的環文件能

查詢到這個文件存儲在哪三個節點中,然後同時向後端查詢,當前僅當至少2個存儲節點表示可以提供該文件,然後代理服務器才從中選擇一個節點下載文件。

15、雲主機實例1和雲主機實例2彼此通信,基於VXLAN的工作原理?(VTEP是Vxlan tunnel end point,VNI是vxlan的network identifier,虛擬機通信還可以

linux bridge)

答:(1)VM1要向VM2發送數據前,必須要知道VM2的MAC地址,其獲取過程如下:

     1、VM1發送ARP請求包,請求192.168.0.101[VM2_IP]的MAC地址;

     2、ARP請求包被VTEP1封裝成多播包,發給VNI=864的多播組;

     3、所有的VTEP接收此多播包,並添加(VNI–VTEP1–VM1_MAC Address)映射關係到自己的VXLAN表中;

     4、目的主機上的VTEP2接收到多播包後將其解開,並向本主機上VNI=864的所有虛擬機發送廣播包;

     5、VM2看到了ARP包後,迴應了自己的MAC地址;

     6、VTEP2再次封裝回應的單播包,通過路由發給VTEP1;

     7、VTEP1解包,並將包傳給VM1,則最終獲取了VM2的MAC地址;

     8、VTEP1將(VNI–VTEP2–VM2_MAC Address)映射關係添加到自己的VXLAN表中;

(2)VM1獲知VM2的MAC地址後,發送數據包,過程如下:

1、 VM1發送IP數據包到VM2,即192.168.0.100 到 192.168.0.101;

2、 VTEP1查找自己的VXLAN表知道要發給VTEP2,然後依次封裝以下數據包頭;

a)VXLAN包頭,VNI=864;

b)標準UDP包頭,校驗和checksum爲0x0000,目標端口號4789;

c)標準IP包頭,目標地址爲VTEP2的IP地址,協議號設爲0x11表面爲UDP包。

d)標準MAC數據包,目標地址爲下一跳設備(虛擬路由器)的MAC地址00:10:11:FE:D8:D2,可路由到目標隧道端VTEP2。

3、 VTEP2接收數據包,根據UDP的destination端口找到VXLAN數據包。接着查找所有所在VXLAN的VNI爲864的端口組,找到VM2的

4、 VM2接收並處理數據包,拿到Payload數據.(vxlan有2^24個邏輯網絡,所以稱爲擴展vlan)

參考文檔:http://www.aboutyun.com/thread-11189-1-1.html

16、在OpenStack中,介紹什麼是浮動IP?什麼是元數據?

答:(1)OpenStack引入了一個叫浮動ip的概念,浮動ip是一些可以從外部訪問的ip列表,通常從isp哪裏買來的。浮動ip缺省不會自動賦給實例,用戶需要手動從地址池裏抓取然後賦給實例。一旦用戶抓去後,他就變成這個ip的所有者,可以隨意賦給自己擁有的其他實例。如果實例死掉了的話,用戶也不會失去這個浮動ip,可以隨時賦給其他實例。暫時不支持爲了負載均衡多實例共享一個浮動ip。動IP地址可以讓實例使用私有網絡連接到外部網絡,例如互聯網。而對於固定ip來說,實例啓動後獲得的ip是自動的,不能指定某一個。所以當一個VM歇菜了,再啓動也許固定ip就換了一個。

(2)系統管理員可以配置多個浮動ip池,這個ip池不能指定租戶,每個用戶都可以去抓取。多浮動ip池是爲了考慮不同的isp服務提供商,免得某一個isp出故障帶來麻煩。如果運行的是企業雲,浮動ip池就是那些openstack外的數據中心都能訪問到的ip。浮動ip機制給雲用戶提供了很多靈活性,也給系統管理員減少了安全風險,儘量只讓OpenStack軟件去改防火牆會安全些。

參考文檔:http://www.cnblogs.com/wcxy/p/3402006.html

元數據(Metadata):又稱中繼數據,描述爲數據的數據,主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。

17、講講Opnstack啓動虛擬機實例後,虛擬機的狀態是怎麼變化的?

答:(1)管理員發出創建虛擬機的命令,決定從鏡像文件或是快照文件進行啓動。

(2)當創建後,虛擬機實例進入Build狀態,任務狀態是Spawning孵化。

(3)期間,將會從控制節點上的Glance組件把相應的鏡像文件從中下載到Nova計算節點,並進行一些虛擬機的初始參數配置,如內存、CPU、磁盤空間。

(4)當一切正常後,虛擬機將會將會進入Active狀態,此後,用戶便可以使用雲主機了。創建實例的時間一般由鏡像文件的大小、網絡傳輸帶寬、以及創建的Hypervisor磁盤性能大小。

(5)虛擬機創建完畢,可以經過Horzion的web界面進行管理,也可以基於Python Nova client的命令行管理。

18、說說OpenStakc各組件的作用?

答:(1)keystone負責爲每個服務進行認證、授權、租戶管理、項目權限和配額以及服務目錄管理。

(2)Glance負責提供Nova創建實例所需要的鏡像文件,鏡像格式如raw、qcow2。

(3)Nova負責雲主機實例生命週期的管理,以及宿主機資源調度;Nova還決定了虛擬機實例在哪一臺Hypervisior物理機上運行。

(4)Horzion將用戶的http請求轉換爲RESTful請求,然後將RESTful請求分發給Nova API,進行實例的創建。

(5)cinder提供塊存儲,目的是用來做持久存儲的,典型軟件如ceph;swift提供對象存儲,用來文件共享的。

(6)neutron服務爲雲主機實例提供網絡服務,比如私有IP的地址分配問題,訪問外網的浮動IP、NAT路由、防火牆,以及雲主機實例彼此之間的vxlan通信。

19、談談你對OpentStack的認識?

答:OpenStack是一個分佈式系統,完成一件事,基本上都會涉及到一系列的組件,這些組件協同工作,在雲中扮演着各種角色。(然後就拿上面各組件的作用說,原理我看就算了,一般人說不清楚,對方也聽不懂,呵呵)

20、概述創建虛擬機的流程。(這個問題,非常值得思考,很容易被問到!)

答:(1)Horizon通過Keystone獲取nova-Compute組件的的訪問地址(即URL),並獲取令牌token。

(2)Horizion攜帶授權令牌,發送創建虛擬機指令。

(3)Nova-compute組件通過glance-api下載虛擬機鏡像,glance鏡像中有緩存機制,通常把緩存文件放入名爲_base的目錄,如果_base緩存沒有鏡像文件

,那麼就會從glance下載鏡像到base緩存,然後再從base緩存通過TCP/IP網絡複製到計算節點雲主機實例下的鏡像目錄裏。

(4)glance檢索後端鏡像,glance後端存儲不一定要使用swift,只要是存放鏡像文件的系統都可以。

(5)獲取網絡信息,決定虛擬機的網絡模式以及建立網絡連接。

(6)nova-compute發送啓動虛擬機指令,至此經過虛擬機服務任務狀態的變化,正常過後創建即可完成。

21、如果我有多個計算節點,那麼我啓動一個雲主機實例,那麼我怎麼知道該實例在哪臺計算節點上運行呢?(嗯…因缺絲婷)

答:命令查看…

22、PXE的工作原理?

答:實現自動獲取IP網絡安裝linux是這樣的:客啓端PXE網卡啓動–>通過Bootp協議廣播dhcp請求–>DHCP服務器–>獲取IP,TFTP服務器地址–>從TFTP上下載 pxelinux.0以及系統內核文件vmlinuz、initrd.img–>啓動系統–>(到指定url去下載ks.cfg文件–>根據ks.cfg文件去NFS/HTTP/FTP服務器自動下載軟件包)安裝系統–>完成安裝。

DHCP server爲客戶端分配ip並提供TFTP服務器地址及PXE啓動文件位置,TFTP server爲客戶端提供引導文件

23、創建網絡時,Neutron做了什麼?

答:創建虛擬機時,Neutron會根據選擇的網絡,首先給虛擬機分配一個tap設備作爲虛擬的網卡,命名爲tapXXX , XXX是一串數字和字母的組合,用來標識的,譬如tap8eaf6158-80,

在系統中使用ifconfig命令可以看到新增了這個網口。建立一個Linux網橋,命名爲

qbr8eaf6158-80。把上面那個新增的tap網口接在這個qbr的交換機上,使用命令“brctl

show”可以列出存在的網橋設備和端口。現在,虛擬機上已經有了一個接在虛擬網橋上的網

口,接下來是如何把這個網口與OVS的br-tun連接起來。

這時會有一對veth設備出現。veth是Linux中的虛擬網絡設備,總是成對出現,一對veth設備的數據總是從一個流人,

從另一個流出。Neut1-on會建立一對分別命名爲qvbXXX

和qvoXXX的veth設備,並且把它們分別連接到前面提到的qbr8eaf6158和br-int這兩個交

換機上。可以使用命令“brctl show”和“ovs-vsctl show”分別查詢qbrXXX和br-int這兩個

交換機是否已經串聯起來了。

23、saltstack中,master和minion各自幹了什麼事?

答:master:存放所有minion的公鑰、監聽mininon、發送命令給minion、存放一些爲minion準備的配置文件,如state、存放一些爲minion準備的files和數據,如apache2.cnf,pillar

minion:連接master、監聽master發送的commands、從master下載state並且執行state、可以執行在minion上執行state,用salt-call,當然這個一般多數用於調試

24、SSH的工作原理?

答:(1)SSH可以基於賬戶密碼進行認證;SSH可以基於密鑰對進行認證

(2)基於密鑰的安全認證就是本機提供一對公鑰和私鑰,把公鑰複製一份放在遠程服務器上面,遠程服務器的sshd進程監聽22號端口。當向遠程服務器發起請求的時候,本機會把公鑰發送給遠程服務器,遠程服務器會在家目錄下檢查公鑰是否一致,如果一致,就會把應答數據包使用公鑰加密後返回給客戶端,客戶端再使用自己的私鑰進行解密,得到解密後的數據包,其中解密後的數據包含有會話密鑰,而後使用會話密鑰進行通信。

25、Zabbix有何特性?

答:數據收集、靈活的閾值定義、高級告警設置、實時繪圖、擴展的圖形化展示、歷史數據存儲、監控主機使用模板、自動發現網絡設備、提供Zabbix API。

26、Zabiix包含了哪幾個進程,各有什麼作用?

答:(1)Zabbix_agentd:客戶端守護進程,收集本機的數據

(2)Zabbix_get:Server端用於主動獲取被監控端數據

(3)Zabbix_sender:被監控端結合trapper進程,主動發送監控項收集的數據到Server或Proxy端

(4)Zabbix_server:服務端的守護進程,接受其他進程發過來的數據

(5)Zabbix_proxy:代理守護進程,功能類似於Server,不過它只是一箇中轉站,把收集到的數據再提交給Server,跨機房和地區需要用到

27、zabbix的server端如何去監控agent端?

答:原理:每一個item都有其專用的key,zabbix服務器與被監控端進行通信時就使用相應的協議或機制去質詢被監控端這個key的值,被監控端就調用此key所對應的腳本去獲取相應的數據並返回給服務端。

28、監控中,歷史數據和歷史趨勢數據有何區別?

答:歷史數據:指的是採樣的數據。指定存儲在數據庫中的天數,如果超過該閾值,那麼會被housekeeper進程給清理掉

歷史趨勢數據:指的是每小時的最大值、最小值、平均值以及各種統計。

29、說一下,在zabbix監控某個主機的時候,人爲應該部署哪些步驟?

答:創建主機、附加模板,修改item監控項,創建圖形(關聯Item),定義觸發器,創建用戶,創建事件、創建action

30、如果有100臺服務器,每臺服務器有30個監控項,每個監控項60秒刷新一次,需要多大的硬盤呢?

答:隨着監控項的數量增多以及監控值的實時刷新,數據庫也會越來越龐大,那麼影響Zabbix硬盤大小的因素有:

(1)監控值每秒中存儲的數據量:100x30/60=50個

(2)歷史記錄保存時間

(3)趨勢數據保存時間

(4)事件記錄保存時間 (報警、恢復)

(5)數據庫引擎以及數據類型(整型、浮點型、字符型)

綜上:數據庫硬盤空間=配置文件大小+歷史記錄+趨勢記錄+事件記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章