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