運維工程師是從一個呆逼進化為苦逼再成長為牛逼的過程,前提在于你要能忍能幹能拼,還要具有敏銳的嗅覺感覺前方潮流變化。如:今年大資料,人工智能比較火……(相對表示就是 Python 比較火)
之前寫過運維基礎篇,發現對很多人收益挺大,接下來也寫下關于這 4 年多的運維實踐經驗,從事了 2 年多遊戲運維,1 年多安全運維,1 年大資料運維,相關行業資訊不能算非常精通,但是熟悉和熟練還是相對可以的。
初級篇
8 張 Linux 知識圖譜,幫你讀懂相關技術和性能
詳解Linux運維工程師入門級必備技能:http://chenhao6.blog.51cto.com/6228054/1341458
01rsync工具
很多地方經常會用到 rsync 工具,實施幾台伺服器的同步效果。我們公司就是使用這個工具完成伺服器的遊戲的服務端和用戶端同步。
有幾個文章例子:
rsync 強化技術(手動修改端口開啟防火牆的情況下)并且通過腳本隻同步需要的伺服器:http://chenhao6.blog.51cto.com/6228054/1322579
inotify+rsync+mutt+msmtp 實作 Linux 檔案或者目錄自動更新并且實作發郵件給管理者:http://chenhao6.blog.51cto.com/6228054/1298375
02網絡服務
服務有很多種,每間公司都會用到不同的,但基礎的服務肯定要掌握,如 FTP、DNS、SAMBA、郵件,這幾個大概學一下就行,LAMP 和 LNMP 是必須要熟練。
我所指的不是光會搭建,而是要很熟悉裡面的相當配置才行,因為公司最關鍵的絕對是 Web 伺服器,是以 Nginx 和 Apache 要熟悉,特别是 Nginx 一定要很熟悉才行,至少有些公司還會用 Tomcat,這個也最好學一下。
其實網絡服務方面不用太擔心,一般公司的環境都已經搭建好,就算有新伺服器或讓你整改,公司會有相應的文檔讓你參照來弄,不會讓你亂來的,但至少相關的配置一定要學熟,而且肯定是編譯安裝多,那些子產品要熟悉一下它的作用,特别是 PHP 那些子產品。
上面兩點隻是基礎,也是必要條件,不能說是工具,以下才是真正的要掌握的工具:
Samba 檔案共享服務(共享腳本讓你工作更輕松):
http://chenhao6.blog.51cto.com/6228054/1218028
Linux Web 服務安裝 Apache 思路(源碼編譯,自己定義服務):
http://chenhao6.blog.51cto.com/6228054/1223484
FTP(持虛拟使用者,并且每個虛拟使用者可以具有獨立的屬性配置):
http://chenhao6.blog.51cto.com/6228054/1219713
Linux 下建構 DHCP 伺服器:
http://chenhao6.blog.51cto.com/6228054/1217232
03腳本語言
Shell 腳本和另一個腳本語言,Shell 是運維人員必須具備的,不懂這個連入職都不行,至少也要寫出一些系統管理腳本,最簡單也得寫個監控 CPU,記憶體比率的腳本吧,這是最最最基本了。
别以為會寫那些猜數字和計算什麼數的,這些沒什麼作用,隻作學習意義,寫系統腳本才是最有意義,而另一個腳本語言是可選的,一般是 3P,即 Python、Perl 和 PHP。
PHP 就不需要考慮了,除非你要做開發,我個人建議學 Python 會比較好,可實作自動化運維,Perl 是文本處理很強大,這兩個學一個就行了。
Shell(一) 入門到複雜 自己做的各種腳本執行個體與解釋:
http://chenhao6.blog.51cto.com/6228054/1230337
Shell(二)入門到複雜 腳本執行個體(電腦):
http://chenhao6.blog.51cto.com/6228054/1232070
04sed 和 awk 工具
這兩個工具必須要掌握,同時還要掌握正規表達式,這個就痛苦了,正則是最難學的表達式,但結合到 sed 和 awk 中會很強大。
在處理文本内容和過濾 Web 内容時十分有用,不過在學 Shell 的同時一般會經常結合用到的,是以學第 3 點就會順便學第 4 點。
sed 簡明教程:
https://coolshell.cn/articles/9104.html
05文本處理指令
sort 、tr、cut、paste、uniq、tee 等必學,也是結合第 3 點腳本語言時一并學習的。
06資料庫
首選 MySQL,别問我為什麼不學 SQL Server 和 Oracle,因為 Linux 用得最多絕對是 MySQL,增删改查必學,特别要學熟查,其它方面可能不太需要,因為運維人員使用最多還是查,哪些優化和開發語句不會讓你弄的。
MySQL(手動編譯詳細思路,以及增删改查、授權、備份還原):
http://chenhao6.blog.51cto.com/6228054/1225129
07防火牆
防火牆也算是個難點,說難不難,說易不易,最重要弄懂規則,如果學過 CCNA 的朋友可能會比較好學,因為 iptables 也有 NAT 表,原理是一樣的,而 FILTER 表用得最多,反正不學就肯定不合格。
防火牆(一)主機型防火牆
http://chenhao6.blog.51cto.com/6228054/1239306
防火牆(二)SNAT和DNAT
http://chenhao6.blog.51cto.com/6228054/1240714
08監控工具
我個人建議,最好學這 3 個:Cacti,Nagios,Zabbix,企業用得最多應該是 Nagios 和 Zabbix,反正都學吧,但 Nagios 會有點難,因為會涉及到用腳本寫自動監控,那個地方很難。
CentOS 6.2+Nginx+Nagios,手機短信和QQ郵箱提醒:
http://chenhao6.blog.51cto.com/6228054/1323192
伺服器集中檢測Cacti:
http://chenhao6.blog.51cto.com/6228054/1249302
09叢集和熱備
這個很重要,肯定要懂的,但到了公司就不會讓你去弄,因為新手基本不讓你碰,叢集工具有很多,最好學是 LVS,這是必學,最好也學 Nginx 叢集、反向代理,還有熱備,這個就有更多工具能實作了,像我公司是自己開發熱備工具的。
MySQL 熱備也要學,就是主從複制,這個要學懂整個流程一點也不容易,隻照着做根本沒意思。
MySQL主從同步,雙主同步,如果伺服器意外挂機,不同步怎麼辦:
http://chenhao6.blog.51cto.com/6228054/1325247
MySQL高性能壓力測試(總結了好久)
:http://chenhao6.blog.51cto.com/6228054/1314418
Nginx 緩存配置及報錯解決:
http://chenhao6.blog.51cto.com/6228054/1329106
10資料備份
工具有很多,但至少要把 RAID 的原理弄懂,特别是企業最常用的 1+0 或 0+1,自己做實驗也要弄出來,備份工具有很多,如 tar、dump,最好多了解一下。
學會以上 10 點,應該可以入門了,有些技術會比較難學,例如 Apache 和 Nginx 中還有些很重要的技術,如系統調優、服務優化、程式優化,這些在沒接觸工作前很難學習到的。
是以先把這 10 點學了吧,估計要學熟至少 3 個月不止,腳本部分會覺得很吃力了,我建議是先學熟 Shell,等工作後再學另一門腳本語言,這樣會比較好。
以上就是踏入 Linux 運維工程師需要掌握的工具,還有很多工具要掌握的,但在學習環境中是很難學到。
最後我再提醒一下,這裡所指的工具相當于技能,而不是像 Windows 或 Ubuntu 的圖形化工具,還有學 Linux 就别裝圖形界面,這樣虛拟機就不用吃太多記憶體,而且絕對不建議在真機上裝 Linux,根本達不到學習效果。
中級篇
這部分來自我自己的面試經曆和面試别人的經曆總結。先附上運維思路拓撲圖:
有些人認為,運維就是部署某個軟體,設定些基礎功能,就算會運維了。
舉個例子:安裝 LAMP,LNMP,就感覺部署方法我都掌握了。其實網上大多數都有一鍵安裝腳本啥的根本沒有啥技術含量,在面試官眼裡,這些都不是你的亮點。
基本到了公司一般環境架構都是部署好的,很少需要你去變動環境架構。就算你安裝好 LNMP 架構,你熟悉裡面的原理嗎?熟悉 Nginx 優化嗎?熟悉 MySQL 優化嗎?
再舉個例子:我面試遇到的問題,面試官問你既然熟悉 LNMP 架構,那麼 Nginx 反向代理的作用呢。
你應該不是說出懂這個軟體和配置,你盡可能的說怎麼優化,怎麼深入提高網站性能:
- 使用反向代理可以了解為 7 層應用層的負載均衡,使用負載均衡之後可以非常便捷的橫向擴充伺服器叢集,實作叢集整體并發能力、抗壓能力的提高。
- 通常反向代理伺服器會帶有本地 Cache 功能,通過靜态資源的 Cache,有效的減少後端伺服器所承載的壓力,進而提高性能。
下面說說運維在工作中需要掌握的核心技術。需要注意的是,這是在工作中掌握的,在學習中很難掌握。
01第一條最主要的排錯
- 分析部分程式不能運作或沒有按預想結果運作的原因,對程式運作跟蹤,檢視系統調用的過程。
- 較深入的系統瓶頸點分析。
檢視剩餘記憶體:
- free -m
- #-/+ buffers/cache: 6458 1649
- #6458M為真實使用記憶體 1649M為真實剩餘記憶體(剩餘記憶體+緩存+緩沖器)
- #linux會利用所有的剩餘記憶體作為緩存,是以要保證linux運作速度,就需要保證記憶體的緩存大小
系統資訊:
- uname -a # 檢視Linux核心版本資訊
- cat /proc/version # 檢視核心版本
- cat /etc/issue # 檢視系統版本
- lsb_release -a # 檢視系統版本 需安裝 centos-release
- locale -a # 列出所有語系
- locale # 目前環境變量中所有編碼
- hwclock # 檢視時間
- who # 目前線上使用者
- w # 目前線上使用者
- whoami # 檢視目前使用者名
- logname # 檢視初始登陸使用者名
- uptime # 檢視伺服器啟動時間
- sar -n DEV 1 10 # 檢視網卡網速流量
- dmesg # 顯示開機資訊
- lsmod # 檢視核心子產品
硬體資訊:
- more /proc/cpuinfo # 檢視cpu資訊
- lscpu # 檢視cpu資訊
- cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 檢視cpu型号和邏輯核心數
- getconf LONG_BIT # cpu運作的位數
- cat /proc/cpuinfo | grep \'physical id\' |sort| uniq -c # 實體cpu個數
- cat /proc/cpuinfo | grep flags | grep \' lm \' | wc -l # 結果大于0支援64位
- cat /proc/cpuinfo|grep flags # 檢視cpu是否支援虛拟化 pae支援半虛拟化 IntelVT 支援全虛拟化
- more /proc/meminfo # 檢視記憶體資訊
- dmidecode # 檢視全面硬體資訊
- dmidecode | grep "Product Name" # 檢視伺服器型号
- dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range # 檢視記憶體插槽
- cat /proc/mdstat # 檢視軟raid資訊
- cat /proc/scsi/scsi # 檢視Dell硬raid資訊(IBM、HP需要官方檢測工具)
- lspci # 檢視硬體資訊
- lspci|grep RAID # 檢視是否支援raid
- lspci -vvv |grep Ethernet # 檢視網卡型号
- lspci -vvv |grep Kernel|grep driver # 檢視驅動子產品
- modinfo tg2 # 檢視驅動版本(驅動子產品)
- ethtool -i em1 # 檢視網卡驅動版本
- ethtool em1
- 使用分析系統分析 Web 日志(如逆火軟體)
- 分析系統性能瓶頸點(IO/Memory/CPU,常用工具,top 指令中 shift 組合鍵的特殊用 Sar/vmstat/iostat/ipcs)
日志管理常用指令:
- history # 曆時指令預設1000條
- HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 讓history指令顯示具體時間
- history -c # 清除記錄指令
- cat $HOME/.bash_history # 曆史指令記錄檔案
- lastb -a # 列出登入系統失敗的使用者相關資訊 清空二進制日志記錄檔案 echo > /var/log/btmp
- last # 檢視登陸過的使用者資訊 清空二進制日志記錄檔案 echo > /var/log/wtmp 預設打開亂碼
- who /var/log/wtmp # 檢視登陸過的使用者資訊
- lastlog # 使用者最後登入的時間
- tail -f /var/log/messages # 系統日志
- tail -f /var/log/secure # ssh日志
02優化
優化可以說是運維最吃香的技能,基本會優化的運維普遍工資很高,而且優化是要承擔風險的,并不是網上搜個文章改一下配置檔案或者參數就叫優化了,這樣很容易造成當機。
優化是根據實際的現場環境硬體各個參數進行部分優化,提高軟體性能和網站性能。這個我隻能講半知半解,當時優化 MySQL 和 Tomcat 參數也是根據網上文章和官網文檔查找參數在虛拟機上測試然後檢視性能。
成本優化,性能優化,這裡我給出 Tomcat 優化 JVM 參數(做過相應測試才放到現場環境的):(記住無監控不調優)
- -标準參數,所有jvm都應該支援
- -X 非标,每個jvm實作都不同
- -XX 不穩定參數,下一版本可能會取消
- serial collector 單線程 序列化
- parallel collector 多線程
啟動 jvisualvm.exe 監控 dump 記憶體溢出:
- -Xms:初始堆大小
- -Xmx:最大堆大小
- -Xss:線程棧大小
- -XX:NewSize=n:設定年輕代大小
- -XX:NewRatio=n:設定年輕代和年老代的比值,如3, 标示年輕代:年老代比值1:3,年輕代占整個年輕代年老代和的1/4
- -XX:SurvivorRatio=n:年輕代中的eden區與2個Survivor區的比值。
- -XX:MaxPermSize=n:設定持久代大小
收集器設定:
- -XX:+UseSerialGC:設定串行收集器
- -XX:+UseParallelGC:設定并行收集器
- -XX:+UseConcMarkSweepGC:設定并發收集器
回收統計資訊:
- -XX:+PrintGC
- -XX:+PrintGCDetails
- -Xloggc:filename
Tocmat 優化,确認有幾個 JVM 虛拟機:
- set JAVA_OPTS=
- -Xms4g
- -Xmx4g
- -Xss512k
- -XX:+AggressiveOpts 進攻型的優化選項,所有優化項都加上
- -XX:+UseBiasedLocking 優化鎖,基本都要選上,偏執鎖
- -XX:permSize=64m 原始區大小,最大300m 類多就設定大一點
- -XX:MaxPermSize=300m
- -XX:+DisableExplicitGC //System.gc() 不顯示調用gc
- -XX:+UseConcMarkSweepGC 使用cms縮短相應時間,并發收集,低停頓
- -XX:+UseParNewGC 并行收集新生代的垃圾
- -XX:+CMSParallelRemarkEnabled 在使用UseParNewGC的情況下,盡量減少mark的時間
- -XX:+UseCMSCompactAtFullCollection 使用并發收集器時,開啟對年老代的壓縮,使碎片減少
- -XX:LargePageSizelnBytes=128m 記憶體分頁大小對性能的提升
- -XX:+UseFastAccessorMethods get/set方法轉成本地代碼
- -Djava awt headless=true 修複linux下tomcat處理圖示時可能産生的bug
記憶體調優:
- "C:\Program Files\Java\jdk1.8.0_31\bin\java" -XX:+DoEscapeAnalysis -XX:+EliminateAllocations -XX:+UseTLAB -XX:+PrintGCDetails -Didea.launcher.port=7540 "-Didea.launcher.bin.path=E:\java\IntelliJ IDEA 2016.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_31\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\rt.jar;E:\java\new\out\production\new;E:\java\IntelliJ IDEA 2016.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain aa.T02
- Heap
- PSYoungGen total 38400K, used 3994K [0x00000000d5d80000, 0x00000000d8800000, 0x0000000100000000)
- eden space 33280K, 12% used [0x00000000d5d80000,0x00000000d61668b8,0x00000000d7e00000)
- from space 5120K, 0% used [0x00000000d8300000,0x00000000d8300000,0x00000000d8800000)
- to space 5120K, 0% used [0x00000000d7e00000,0x00000000d7e00000,0x00000000d8300000)
- ParOldGen total 87552K, used 0K [0x0000000081800000, 0x0000000086d80000, 0x00000000d5d80000)
- object space 87552K, 0% used [0x0000000081800000,0x0000000081800000,0x0000000086d80000)
- Metaspace used 3072K, capacity 4494K, committed 4864K, reserved 1056768K
- class space used 329K, capacity 386K, committed 512K, reserved 1048576K
- Heap
- PSYoungGen total 38400K, used 1147K [0x00000000d5d80000, 0x00000000d8800000, 0x0000000100000000)
- eden space 33280K, 3% used [0x00000000d5d80000,0x00000000d5e9ecb8,0x00000000d7e00000)
- from space 5120K, 0% used [0x00000000d8300000,0x00000000d8300000,0x00000000d8800000)
- to space 5120K, 0% used [0x00000000d7e00000,0x00000000d7e00000,0x00000000d8300000)
- ParOldGen total 87552K, used 0K [0x0000000081800000, 0x0000000086d80000, 0x00000000d5d80000)
- object space 87552K, 0% used [0x0000000081800000,0x0000000081800000,0x0000000086d80000)
- Metaspace used 3072K, capacity 4494K, committed 4864K, reserved 1056768K
- class space used 330K, capacity 386K, committed 512K, reserved 1048576K
- 線程本地緩存使用eden的,開啟就會使用更多
Tomcat 前任何參數沒參加大概每秒 605,調優後大概每秒 435,接近 3 倍的結果。
03開發技能
優選 Shell 和 Python,現在 Shell 無法滿足你的需求或者效率很低,那麼選擇自動化 Python 是最好的選擇。現在普遍招聘需求要求,會寫 Shell 或者 Python、Perl 腳本,個人選擇還是選 Python。
Python 這門語言上手比較快,容易了解。在伺服器管理工具上非常豐富,配置管理(Saltstack) 批量執行(Fabric、Saltstack) 監控(Zenoss、Nagios 插件) 虛拟化管理( python-libvirt) 程序管理 (Supervisor) 雲計算(OpenStack) ......
還有大部分系統 C 庫都有 Python 綁定。
對于流程确定的事情,最終一定是納入系統管理的體系,寫成程式,成為系統的一部分。而不是無法複用遊離與整體的各種腳本。
随着雲計算時代的來臨,中小型公司不需要運維了,大型公司沒有工程開發能力的運維,是沒有競争力的。
最重要的學好 Python 可以漲工資,可以漲工資,可以漲工資。(重要的事情說三遍~)目前本人也是在學 Python,正在把以前 Shell 腳本的執行個體轉換成 Python 腳本。
推薦《Python 執行個體手冊》下載下傳連結:
http://down.51cto.com/data/2329173
意識篇
01安全意識
運維人員的權限很大,是以一定要保證帳号/私鑰的安全:
- 最好使用加密工具存儲。比如 Truecrypt、lpassword。
- 基于本地存儲。切勿用網盤,也不建議用 lastpass 等。
- SSH 私鑰添加密碼。
02磨刀意識
關于任何操作配置,最好先搞明白操作或配置的原理,然後再去操作。應一句話叫做“磨刀不誤砍柴功”,而且對于類似的操作可以舉一反三。
03計劃意識
複雜的變更操作比如多台主機以及牽涉到 san 存儲,最好先作操作計劃,寫計劃文檔,詳細到每條指令,然後請高手幫忙稽核。
這樣能最大程度使整個操作過程安全。如果是重要的客戶業務系統,操作最好有回退方案,而一旦變更失敗,客戶可以在短時間内将業務回退。
04記錄分享意識
遇到自己認為較特殊的案例時,記得要寫案例過程及分析的文檔。也友善自己以後翻看,或者和其他兄弟分享,作知識的傳播以便于大家以後都能少走彎路。
05監控意識
對運維來說,監控是非常重要的,監控是發現系統各種異常的眼睛,是以運維應該和監控緊密配合。
06業務意識
盡量了解維護的各主機上的業務類型,以及各主機業務之間的關聯性,因為任何維護工作都是為主機能提供業務服務的。
當某業務中斷,能最快的知道與此業務相關的主機群,進而縮小故障排查範圍,最快定位故障。
并不是你技術很牛,學的技術很多很熟,就不代表你不需要運維意識,其實上司很看重運維意識的。
例如有沒有做好備份、權限配置設定問題、平台測試情況、故障響應時間等,這些都是意識,而不是你學了很多技術自認大牛了,平台發現故障你以為很簡單的問題喜歡處理就處理,不需要向其它部門回報等。
上司不是看你的技術如何,而是看你的運維意識如何,你沒運維意識,技術再牛也沒用,隻會讓其它部門的人跟你不協調。
要知道做 IT 這行是苦逼的,需要無盡的學習,不學習隻會被淘汰,不想被年輕的淘汰,就隻能不斷增值自己,不然不是你工資無法提升,而是你無法再從事這行。
這個世界,在悄悄懲罰不改變的人……