本書第4版相對于前3版而言改動比較大,刪除了不少內(nèi)容過時的內(nèi)容,增補(bǔ)了當(dāng)前熱門的技術(shù)知識點。另外,本書除了項目部署時采用的系統(tǒng)沒有升級到CentOS6.8x86_64外,其他環(huán)境均為CentOS6.8x86_64。此外,在寫作過程中采納了讀者針對上一版本提出的許多意見和建議,同時修正了第3版的各種錯誤及其他問題。具體改動如下:刪除了第3版中前3章的內(nèi)容,增補(bǔ)了Vagrant虛擬化軟件的應(yīng)用,并且重寫了生產(chǎn)環(huán)境下的Shell腳本;刪除了對分布式自動化部署管理工具Puppet的相關(guān)介紹,改用了Fabric自動化運維工具;刪除了關(guān)于開源VPN在企業(yè)中部署的章節(jié)。附錄部分增加了對現(xiàn)在流行的GitLab應(yīng)用,以及強(qiáng)大的編輯工具SulbimeText3的快捷鍵方式操作的介紹。
運維工程師工作的演變
隨著云計算的流行,運維工程師的工作性質(zhì)在不斷地發(fā)生變化,很多新的技能點和知識點需要掌握和學(xué)習(xí)。工作中,大家經(jīng)常可以看到DevOps這個詞匯。最近DevOps為什么這么火?跟最近兩年云計算的快速普及有很大的關(guān)系:云計算平臺上的各種資源,從服務(wù)器到網(wǎng)絡(luò),再到負(fù)載均衡都是由API創(chuàng)建和操作的,這就意味著所有的資源都可以“軟件定義”,這給各種自動化運維工具提供了一個非常好的基礎(chǔ)環(huán)境。而在傳統(tǒng)的互聯(lián)網(wǎng)行業(yè),比如CDN行業(yè),由于機(jī)器數(shù)量眾多、網(wǎng)絡(luò)環(huán)境錯綜復(fù)雜,故也需要由DevOps人員來設(shè)計工具,提供后端的自動化API,結(jié)合公司的CMDB資產(chǎn)管理系統(tǒng),提供自動化運維功能。
我在公司的職務(wù)是高級運維開發(fā)工程師(DevOps)、系統(tǒng)架構(gòu)師,主要工作是設(shè)計、實施及維護(hù)本公司的電子商務(wù)網(wǎng)站,以及核心業(yè)務(wù)的代碼開發(fā)工作。相對于CDN分布式系統(tǒng)而言,公司的電子商務(wù)網(wǎng)站沒有節(jié)點冗余,對集群技術(shù)的要求更高。所以我前期將所有的網(wǎng)站應(yīng)用都做了雙機(jī)高HA,包括LVS/HAProxy+Keepalived和Nginx+Keepalived,以及DRBD+Heartbeat+NFS文件高可用,MySQL數(shù)據(jù)庫用的是DRBD雙主多從架構(gòu),甚至Redis也使用了主從復(fù)制的架構(gòu)設(shè)計。隨著特殊業(yè)務(wù)的需求量越來越旺盛(比如定點搶紅包活動),我也在網(wǎng)站的架構(gòu)設(shè)計中引入了RabbitMQ消息隊列集群。后期隨著商業(yè)推廣量的加大,網(wǎng)站流量、UV及并發(fā)日益增大,新機(jī)器上線也日益頻繁,所以我采用了Fabric、Ansbile等自動化運維工具來管理線上機(jī)器,避免運維同事們的重復(fù)勞動。另外,由于電子商務(wù)網(wǎng)站牽涉支付問題,所以對安全性的要求也非常高,我們平時都會從網(wǎng)絡(luò)安全(包括硬件防火墻、Linux系統(tǒng)防火墻和WAF應(yīng)用防火墻)、系統(tǒng)安全、代碼安全和數(shù)據(jù)庫安全這些方面著手,盡力避免一切影響網(wǎng)站安全的行為。此外,我的工作職責(zé)還包括使用成熟的自動化工具(比如Ansible、Saltstack等),利用Python或Golang進(jìn)行二次開發(fā),根據(jù)實際工作需求,結(jié)合公司的CMDB系統(tǒng),提供穩(wěn)定的后端API,方便前端人員或資產(chǎn)人員進(jìn)行調(diào)用,這樣大家可以利用界面來完成自動化運維工作。工作雖然辛苦,但看到自己設(shè)計的后端API和網(wǎng)站能夠穩(wěn)定運行,心里還是很有成就感的,這也是我目前工作的主要動力。
撰寫本書的目的
從事系統(tǒng)集成、運維開發(fā)、架構(gòu)設(shè)計方面的工作已經(jīng)有十余年了,在工作期間,我曾有幸擔(dān)任了一段時間的紅帽RHCE講師,在東北大學(xué)等高校推廣紅帽Linux系統(tǒng)。在教學(xué)過程中我發(fā)現(xiàn),很多學(xué)生進(jìn)入企業(yè)后都無法勝任自己的工作,更談不上正確規(guī)劃自己的職業(yè)道路了。究其原因,一方面是因為企業(yè)的生產(chǎn)環(huán)境具有一定的復(fù)雜性和危險性;另一方面則是由于市場上入門書居多,缺乏能真正指導(dǎo)讀者解決實際問題的書籍。例如,很多書籍都只給出了比較基礎(chǔ)的操作及理論,而相對于線上環(huán)境,根本沒有涉及如何安全操作才能避免誤操,以及在PV、UV、并發(fā)、數(shù)據(jù)庫壓力和高并發(fā)環(huán)境下消息隊列或任務(wù)隊列如何設(shè)計等相關(guān)話題。
之所以寫這本書,一方面是想對自己這些年的工作進(jìn)行一次系統(tǒng)的梳理和總結(jié);另一方面是想將自己的經(jīng)驗和心得分享給大家,希望能幫助大家少走彎路。通過本書中介紹項目實踐(包括Linux集群、MySQL的高可用方案及Python自動化運維工具的使用)和線上環(huán)境的Shell腳本,幫大家迅速進(jìn)入工作狀態(tài)。書中所提供的Shell腳本和iptables腳本均來自于線上的生產(chǎn)服務(wù)器,大家均可以直接拿來用。關(guān)于Linux集群的項目實踐和MySQL的高可用方案,大家也可以根據(jù)實際項目的需求直接采用,以此來設(shè)計公司的網(wǎng)站架構(gòu)。
希望大家能通過本書掌握Linux的精髓,輕松而愉快地工作,從而提高自己的技術(shù)水平,也希望大家通過我分享的內(nèi)容,了解運維工作的發(fā)展趨勢,確定以后的學(xué)習(xí)目標(biāo)。這是我非常希望看到的,也是我寫本書的初衷。
第4版與第3版的區(qū)別
本書是第4版,相對于前3版而言改動比較大,刪除了不少過時的內(nèi)容,增補(bǔ)了當(dāng)前熱門的技術(shù)知識點。另外,本書除了項目部署時采用的系統(tǒng)沒有升級到CentOS 6.8 x86_64外,其他環(huán)境均為CentOS 6.8 x86_64。此外,在寫作過程中采納了讀者針對上一版本提出的許多意見和建議,同時修正了第3版的各種錯誤及其他問題。具體改動如下:刪除了第3版中前3章的內(nèi)容,增補(bǔ)了Vagrant虛擬化軟件的應(yīng)用,并且重寫了生產(chǎn)環(huán)境下的Shell腳本;刪除了對分布式自動化部署管理工具Puppet的相關(guān)介紹,改用了Fabric自動化運維工具;刪除了關(guān)于開源VPN在企業(yè)中部署的章節(jié)。附錄部分增加了對現(xiàn)在流行的GitLab應(yīng)用及強(qiáng)大的編輯工具Sulbime Text3的快捷鍵方式操作的介紹。出第4版的原因是希望能將現(xiàn)在最流行的開源技術(shù)展現(xiàn)并分享給大家,增加大家的職業(yè)技能知識。
讀者對象
本書的讀者對象如下:
項目實施工程師;
系統(tǒng)管理員或系統(tǒng)工程師;
網(wǎng)絡(luò)管理員或企業(yè)網(wǎng)管;
系統(tǒng)開發(fā)工程;
高級開發(fā)人員。
如何閱讀本書
本書的內(nèi)容是對實際工作經(jīng)驗的總結(jié),涉及大量的知識點和專業(yè)術(shù)語,建議經(jīng)驗不足的讀者一定從第1章讀起,本章內(nèi)容相對來說比較基礎(chǔ)。大家在學(xué)習(xí)過程中根據(jù)第1章的講解進(jìn)行操作,定會達(dá)到事半功倍的效果。
推薦系統(tǒng)管理員和運維工程師們通篇閱讀本書,并重點關(guān)注第2章、第4章、第5章、第7章和第8章的內(nèi)容,這些都與運維工作息息相關(guān)的,建議大家多花些精力和時間,抱著一切從線上環(huán)境去考慮的態(tài)度去學(xué)習(xí)。
對于網(wǎng)絡(luò)管理員和企業(yè)網(wǎng)管來說,如果基礎(chǔ)不是太扎實,建議先學(xué)習(xí)第1章和第2章的內(nèi)容,然后將重點放在第7章和第8章。
對于項目實施工程師而言,由于大多數(shù)都是從事系統(tǒng)集成相關(guān)工作的,因此建議順序?qū)W習(xí)全書的內(nèi)容,重心可以放在第5章和第6章。
對于高級開發(fā)人員來說,由于只需對系統(tǒng)有一個大概的了解,重點可以放在第1章、第3章和第4章。如果希望了解集群相關(guān)的知識體系,可學(xué)習(xí)第5章和第6章的內(nèi)容。
大家可以根據(jù)自己的職業(yè)發(fā)展和工作需要選擇不同的閱讀順序和側(cè)重點,同時也可以對其他相關(guān)的知識點有一定的了解。
致謝
感謝我的家人,你們在生活上對我無微不至的照顧,讓我有更多精力和動力去工作和創(chuàng)作。
感謝好友劉天斯和老男孩的支持和鼓勵,閑暇之余和你們一起交流開源技術(shù)和發(fā)展趨勢,也是一種享受。
感謝朋友劉鑫,是你花了大量時間和我一起研究和調(diào)試HAProxy+Keepalived。
感謝朋友胡安偉,感謝你為本書提供的精美插圖,并就Linux集群相關(guān)內(nèi)容提出的許多寶貴的意見。
感謝機(jī)械工業(yè)出版華章公司的編輯楊福川和孫海亮,正是由于你們的信任、支持和幫助,我才能夠如此順利地完成全部書稿。
感謝熱心的讀者朋友們,沒有大家的支持和鼓勵,本書也不可能出到第4版。
感謝朋友三寶,感謝你在我苦悶的時候陪我聊天,感謝你這么多年來對我的信任和支持。
感謝在工作和生活中給予過我?guī)椭乃腥耍兄x你們,正是因為有了你們,才有了本書的問世。
關(guān)于勘誤
盡管我花了大量時間和精力去核對文件和語法,但書中難免還會存在一些錯誤和紕漏,如果大家發(fā)現(xiàn)問題,希望可以反饋給我,相關(guān)信息可發(fā)到我的郵箱 yuhongchun027@gmail.com。盡管我無法保證每一個問題都會有正確的答案,但我肯定會努力回答和并且指出一個正確的方向。
如果大家對本書有任何疑問或想進(jìn)行Linux的技術(shù)交流,可以訪問我的個人博客,我會在此恭候大家。我的個人博客地址為http://yuhongchun.blog.51cto.com。另外,我在51CTO和CU社區(qū)的用戶名均為“撫琴煮酒”,大家也可以直接通過此用戶名在社區(qū)內(nèi)與我進(jìn)行交流。
余洪春(撫琴煮酒)
余洪春(撫琴煮酒),系統(tǒng)架構(gòu)師、高級DevOps,從事電子商務(wù)網(wǎng)站和大型CDN系統(tǒng)運維工作10多年,在Linux集群、自動化運維、系統(tǒng)安全及高并發(fā)高流量網(wǎng)站架構(gòu)設(shè)計等方面進(jìn)行了深入的研究,在大量一線實踐中積累了豐富的經(jīng)驗。精通負(fù)載均衡高可用技術(shù)和自動化運維技術(shù),擅長電子商務(wù)和門戶類網(wǎng)站架構(gòu)。51CTO和ChinaUnix等知名社區(qū)的特邀專家,51CTO系統(tǒng)網(wǎng)絡(luò)頻道的專欄作家,ChinaUnix論壇“集群和高可用”及“監(jiān)控及自動化運維”版版主,在社區(qū)內(nèi)發(fā)表了大量技術(shù)文章,深受網(wǎng)友好評。
前言
第1章 Linux服務(wù)器的性能調(diào)優(yōu)1
1.1 網(wǎng)站架構(gòu)設(shè)計相關(guān)1
1.1.1 評估網(wǎng)站性能涉及的專業(yè)名詞術(shù)語1
1.1.2 CDN業(yè)務(wù)的選項2
1.1.3 IDC機(jī)房的選擇3
1.2 如何根據(jù)服務(wù)器應(yīng)用來選購服務(wù)器 4
1.3 硬件對Linux性能的影響9
1.4 CentOS 6.8 x86_64最小化安裝后的優(yōu)化11
1.4.1 系統(tǒng)的基礎(chǔ)優(yōu)化11
1.4.2 優(yōu)化Linux下的內(nèi)核TCP參數(shù)以提高系統(tǒng)性能19
1.4.3 CentOS 6.8 x86_64系統(tǒng)最小化安裝優(yōu)化腳本21
1.4.4 Linux下CPU使用率與機(jī)器負(fù)載的關(guān)系與區(qū)別23
1.5 服務(wù)器調(diào)優(yōu)實際案例25
1.6 小結(jié)28
第2章 Shell腳本在生產(chǎn)環(huán)境下的應(yīng)用29
2.1 Shell編程基礎(chǔ)29
2.1.1 Shell腳本基本元素30
2.1.2 Shell基礎(chǔ)正則表達(dá)式30
2.1.3 Shell特殊字符32
2.1.4 變量和運算符33
2.2 Shell中控制流結(jié)構(gòu)45
2.3 Sed的基礎(chǔ)用法及實用舉例48
2.3.1 Sed的基礎(chǔ)語法格式48
2.3.2 Sed的用法舉例說明53
2.4 awk的基礎(chǔ)用法及實用舉例56
2.5 Shell基礎(chǔ)正則表達(dá)式舉例61
2.6 Shell開發(fā)中應(yīng)該掌握的系統(tǒng)知識點68
2.7 生產(chǎn)環(huán)境下的Shell腳本74
2.7.1 Amazon Linux系統(tǒng)簡介74
2.7.2 生產(chǎn)環(huán)境下的備份類腳本75
2.7.3 生產(chǎn)環(huán)境下的監(jiān)控類腳本78
2.7.4 生產(chǎn)環(huán)境下的運維開發(fā)類腳本84
2.8 小結(jié)88
第3章 利用Vagrant搭建分布式環(huán)境89
3.1 Vagrant簡單介紹89
3.2 Vagrant安裝90
3.3 使用Vagrant配置本地開發(fā)環(huán)境91
3.3.1 Vagrant的具體安裝步驟91
3.3.2 Vagrant配置文件詳解93
3.3.3 Vagrant常用命令詳解95
3.4 使用Vagrant搭建分布式環(huán)境96
3.5 小結(jié)99
第4章 輕量級自動化運維工具介紹100
4.1 輕量級自動化運維工具pssh介紹101
4.1.1 pssh的安裝103
4.1.2 pssh的使用103
4.2 輕量級自動化運維工具Fabric介紹105
4.2.1 Fabric的安裝105
4.2.2 Fabric的命令行入口fab命令詳細(xì)介紹107
4.2.3 Fabric的環(huán)境變量設(shè)置108
4.2.4 Fabric的核心API109
4.2.5 Fabric的執(zhí)行邏輯112
4.2.6 如何利用進(jìn)程池大小來限制Fabric并發(fā)進(jìn)程數(shù)114
4.3 Fabric在工作中應(yīng)用實例114
4.3.1 開發(fā)環(huán)境中Fabric應(yīng)用實例115
4.3.2 工作場景中常見的Fabric應(yīng)用實例116
4.4 小結(jié)120
第5章 Linux集群及其項目案例分享121
5.1 負(fù)載均衡高可用核心概念及常用軟件121
5.1.1 什么是負(fù)載均衡高可用121
5.1.2 以F5 BIG-IP作為負(fù)載均衡器122
5.1.3 以LVS作為負(fù)載均衡器123
5.1.4 以Nginx作為負(fù)載均衡器132
5.1.5 以HAProxy作為負(fù)載均衡器132
5.1.6 高可用軟件Keepalived134
5.1.7 高可用軟件Heartbeat134
5.1.8 高可用塊設(shè)備DRBD135
5.2 負(fù)載均衡關(guān)鍵技術(shù)136
5.2.1 什么是Session136
5.2.2 什么是Session共享136
5.2.3 什么是會話保持137
5.3 負(fù)載均衡器的會話保持機(jī)制138
5.3.1 LVS的會話保持機(jī)制138
5.3.2 Nginx負(fù)載均衡器中的ip_hash算法142
5.3.3 HAProxy負(fù)載均衡器的source算法145
5.4 服務(wù)器健康檢測150
5.5 Linux集群的項目案例分享151
5.5.1 用LVS+Keepalived建高可用集群151
5.5.2 用Nginx+Keepalived實現(xiàn)在線票務(wù)系統(tǒng)154
5.5.3 企業(yè)級Web負(fù)載均衡高可用之Nginx+Keepalived157
5.5.4 HAProxy雙機(jī)高可用方案之HAProxy+Keepalived169
5.5.5 巧用DNS輪詢作負(fù)載均衡179
5.5.6 百萬級PV高可用網(wǎng)站架構(gòu)設(shè)計184
5.5.7 千萬級PV高性能高并發(fā)網(wǎng)站架構(gòu)設(shè)計187
5.6 軟件級負(fù)載均衡器的特點介紹與對比193
5.7 四層負(fù)載均衡和七層負(fù)載均衡工作流程的對比194
5.8 Linux集群的總結(jié)和思考196
5.9 小結(jié)198
第6章 MySQL性能調(diào)優(yōu)及高可用案例分享200
6.1 MySQL數(shù)據(jù)庫的優(yōu)化200
6.1.1 服務(wù)器物理硬件的優(yōu)化200
6.1.2 MySQL配置文件的優(yōu)化201
6.1.3 MySQL上線后根據(jù)status狀態(tài)進(jìn)行適當(dāng)優(yōu)化204
6.1.4 利用tuning-primer腳本進(jìn)行數(shù)據(jù)庫調(diào)優(yōu)212
6.1.5 MySQL架構(gòu)設(shè)計調(diào)優(yōu)216
6.2 MySQL數(shù)據(jù)庫的高可用架構(gòu)方案216
6.2.1 生產(chǎn)環(huán)境下的DRBD+Heart-beat+MySQL雙機(jī)高可用217
6.2.2 生產(chǎn)環(huán)境下的MySQL數(shù)據(jù)庫主從Replication同步228
6.3 小結(jié)240
第7章 Linux防火墻介紹242
7.1 基礎(chǔ)網(wǎng)絡(luò)知識242
7.1.1 OSI網(wǎng)絡(luò)參考模型242
7.1.2 TCP/IP三次握手的過程詳解243
7.1.3 Socket應(yīng)用245
7.1.4 其他基礎(chǔ)網(wǎng)絡(luò)知識247
7.2 Linux防火墻的狀態(tài)機(jī)制247
7.3 Linux防火墻在企業(yè)中的應(yīng)用247
7.4 Linux防火墻的語法248
7.5 iptables的基礎(chǔ)知識252
7.5.1 iptables的狀態(tài)state252
7.5.2 iptables的Conntrack記錄254
7.5.3 關(guān)于iptables模塊的說明255
7.5.4 iptables防火墻初始化的注意事項256
7.5.5 如何保存運行中的iptables規(guī)則256
7.6 如何流程化編寫iptables腳本257
7.7 學(xué)習(xí)iptables應(yīng)該掌握的工具260
7.7.1 命令行的抓包工具TCPDump260
7.7.2 圖形化抓包工具Wireshark261
7.7.3 強(qiáng)大的命令行掃描工具Nmap264
7.7.4 使用TCPPing工具檢測TCP延遲266
7.8 iptables的簡單腳本學(xué)習(xí)267
7.8.1 普通的Web主機(jī)防護(hù)腳本267
7.8.2 如何讓別人ping不到自己,而自己能ping通別人呢?269
7.8.3