Linux維運工程師 50個常見面試題
原文链接:https://mp.weixin.qq.com/s/Yuh_ei37DspfDuiiSgmi5A
1.請簡述OSI七層網路模型有哪些層及各自的意義?
實體層:底層資料傳輸,例如網路線、網路卡標準
資料鏈路層:定義資料的基本格式,如何傳輸,如何識別。 例如網卡MAC位址
網路層:定義IP編碼,定義路由功能,例如不同設備的資料轉發
傳輸層:端對端傳輸資料的基本功能,如TCP、UDP
會話層:控制應用程式之間會話能力,例如不同軟體資料分發給不停軟體
表示層:資料格式標識,基本壓縮加密功能。
應用層:各種應用軟體,包括 Web 應用。
2.在Linux的LVM分割區格式下,請簡述給根分割區磁碟擴容的步驟?
這個分3種
第一種方法:
growpart /dev/vda 1
resize2fs /dev/vda1
第二种方法:
partpeobe /dev/sda
resize2fs /dev/vda1
第三种方法:
fdisk /dev/sdb # n p 1 1 回车 回车 t 8e w
pvcreate /dev/sdb1
vgextend datavg /dev/sdb1
lvextend -r -L +100%free /dev/mapper/datavg-lv01
3.講述Tomcat8005、8009、8080三個端口的含義?
8005 關閉時使用
8009為AJP端口,即容器使用,如Apache能透過AJP協定存取Tomcat的8009端口來實現功能
8080 一般應用使用
4.簡述DNS進行域名解析的過程?
迭代查詢(返回最優結果)、遞迴查詢(本地找DNS)用戶要訪問www.baidu.com,會先找本機的host文件,再找本地設定的DNS伺服器,如果也沒有找到,就去網絡 中找根伺服器,根伺服器回饋結果,說只能提供一級網域名稱伺服器.cn,就去找一級網域名稱伺服器,一級網域伺服器說只能提供二級網域伺服器.com.cn,就去找二 級網域名稱伺服器,二級網域伺服器只能提供三級網域伺服器.baidu.com.cn,就去找三級網域伺服器,三級網域伺服器剛好有這個網站www.baidu.com,然後發給要求的伺服器 ,儲存一份之後,再發給客戶端。
5.講一下Keepalived的工作原理?
在一個虛擬路由器中,只有作為MASTER的VRRP(虛擬路由冗餘協定)路由器會一直發送VRRP通告訊息,BACKUP不會搶佔MASTER,除非它的優先權更高。 當MASTER無法使用時(BACKUP收不到通告資訊)多台BACKUP中優先順序最高的這台會被搶佔為MASTER。 這種搶佔是非常快速的(<1s),以確保服務的連續性由於安全性考慮,VRRP包使用了加密協定進行加密。 BACKUP不會傳送通告訊息,只會接收通告訊息。
6.LVS、Nginx、HAproxy有什麼差別? 工作中你怎麼選擇?
LVS:
抗負載能力強、工作在第4層僅作分發之用,沒有流量的產生,這個特點也決定了它在負載平衡軟體裡的性能最強的;無流量,同時保證了均衡器IO的性能不 會受到大流量的影響;
工作穩定,本身有完整的雙機熱備方案,如LVS+Keepalived和LVS+Heartbeat;
應用範圍比較廣,可以對所有應用做負載平衡;
配置簡單,因為沒有可太多配置的東西,所以並不需要太多接觸,大大減少了人為出錯的幾率;
LVS的缺點:
軟體本身不支援正規處理,無法做動靜分離,這就凸顯了Nginx/HAProxy+Keepalived的優勢。
如果網站應用程式比較龐大,LVS/DR+Keepalived就比較複雜了,特別是後面有Windows Server應用的機器,實作及設定還有維護過程就比較麻煩,相對而言,Nginx/HAProxy+Keepalived就簡單多了 。
Nginx:
工作在第7層,應用層,可以針對http應用做一些分流的策略。 例如針對網域名稱、目錄結構。 它的正規比HAProxy更為強大和靈活;
Nginx對網路的依賴非常小,理論上能ping通就能進行負載功能
Nginx安裝與設定簡單
可以承受高的負載壓力且穩定,一般能支撐超過數萬次的並發量;
Nginx不僅僅是一款優秀的負載平衡器/反向代理軟體,它同時也是功能強大的網路應用伺服器。 Nginx在處理靜態頁面、特別是抗高並發方面相對apache有優勢;
Nginx作為Web反向代理加速快取越來越成熟,速度比傳統的Squid伺服器更快
Nginx的缺點:
Nginx不支援url來檢測。
Nginx只能支援http、https和Email協議
Nginx的Session的維持,Cookie的引導能力相對欠缺。
HAProxy:
HAProxy是支援虛擬主機的,可以工作在4、7層(支援多網段);
能夠補充Nginx的一些缺點例如Session的保持,Cookie的引導等工作;
支援url檢測後端的伺服器;
它跟LVS一樣,本身只是一款負載平衡軟體;單純從效率上來講HAProxy更會比Nginx有更出色的負載平衡速度,在並發處理上也是優於Nginx的;
HAProxy可以對Mysql讀進行負載平衡,對後端的MySQL節點進行偵測與負載平衡,不過在後端的MySQL slaves數量超過10台時效能不如LVS;
HAProxy的演算法較多,達到8種;
工作選擇:
HAproxy和Nginx由於可以做七層的轉發,所以URL和目錄的轉發都可以做在很大並發量的時候我們就要選擇LVS,像中小型公司的話並發量沒那麼大選擇HAproxy或者Nginx足已, 由於HAproxy由是專業的代理伺服器設定簡單,所以中小型企業推薦使用HAproxy。
7.docker的工作原理是什麼,講一下
docker是一個Client-Server結構的系統,docker守護程序運行在宿主機上,守護程序從客戶端接受命令並管理運行在主機上的容器,容器是一個運行時環境,這就是我們說的集裝箱。
8.docker的組成包含哪幾大部分
一個完整的docker有以下幾個部分組成:
docker client,客戶端,提供使用者一系列可執行指令,使用者用這些指令實作跟 docker daemon 互動;
docker daemon,守護進程,一般在宿主主機後台運行,等待接收來自客戶端的請求訊息;
docker image,鏡像,鏡像run之後就生成為docker容器;
docker container,容器,一個系統層級的服務,擁有自己的ip和系統目錄結構;運行容器前需要本地存在對應的鏡像,如果本地不存在該鏡像則就去鏡像倉庫下載。
docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端api來管理和建立docker容器。 docker 容器透過 docker 映像來建立。 容器與鏡像的關係類似於物件導向程式設計中的物件與類別。
9.docker與傳統虛擬機器的差別什麼?
傳統虛擬機器是需要安裝整個作業系統的,然後再在上面安裝業務應用,啟動應用,通常需要幾分鐘去啟動應用,而docker是直接使用鏡像來運行業務容器的,其容器啟動屬於秒級別;
Docker需要的資源更少,Docker在作業系統層級進行虛擬化,Docker容器和核心交互,幾乎沒有效能損耗,而虛擬機運行著整個作業系統,佔用實體機的資源就比較多;
Docker更輕量,Docker的架構可以共用一個核心與共享應用程式庫,所佔記憶體極小;同樣的硬體環境,Docker運行的鏡像數遠多於虛擬機器數量,對系統的利用率非常高;
與虛擬機器相比,Docker隔離性較弱,Docker屬於進程之間的隔離,虛擬機器可實現系統層級隔離;
Docker的安全性也更弱,Docker的租用戶root和宿主機root相同,一旦容器內的用戶從普通用戶權限提升為root權限,它就直接具備了宿主機的root權限,進而可進行無限制的操作 。 虛擬機器租戶root權限和宿主機器的root虛擬機器權限是分離的,虛擬機器利用如Intel的VT-d和VT-x的ring-1硬體隔離技術,這種技術可以防止虛擬機器突破和彼此交互 ,而容器至今還沒有任何形式的硬體隔離;
Docker的集中化管理工具還不算成熟,各種虛擬化技術都有成熟的管理工具,例如:VMware vCenter提供完整的虛擬機器管理能力;
Docker對業務的高可用支援是透過快速重新部署實現的,虛擬化具備負載平衡,高可用、容錯、遷移和資料保護等經過生產實踐檢驗的成熟保障機制,Vmware可承諾虛擬機器99.999%高可用, 保證業務連續性;
虛擬化創建是分鐘級別的,Docker容器創建是秒級別的,Docker的快速迭代性,決定了無論是開發、測試、部署都可以節省大量時間;
虛擬機器可以透過映像實現環境交付的一致性,但鏡像分發無法體系化,Docker在Dockerfile中記錄了容器建置過程,可在叢集中實現快速分發和快速部署。 from wljslmz
10.docker技術的三大核心概念是什麼?
鏡像:鏡像是一種輕量級、可執行的獨立軟體包,它包含運行某個軟體所需的所有內容,我們把應用程式和配置依賴打包好形成一個可交付的運行環境(包括程式碼、運行 時需要的函式庫、環境變數和設定檔等),這個打包好的運行環境就是image鏡像檔。
容器:容器是基於鏡像創建的,是鏡像運作起來之後的實例,容器才是真正運行業務程序的地方。 如果把鏡像比喻成程式裡面的類,那麼容器就是物件。
鏡像倉庫:存放鏡像的地方,研發工程師打包好鏡像之後需要把鏡像上傳到鏡像倉庫中去,然後就可以運行有倉庫權限的人拉取鏡像來運行容器了。
11.centos鏡像幾個G,但是docker centos映像才幾百兆,這是為什麼?
一個完整的Linux作業系統包含Linux核心和rootfs根檔案系統,也就是我們熟悉的/dev、/proc/、/bin等目錄。 我們平常看到的centOS除了rootfs,還會選裝很多軟體,服務,圖形桌面等,所以centOS鏡像有好幾個G也不足為奇。
而對於容器映像而言,所有容器都是共享宿主機的Linux 核心的,而對於docker映像而言,docker映像只需要提供一個很小的rootfs即可,只需要包含最基本的命令,工具,程序 庫即可,所有docker映像才會這麼小。
12.講一下鏡像的分層結構以及為什麼要使用鏡像的分層結構?
一個新的鏡像其實是從 base 鏡像一層一層疊加產生的。 每安裝一個軟體,dockerfile中使用RUM指令,就會在現有映像的基礎上增加一層,這樣一層一層的疊加最後才構成整個映像。 所以我們docker pull拉取一個映像的時候會看到docker是一層層拉的。
分層機構最大的一個好處就是 :共享資源。 例如:有多個映像都從相同的 base 映像建置而來,那麼 Docker Host 只需在磁碟上保存一份 base 映像;同時記憶體中也只需載入一份 base 映像,就可以為所有容器服務了。 而且鏡像的每一層都可以被分享。
13.講一下容器的copy-on-write特性,修改容器裡面的內容會修改鏡像嗎?
我們知道,鏡像是分層的,鏡像的每一層都可以被分享,同時,鏡像是唯讀的。 當一個容器啟動時,一個新的可寫層被加載到鏡像的頂部,這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
所有對容器的改動 - 無論添加、刪除、或修改文件,都只會發生在容器層中,因為只有容器層是可寫的,容器層下面的所有鏡像層都是唯讀的。 鏡像層數量可能會很多,所有鏡像層會聯合在一起組成一個統一的檔案系統。 如果不同層中有一個相同路徑的文件,例如 /a,上層的 /a 會覆蓋下層的 /a,也就是說使用者只能存取到上層中的文件 /a。 在容器層中,使用者看到的是一個疊加後的檔案系統。
新增檔案:在容器中建立檔案時,新檔案會被加入到容器層。
讀取檔案:在容器中讀取某個檔案時,Docker 會從上往下依序在各個映像層中尋找此檔案。 一旦找到,立即將其複製到容器層,然後打開並讀入記憶體。
修改檔案:在容器中修改已存在的檔案時,Docker 會從上往下依序在各個映像層中尋找此檔案。 一旦找到,立即將其複製到容器層,然後修改之。
刪除檔案:在容器中刪除檔案時,Docker 也是從上往下依序在映像層中尋找此檔案。 找到後,會在容器層中記錄此刪除操作。
只有當需要修改時才複製一份數據,這種特性被稱為 Copy-on-Write。 可見,容器層保存的是鏡像變化的部分,不會對鏡像本身做任何修改。
14.簡單描述一下Dockerfile的整個建置映像過程
首先,建立一個目錄用於存放應用程式以及建置過程中使用到的各個檔案等;
然後,在這個目錄下建立一個Dockerfile文件,一般建議Dockerfile的檔案名稱就是Dockerfile;
編寫Dockerfile文件,編寫指令,如,使用FORM指令指定基礎鏡像,COPY指令複製文件,RUN指令指定要運行的命令,ENV設定環境變量,EXPOSE指定容器要暴露的端口,WORKDIR設定當前工作目錄,CMD容器 啟動時運行命令,等等指令建構鏡像;
Dockerfile編寫完成就可以建立映像,最後一個點是表示當前目錄,docker會預設尋找目前目錄下的Dockerfile檔案來建立映像,如果不使用預設 ,可以使用-f參數來指定dockerfile文件
,如:docker build -t 映像名:tag -f /xx/xxx/Dockerfile ;
使用docker build指令建置之後,docker就會將目前目錄下所有的檔案傳送給docker daemon,順序執行Dockerfile檔案裡的指令,在這過程中會產生臨時容器,在臨時容器裡面安裝RUN指定的指令,安裝 成功後,docker底層會使用類似docker commit指令將容器儲存為映像,然後刪除臨時容器,以此類推,一層層的建置映像,執行臨時容器安裝軟體,直到最後的映像建置成功。
15.Dockerfile建置映像出現異常,如何排查?
首先,Dockerfile是一層一層的建置映像,期間會產生一個或多個臨時容器,建置過程中其實就是在臨時容器裡面安裝應用,如果因為臨時容器安裝應用出現異常導致映像建置失敗,這時容器 雖然被清理掉了,但是期間構建的中間鏡像還在,那麼我們可以根據異常時上一層已經構建好的臨時鏡像,將臨時鏡像運行為容器,然後在容器裡面運行安裝命令來定位具體的異常 。
16.Dockerfile的基本指令有哪些?
FROM 指定基礎鏡像(必須為第一個指令,因為需要指定使用哪個基礎鏡像來建構鏡像);
MAINTAINER 設定鏡像作者相關訊息,如作者名字,日期,郵件,聯絡資訊等;
COPY 複製文件到鏡像;
ADD 複製檔案到鏡像(ADD與COPY的差別在於,ADD會自動解壓縮tar、zip、tgz、xz等歸檔文件,而COPY不會,同時ADD指令還可以接一個url下載檔案位址,一般建議使用COPY複製 文件即可,文件在宿主機上是什麼樣子複製到鏡像裡面就是什麼樣子這樣比較好);
ENV 設定環境變數;
EXPOSE 暴露容器進程的端口,僅是提示別人容器使用的哪個端口,沒有過多作用;
VOLUME 資料卷持久化,掛載一個目錄;
WORKDIR 設定工作目錄,如果目錄不在,則會自動建立目錄;
RUN 在容器中執行指令,RUN指令會建立新的鏡像層,RUN指令常被用來安裝軟體包;
CMD 指定容器啟動時預設執行哪些指令,如果有多個CMD,則只有最後一個生效,另外,CMD指令可以被docker run之後的參數取代;
ENTRYOINT 指定容器啟動時執行哪些指令,如果有多個ENTRYOINT,則只有最後一個生效,另外,如果Dockerfile中同時存在CMD和ENTRYOINT,那麼CMD或docker run之後的參數將會被當做參數傳遞給ENTRYOINT;
17、如何進入容器? 使用哪個命令
進入容器有兩種方法:docker attach、docker exec。
18、什麼是k8s? 說出你的理解
K8s是kubernetes的簡稱,其本質是一個開源的容器編排系統,主要用於管理容器化的應用,其目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新 ,維護的一種機制。
說簡單點:k8s就是一個編排容器的系統,一個可以管理容器應用全生命週期的工具,從創建應用,應用的部署,應用提供服務,擴容縮容應用,應用更新,都非常的方便,而且還 可以做到故障自愈,所以,k8s是一個非常強大的容器編排系統。
19、k8s的組件有哪些,作用分別是什麼?
k8s主要由master節點和node節點構成。 master節點負責管理集群,node節點是容器應用程式真正運作的地方。
master節點包含的元件有:kube-api-server、kube-controller-manager、kube-scheduler、etcd。
node節點所包含的元件有:kubelet、kube-proxy、container-runtime。
kube-api-server:以下簡稱api-server,api-server是k8s最重要的核心元件之一,它是k8s叢集管理的統一存取入口,提供了RESTful API介面, 實現了認證、授權和准入控制 等安全功能;api-server還是其他元件之間的資料交互和通信的樞紐,其他元件彼此之間並不會直接通信,其他元件對資源物件的增、刪、改、查和監聽操作都是交 由api-server處理後,api-server再提交給etcd資料庫做持久化存儲,只有api-server才能直接操作etcd資料庫,其他元件都不能直接操作etcd資料庫,其他元件都是透過api-server間接的讀 取,寫入資料到etcd。
kube-controller-manager:以下簡稱controller-manager,controller-manager是k8s中各種控制器的的管理者,是k8s集群內部的管理控制中心,也是k8s自動化功能的核心;controller-manager內部包含replication controller 、node controller、deployment controller、endpoint controller等各種資源物件的控制器,每種控制器都負責一種特定資源的控制流程,而controller-manager正是這些controller的核心管理者。
kube-scheduler:以下簡稱scheduler,scheduler負責叢集資源調度,其作用是將待調度的pod透過一系列複雜的調度演算法計算出最適合的node節點,然後將pod綁定到目標節點。 shceduler會根據pod的資訊(關注微信公眾號:網路技術聯盟站),全部節點資訊列表,過濾掉不符合要求的節點,過濾出一批候選節點,然後給候選節點打分,選分最高的就是最 佳節點,scheduler就會把目標pod安置到該節點。
Etcd:etcd是一個分散式的鍵值對儲存資料庫,主要是用來保存k8s叢集狀態數據,例如,pod,service等資源物件的資訊;etcd可以是單一也可以有多個,多個就是etcd資料庫 集群,etcd通常部署奇數個實例,在大規模集群中,etcd有5個或7個節點就足夠了;另外說明一點,etcd本質上可以不與master節點部署在一起,只要master節點能透過網路連接 etcd資料庫即可。
kubelet:每個node節點上都有一個kubelet服務進程,kubelet作為連接master和各node之間的橋樑,負責維護pod和容器的生命週期,當監聽到master下發到本節點的任務時,例如創建 、更新、終止pod等任務,kubelet 即透過控制docker來建立、更新、銷毀容器;每個kubelet進程都會在api-server上註冊本節點本身的信息,用於定期向master報告本節點資源的使用情況 。
kube-proxy:kube-proxy運行在node節點上,在Node節點上實作Pod網路代理,維護網路規則和四層負載平衡工作,kube-proxy會監聽api-server中從而取得service和endpoint的變更情況, 建立並維護路由規則以提供服務IP和負載平衡功能。 簡單理解此程序是Service的透明代理兼負載平衡器,其核心功能是將到某個Service的存取請求轉送到後端的多個Pod實例上。
container-runtime:容器運行時環境,即運行容器所需的一系列程序,目前k8s支援的容器運行時有很多,如docker、rkt或其他,比較受歡迎的是docker,但是新版的k8s已經宣布棄 用docker。
20、kubelet的功能、作用是什麼? (重點,常會問)
kubelet部署在每個node節點上的,它主要有4個功能:
節點管理。 kubelet啟動時會向api-server進行註冊,然後會定時的向api-server報告本節點資訊狀態,資源使用狀態等,這樣master就能夠知道node節點的資源剩餘,節點是否失聯等等相關的信息 了。 master知道了整個叢集所有節點的資源情況,這對於 pod 的調度和正常運作至關重要。
pod管理。 kubelet負責維護node節點上pod的生命週期,當kubelet監聽到master的下發到自己節點的任務時,例如要建立、更新、刪除一個pod,kubelet 就會透過CRI(容器運行時介面)外掛程式來調用 不同的容器運行時來創建、更新、刪除容器;常見的容器運行時有docker、containerd、rkt等等這些容器運行時,我們最熟悉的就是docker了,但在新版本的k8s已經棄用docker了 ,k8s1.24版本中已經使用containerd作為容器運行時了。
容器健康檢查。 pod中可以定義啟動探針、存活探針、就緒探針等3種,我們最常用的就是存活探針、就緒探針,kubelet 會定期呼叫容器中的探針來偵測容器是否存活,是否就緒, 如果是存活探針,則會根據探測結果對檢查失敗的容器進行相應的重啟策略;
Metrics Server資源監控。 在node節點上部署Metrics Server用於監控node節點、pod的CPU、記憶體、檔案系統、網路使用等資源使用情況,而kubelet則透過Metrics Server取得所在節點及容器的上的資料。
21、kube-api-server的連接埠是多少? 各pod是如何存取kube-api-server的?
kube-api-server的端口是8080和6443,前者是http的端口,後者是https的端口,以我本機使用kubeadm安裝的k8s為例:
在命名空間的kube-system命名空間裡,有一個名稱為kube-api-master的pod,這個pod就是運行著kube-api-server進程,它綁定了master主機的ip位址和6443端口,但是在 default命名空間下,存在一個叫kubernetes的服務,該服務對外暴露埠為443,目標埠6443,這個服務的ip位址是clusterip位址池裡面的第一個位址,同時這個服務的yaml定義裡面並沒有指定 標籤選擇器,也就是說這個kubernetes服務所對應的endpoint是手動創建的,該endpoint也是名稱叫做kubernetes,該endpoint的yaml定義裡面代理到master節點的6443端口,也就是kube-api-server的IP和 端口。 這樣一來,其他pod訪問kube-api-server的整個流程就是:pod創建後嵌入了環境變量,pod獲取到了kubernetes這個服務的ip和443端口,請求到kubernetes這個服務其實就是轉發到了master節點上的 6443埠的kube-api-server這個pod裡面。
22、k8s中命名空間的作用是什麼?
amespace是kubernetes系統中的一個非常重要的資源,namespace的主要作用是用來實現多套環境的資源隔離,或者說是多租戶的資源隔離。
k8s透過將叢集內部的資源分配到不同的namespace中,可以形成邏輯上的隔離,以方便不同的資源進行隔離使用和管理。 不同的命名空間可以存在同名的資源,而命名空間為資源提供了一個作用域。
可以透過k8s的授權機制,將不同的namespace交給不同的租戶進行管理,這樣就實現了多租戶的資源隔離,還可以結合k8s的資源配額機制,限定不同的租戶能佔用的資源,例如CPU使用 量、記憶體使用量等等來實現租戶可用資源的管理。
23、pod資源控制器類型有哪些?
Deployments:Deployment為Pod和ReplicaSet提供聲明式的更新能力。
ReplicaSet:ReplicaSet的目的是維護一組在任何時候都處於運作狀態的Pod副本的穩定集合。 因此,它通常用來保證給定數量的、完全相同的Pod的可用性。
StatefulSets:和Deployment類似,StatefulSet管理基於相同容器規約的一組Pod。 但和Deployment不同的是,StatefulSet為它們的每個Pod維護了一個有黏性的ID。 這些Pod是基於相同的規約來創建的,但是不能相互替換:無論怎麼調度,每個Pod都有一個永久不變的ID。
DaemonSet:DaemonSet確保全部(或某些)節點上執行一個Pod的副本。 當有節點加入叢集時,也會為他們新增一個Pod。 當有節點從叢集移除時,這些Pod也會被回收。 刪除DaemonSet將會刪除它所建立的所有Pod。
Jobs:Job會建立一個或多個Pod,並將繼續重試Pod的執行,直到指定數量的Pod成功終止。 隨著Pod成功結束,Job追蹤記錄成功完成的Pod個數。 當數量達到指定的成功個數閾值時,任務(即Job)結束。 刪除Job的操作會清除所建立的全部Pod。 掛起Job的操作會刪除Job的所有活躍Pod,直到Job再次恢復執行。
Automatic Clean-up for Finished Jobs:TTL-after-finished控制器提供了一個TTL機制來限制已完成執行的資源物件的生命週期。 TTL控制器目前只處理Job。
CronJob:一個CronJob物件就像crontab(crontable)檔案中的一行。 它用Cron格式進行編寫,並週期性地在給定的調度時間執行Job。
ReplicationController:ReplicationController確保在任何時間點都有特定數量的Pod副本處於運作狀態。 換句話說,ReplicationController確保一個Pod或一組類似的Pod總是可用的。
24、nginx演算法策略
輪詢(預設)
加權輪詢(輪詢+weight)
ip_hash
每一個請求的存取IP,都會對應成一個hash,再透過hash演算法(hash值%node_count),分配到不同的後端伺服器,存取ip相同的請求會固定存取同一個後端伺服器,這樣可以做到 會話保持,解決session同步問題。
least_conn(最少連線)
使用最少連接的負載平衡,nginx將嘗試不會使繁忙的應用程式伺服器超載請求過多,而是將新請求分發給不太繁忙的伺服器。
25.nignx常用模組
upstream
rewrite
location
proxy_pass
26、如何查看並且殺死殭屍行程?
top —> task (line)—> zombie.
把父進程殺掉,父進程死後,過繼給1號進程init,init 始終負責清理殭屍進程,它產生的所有殭屍進程跟著消失;如果你使用kill ,一般都不能殺掉 defunct進程.。 用了kill -15,kill -9之後 之後反而會多出更多的殭屍行程。
27.搜尋某個用戶運行的進程
pgrep -au neteagle
28、查看某個連接埠正在被哪個進程使用
lsof -i :[port]
29、連接埠轉發
iptables -t nat -A PREROUTING -d 10.0.0.8 -p tcp –dport 80 -j REDIRECT –to-ports 8080
30.查看http的同時請求數與其TCP連線狀態
etstat-n|awk’/^tcp/{++b[$NF]}END{for(ainb)printa,b[a]}’
31、查看/var/log目錄下檔案數
ls/var/log/-lR|grep"^-“|wc-l
32、linux系統啟動流程
第一步:開機自檢,載入BIOS
第二步:讀取MBR
第三步:Boot Loader grub引導選單
第四步:載入kernel內核
第五步:init進程依據inittab資料夾來設定運行級別
第六步:init進程執行rc.sysinit
第七步:啟動內核模組
第八步:執行不同運行等級的腳本程序
第九步:執行/etc/rc.d/rc.lo
33、Linux檔案類型
-:常規文件,即file
d:目錄文件
b:block device 即區塊裝置文件,如硬碟;支援以block為單位進行隨機訪問
c:character device 即字元裝置文件,如鍵盤支援以character為單位進行線性訪問
l:symbolic link 即符號連結文件(追蹤微信公眾號:網路技術聯盟站),又稱軟連結文件
p:pipe 即命名管道文件
s:socket 即套接字文件,用於實現兩個進程進行通信
34.簡述lvm,如何給予使用lvm的/分區擴容?
功能:可以對磁碟進行動態管理。 動態按需調整大小
概念:
PV 實體磁碟區:實體磁碟區在邏輯磁碟區管理中處於最底層,它可以是實際實體硬碟上的分割區,也可以是整個實體硬碟,也可以是raid裝置。
VG 卷組:卷組建立在物理卷之上,一個卷組中至少要包括一個物理卷,在卷組建立之後可動態添加物理捲到卷組中。 一個邏輯磁碟區管理系統工程中可以只有一個磁碟區組,也可以擁有多個磁碟區組。
LV 邏輯卷:邏輯卷建立在卷組之上,卷組中的未分配空間可以用來建立新的邏輯卷,邏輯卷建立後可以動態地擴展和縮小空間。 系統中的多個邏輯磁碟區可以屬於同一個磁碟區組,也可以屬於不同的多個磁碟區組。
給/分區擴容步驟:
新增磁碟
使用fdisk指令對新增加的磁碟進行分割區
分區完成後修改分區類型為lvm
使用pvcreate建立物理卷
使用vgextend指令將新增加的分割區加入到根目錄分割區中
使用lvextend命令進行擴容
使用xfs_growfs調整磁碟區分區大小
35、如何在文字裡面進行複製、貼上,刪除行,刪除全部,按行查找和按字母查找。
以下操作全部在vi/vim命令列狀態操作,不要在編輯狀態操作:
在文字裡 移動到想要複製的行按yy想複製到哪就移動到哪,然後按P就貼上了
刪除行 移動到改行 按dd
刪除全部dG這裡注意G一定要大寫
按行查找 :90 這樣就是找到第90行
以字母找出 /path 這樣就是找到path這個字的位置,文字裡可能存在多個,多次查找會顯示在不同的位置。
36.符號連結與硬連結的區別
我們可以把符號鏈接,也就是軟連接 當做是 windows系統裡的 快捷方式。
硬連結 就好像是 又複製了一份.
ln 3.txt 4.txt 這是硬鏈接,相當於複製,不可以跨分區,但修改3,4會跟著變,若刪除3,4不受任何影響。
ln -s 3.txt 4.txt 這是軟連接,相當於捷徑。 修改4,3也會跟著變,若刪除3,4就壞掉了。 不可以用了。
37、什麼是正向代理?
一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理程式傳送一個請求並指定目標(原始伺服器),然後代理程式向原始伺服器轉交請求並將獲得的內容 返回給客戶端。
客戶端才能使用正向代理。 正向代理總結就一句話:代理端代理的是客戶端。 例如說:我們使用的OpenVPN 等等。
38、什麼是反向代理?
反向代理(Reverse Proxy)方式,是指以代理伺服器來接受Internet上的連接請求,然後將請求,發給內部網路上的伺服器並將從伺服器上得到的結果傳回給Internet 上請求連接的客戶端 ,此時代理伺服器對外就表現為一個反向代理伺服器。
反向代理總結就一句話:代理端代理的是服務端。
39、什麼是動態資源、靜態資源分離?
動態資源、靜態資源分離,是讓動態網站裡的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後我們就可以根據靜態資源的特點將其 做快取操作,這就是網站靜態化處理的核心想法。
動態資源、靜態資源分離簡單的概括是:動態文件與靜態文件的分離。
在我們的軟體開發中,有些請求是需要後台處理的(如:.jsp,.do 等等),有些請求是不需要經過後台處理的(如:css、html、jpg、js 等等檔案), 這些不需要經過背景處理的文件稱為靜態文件,否則動態文件。
因此我們後台處理忽略靜態文件。 這會有人又說那我後台忽略靜態檔不就完了嗎? 當然這是可以的,但是這樣後台的請求次數就明顯增加了。 在我們對資源的響應速度有要求的時候,我們應該使用這種動靜分離的策略去解決動、靜分離將網站靜態資源(HTML,JavaScript,CSS,img等文件)與後台應用分開部署,提高用戶 存取靜態程式碼的速度,降低對後台應用程式存取
這裡我們將靜態資源放到 Nginx 中,動態資源轉送到 Tomcat 伺服器中去。
當然,因為現在七牛、阿里雲等 CDN 服務已經很成熟,主流的做法,是把靜態資源快取到 CDN 服務中,進而提升存取速度。
相較於本地的 Nginx 來說,CDN 伺服器由於在國內有更多的節點,可以實現使用者的就近存取。 並且,CDN 服務可以提供更大的頻寬,不像我們自己的應用服務,提供的頻寬是有限的。
40.網站登陸緩慢是什麼原因?
網路頻寬,這是一個很常見的瓶頸。
cpu、硬碟、記憶體配置過低,伺服器負載不起來。
網站的開發程式碼不夠完善,例如mysql語句沒有進行最佳化,導致資料庫的讀寫相當耗費時間。
資料庫的瓶頸。 當我們的資料庫的資料變得越來越多的時候,那麼對於資料庫的讀寫壓力肯定會變大。
41.a與b伺服器不在同一網段怎麼設定?設定完還ping不通怎麼排查?
AB伺服器不在同一個網段
首先把不同IP段的伺服器劃分給不同的vlan
在透過透過三層交換器添加虛擬IP路由實在不同網段的vlan的連接
42.在AB兩台伺服器之間透過一個伺服器c做軟體路由使用給路由器c設定兩塊網卡並開啟自身的路由功能
vi /etc/sysconfig/network-scripts/ifcfg-eth0
查看網卡狀況IP -a -s 網卡的名字
A伺服器設定相關網卡資訊
子網路遮罩:255.255.255.0
IP=10.0.0.1
網關=10.0.0.254
重啟網卡生效
查看路由資訊
route -n
新增對應路由
route add -net 10.0.1.0/24 gw 10.0.0.11
B伺服器的設定相關訊息
IP=10.0.1.10
網關10.0.1.254
重啟網卡生效
route -n
新增對應的路由
route add -net 10.0.0.0/24 gw 10.0.1.11
C伺服器的兩塊網卡
網卡1
IP=10.0.0.11
網關=10.0.0.254
網路卡2
IP=10.0.1.11
網關=10.0.1.254
重啟網卡生效
route -n
vi /etc/sysctl.conf
net.ipv4.ip_forword = 1
43.如果PING不通怎麼排查
首先先看看是不是網路介面故障水晶頭或是網路卡介面接觸不良造成,其次檢查交換器和路由等網路設備是故障
是否關閉了防火牆和selinux機制
然後查看網卡和路由和網關是否配置正確
44、docker容器ping不通是什麼原因?
ifconfig 查看docker0橋接器,ping一下網橋看看是否通,有可能是橋接設定問題
weave路由器埠6783
安裝docker容器的伺服器沒有關閉防火牆(訪問安裝docker物理機的,是否能訪問,如果不能訪問就變不能訪問docker)
docker在建立映像的時候沒有做連接埠對映(出現這種情況能存取實體機不能存取docker)使用dockers ps 查看映像的連接埠對映情況
連接埠映射不正確
查看網路設定ping網橋看是否能ping通,有可能是網橋的原因
45.如果一台辦公室內主機無法上網(打不開網站),請給你的排查步驟?
首先確定物理鏈路是否聯通正常。
查看本機IP,路由,DNS的設定狀況是否達標。
telnet檢查伺服器的WEB有沒有開啟以及防火牆是否阻擋。
ping一下網關,進行最基礎的檢查,通了,表示能夠到達伺服器。
測試到網關或路由器的通常情況,先測網關,然後再測路由器一級一級的測試。
測試ping公網ip的通常情況(記住幾個外部IP),
測試DNS的通暢。 ping出對應IP。
通過以上檢查後,也會在網管的路由器上進行檢查。
46、如果我們的網站打開速度慢請說下您的排查思路?
判斷原因
首先我要以使用者的身分登入我們的網站,判斷問題出現在我們自身原因,還是使用者那邊的原因。
如果是用戶問題有以下幾個原因:
用戶那邊的頻寬
使用者的瀏覽器
器版本低,安裝插件太多
中毒和電腦裡的垃圾檔案太多
使用者主機的主機的效能和作業系統
如果是我們的網站本身問題有幾個原因
網路頻寬
伺服器的cpu、硬碟、記憶體過低伺服器負載不起來也就是說伺服器本身的效能面
網站程式碼不夠完善。 如mysql語句沒有進行最佳化導致資料庫讀寫耗時
伺服器未開啟圖片壓縮
網頁台下
死連接過多插件使用及js檔案呼叫頻繁網站伺服器的速度或是租用空間所在的伺服器速度
解決思路
1.檢測伺服器速度的快慢
ping指令查看連接到伺服器的時間和丟包情況(ping 測試網址的)
看丟包率(1000包沒有丟一個是最理想的、一般一個速度好的機房丟包率不超過1%)
ping值要小同城電信adsl ping平均值絕對不能超過20,一般都在10,跨省的平均值20-40屬於正常
ping值要均勻最小值和最大值相差太大說明路由不穩定的表現
2、查看伺服器自身效能
查看cpu的使用率uptime
查看記憶體狀況 free -m
查看I/O讀寫iostat 磁碟I/O讀寫等等看看是那個進程大量佔用系統資源導致我的伺服器變慢
3.看看訪問最多的URL和IP有什麼特徵,如果是惡意URL和IP就把他屏蔽掉如果是善意的就限流有可能是CDN回源量大造成網站無法訪問
4.查看同台伺服器上其他網站的開啟速度,可以透過查詢工具查看和自己在同一台伺服器上的網站個數和網址可以看他們開啟快慢
5.電信和聯通互訪的問題
如果是空間打開時快時慢,有時打不開那就是空間不穩定找空間商解決或是換空間傷,如果是有的地方快有的地方慢應該是網絡線路問題,比如電信用戶訪問放在 聯通伺服器上的網站,聯通用戶造訪放在電信伺服器上的網站,解決辦吧是:使用雙線空間或是多線空間
6.從網站本身的原因
網站的程式設計結構是否合理是否由於投影片程式碼影響網站開啟速度(找程式設計相關人士解決)
網頁的設計結構和程式碼錯誤(請專業人士進行修改)
網頁的內容如:大尺寸圖片、大尺寸flash、過多的引用其他網站內容,如果被引用內容的網站速度慢,也影響自身網站把。 譬如友情連結可以把對方 的圖片放到自己網站上
解決辦法
優化圖片,限制圖片大小尺寸,降低圖片質量,減少圖片數量
限定圖片的格式:jpg,png,gif
減少http的請求數(當打開網頁時瀏覽器會發出很多對象請求,每個對象的加載都會有所延時,如果網頁上的對像很多就會花費大量的時間,去除不必要的對象,將臨近 的圖片合成一張,合併css檔) f r o m :w l j s l m z
46、如何查看二進位檔案的內容
我們一般會透過 hexdump 指令 來查看二進位檔案的內容。
hexdump -C XXX(檔名) -C 是參數 不同的參數有不同的意義
-C 是比較規範的 十六進位和 ASCII 碼顯示
-c 是單字節字元顯示
-b 單字節八進位顯示
-o 是雙位元組八進位顯示
-d 是雙位元組十進位顯示
-x 是雙位元組十六進位顯示
等等等等
47、你是怎麼備份資料的,包括資料庫備份?
在生產環境下,不管是應用資料、還是資料庫資料首先在部署的時候就會有主從架構、或者集群,這本身就是屬於資料的熱備份;其實考慮冷備份,用專門一台伺服器做為備份 伺服器,例如可以用rsync+inotify配合排程任務來實現資料的冷備份,如果是發版的包備份,正常情況下有台發布伺服器,每次發版都會保存好發版的包。
48、zabbix常用術語你知道幾個?
主機(host):要監控的網路設備,可由IP或DNS名稱指定;
主機群組(hostgroup):主機的邏輯容器,可以包含主機和模板,但同一個組織內的主機和模板無法互相連結;主機群組通常在指派給使用者或使用者群組監控權限時使用;
監控項(item):一個特定監控指標的相關的資料;這些資料來自於被監控對象;item是zabbix進行資料收集的核心,相對某個監控對象,每個item都由"key"標識;
觸發器(trigger):一個表達式,用於評估某監控對象的特定item內接收到的資料是否在合理範圍內,也就是閾值;接收的資料量大於閾值時,觸發器狀態將從"OK" 轉變為"Problem",當資料再次恢復到合理範圍,又轉變為"OK";
事件(event):觸發一個值得關注的事情,例如觸發器狀態轉變,新的agent或重新上線的agent的自動註冊等;
動作(action):指對於特定事件事先定義的處理方法,如發送通知,何時執行操作;
警報升級(escalation):發送警報或執行遠端指令的自訂方案,如每隔5分鐘發送警報,共發送5次等;
媒介(media):發送通知的手段或通道,如Email、Jabber或SMS等;
通知(notification):透過選定的媒介向使用者發送的有關某事件的資訊;遠端命令(remote command):預先定義的命令,可在被監控主機處於某特定條件下時自動執行;
範本(template):用於快速定義被監控主機的預設條目集合,通常包含了item、trigger、graph、screen、application以及low-level
discovery rule;模板可以直接連結至某個主機;應用程式(application):一組item的集合;
web場景(webscennario):用於偵測web站點可用性的一個活多個HTTP請求;前端(frontend):Zabbix的web介面;
49.虛擬化技術有哪些表現形式
完全擬化技術:透過軟體實現作業系統的資源再分配,較成熟,完全虛擬化代表技術:KVM、ESXI、Hyper-V。
半虛擬化技術:透過程式碼修改現有的系統,形成一種新的可虛擬化的系統,呼叫硬體資源去安裝多個系統,整體速度上相對高一點,半虛擬化代表技術:Xen。
輕量級虛擬化:介於完全虛擬化、半虛擬化之間,輕量級虛擬化代表科技:Docker。
50、修改線上業務設定檔流程
先告知維運經理及業務相關開發人員
在測試環境測試,並備份先前的設定文件
測試無誤後修改生產環境配置
觀察生產環境是否正常,是否有警報
完成設定檔更改
Comments
Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/html/wwwroot/itrenzheng.hk/wp-includes/class-wp-comment-query.php on line 399
Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!