運維開發面試題(1)
問:在linux系統上有一列數字的文本,怎么求和?
awk '{ sum += $1 } END { print "Sum:", sum }' numbers.txt
問:做過linux內核優化或者升級沒?(沒答出來)
linux內核優化主要在/etc/sysctl.conf調整TCP/IP堆棧參數、文件系統緩存大小、內存管理和調度器行為等,或者在/etc/modprobe.d/blacklist.conf文件中禁用不需要的內核模塊可以減少內核的內存占用和加載時間。
做升級前使用uname -r 查看當前正在運行的內核版本,yum list kernel查找可用的內核版,在使用yum install kernel-<VERSION>,安裝后使用grub2-mkconfig -o /boot/grub2/grub.cfg更新GRUB引導程序,設置默認啟動的內核版本,grub2-set-default <VERSION>,重啟系統以使更改生效reboot。
問:使用python做過哪些開發?
略
問:python的xrange 和 range 的異同?
同:
兩者都用于生成一系列的整數。
語法相同,都是range(start, stop, step)或xrange(start, stop, step)
異:
range函數會生成一個列表,占用大量內存來存儲整個序列。而xrange是一個生成器,它不會一次性生成整個序列,而是在迭代過程中逐個生成元素,因此內存使用更加高效。
range返回一個列表,而xrange返回一個xrange對象。
問:列表 A 和 B,使用 Python 快速獲取 A 和 B 中的共有元素。
首先將兩個列表轉成set集合,然后用&連接兩個集合,例如set_A&set_B,輸出的結果就是兩個集合的交集。
問:在mysql的性能優化有哪些?以配置文件為例
內存設置:
innodb_buffer_pool_size:將此值設置為足夠大的值,以便InnoDB存儲引擎可以在內存中緩存更多的數據和索引。
query_cache_size:啟用查詢緩存,并將其大小設置為適當的值,以緩存經常執行的查詢結果。
tmp_table_size 和 max_heap_table_size:調整這兩個值,以便在執行排序或臨時表操作時使用的內存可以容納數據。
索引優化:
使用適當的索引來加速查詢。分析查詢和表結構,并根據需要創建和優化索引。
避免創建過多的索引,因為這可能會降低寫入性能和增加存儲開銷。
查詢優化:
優化查詢語句,確保它們使用合適的索引,避免全表掃描。
避免在查詢中使用SELECT *,而是只選擇需要的列。
使用合適的JOIN類型和JOIN條件,避免跨表掃描。
日志設置:
適當配置慢查詢日志(slow_query_log),以便記錄執行時間較長的查詢,以便識別和優化慢查詢。
配置錯誤日志(log_error)和查詢日志(general_log)根據需要進行跟蹤和故障排除。
連接和線程設置:
調整max_connections參數來限制并發連接數,以避免資源競爭和過多的連接。
優化thread_cache_size參數來管理線程緩存,以提高線程的重用性能。
問:mysql的數據備份,你們平時怎么做的?
mysql備份原生自帶的mysqldump,是一個邏輯備份工具,它通過導出數據庫的SQL語句來創建備份文件。這意味著備份文件包含了數據庫的表結構和數據,可以跨不同的MySQL服務器進行遷移和恢復。但是,由于備份文件是文本格式,執行備份文件中的SQL語句來重新創建表結構和導入數據,在導入大型數據庫時可能比較慢。mysqldump在備份期間會鎖定表,確保備份的一致性。
mysqldump -u 用戶名 -p 密碼 數據庫名 > 備份文件名.sql
后面我們更傾向與使用XtraBackup,是一個物理備份工具,它備份的是MySQL數據文件和日志文件的副本,XtraBackup使用InnoDB的快照機制,可以在備份期間進行熱備份而無需鎖定表,由于是物理備份,它備份和還原的速度通常比mysqldump更快,生成的備份文件通常比mysqldump生成的備份文件小很多。
innobackupex --user=<用戶名> --password=<密碼> --databases="<數據庫1> <數據庫2>" <備份目錄>
問:在jenkins中,傳統項目構建和k8s項目構建,這兩種的整體大致流程分別是什么樣的?
傳統項目構建流程:
源代碼管理:Jenkins從版本控制系統(如Git、SVN等)中檢出或更新源代碼。
構建觸發:根據配置的觸發器(如定時構建、代碼推送觸發等)啟動構建過程。
構建環境準備:Jenkins配置構建環境,包括設置環境變量、選擇構建工具(如Maven、Gradle、npm等)。
編譯和構建:執行構建腳本或命令,編譯源代碼,生成可執行文件或部署包。
單元測試:運行單元測試,確保代碼質量。
靜態代碼分析:進行代碼質量檢查,如使用SonarQube等工具。
打包和歸檔:將構建產物打包,并在Jenkins中歸檔,以便后續部署使用。
部署:將構建產物部署到目標環境,可能是傳統的物理機、虛擬機或云服務器。
集成測試:在部署后進行集成測試,確保應用在目標環境中正常工作。
通知和報告:構建完成后,通過郵件或其他方式通知相關人員,并提供構建報告。
Kubernetes項目構建流程:
源代碼管理:與傳統項目相同,Jenkins從版本控制系統中檢出或更新源代碼。
構建觸發:根據配置的觸發器啟動構建過程。
構建環境準備:Jenkins配置構建環境,可能包括Kubernetes集群的配置信息。
編譯和構建:執行構建腳本或命令,編譯源代碼,生成容器鏡像。
單元測試:運行單元測試。
靜態代碼分析:進行代碼質量檢查。
容器鏡像構建:使用Docker或其他容器技術構建應用的容器鏡像。
鏡像推送:將構建好的容器鏡像推送到鏡像倉庫(如Docker Hub、Harbor、Google Container Registry等)。
部署配置更新:更新Kubernetes的部署配置文件,指向新推送的鏡像。
Kubernetes部署:使用kubectl apply或其他工具將更新后的部署配置應用到Kubernetes集群。
集成測試:在Kubernetes集群中進行集成測試。
通知和報告:構建完成后,通知相關人員,并提供構建報告。
問:ansible的playbook怎么用?
Ansible的Playbook是用于定義自動化任務的YAML文件,允許對一組主機執行一系列操作。使用Playbook的基本步驟包括:
1.創建Inventory文件:定義需要管理的目標主機和組。
2.編寫Playbook:使用YAML格式編寫任務,指定在哪些主機上執行哪些動作。
3.運行Playbook:使用ansible-playbook命令,指定Inventory文件和Playbook文件來執行任務。
問:k8s的探針了解嗎,有哪幾種?
Liveness Probe: Liveness探針用于判斷容器是否還在運行。如果Liveness探針失敗,Kubernetes會殺死容器,然后根據容器的重啟策略決定是否重啟容器。
Readiness Probe: Readiness探針用于判斷容器是否準備好開始接受請求。如果Readiness探針失敗,那么Kubernetes會從服務的負載均衡器中剔除該Pod,直至探針再次成功。
Startup Probe: Startup探針用于判斷應用程序在容器中是否已經啟動。這對于啟動時間較長的應用很有用。如果提供了Startup探針,那么直到這個探針成功之前,其他的探針都會被忽略。
問:你們平時使用ELK嗎,或者EFK,怎么使用的?
Elasticsearch是一個全文搜索數據庫,在k8s中通過StatefulSet來創建一個Elasticsearch集群。
Fluentd是一個開源的日志收集器,用于收集、過濾、緩沖和轉發日志到各種存儲后端,如Elasticsearch。在k8s中,可以通過DaemonSet在每個節點上部署Fluentd,以便從節點上收集日志并轉發到Elasticsearch。
Kibana是一個開源的分析和可視化平臺,用于搜索、查看并與存儲在Elasticsearch中的數據進行交互。在Kubernetes中,可以通過部署Kibana的Deployment來創建一個Kibana實例。
主要的工作量來自與Fluentd的配置部分,定義如何從Pod中收集日志,包括日志的格式、過濾規則。我們的需求是從Pod的標準輸出(stdout/stderr)作為入口收集日志,通常位于node節點的/var/log/containers/目錄中的文件,這些日志文件都是以特定的格式命名的,包括Pod名稱、命名空間、容器名稱和容器ID等信息。
問:如果現在訪問nginx代理的地址報404錯誤,但是upsteam或者location沒有錯誤的問題,最直接的方式怎么排查?
檢查Nginx的錯誤日志文件(通常位于/var/log/nginx/error.log),看是否有關于404錯誤的詳細信息。
檢查Nginx的訪問日志文件(通常位于/var/log/nginx/access.log),看是否有請求被Nginx接收,但返回了404狀態碼。
浙公網安備 33010602011771號