日了狗了,最近一家面試都沒有啊,就特麼一場筆試,還不給勞資消息,至今0 offer,唉。真沒有學習的興趣了,特別煩,我好特麼想墮落一段時間,可是我不敢,由於我工做還沒找到。我就想要進入運維行業都這麼難,我付出太多了。話是那麼說,校招不成功,找實習生門檻低點,呵呵,不甘心啊, 別人都能隨便拿10k左右,我當特麼個實習生也就3k左右,唉!我早就意識到工做問題,咋現在仍是這麼被動啊...html
一、詳細描述mysql主從複製的方式?(相似跟DRBD高可用的協議類型)前端
答:(1)同步複製(C協議:sync):只有在本地和遠程磁盤都肯定寫入已完成時,主節點纔會認爲寫入完成。master的變化,必須等待slave-1,slave-2,...,slave-n完成後才能返回。這樣顯然不可取,也不是MYSQL複製的默認設置。好比,在WEB前端頁面上,用戶增長了1條記錄,須要等待很長時間。python
(2)異步複製(A協議:aysnc):只要主節點完成本地寫操做就認爲寫操做完成,而且複製的數據包會被存儲在本地的TCP發送緩存中。master只須要完成本身的數據庫操做便可,至於slaves是否收到二進制日誌、是否完成操做,不用關心。MYSQL的默認設置。mysql
(3)半同步複製(B協議):當本地磁盤的寫已經完成,而且複製的數據包已經到達對應從節點,此時主節點才認爲磁盤寫已經完成。master只保證slaves中的一個操做成功,就返回,其餘slave無論。linux
二、MySQL一主多從模式下,讀寫分離的原理。(一說到這種問題,最好腦子裏有個拓撲圖,這樣好描述一些,放慢節奏)nginx
答:當代理組件mysq-proxy收到了前端應用程序(好比Java解釋器、PHP解釋器)的SQL語句請求時,若是是insert/update/delete,那麼交給Master來進行寫操做,若是是select操做,將讀的任務交給一個調度器能夠是HAProxy(但不能是LVS,由於LVS僅僅支持對http、mail的分發),該調度器負責選取必定的算法後,如輪詢方式,將讀操做交給衆多slave中的一個slave來進行處理。在這裏,mysql-proxy僅僅充當SQL路由的角色,並不進行執行相應的SQL語句。web
三、若是mysql-proxy , director,甚至master他們中的某些掛了怎麼辦?面試
答:這些都容易成爲單點故障,毫無疑問要對mysql-proxy、dircetor進行高可用,再搭建一臺服務器充當備份角色,當遭遇不測的時候,進行keepalived自動主備切換。若是master掛了,先讓slave-1提高爲新主,其餘的slave都重新主複製日誌,也可能其餘slave一直都是slave-1(新主)複製日誌。算法
四、解釋一下在Linux中的負載均衡是什麼?sql
答:當一臺服務器的性能達到極限時,咱們可使用服務器集羣來提升網站的總體性能。那麼,在服務器集羣中,須要有一臺服務器充當調度者的角色,用戶的全部請求都會首先由它接收,調度者再根據每臺服務器的負載狀況將請求分配給某一臺後端服務器去處理。
五、若是對Mysql服務器進行優化?(馬哥總結,不細分讀仍是寫)
答:從數據庫層面、從操做系統層面(內存、CPU多線程、本地磁盤IO、網絡帶寬)、從服務器硬件層面(固態硬盤以及RAID陣列)
這裏從數據庫層面的優化分析以下:
(1)是否正確設定了表結構的相關屬性,尤爲是每一個字段的字段類型是否爲最佳。同時,是否爲特定類型的工做組織使用了合適的表及表字段也將影響系統性能,好比,數據頻繁更新的場景應該使用較多的表而每張表有着較少字段的結構,而複雜數據查詢或分析的場景應該使用較少的表而每張表較多字段的結構等,則進行分表分庫
(2)是否爲高效進行查詢建立了合適的索引。
(3)是否爲每張表選用了合適的存儲引擎,並有效利用了選用的存儲引擎自己的優點和特性。好比是否支持事務的特性
(4)是否基於存儲引擎爲表選用了合適的行格式(rowformat)。例如,壓縮表在讀寫操做中會下降I/O操做需求並佔用較少的磁盤空間,InnoDB支持讀寫應用場景中使用壓縮表,但MyISAM僅能在讀環境中使用壓縮表。
(5)是否使用了合適的鎖策略,如在併發操做場景中使用共享鎖,而對較高優先級的需求使用獨佔鎖等。同時,還應該考慮存儲引擎所支持的鎖類型,諸如表鎖、行鎖、頁鎖等等
(6)對my.cnf配置文件參數設置是否爲InnoDB的緩衝池、MyISAM的鍵緩存以及MySQL查詢緩存設定了合適大小的內存空間,以便可以存儲頻繁訪問的數據且又不會引發頁面換出。好比能夠設置緩衝提升其寫性能,當客戶端提交一個數據時,並非當即把數據寫入到硬盤中,而是放在內存緩衝區裏,等緩衝區積累必定程度後,再把它複製到硬盤上,這樣能夠避免頻繁對磁盤IO,那麼咱們所作的步驟就是對配置文件設置buffer區的緩衝大小。
七、Squid代理服務器的工做原理,有何意義?反向代理是什麼?透明代理又是什麼?(忽然反應貌似上次是想問我這個東西)
答:原理:(1)ClientA發出資源請求,根據客戶端上的代理服務配置設置,將請求發送到代理服務器。 (2)而後由代理服務器表明客戶端發出請求,假如代理服務器將請求發給了一個web主機
(3)Web主機將資源返還給代理服務器
(4)代理服務器將資源返再還給客戶端,並將內容存儲在緩存中
(5)ClientB請求與ClientA相同的資源,和ClientA同樣,也會將請求發送到代理服務器 (6)代理服務器已有該資源內容,因此代理服務器直接將資源內容發送給客戶端ClientB
意義:解決了內網計算機沒法上網的問題,由於共享Squid外網IP因此節約了IP地址資源,屏蔽了內網網站的信息,必定程度保證了安全性,同時,它會緩存內容以供下次訪問,因此節省了帶寬,也提升了訪問效率。再者,Squid具備acl和http_access訪問控制屬性,相似於防火牆的功能。
反向代理:代替互聯網上的計算機來訪問內網的服務器資源。
透明代理:客戶端只須要把網關設置爲代理服務器的內網網卡IP便可,無需再作其餘設置,即可以經過代理服務器幫它從Internet上取回網頁資源。
八、代理服務器除了Squid還有哪些?Squid的端口號是多少來着?透明代理實驗你是如何測試的?作Squid服務的時候還須要作哪些服務?
答:Nginx也有很好的代理緩存功能,windows系統可使用proxy-server等;Squid內網端口監聽3128,外網監聽端口80。
測試:外網web服務器設置一個測試網頁,在內網瀏覽器訪問一個外網IP地址(在虛擬機中是能夠設置一個公有IP的,也能正常使用),因而返回顯示一些訪問頁面則Squid實驗成功,而且使用http-watch插件安裝在火狐瀏覽器上,進行http報文字段分析,第一次訪問沒有一個hit字段,第二刷新就會有一個hit命中字段,說明緩存成功。然後,查看這個外網web服務器的訪問日誌以及squid的訪問日誌。其中web服務器的日誌會顯示Squid的外網IP,同時,Squid會顯示內網客戶端的IP。
還須要DNS服務,客戶端輸入一個URL,沒了網關,找不到DNS服務器,只有請求代理服務器,因此只能讓代理服務器請求外部並完成域名解析的任務。
九、mysql主從複製的優勢、讀寫分離的場合?
答:複製優勢:(1) 若是主服務器出現問題, 能夠快速切換到從服務器提供的服務;
(2)能夠在從服務器上執行查詢操做, 下降主服務器的訪問壓力;
(3) 能夠在從服務器上執行備份, 以免備份期間影響主服務器的服務。
分離場合:讀操做(訪問)很是大的時候
十、Suqid有幾種日誌、Squid.conf中設置visable_hostname有何意義?
答:(1)access.log、cache.log、store.log
(2)指定主機名,當訪問出錯時返回給客戶端頁面包含的名字,從而幫助管理員分析哪一個代理服務器掛了。
十一、日誌過多了怎麼辦?用什麼東西分析日誌?如何打印今天訪問的日誌?日誌總共1000行,如何查看其中的200-500行日誌?
答:寫腳本日誌切割,每個月一個目錄,而後天天是它的子目錄;或者logrotate日誌輪替,多了的日誌不要了。Awstatus專業日誌分析工具。grep 關鍵字,好比今天的日期 grep 24/Aug/2016 access.log 。
head -500 access.log |tail -301
十二、rsync+inotfiy是雙向同步仍是單向同步?有幾種工做模式?
答:雙向同步。shell模式和deamon模式
1三、爲何要在LVS的後端真實服務器上抑制ARP應答?請解釋下ARP工做原理?
答:Director Server和全部的Real server共享VIP,若是有客戶端PC發出ARP請求其相應的VIP地址時,Director Server與全部Real server 都作應答的話,就出現問題了,所以,須要禁止Realserver的響應ARP。
ARP原理:源IP地址是本身的,目的IP地址是對方的,源MAC地址是本身的,目的MAC地址爲空,以廣播形式從本地網卡發送出去,當該數據幀到達對方節點時,對方拆包比對目的IP是不是本身的,若是是,則填上本身的MAC地址,並以單播形式返回過去,若是目的IP和本身網卡的IP不同,則丟棄。
1四、Http1.1相比Http1.0作了哪些改進?(老男孩老師說運維面試官不喜歡問這個,開發、CTO總監喜歡問這個,因缺思婷,我之後面試別人也不問這個,太特麼偏了)
答:(1)可擴展性、緩存處理、帶寬優化、持久鏈接、HOST頭、錯誤通知、消息傳遞、內容協商等方面。
(2)http1.0狀態響應碼有16個,http1.1狀態碼有24個(不知道)
1五、http狀態碼502與504的區別?
答:(1)502是網關錯誤,504是網關超時
(2)兩者很相似,502是代理服務器後面的真實服務器節點配置出了問題或者已經掛掉了,而504是代理服務器後面的真實服務器已通過載,它要處理的請求報文實在太多,忙不過來了。
(3)502還有一種狀況就是nginx與fastcgi即PHP進程配合的不恰當,致使返回502網關錯誤。
1六、http應答報文格式是什麼?空行有何做用?
答:起始行:協議版本號、狀態碼、狀態信息;
響應頭部:資源文件類型、文件長度、日期等
空行 ##用來告知對端,此報文頭部到此截止已經沒有了
報文實體內容 ##就是真實的網頁代碼
1七、什麼是MySQL多實例,如何配置MySQL多實例?
答:(1)定義:是在同一臺機器上面開啓多個不一樣的端口,運行多個MySQL服務進程,這些MySQL多實例公用一套安裝程序。
(2)應用場景:a、一臺物理數據庫服務器支撐多個數據庫的數據服務,爲提升mysql複製從機的複製效率,採用多實例部署
b、異地災難備份
(3)做用:有效利用服務器的資源,單個服務器資源有剩餘時,能夠充分利用剩餘的資源提供更多的服務.
(4)配置方式:a、使用多個配置文件啓動不一樣的進程來實現多實例,這種方式的優點邏輯簡單,配置簡單,缺點是管理起來不太方便。
b、經過官方自帶的mysqld_multi使用單獨的配置文件來實現多實例,這種方式定製每一個實例的配置不太方便,優勢是管理起來很方便,集中管理。
參考文檔:http://www.codesec.net/view/194257.html
1八、如何增強MySQL數據的安全,請你給出可行的思路?(TMD這個話題老生長談啊)
答:(1)從操做系統層面,iptables、TCP_wrappers幹掉不可信任的外部網絡
(2)從數據庫層面,對用戶的受權加以嚴格控制,防止內網搞破壞
(3)使用chroot,改變mysql日誌文件或數據文件的根目錄。
(4)移除或禁用~/.mysql_history文件,由於此文件記錄了用戶操做命令信息,若是被***獲取,便能知道數據庫的表結構
參考文檔:http://soft.chinabyte.com/database/76/12788576.shtml
1九、工做中數據庫被誤操做執行了一個刪除的SQL語句,你如何完整恢復丟失的數據?(這問題頗有思考意義,工做中若是刪了,呵呵,完蛋了)
答:(1)若是是Innodb引擎,而且沒有設置自動提交,那麼能夠經過rollback進行事務回滾
(2)從binlog日誌中進行恢復,可是要求日誌格式是row的,就麻煩了。
參考文檔:http://www.cnblogs.com/gomysql/p/3582058.html
20、SQL語句如何優化?(再整理一遍,勞資爲何就是記不住!)
答:(1)合理添加索引(他媽的這句我記得最清楚)
(2)使用內鏈接代替子查詢,避免使用多表查詢
(3)select 使用明確的字段用來代替*號
(4)對錶使用別名
(5)用Where 子句替換HAVING 子句由於HAVING 只會在檢索出全部記錄以後纔對結果集進行過濾
2一、MySQL Sleep線程過多如何解決?
答:現象:MySQL裏大量的Sleep線程等待,沒法及時釋放鏈接,拖累系統性能。
緣由:(1)使用了太多持久鏈接
(2)程序中,沒有及時關閉mysql鏈接
(3)數據庫查詢不夠優化,過分耗時。
影響:嚴重消耗mysql服務器資源(主要是cpu, 內存),並可能致使mysql崩潰
解決:在配置文件中對wait_timeout值設置的小一點,超過這個時間,就斷開Mysql的鏈接。對於正在運行中的生產服務器,在不能中止服務狀況下,以root用戶登陸到mysql,執行:set global wait_timeout=100
參考文檔:http://blog.sina.com.cn/s/blog_78ecbe330101332k.html
2二、mysql讀寫分離架構中,若是Master掛了,那麼slave上會不會寫數據,從而致使數據不一致?
答:不會。master掛了之後,mysql-proxy可以進行健康檢查,而且不會再容許有寫的請求發過來。
2三、timw_wait的做用?(至關於問2MSL的做用)
答:(1)使本次TCP鏈接中全部網絡分組均死掉,避免干擾下一次鏈接
(2)是ACK報文儘量到達目的端。
2四、你知道運維中的常見故障有哪些?
答:(1)命令所在的安裝包丟失,沒法繼續操做命令
(2)啓動配置文件丟失,致使不能重啓系統
(3)服務器硬件改動進入了emergency緊急模式
(4)bash文件損壞致使用戶沒法正常登錄
(5)Nginx負載均衡器出現故障
(6)文件變成了只讀模式
(7)錯綜複雜的網絡不通問題
2五、http協議中,put與post有何區別?
答:(1)PUT一般指定了資源的存放位置,而POST則沒有,POST的數據存放位置由服務器本身決定。
(2)傳輸數據的大小不一樣,前者通常是提交表單的數據,後者通常是附件類的大文件。
2六、NFS的工做原理?
答:1)首先服務端啓動RPC,並開啓111端口
2)服務端啓動NFS,並向RPC註冊端口信息
3)客戶端啓動RPC的主程序portmap端口映射,向服務端的111端口創建TCP網絡鏈接,
4)服務端的RPC把NFS隨機端口信息反饋給給客戶端。
5)客戶端經過該NFS隨機端口(小於1024)來創建和服務端的鏈接,以便進行數據的傳輸
2七、traceroute 的原理。(UDP數據報的意思僅僅是說上層運輸層封裝的是UDP,在這裏它是三層數據報文)
答:源端向目的端發送不一樣TTL(time to live )的UDP用戶數據報,第一個TTL爲1,在通過第一個路由器後,TTL減1,因而變爲0,該路由器就會丟棄
該數據包,並向源端發送一個ICMP超時報文,然後,源端發送一個TTL爲2的數據包,再通過2個路由器後,TTL又等於0因而又發給源端ICMP超時報文,當到達最後目的主機時,TTL是1,這時候TTL再也不減1,主機也不轉發數據包,可是因爲IP數據包封裝的是沒法交付的UDP用戶數據報,因而目的主機會返回給源端ICMP不可達的差錯報告報文。
##在這裏主要的疑惑是UDP用戶數據包怎麼就沒法交付了,網上的說法是 「前提是發出的UDP數據報中要求的端口在目的主機上沒有進程在使用。若是目的主機上正好有進程在使用這個端口,接收這個包並按正常方式處理,這樣traceroute就收不到"端口不可達"的錯誤了。爲了不出現這種狀況,UDP數據報的端口很高(書中的實現是初始值33435,之後每發送一次再加1,端口號最大能夠到65535)」。 actually,我也不太清楚。
參考文檔:http://blog.csdn.net/hero456123/article/details/11472363
2八、編寫腳本實現如下功能;
天天早上5點開始作備份;要備份的是/var/mylog裏全部文件和目錄能夠壓縮進行備份;備份能夠保存到別一臺FTP即器上19二、16八、一、2 ,FTP賬號aaa,密碼 bbb;而且天天的備份文件要帶有當天的日期標記
答:
#!/bin/bash ##file:log_bak_ftp.sh BACKDIR=/var/mylog TIME=`date +%F` tar zcf $BACKDIR_$TIME.tar.gz $BACKDIR ##ftp上傳 ftp -n <<EOF open 192.168.1.2 user aaa bbb bin ##必需要設置爲二進制模式,否則會傳輸ASCII碼的東西,是沒法解壓的,記住了! put $BACKDIR_$TIME.tar.gz bye EOF ##crontab -e: 0 5 * * * /bin/bash /root/log_bak_ftp.sh
2九、編寫Nginx日誌切割腳本,並測量運行時間。
答:
#!/bin/bash ##切割日誌,/usr/lcoal/nginx/logs/access.logs/access.log LOG=/usr/lcoal/nginx/logs/access.log mkdir /newlog_dir TIME=${date -d "yesterday" +%Y%m%d} Year=${date -d "yesterday" +%Y} Month=${date -d "yesterday" +%Y%m} mkdir -p /newlog_dir/Year/Month if [ -d /newlog_dir -a -d /newlog_dir/Year -a /newlog_dir/Year/Month ] ##若是全部目錄都存在 then tar -zcf /newlog_dir/Year/Month/ginx_access_log.${TIME}.tar.gz $LOG if [ $? -eq 0];then rm -f $LOG echo "---$TIME---備份成功---">>/newlog_dir/log_event.txt fi fi ##查看時間time bash /cut_log.sh
優秀參考文檔:http://www.tianfeiyu.com/?p=2230
30、如何殺掉linux系統中全部的帶「nginx」字段的進程,請給出詳細命令?(批量殺死相關進程的緣由)
答:(1)ps aux |grep "nginx" |grep -v grep |xargs kill -9
(2)for KILLPID in `ps aux|grep "nginx"|grep -v grep |awk '{print $2}' `
do
kill -p $KILLPID
done