運維工程師職業技能匯總大全(持續更新)


 運維工程師職業技能匯總大全(持續更新)

1. 基礎知識 

1.1 系統原理 

1.1.1 Linux操作系統啟動流程

a. 名詞解釋:
BIOS

基本輸入輸出系統(Basic Input Output System,BIOS)是一組固化到計算機主板上的只讀內存鏡像(Read Only Memory image,ROM)芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、系統設置信息、開機后自檢程序和系統自啟動程序。主要功能是為計算機提供最底層的、最直接的硬件設置和控制。

MBR

全新硬盤在使用之前必須進行分區格式化,硬盤分區初始化的格式主要由兩種,分別是:MBR格式和GPT格式。
MBR主引導記錄扇區(Main Boot Record)是計算機啟動最先執行的硬盤上的程序,只有512字節大小,所以不能載入操作系統的核心,只能先載入一個可以載入計算機核心的程序,我們稱之為引導程序。MBR分區標准決定了MBR只支持在2TB以下的硬盤。

GPT

GUID全局唯一的標識符(Globally unique identifier,簡稱GPT),正逐漸取代MBR成為新標准。它和統一的可擴展固件接口 (Unified Extensible Firmware Interface,UEFI)相輔相成。UEFI用於取代老舊的BIOS,而GPT則取代老舊的MBR。GPT支持2T以上磁盤,如果使用Fdisk分區,最大只能建立2TB大小的分區,創建大於2TB的分區,需使用parted,同時必須使用64位操作系統。

GRUB
GNU項目的多操作系統啟動程序(GRand Unified Bootloader,GRUB),可以支持多操作系統的引導,它允許用戶可以在計算機內同時擁有多個操作系統,並在計算機啟動時選擇希望運行的操作系統。CentOS 7 Linux默認使用GRUB2引導程序,引導系統啟動。

 b. 啟動流程

我的理解是:

開機質檢
加載BIOS
讀取MBR
引導GRUB
加載內核
確定啟動級別
加載模塊
系統初始化
執行對應啟動級別自啟任務
執行rc.local文件
登錄shell

 (1)加載BIOS

計算機電源加電質檢,首先加載基本輸入輸出系統(Basic Input Output System,BIOS),BIOS中包含硬件CPU、內存、硬盤等相關信息,包含設備啟動順序信息、硬盤信息、內存信息、時鍾信息、即插即用(Plug-and-Play,PNP)特性等。加載完BIOS信息,計算機將根據順序進行啟動。

(2)讀取MBR

讀取完BIOS信息,計算機將會查找BIOS所指定的硬盤MBR引導扇區,將其內容復制到0x7c00地址所在的物理內存中。被復制到物理內存的內容是Boot Loader,然后進行引導。

(3)GRUB引導

GRUB啟動引導器是計算機啟動過程中運行的第一個軟件程序,當計算機讀取內存中的GRUB配置信息后,會根據其配置信息來啟動硬盤中不同的操作系統。

(4)加載Kernel

計算機讀取內存映像,並進行解壓縮操作,屏幕一般會輸出“Uncompressing Linux”的提示,當解壓縮內核完成后,屏幕輸出“OK, booting the kernel”。系統將解壓后的內核放置在內存之中,並調用start_kernel()函數來啟動一系列的初始化函數並初始化各種設備,完成Linux核心環境的建立。

(5)設定Inittab運行等級

內核加載完畢,會啟動Linux操作系統第一個守護進程init,然后通過該進程讀取/etc/inittab文件,/etc/inittab文件的作用是設定Linux的運行等級,Linux常見運行級別如下:

  • 0:關機模式;
  • 1:單用戶模式;
  • 2:無網絡支持的多用戶模式;
  • 3:字符界面多用戶模式;
  • 4:保留,未使用模式;
  • 5:圖像界面多用戶模式;
  • 6:重新引導系統,重啟模式。

(6)加載rc.sysinit

讀取完運行級別,Linux系統執行的第一個用戶層文件/etc/rc.d/rc.sysinit,該文件功能包括:設定PATH運行變量、設定網絡配置、啟動swap分區、設定/proc、系統函數、配置Selinux等。

(7)加載內核模塊

讀取/etc/modules.conf文件及/etc/modules.d目錄下的文件來加載系統內核模塊。該模塊文件,可以后期添加或者修改及刪除。

(8)啟動運行級別程序

根據之前讀取的運行級別,操作系統會運行rc0.d到rc6.d中的相應的腳本程序,來完成相應的初始化工作和啟動相應的服務。其中以S開頭表示系統即將啟動的程序,如果以K開頭,則代表停止該服務。S和K后緊跟的數字為啟動順序編號。

(9)讀取rc.local文件

操作系統啟動完相應服務之后,會讀取執行/etc/rc.d/rc.local文件,可以將需要開機啟動的任務加入到該文件末尾,系統會逐行去執行並啟動相應命令

(10)執行/bin/login程序

執行/bin/login程序,啟動到系統登錄界面,操作系統等待用戶輸入用戶名和密碼,即可登錄到Shell終端,輸入用戶名、密碼即可登錄Linux操作系統,至此Linux操作系統完整流程啟動完畢。

1.2 命令基礎 

1.2.1 命令行下載工具wget/mwget

wget是一個命令行下載工具,mwget是一個多線程命令行下載工具。后者下載速度有明顯提升,建議直接上mwget

wget安裝

yum install wget -y

wget使用示例

wget 下載地址URL

mwget安裝

#!/bin/bash
wget http://jaist.dl.sourceforge.net/project/kmphpfm/mwget/0.1/mwget_0.1.0.orig.tar.bz2
yum install bzip2 gcc-c++ openssl-devel intltool -y
bzip2 -d mwget_0.1.0.orig.tar.bz2
tar -xvf mwget_0.1.0.orig.tar 
cd mwget_0.1.0.orig
./configure 
make
make install  #至此,安裝完成

mwget使用示例

mwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.5.tgz

wget和mwget下載速度對比

[root@instance-u5vn5wqr ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.5.tgz
--2020-03-26 09:41:07--  https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.5.tgz
正在解析主機 fastdl.mongodb.org (fastdl.mongodb.org)... 52.222.158.137, 52.222.158.143, 52.222.158.153, ...
正在連接 fastdl.mongodb.org (fastdl.mongodb.org)|52.222.158.137|:443... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:132702741 (127M) [application/gzip]
正在保存至: “mongodb-linux-x86_64-rhel70-4.2.5.tgz”
 7% [=====>                                                                                      ] 9,625,799   2.77KB/s 剩余 2h 8m  ^C
[root@instance-u5vn5wqr ~] mwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.5.tgz
--2020-03-26 09:55:58--  https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.5.tgz
正在解析主機 fastdl.mongodb.org (fastdl.mongodb.org)... 54.192.151.31, 54.192.151.43, 54.192.151.54, ...
正在連接 fastdl.mongodb.org (fastdl.mongodb.org)|54.192.151.31|:443... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:132702741 (127M) [application/gzip]
正在保存至: “mongodb-linux-x86_64-rhel70-4.2.5.tgz.1100%[===========================================================================================>] 132,702,741 4.01MB/s 用時 40s    
2020-03-26 09:56:39 (3.19 MB/s) - 已保存 “mongodb-linux-x86_64-rhel70-4.2.5.tgz.1” [132702741/132702741])
[root@instance-u5vn5wqr ~]#

1.2.2 端口查看netstat/ss

netstat/ss都可以用來查看系統當前端口使用情況,哪些程序使用了哪些端口,哪些端口是監聽中的

netstat安裝

yum install net-tools -y

netstat使用示例

[root@instance-u5vn5wqr ~]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      12196/mongod        
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      12004/mysqld        
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      12658/nginx: master 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1050/sshd           
tcp        0      0 127.0.0.1:1815          0.0.0.0:*               LISTEN      31407/hosteye       
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      16391/master        
tcp6       0      0 :::781                  :::*                    LISTEN      1085/./bcm-agent    
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      1050/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      16391/master        
[root@instance-u5vn5wqr ~]#

centos7默認自帶ss命令?待驗證

ss這個命令我也不熟,用慣了netstat。下面看一下ss怎么用。暫時不知道怎么同時顯示服務名和對應的端口的方法 >_<

[root@instance-u5vn5wqr ~]# ss -tl
State       Recv-Q Send-Q                   Local Address:Port                                    Peer Address:Port                
LISTEN      0      128                          127.0.0.1:27017                                              *:*                    
LISTEN      0      50                                   *:mysql                                              *:*                    
LISTEN      0      128                                  *:sunrpc                                             *:*                    
LISTEN      0      128                                  *:http                                               *:*                    
LISTEN      0      128                                  *:ssh                                                *:*                    
LISTEN      0      128                          127.0.0.1:mmpft                                              *:*                    
LISTEN      0      100                          127.0.0.1:smtp                                               *:*                    
LISTEN      0      128                                 :::781                                               :::*                    
LISTEN      0      128                                 :::sunrpc                                            :::*                    
LISTEN      0      128                                 :::ssh                                               :::*                    
LISTEN      0      100                                ::1:smtp                                              :::*                    
[root@instance-u5vn5wqr ~]# ss -tln
State       Recv-Q Send-Q                     Local Address:Port                                    Peer Address:Port              
LISTEN      0      128                            127.0.0.1:27017                                              *:*                  
LISTEN      0      50                                     *:3306                                               *:*                  
LISTEN      0      128                                    *:111                                                *:*                  
LISTEN      0      128                                    *:80                                                 *:*                  
LISTEN      0      128                                    *:22                                                 *:*                  
LISTEN      0      128                            127.0.0.1:1815                                               *:*                  
LISTEN      0      100                            127.0.0.1:25                                                 *:*                  
LISTEN      0      128                                   :::781                                               :::*                  
LISTEN      0      128                                   :::111                                               :::*                  
LISTEN      0      128                                   :::22                                                :::*                  
LISTEN      0      100                                  ::1:25                                                :::*                  
[root@instance-u5vn5wqr ~]#

1.3 網絡基礎 

1.3.1 網絡模型

七層網絡協議模型

物理層:由於網絡傳輸介質傳輸的是比特位(01),因此物理層必須定義所使用的傳輸設備的電壓和信號等,同時還必須了解數據幀轉換成比特流的編碼方式,最后鏈接實際傳輸介質並發送/接收比特信號。
數據鏈路層:硬件部分,主要處理MAC數據幀,傳遞給物理層轉換成比特流;軟件部分主要處理來自上層的數據表轉換成MAC的格式。相關協議:PPP
網絡層:定義IP地址,定義計算機之間的鏈接建立,終止維護等,數據包的傳輸路徑等。相關協議:IP、ICMP、ARP、RARP
傳輸層:定義發送端與接收端的鏈接技術(TCP,UDP)同時包括該技術的數據包格式,數據包的發送,流程的控制等,以確保各個資料數據可以正確無誤的到達目的端。相關協議:TCP、UDP
會話層:確定網絡服務建立鏈接的確認。
表示層:定義網絡服務(或程序)之間的數據格式的轉換,使數據格式標准化,也包括數據的加密解密也是在這層上處理。
應用層:將數據發送給應用程序,並最終展示給用戶。相關協議:HTTP、FTP、SMTP等。
雖然OSI七層協議的架構非常嚴謹,但是由於太過嚴謹導致程序編寫相當不容易,因此產生了TCP/IP協議。

應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網絡遠程訪問協議(Telnet)等。

傳輸層:在此層中,它提供了節點間的數據傳送,應用程序之間的通信服務,主要功能是數據格式化、數據確認和丟失重傳等。如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據並把它傳輸到下一層中,這一層負責傳送數據,並且確定數據已被送達並接收。

互連網絡層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。

網絡接口層(主機-網絡層):接收IP數據報並進行傳輸,從網絡上接收物理幀,抽取IP數據報轉交給下一層,對實際的網絡媒體的管理,定義如何使用實際網絡(如Ethernet、Serial Line等)來傳送數據。

1.3.2 網絡划分

IP地址的種類划分:
在IPV4中有兩種IP類別
Public IP:公共IP,經由InterNIC統一規划IP,只有這種IP才可鏈接到Internet。
Private IP:私有IP或保留IP,不能直接連上Internet的IP,主要用於局域網絡內的主機鏈接規划。
Public IP公共IP如下:(注:128+64+32+16+8+4+2+1)

A類地址
定義:第1字節為網絡地址,其它3個字節為主機地址(第一個字節1...126都是指網絡地址,后面跟的三位數具體到主機)
范圍:1.0.0.1 - 126.255.255.254
子網掩碼:255.0.0.0
私有地址:10.X.X.X是私有地址(所謂的私有地址就是在互聯網上不使用,而被用在局域網絡中的地址),范圍10.0.0.0-10.255.255.255 ---
保留地址127.X.X.X是保留地址,用做循環測試用的,嗎比如常用的 127.0.0.1
B類地址
定義:第1字節和第2字節為網絡地址,其它2個字節為主機地址
范圍:128.0.0.1 - 191.255.255.254
子網掩碼:255.255.0.0
私有地址:172.16.0.0 - 172.31.255.255是私有地址
保留地址:169.254.X.X是保留地址。如果你的IP地址是自動獲取IP地址,而你在網絡上又沒有找到可用的DHCP服務器。就會得到其中一個IP
C類地址
范圍:第1字節、第2字節和第3個字節為網絡地址,第4個個字節為主機地址。另外第1個字節的前三位固定為110
范圍:192.0.0.1 - 223.255.255.254
子網掩碼:255.255.255.0
私有地址:192.168.X.X是私有地址。(192.168.0.0 - 192.168.255.255)
D類地址
定義:不分網絡地址和主機地址,它的第1個字節的前四位固定為1110
范圍:224.0.0.1 - 239.255.255.254
E類地址
定義:不分網絡地址和主機地址,它的第1個字節的前五位固定為11110
范圍:240.0.0.1 - 255.255.255.254
另外, ip地址后邊加個/8(16,24,32),這些數字代表掩碼的位數

A類IP地址的默認子網掩碼為255.0.0.0(由於255相當於二進制的8位1,所以也縮寫成“/8”,表示網絡號占了8位);

B類的為255.255.0.0(/16);

C類的為255.255.255.0(/24)

/30就是255.255.255.252

/32就是255.255.255.255

1.3.3 網絡計算

已知192.168.1.53/27,計算以下內容
具體的子網掩碼
子網數
可用的主機數
最大可容納主機數
網絡地址
廣播地址

ip對應的二進制位,只需關注53即可
53對應的二進制位00110101 -》2^5+2^4+2^2+2^0=32+16+4+1=53

子網掩碼
根據192.168.1.53/27可知,子網掩碼有27個1,對應二進制如下
11111111.11111111.11111111.11100000
轉換為十進制11100000 -》2^7+2^6+2^5=224‬
可得255.255.255.224

最大可容納主機數
從掩碼中可以看出主機號只剩5個, 掩碼都變成1,說明達到最大可容納主機數了
所以最大可容納主機數為
2^5=32

可用的主機數
最大可容納主機數減去2(減去全為0或全為1)
32-2=30

子網數
基礎網絡位和網絡位之間的差值,C類網絡基礎網絡位24位(前面三位全為1),現在借了3位,2^3=8
可得8

網絡地址-> IP地址和子網掩碼進行與運算的結果(掩碼前面都為1所以保持不變,只需計算最后一串數字)
00110101
11100000
兩者與運算得00100000=2^5=32
可得192.168.1.32

廣播地址-》子網掩碼取反后與網絡地址或運算
00011111(掩碼取反)
00100000
或運算得00111111=2^5+2^4+2^3+2^2+2^1+1=63
可得192.168.1.63

可自行在https://tool.520101.com/wangluo/ipjisuan/ 計算答案對比看是否正確。如有問題請反饋

1.3.4 TCP的三次握手及四次揮手詳解

 三次握手:
第一次握手:客戶端發送一個TCP的SYN標志位置1的包指明客戶打算連接的服務器的端口。
第二次握手:服務器發回確認包ACK應答,即SYN標志位和ACK標志位均為1。
第三次握手:客戶端再次發送確認包ACK,SYN標志位為0,ACK標志位為1。
四次揮手:
第一次揮手:客戶端發送一個FIN,用來關閉客戶端到服務器的數據傳送,客戶端進入FIN_WAIT_1狀態。
第二次揮手:服務器收到FIN后,發送一個ACK給客戶端,確認序號為收到序號+1,服務器進入CLOSE_WAIT狀態。
第三次揮手:服務器發送一個FIN,用來關閉Server到Client的數據傳送,服務器進入LAST_ACK狀態。
第四次揮手:客戶端收到FIN后,客戶端進入TIME_WAIT狀態,接着發送一個ACK給服務器確認序號為收到序號+1,服務器進入CLOSE狀態,完成四次揮手

1.4 排錯基礎 

PS:排錯前,需要做以下事項的確認,否則你可能會被自己坑慘:

第一坑:確認一下防火牆狀態

第二坑:Selinux也十分重要

第三坑:系統時間千萬要正常

1.4.1 關於CPU

top
-p 指定pid
-P按照CPU使用率排行
-M按照內存使用率排行
進入top后按q退出top
按m顯示內存使用率百分比
top顯示內容解釋
第一行會顯示系統運行時長,當前登錄用戶,平均負載
load average數據是每隔5秒鍾檢查一次活躍的進程數。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。相當於有活躍進程在等待CPU執行,而當前邏輯CPU已經都被占用了
第二行可以看到當前運行的進程總數,僵屍進程數
第三行可以看到用戶空間占用cpu百分比us,內核空間占用cpu百分比su,空閑cpu百分比id,等待輸入輸出的CPU時間百分比
在top基本視圖中,按鍵盤數字“1”可以監控每個邏輯CPU的狀況
top雖然很強大,但是只能監控到進程,無法監控到線程數和客戶連接數等
和top相反,ps可以通過-L選項監控到具體線程

PS:
監控java線程數:ps -eLf | grep java | wc -l            
監控網絡客戶連接數:netstat -n | grep tcp | grep 偵聽端口 | wc -l
有時候我們希望ps以樹形結構顯示進程,可以使用 -axjf 參數。因為有一些可能會有多個進程?
ps -axjf      也可以通過pstree查看樹形結構進程
如果想要查看現在有誰登入了你的服務器。可以使用ps命令加上相關參數:   
$ ps -eo pid,user,args
參數 -e 顯示所有進程信息,-o 參數控制輸出。Pid,User 和 Args參數顯示PID,運行應用的用戶和該應用。
如果希望結果能夠每秒刷新一次。為此,我們可以將ps命令和watch命令結合起來。
$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’        watch可以幫你監測一個命令的運行結果,來監測你想要的一切命令的結果變化。-n指間隔時長
#查看所有cpu核信息
mpstat -P ALL 1

vmstat

#查看cpu使用情況以及平均負載。vmstat  reports  information  about processes, memory, paging, block IO, traps, disks and cpu activity
vmstat 1

pidstat
#具體進程cpu的統計信息
pidstat -u 1 -p pid

perf
#跟蹤進程內部函數級cpu使用情況
perf top -p pid -e cpu-clock

1.4.2 關於內存

#查看系統內存使用情況
free -m
#查看系統內存情況
top
#1s采集周期,獲取內存的統計信息
pidstat -p pid -r 1
#查看進程的內存映像信息
pmap -d pid
#檢測程序內存問題
valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./程序名
#valgrind的使用具體可以參考https://www.cnblogs.com/leiyun/articles/2550507.html

1.4.3 關於磁盤

#查看所有進程io信息
iotop
#統計io詳細信息
iostat -d -x -k 1 10
#查看進程級io的信息
pidstat -d 1 -p pid
#查看系統IO的請求,比如可以在發現系統IO異常時,可以使用該命令進行調查,就能指定到底是什么原因導致的IO異常
#record是開始錄制,^C截止,report播放記錄
perf record -e block:block_rq_issue -ag
^C
perf report

1.4.4關於網絡

顯示網絡統計信息
netstat -s
顯示當前UDP連接狀況
netstat -nu
顯示UDP端口號的使用情況
netstat -apu
統計機器中網絡連接各個狀態個數
netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
顯示TCP連接
ss -t -a
顯示sockets摘要信息
ss -s
顯示所有udp sockets
ss -u -a
sar(System Activity Reporter系統活動情況報告)是目前 Linux 上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、系統調用的使用情況、磁盤I/O、CPU效率、內存使用狀況、進程活動及IPC有關的活動等
#tcp,etcp狀態。
sar -n TCP,ETCP 1
查看網絡IO
sar -n DEV 1
sar參數-u CPU使用率
1. 若 %iowait 的值過高,表示硬盤存在I/O瓶頸
2. 若 %idle 的值高但系統響應慢時,有可能是 CPU 等待分配內存,此時應加大內存容量
3. 若 %idle 的值持續低於1,則系統的 CPU
-v inode、文件和其他內核表監控
-r 內存和交換空間監控
-B 內存分頁監控
-b I/O和傳送速率監控
-q 進程隊列長度和平均負載狀態監控
-W 系統交換活動信息監控
-d 設備使用情況監控


抓包以包為單位進行輸出。and做且條件
tcpdump -i eth1 host 192.168.1.1 and port 80
抓包以流為單位顯示數據內容
tcpflow -cp host 192.168.1.1

1.4.5 關於系統負載

查看負載情況
uptime
top
vmstat
統計系統調用耗時情況
strace -c -p pid
跟蹤指定的系統操作例如epoll_wait
strace -T -e epoll_wait -p pid
查看內核日志信息
dmesg

1.4.6 關於火焰圖

cpu占用過高,或者使用率提不上來,你能快速定位到代碼的哪塊有問題嗎?

一般的做法可能就是通過日志等方式去確定問題。現在我們有了火焰圖,能夠非常清晰的發現哪個函數占用cpu過高,或者過低導致的問題。

火焰圖的安裝

火焰圖(flame graph)是性能分析的利器,通過它可以快速定位性能瓶頸點。

perf 命令(performance 的縮寫)是 Linux 系統原生提供的性能分析工具,會返回 CPU 正在執行的函數名以及調用棧(stack)。

系統版本:Centos7.6

一、配置JAVA環境

二、安裝perf

yum install perf -y

三、下載FlameGraph

yum install git -y

git clone https://github.com/brendangregg/FlameGraph.git

四、假設我們要對pid為3309的進程進行性能分析

perf record -F 99 -p 3309 -g -- sleep 20

perf script -i perf.data &> perf.unfold

./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded

./FlameGraph/flamegraph.pl perf.folded > perf.svg

這個perf.svg是一張圖片,里面包含了很多可以用來分析性能的信息,直接在瀏覽器打開即可

1.5 優化基礎 

1.5.1 最大文件打開數

1.6 安全基礎 

2. WEB管理 

2.1 Nginx 

2.1.1 部署 

自動化在線編譯安裝腳本(已驗證)

#!/bin/bash
yum install wget -y
wget -c http://nginx.org/download/nginx-1.14.0.tar.gz #下載nginx安裝包,這里需要根據自己的情況修改這個URL
tar -zxvf nginx-1.14.0.tar.gz #解壓
cd nginx-1.14.0/
yum -y install gcc-c++ pcre-devel zlib-devel openssl-devel #安裝依賴
#prefix選項是指安裝位置,--sbin-path指定nginx可運行文件存放位置,--conf-path指定配置存放位置,--pid-path指定pid存放位置,同時啟用https模塊http_ssl_module
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module
make
make install
cd /usr/local/nginx/sbin
./nginx #啟動服務
systemctl stop firewalld #關閉防火牆
setenforce 0  #關閉selinux
echo "-----------Nginx安裝完成------------"
echo "-----------Nginx已啟動------------"

2.1.2 優化 

2.1.3 備份 

2.1.4 恢復 

2.1.5 架構

2.2 Httpd 

2.2.1 部署

yum install httpd -y

2.2.2 優化

2.2.3 備份

2.2.4 恢復

2.2.5 架構

2.3 Tomcat 

2.3.1 部署

相關jdk包和tomcat包下載地址

鏈接:https://pan.baidu.com/s/18QQ0vj1pm_fLrVRPeGOHdA
提取碼:3zjx

一鍵安裝腳本

[root@k8s-node02 ~]# cat installtomcat.sh 
#!/bin/bash
tar -zxvf jdk-8u111-linux-x64.tar.gz -C /usr/local/
cat >> /etc/profile <<EOF
AVA_HOME=/usr/local/jdk1.8.0_111
JRE_HOME=/usr/local/jdk1.8.0_111/jre
CLASS_PATH=.:/\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar:\$JRE_HOME/lib
PATH=\$PATH:\$JAVA_HOME/bin:\$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
EOF
source /etc/profile
tar -zxvf apache-tomcat-9.0.33.tar.gz -C /usr/local/
cd /usr/local/apache-tomcat-9.0.33/bin
./startup.sh

2.3.2 優化

2.3.3 備份

2.3.4 恢復

2.3.5 架構

2.4 IIS 

2.4.1 部署

2.4.2 優化

2.4.3 備份

2.4.4 恢復

2.4.5 架構

3. 數據庫 

3.1 MySQL 

3.1.1 部署 

mysql版本5.7

wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
sed -i '21c enabled=1' /etc/yum.repos.d/mysql-community.repo
sed -i '28c enabled=0' /etc/yum.repos.d/mysql-community.repo
yum clean all
yum install  mysql-server mysql -y
systemctl start mysqld
cat /var/log/mysqld.log |grep pass

MyISAM 采用的是表級鎖機制,而 InnoDB 是行級鎖機制,通常情況下 InnoDB 具有更高的寫入效率。

表級鎖是 MySQL 中鎖定粒度最大的一種鎖,表示對當前操作的整張表加鎖。

行級鎖是 MySQL 中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。

MyISAM 對數據完整性的保護存在缺陷,且這些缺陷會導致數據庫數據的損壞甚至丟失。另外,這些缺陷很多是設計問題,無法在不破壞兼容性的前提下修復。

MyISAM 的發展在向 InnoDB 轉移,在最新的官方 MySQL 8.0 版本中,系統表均已采用 InnoDB

 

MySQL如何確保數據不丟失?

只要 redo log binlog 保證持久化到磁盤,就能確保 MySQL 異常重啟后,數據可以恢復。

binlog 的寫入邏輯比較簡單:事務執行過程中,先把日志寫到 binlog cache,事務提交的時候,再把 binlog cache 寫到 binlog 文件中。

一個事務的 binlog 是不能被拆開的,因此不論這個事務多大,也要確保一次性寫入。系統給 binlog cache 分配了一片內存,每個線程一個,參數 binlog_cache_size 用於控制單個線程內 binlog cache 所占內存的大小。如果超過了這個參數規定的大小,就要暫存到磁盤。

事務提交的時候,執行器把 binlog cache 里的完整事務寫入到 binlog 中,並清空 binlog cache

 

可以看到,每個線程有自己 binlog cache,但是共用同一份 binlog 文件。

write,指的就是指把日志寫入到文件系統的 page cache,並沒有把數據持久化到磁盤,所以速度比較快。

fsync,才是將數據持久化到磁盤的操作。一般情況下,我們認為 fsync 才占磁盤的 IOPS

write fsync 的時機,是由參數 sync_binlog 控制的:

sync_binlog=0 的時候,表示每次提交事務都只 write,不 fsync

sync_binlog=1 的時候,表示每次提交事務都會執行 fsync

sync_binlog=N(N>1) 的時候,表示每次提交事務都 write,但累積 N 個事務后才 fsync

因此,在出現 IO 瓶頸的場景里,將 sync_binlog 設置成一個比較大的值,可以提升性能。在實際的業務場景中,考慮到丟失日志量的可控性,一般不建議將這個參數設成 0,比較常見的是將其設置為 100~1000 中的某個數值。

但是,將 sync_binlog 設置為 N,對應的風險是:如果主機發生異常重啟,會丟失最近 N 個事務的 binlog 日志。

 

接下來,我們再說說 redo log 的寫入機制。

我們先明確一下InnoDB的修改數據的基本流程,當我們想要修改DB上某一行數據的時候,InnoDB是把數據從磁盤讀取到內存的緩沖池上進行修改。這個時候數據在內存中被修改,與磁盤中相比就存在了差異,我們稱這種有差異的數據為臟頁。InnoDB對臟頁的處理不是每次生成臟頁就將臟頁刷新回磁盤,這樣會產生海量的IO操作,嚴重影響InnoDB的處理性能。對於此,InnoDB有一套完善的處理策略,與我們這次主題關系不大,表過不提。既然臟頁與磁盤中的數據存在差異,那么如果在這期間DB出現故障就會造成數據的丟失。為了解決這個問題,redo log就應運而生了。

 

redo log在數據庫重啟恢復的時候被使用,因為其屬於物理日志的特性,恢復速度遠快於邏輯日志。而我們經常使用的binlog就屬於典型的邏輯日志。

checkpoint

坦白來講checkpoint本身是比較復雜的,checkpoint所做的事就是把臟頁給刷新回磁盤。所以,當DB重啟恢復時,只需要恢復checkpoint之后的數據。這樣就能大大縮短恢復時間。當然checkpoint還有其他的作用。

LSN(Log Sequence Number)

LSN實際上就是InnoDB使用的一個版本標記的計數,它是一個單調遞增的值。數據頁和redo log都有各自的LSN。我們可以根據數據頁中的LSN值和redo logLSN的值判斷需要恢復的redo log的位置和大小。

工作原理

好的,現在我們來看看redo log的工作原理。說白了,redo log就是存儲了數據被修改后的值。當我們提交一個事務時,InnoDB會先去把要修改的數據寫入日志,然后再去修改緩沖池里面的真正數據頁。

 

存在 redo log buffer 中,物理上是在 MySQL 進程內存中,就是圖中的紅色部分;

寫到磁盤 (write),但是沒有持久化(fsync),物理上是在文件系統的 page cache 里面,也就是圖中的黃色部分;

持久化到磁盤,對應的是 hard disk,也就是圖中的綠色部分。

日志寫到 redo log buffer 是很快的,wirte page cache 也差不多,但是持久化到磁盤的速度就慢多了。

為了控制 redo log 的寫入策略,InnoDB 提供了 innodb_flush_log_at_trx_commit 參數,它有三種可能取值:

設置為 0 的時候,表示每次事務提交時都只是把 redo log 留在 redo log buffer ;

設置為 1 的時候,表示每次事務提交時都將 redo log 直接持久化到磁盤;

設置為 2 的時候,表示每次事務提交時都只是把 redo log 寫到 page cache

InnoDB 有一個后台線程,每隔 1 秒,就會把 redo log buffer 中的日志,調用 write 寫到文件系統的 page cache,然后調用 fsync 持久化到磁盤。

注意,事務執行中間過程的 redo log 也是直接寫在 redo log buffer 中的,這些 redo log 也會被后台線程一起持久化到磁盤。也就是說,一個沒有提交的事務的 redo log,也是可能已經持久化到磁盤的。

宕機恢復

DB宕機后重啟,InnoDB會首先去查看數據頁中的LSN的數值。這個值代表數據頁被刷新回磁盤的LSN的大小。然后再去查看redo logLSN的大小。如果數據頁中的LSN值大說明數據頁領先於redo log刷新回磁盤,不需要進行恢復。反之需要從redo log中恢復數據。

 

MySQL 支持三種數據復制方式:

異步復制

應用發起數據更新(含 insertupdatedelete 操作)請求,Master 在執行完更新操作后立即向應用程序返回響應,然后 Master 再向 Slave 復制數據。

數據更新過程中 Master 不需要等待 Slave 的響應,因此異步復制的數據庫實例通常具有較高的性能,且 Slave 不可用並不影響 Master 對外提供服務。但因數據並非實時同步到 Slave,而 Master Slave 有延遲的情況下發生故障則有較小概率會引起數據不一致。

(簡單理解為,對外完成請求了才進行同步,所以有可能導致數據不一致)

半同步復制

應用發起數據更新(含 insertupdatedelete 操作)請求,Master 在執行完更新操作后立即向 Slave 復制數據,Slave 接收到數據並寫到 relay log 中(無需執行) 后才向 Master 返回成功信息,Master 必須在接受到 Slave 的成功信息后再向應用程序返回響應。

僅在數據復制發生異常(Slave 節點不可用或者數據復制所用網絡發生異常)的情況下,Master 會暫停(MySQL 默認10秒左右)對應用的響應,將復制方式降為異步復制。當數據復制恢復正常,將恢復為半同步復制。

(執行了外部請求,完成同步后,才對應用程序返回響應。但是出現異常的時候,有可能進行降級復制,變為異步復制,導致主從數據不一定完全一致)

強同步復制

應用發起數據更新(含 insertupdatedelete 操作)請求,Master 在執行完更新操作后立即向 Slave 復制數據,Slave 接收到數據並執行完 后才向 Master 返回成功信息,Master 必須在接受到 Slave 的成功信息后再向應用程序返回響應。

Master Slave 復制數據是同步進行的,Master 每次更新操作都需要同時保證 Slave 也成功執行,因此強同步復制能最大限度的保障主從數據的一致性。但因每次 Master 更新請求都強依賴於 Slave 的返回,因此 Slave 如果僅有單台,它不可用將會極大影響 Master 上的操作。

(主從數據必須完成同步后,才可以對外返回響應)

 

雲數據庫 MySQL 使用規范

按需授權一般應用程序只授權 DMLSELECTUPDATEINSERTDELETE)權限即可。

指定訪問源:指定可以訪問數據庫的IP地址

禁用弱密碼提升數據庫實例安全性。

避免實例跑多個業務耦合度太高會存在業務之間互相影響的風險。

建議關閉事務自動提交線上操作養成begincommit,降低誤操作導致數據丟失的風險

存在自增列的表,自增列上必須存在一個單獨的索引,若在復合索引中,自增列必須置於第一位。

每張表必須要有主鍵即使選不出合適的列做主鍵,亦必須添加一個無意義的列做主鍵,MySQL 第一范式標准 InnoDB 輔助索引葉子節點會保存一份主鍵值,推薦用自增短列作為主鍵,降低索引所占磁盤空間提升效率,binlog_formatrow 的場景下,批量刪數據沒主鍵會導致嚴重的主從延遲。

字段盡量定義為 NOT NULL 並加上默認值NULL 會給 SQL 開發帶來很多問題導致走不了索引,對 NULL 計算時只能用 IS NULL IS NOT NULL 來判斷。

建庫原則同一類業務的表放一個庫,不同業務的表盡量避免公用同一個庫,盡量避免在程序中執行跨庫的關聯操作

字符集統一使用 utf8mb4 降低亂碼風險,部分復雜漢字和 emoji 表情必須使用 utf8mb4 方可正常顯示,修改字符集只對修改后創建的表生效,故建議新購雲數據庫 MySQL 初始化實例時即選擇 utf8mb4

小數字段推薦使用 decimal 類型float double 精度不夠,特別是涉及金錢的業務,必須使用 decimal

盡量避免數據庫中使用 text/blob 來存儲大段文本、二進制數據、圖片、文件等內容而是將這些數據保存成本地磁盤文件,數據庫中只保存其索引信息。

盡量不使用外鍵,建議在應用層實現外鍵的邏輯,外鍵與級聯更新不適合高並發場景,降低插入性能,大並發下容易產生死鎖。

降低業務邏輯和數據存儲的耦合度,數據庫存儲數據為主,業務邏輯盡量通過應用層實現,盡可能減少對存儲過程、觸發器、函數、event、視圖等高級功能的使用,這些功能移植性、可擴展性較差。

短期內業務達不到一個比較大的量級,建議禁止使用分區表。分區表主要用作歸檔管理,多用於快遞行業和電商行業訂單表,分區表沒有提升性能的作用, 除非業務中80%以上的查詢走分區字段。

對讀壓力較大,且一致性要求較低(接受數據秒級延時)的業務場景,建議購買只讀實例從庫來實現讀寫分離策略。

禁止在更新十分頻繁、區分度不高的列上建立索引,記錄更新會變更 B+ 樹,更新頻繁的字段建立索引會大大降低數據庫性能。

建復合索引時,區分度最高的列放索引的最左邊,例如select xxx where a = x and b = x;a b 一起建組合索引,a 的區分度更高,則建idx_ab(a,b)。存在非等號和等號混合判斷條件時,必須把等號條件的列前置,例如,where a xxx and b = xxx那么即使 a 的區分度更高,也必須把 b 放在索引的最前列,因為走不到索引 a

單表的索引數建議不超過5,單個索引中的字段數建議不超過5個,太多起不到過濾作用,索引也占空間,管理起來也耗資源。

選擇業務中 SQL 過濾走的最多的並且 cardinality 值比較高的列建索引,業務 SQL 不走的列建索引是無意義的,字段的唯一性越高即代表 cardinality 值越高,索引過濾效果也越好,一般索引列的 cardinality 記錄數小於10%我們可認為這是一個低效索引,例如性別字段。

varchar 字段上建索引時,建議指定索引長度,不要直接將整個列建索引,一般 varchar 列比較長,指定一定長度作索引已經區分度夠高,沒必要整列建索引,整列建索引會顯得比較重,增大了索引維護的代價,可以用 count(distinct left(列名, 索引長度))/count(*) 來看索引區分度。

拒絕select *

無法索引覆蓋,回表操作,增加 I/O

額外的內存負擔,大量冷數據灌入innodb_buffer_pool_size,降低查詢命中率。

額外的網絡傳輸開銷。

盡量避免使用大事務,建議大事務拆小事務,規避主從延遲。

業務代碼中事務及時提交,避免產生沒必要的鎖等待。

少用多表 join,大表禁止 join,兩張表 join 必須讓小表做驅動表,join 列必須字符集一致並且都建有索引。

LIMIT 分頁優化,LIMIT 8000010這種操作是取出80010條記錄,再返回后10條,數據庫壓力很大,推薦先確認首記錄的位置再分頁,例如SELECT * FROM test WHERE id = ( SELECT sql_no_cache id FROM test order by id LIMIT 80000,1 ) LIMIT 10 ;

避免多層子查詢嵌套的 SQL 語句

監控上發現全表掃描的量比較大,可以在控制台參數設置log_queries_not_using_indexes分析慢日志文件,但不要開太久以免慢日志暴增。

業務上線之前做有必要的 SQL 審核,日常運維需定期下載慢查詢日志做針對性優化。

 

MySQL CPU 利用率過高,大部分原因與低效 SQL 有關系,通過優化低效 SQL 基本可以解決大部分問題。
MySQL 慢查詢時間(long_query_time)的默認值是10s在遇到性能問題時,若發現沒有慢查詢,建議將其參數調成1s ,再觀察業務周期內的慢查詢,進而對其慢查詢進行優化。若參數調整后,在其業務周期內依然未發現慢查詢,而 CPU 利用率依然偏高,建議升級 CPU 的配置,進而提高數據庫的整體性能。

內存利用率過高

一些特殊的 SQL 或字段類型會導致單個線程可能分配多次緩存,因此當出現 OOM 異常,都是由各個連接的私有內存造成的,通過限制數據庫的連接數和優化低效 SQL,可降低內存利用率過高的風險,若 MySQL 的內存利用率依然過高,可通過升級內存配置來提升數據庫的整體並發量和穩定性。詳細的內存參數介紹

主從延遲

binlog row 格式且表無主鍵或二級索引,當對大表進行 DML 操作(例如 deleteupdateinsert),在從庫進行 binlog 日志應用時,會根據主鍵或者二級索引來檢索需要更改的行,如對應表未創建主鍵或者二級索引,會產生大量的全表掃描進而降低了日志應用速度,從而產生數據延遲。

解決方案

為所有表創建主鍵,若表無法創建主鍵,建議選擇基數高的列創建二級索引。

建議采用 truncate 命令刪除表所有記錄。

大事務

原因
當主實例執行大數據量的 DML 操作,大量的 binlog 日志傳送到從庫時,從庫需要花費與主實例相同的時間來完成相應事務,進而導致從庫出現數據延遲。

解決方案
建議將大事務拆分為小事務,通過 where 條件限制每次要處理的數據量,有助於從庫迅速完成事務的執行,從而避免出現從庫數據的延遲。

DDL 操作

原因
與大事務原理類似,若 DDL 操作在主實例的執行時間很長,在從庫也會花費相同甚至更長時間來執行該操作,從而阻塞了 DDL 操作。

解決方案
建議在業務低峰期執行 DDL 操作。若因災備實例、只讀實例的查詢業務而阻塞了 DDL 操作,建議直接 KILL 掉引起阻塞的會話來恢復主從數據的同步。

實例規格過小

原因
只讀實例、災備實例的規格小於主實例且負載較高,會導致只讀實例、災備實例的數據延遲。

解決方案
建議只讀實例、災備實例規格大於等於主實例,如果只讀實例、災備實例承載了大量的分析類業務導致實例負載過高,需將其實例規格升級至合適的配置或者對其性能低效的 SQL 進行優化。

常見參數修改以及意義

character_set_server

默認值:LATIN1

是否需要重啟:是

作用:用於配置 MySQL 服務器的默認字符集。雲數據庫 MySQL 提供4種字符集,分別為 LATIN1UTF8GBKUTF8MB4,其中 LATIN1 支持英文字符,一個字符占用一個字節;UTF8 包含全世界所有國家需要用到的字符,是國際編碼,通用性強,一個字符占用三個字節;GBK 的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示;UTF8MB4 作為 UTF8 的超集,完全向下兼容,一個字符占用四個字節,且支持 emoji 表情

建議:購買實例后,根據業務所需要支持的數據格式選擇適合的字符集,確保客戶端與服務器端設置相同的字符集,避免因字符集設置不正確而引發亂碼的問題和不必要的重啟操作。

lower_case_table_names

默認值:0

是否需要重啟:是

作用:創建數據庫及表時,存儲與查詢時是否大小寫敏感。該參數可以設置的值為01,默認的參數值為0,表示創建數據庫及表時,存儲與查詢均區分大小寫,反之則不做區分。

建議:數據庫 MySQL 默認大小寫敏感,請根據您的業務需求及使用習慣進行合理的配置。

sql_mode

默認值:NO_ENGINE_SUBSTITUTION5.6版本),ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTION5.7版本)

是否需要重啟:否

作用:MySQL 可以運行在不同 sql 模式,sql 模式定義了 mysql 應該支持的 sql 語法、數據校驗等。
該參數5.6版本的默認參數值為NO_ENGINE_SUBSTITUTION,表示使用的存儲引擎被禁用或未編譯則拋出錯誤;5.7版本的默認參數值為ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTION
其中:

ONLY_FULL_GROUP_BY表示在 GROUP BY 聚合操作時,如果在 SELECT 中的列、HAVING 或者 ORDER BY 子句的列,必須是 GROUP BY 中出現或者依賴於 GROUP BY 列的函數列。

STRICT_TRANS_TABLES為啟用嚴格模式;NO_ZERO_IN_DATE 是否允許日期中的月份和日包含 0,且受是否開啟嚴格模式的影響。

NO_ZERO_DATE數據庫不允許插入零日期,且受是否開啟嚴格模式的影響。

ERROR_FOR_DIVISION_BY_ZERO在嚴格模式下,INSERT UPDATE 過程中,如果數據被零除,則產生錯誤而非警告,而非嚴格模式下,數據被零除時 MySQL 返回 NULL

NO_AUTO_CREATE_USER禁止 GRANT 創建密碼為空的用戶。

NO_ENGINE_SUBSTITUTION使用的存儲引擎被禁用或者未編譯則拋出錯誤。

建議:由於不同的 SQL 模式支持不同的 SQL 語法,建議根據您的業務場景及開發習慣進行合理的配置。

long_query_time

默認值:10

是否需要重啟:否

作用:用於指定慢查詢的界定時間,默認值為10s。當某個查詢執行時間為10s及以上,該查詢的執行情況會記錄於慢日志中,便於過后對慢查詢進行分析。

建議:基於客戶業務場景及性能敏感度不同,建議根據各自業務場景設置合理的值,以便事后進行性能分析。

3.1.2 優化 

3.1.3 備份 

3.1.4 恢復 

3.1.5 架構

案一:主備架構,只有主庫提供讀寫服務,備庫冗余作故障轉移用

 

 

 

高可用分析:高可用,主庫掛了,keepalive(只是一種工具)會自動切換到備庫。這個過程對業務層是透明的,無需修改代碼或配置。

高性能分析:讀寫都操作主庫,很容易產生瓶頸。大部分互聯網應用讀多寫少,讀會先成為瓶頸,進而影響寫性能。另外,備庫只是單純的備份,資源利用率50%,這點方案二可解決。

一致性分析:讀寫都操作主庫,不存在數據一致性問題。

擴展性分析:無法通過加從庫來擴展讀性能,進而提高整體性能。

可落地分析:兩點影響落地使用。第一,性能一般,這點可以通過建立高效的索引和引入緩存來增加讀性能,進而提高性能。這也是通用的方案。第二,擴展性差,這點可以通過分庫分表來擴展。

 

方案二:雙主架構,兩個主庫同時提供服務,負載均衡

 

 

 

高可用分析:高可用,一個主庫掛了,不影響另一台主庫提供服務。這個過程對業務層是透明的,無需修改代碼或配置。

高性能分析:讀寫性能相比於方案一都得到提升,提升一倍。

一致性分析:存在數據一致性問題。請看,一致性解決方案。

擴展性分析:當然可以擴展成三主循環,但筆者不建議(會多一層數據同步,這樣同步的時間會更長)。如果非得在數據庫架構層面擴展的話,擴展為方案四。

可落地分析:兩點影響落地使用。第一,數據一致性問題,一致性解決方案可解決問題。第二,主鍵沖突問題,ID統一地由分布式ID生成服務來生成可解決問題。

 

方案三:主從架構,一主多從,讀寫分離

 

 

高可用分析:主庫單點,從庫高可用。一旦主庫掛了,寫服務也就無法提供。

高性能分析:大部分互聯網應用讀多寫少,讀會先成為瓶頸,進而影響整體性能。讀的性能提高了,整體性能也提高了。另外,主庫可以不用索引,線上從庫和線下從庫也可以建立不同的索引(線上從庫如果有多個還是要建立相同的索引,不然得不償失;線下從庫是平時開發人員排查線上問題時查的庫,可以建更多的索引)。

一致性分析:存在數據一致性問題。請看,一致性解決方案。

擴展性分析:可以通過加從庫來擴展讀性能,進而提高整體性能。(帶來的問題是,從庫越多需要從主庫拉取binlog日志的端就越多,進而影響主庫的性能,並且數據同步完成的時間也會更長)

可落地分析:兩點影響落地使用。第一,數據一致性問題,一致性解決方案可解決問題。第二,主庫單點問題,筆者暫時沒想到很好的解決方案。

注:思考一個問題,一台從庫掛了會怎樣?讀寫分離之讀的負載均衡策略怎么容錯?

 

方案四:雙主+主從架構,看似完美的方案

 

 

高可用分析:高可用。

高性能分析:高性能。

一致性分析:存在數據一致性問題。請看,一致性解決方案。

擴展性分析:可以通過加從庫來擴展讀性能,進而提高整體性能。(帶來的問題同方案二)

可落地分析:同方案二,但數據同步又多了一層,數據延遲更嚴重。

 

一致性解決方案

第一類:主庫和從庫一致性解決方案

 

 

 

注:圖中圈出的是數據同步的地方,數據同步(從庫從主庫拉取binlog日志,再執行一遍)是需要時間的,這個同步時間內主庫和從庫的數據會存在不一致的情況。如果同步過程中有讀請求,那么讀到的就是從庫中的老數據。如下圖。

 

 

 

既然知道了數據不一致性產生的原因,有下面幾個解決方案供參考:

 

1、直接忽略,如果業務允許延時存在,那么就不去管它。

 

2、強制讀主,采用主備架構方案,讀寫都走主庫。用緩存來擴展數據庫讀性能 。有一點需要知道:如果緩存掛了,可能會產生雪崩現象,不過一般分布式緩存都是高可用的。

 

 

 3、選擇讀主,寫操作時根據庫++業務特征生成一個key放到Cache里並設置超時時間(大於等於主從數據同步時間)。讀請求時,同樣的方式生成key先去查Cache,再判斷是否命中。若命中,則讀主庫,否則讀從庫。代價是多了一次緩存讀寫,基本可以忽略。

 

 

 

4、半同步復制,等主從同步完成,寫請求才返回。就是大家常說的“半同步復制”semi-sync。這可以利用數據庫原生功能,實現比較簡單。代價是寫請求時延增長,吞吐量降低。

 

5、數據庫中間件,引入開源(mycat等)或自研的數據庫中間層。個人理解,思路同選擇讀主。數據庫中間件的成本比較高,並且還多引入了一層。

 

 

 第二類:DB和緩存一致性解決方案

 

 

 

先來看一下常用的緩存使用方式:

 

第一步:淘汰緩存;

第二步:寫入數據庫;

第三步:讀取緩存?返回:讀取數據庫;

第四步:讀取數據庫后寫入緩存。

 

注:如果按照這種方式,圖一,不會產生DB和緩存不一致問題;圖二,會產生DB和緩存不一致問題,即4.read先於3.sync執行。如果不做處理,緩存里的數據可能一直是臟數據。解決方式如下:

 

 

 

注:設置緩存時,一定要加上失效時間,以防延時淘汰緩存失敗的情況!

 

個人見解

 

1、加緩存和索引是通用的提升數據庫性能的方式;

2、分庫分表帶來的好處是巨大的,但同樣也會帶來一些問題,詳見MySQL數據庫之互聯網常用分庫分表方案(https://www.cnblogs.com/littlecharacter/p/9342129.html

3、不管是主備+分庫分表還是主從+讀寫分離+分庫分表,都要考慮具體的業務場景。某8到家發展四年,絕大部分的數據庫架構還是采用方案一和方案一+分庫分表,只有極少部分用方案三+讀寫分離+分庫分表。另外,阿里雲提供的數據庫雲服務也都是主備方案,要想主從+讀寫分離需要二次架構。

4、記住一句話:不考慮業務場景的架構都是耍流氓。

 參考鏈接:https://zhuanlan.zhihu.com/p/98546065

 

 

 

 

 

 

 

 

 

3.2 Oracle 

3.2.1 部署 

3.2.2 優化 

3.2.3 備份 

3.2.4 恢復 

3.2.5 架構

3.3 MongoDB 

3.3.1 部署 

3.3.2 優化 

3.3.3 備份 

3.3.4 恢復 

3.3.5 架構

3.4 Redis 

3.4.1 部署 

一鍵部署腳本

#!/bin/bash
wget -c http://download.redis.io/releases/redis-3.2.9.tar.gz    #下載源碼
tar -xvf redis-3.2.9.tar.gz                     #解壓
cd redis-3.2.9/                         
make                                #編譯,如果報zmalloc.h:50:31: 致命錯誤:jemalloc/jemalloc.h:沒有那個文件或目錄之類的錯誤,執行make MALLOC=libc
make install                            #安裝
./utils/install_server.sh                   #安裝並啟動服務,直接回車默認即可

 

3.4.2 優化 

3.4.3 備份 

3.4.4 恢復 

3.4.5 架構

3.5 Memcached 

3.5.1 部署

安裝包下載地址

鏈接:https://pan.baidu.com/s/1vehZ5odzXFKwNjWT9_W0TA 
提取碼:bsk9

將以上文件下載到root家目錄下

一鍵部署腳本

#!/bin/bash
yum install -y apr* autoconf automake bison cloog-ppl compat* cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c++ gtk+-devel gd gettext gettext-devel glibc kernel kernel-headers keyutils keyutils-libs-devel krb5-devel libcom_err-devel libpng* libjpeg* libsepol-devel libselinux-devel libstdc++-devel libtool* libgomp libxml2 libxml2-devel  libXpm* libtiff libtiff* libX* make mpfr ncurses* ntp openssl openssl-devel patch pcre-devel perl php-common php-gd policycoreutils  ppl telnet t1lib t1lib* nasm nasm* wget zlib-devel gmp-devel
tar -zxvf libevent-2.0.22-stable.tar.gz 
cd libevent-2.0.22-stable
./configure --prefix=/usr/local/libevent
make
make install
cdtar -zxvf memcached-1.4.25.tar.gz 
cd memcached-1.4.25
./configure --prefix=/usr/local/memcached -with-libevent=/usr/local/libevent
make
make install
groupadd memcached 
useradd -g memcached memcached -s /bin/false 
ln -s /usr/local/memcached/bin/memcached   /usr/local/bin/memcached
/usr/local/memcached/bin/memcached -d -m 4096 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /usr/local/memcached/memcached.pid

3.5.2 優化 

3.5.3 備份 

3.5.4 恢復 

3.5.5 架構

4. 消息隊列 

4.1 ActiveMQ 

4.1.1 部署 

4.1.2 優化 

4.1.3 備份 

4.1.4 恢復 

4.1.5 架構

4.2 RabbitMQ 

4.2.1 部署 

安裝包下載地址:

鏈接:https://pan.baidu.com/s/1dQjSCQz_HmMKHRFEnmvGvA 
提取碼:4n3a

一鍵部署腳本

 

yum install gcc-c++ ncurses-devel fop unixODBC-devel mesa-libGLU-devel gtk3* bzip2 openssl openssl-devel make perl -y   #安裝依賴
bzip2 -d wxWidgets-3.1.3.tar.bz2   #解壓
tar -xvf wxWidgets-3.1.3.tar     #解壓
cd wxWidgets-3.1.3
 ./configure               #編譯安裝
make & make install
ldconfig                  #重新加載動態庫
cd ..
tar -zxvf otp_src_22.1.tar.gz 
cd otp_src_22.1
./configure --prefix=/usr/local/erlang --without-javac
make
make install
echo 'export PATH=$PATH:/usr/local/erlang/bin'>> /etc/profile    #加入系統PATH
source /etc/profile
erl        #不報錯說明安裝成功
cd
xz -d rabbitmq-server-generic-unix-3.8.3.tar.xz 
tar -xvf rabbitmq-server-generic-unix-3.8.3.tar 
cd rabbitmq_server-3.8.3/
cd sbin/     #相關命令都在這里,可以考慮把這個路徑計入系統PATH
./rabbitmq-server   #不報錯,說明rabbitmq安裝成功

 

4.2.2 優化 

4.2.3 備份 

4.2.4 恢復 

4.2.5 架構

5. 監控 

5.1 Zabbix 

5.1.1 部署

部署腳本如下

寫好如下兩個腳本,只需要執行zabbix部署腳本即可。mysql初始化腳本會被自動調用

mysql初始化腳本mysqlpasswd.sh

#!/usr/bin/expect
spawn mysql_secure_installation
expect "Enter current password for root (enter for none):"
send "\r"
expect "Set root password? "
send "Y\r"
expect "New password:"
send "123456\r"
expect "Re-enter new password:"
send "123456\r"
expect "Remove anonymous users? "
send "y\r"
expect "Disallow root login remotely? "
send "n\r"
expect "Remove test database and access to it? "
send "y\r"
expect "Reload privilege tables now? "
send "y\r"
expect eof

zabbix部署腳本

rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
yum clean all
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent mariadb mariadb-server httpd php php-fpm
systemctl stop firewalld
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config   #2019.5.6新增,不執行該語句,你會發現重啟服務器后,zabbix服務器無法正常啟動了
setenforce 0
systemctl start mariadb
systemctl enable mariadb  #新增,記住,一定要養成將服務器設置為自啟動的狀態,否則下次服務器重啟后,你就得慢慢排錯了。。。
yum install expect -y
chmod +x mysqlpasswd.sh 
/root/mysqlpasswd.sh  
mysql -uroot -p123456 -e "create database zabbix character set utf8 collate utf8_bin;"
mysql -uroot -p123456 -e "grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix'"
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -pzabbix zabbix #如果提示文件不存在就執行find / -name create.sql.gz找到文件對應的位置
sed -i s/'# DBPassword='/'DBPassword=zabbix'/g /etc/zabbix/zabbix_server.conf
sed -i s/'Europe\/Riga'/'Asia\/Shanghai'/g /etc/httpd/conf.d/zabbix.conf
sed -i  s/'# php_value date.timezone Asia\/Shanghai'/'php_value date.timezone Asia\/Shanghai'/g /etc/httpd/conf.d/zabbix.conf
systemctl start zabbix-server zabbix-agent httpd #現在通過web訪問ip/zabbix就可以看到安裝界面了

 

5.2 Prometheus 

5.2.1 部署

下載安裝包

https://prometheus.io/download/

 

 

 開始安裝

[root@localhost ~]# tar -xvf prometheus-2.14.0.linux-amd64.tar.gz
[root@localhost ~]# cd prometheus-2.14.0.linux-amd64
[root@localhost prometheus-2.14.0.linux-amd64]# cat prometheus.yml |grep 9090    #因為我需要在外部訪問,所以把以下部分的localhost修改為服務器IP
    - targets: ['192.168.100.128:9090']
[root@localhost prometheus-2.14.0.linux-amd64]# ./prometheus

 

5.3 Cacti 

5.4 Nagios 

5.4.1 部署

建議一步步執行

yum install -y gcc gcc-c++ httpd php php-gd glibc glibc-common gd gd-devel perl perl-devel traceroute bind-utils ntpdate mtr wget nc mailx 
wget https://jaist.dl.sourceforge.net/project/nagios/nagios-4.x/nagios-4.1.0/nagios-4.1.0.tar.gz 
tar zxf nagios-4.1.0.tar.gz 
cd nagios-4.1.0/ 
useradd -m nagios 
passwd nagios 
groupadd nagcmd 
usermod -a -G nagcmd nagios 
usermod -a -G nagcmd apache 
./configure –with-command-group=nagcmd 
make all 
make install 
make install-init 
make install-config 
make install-commandmode 
make install-webconf 
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin //增加用戶,回車后需要輸入密碼,登錄nagios時需要這個帳號和密碼 
systemctl start httpd //開啟服務 
getenforce //需要把防火牆和selinux關閉,selinux關閉命令 setenforce 0,防火牆關閉命令systemctl stop firewalld,如何你都沒有關閉就執行這兩條命令 
chkconfig –add nagios //添加到系統服務列表 
service nagios start //開啟服務,如果不行就使用systemctl start nagios

 

6. CI/CD 

6.1 Jenkins 

6.1.1 Jenkins實現CI/CD

使用Jenkins實現CI/CD.這個雖然是非常簡單和基礎的功能,但是我用了很長時間才摸着石頭過了河.

本文使用的技術為:

Jenkins+Git+Maven+Tomcat

簡單來說:

通過Jenkins拉取git倉庫代碼,使用遠程命令將maven編譯測試好的war包發送(發布)到遠程Tomcat服務器上.

我這里是使用兩台虛擬機,一台是Jenkins,一台是遠程Tomcat

Jenkins/Git/Maven在同一台服務器上,所以下面的內容,需要根據你的具體情況做微調

具體步驟:

以下部分是配置Jenkins服務器

(1)下載安裝包

下載jdk/jenkins/maven/tomcat到Jenkins服務器

相關安裝包下載地址
鏈接:https://pan.baidu.com/s/1iMihWl5GKPSRLZ1UKgUXbg
提取碼:mb3k

(2)部署java環境

tar -zxvf jdk-8u111-linux-x64.tar.gz

mv jdk1.8.0_111 /usr/local/jdk

修改/etc/profile文件,文件末尾增加以下內容

JAVA_HOME=/usr/local/jdk
JRE_HOME=/usr/local/jdk/jre
CLASS_PATH=.:/$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

添加完畢后,執行source /etc/profile使修改內容立即生效 

執行java -version會顯示剛剛安裝的1.8.0_144那個版本

(3)安裝tomcat

tar -zxvf apache-tomcat-9.0.33.tar.gz

(4)部署jenkins

cp jenkins.war apache-tomcat-9.0.33/webapps/

apache-tomcat-9.0.33/bin/startup.sh

(5)配置jenkins

http://Jenkins服務器ip:8080/jenkins

 查看密鑰

[root@130-node1 ~]# cat /root/.jenkins/secrets/initialAdminPassword
d2b1fcd02b374a6ca213a3e505c939d9
[root@130-node1 ~]#點擊確認,在一路默認安裝下去即可

建議使用谷歌瀏覽器進行安裝.安裝插件時如果提示失敗,多重試幾次即可

安裝好后的jenkins界面

 6.Jenkins服務器安裝Git和Maven

git安裝步驟:

yum install git -y

Maven安裝步驟:

tar -zxvf apache-maven-3.6.3-bin.tar.gz

mv apache-maven-3.6.3 /usr/local/maven

配置/etc/profile

[root@130-node1 ~]# tail -n 6 /etc/profile
JAVA_HOME=/usr/local/jdk
JRE_HOME=/usr/local/jdk/jre
CLASS_PATH=.:/$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
MAVEN_HOME=/usr/local/maven
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH MAVEN_HOME
[root@130-node1 ~]# 

使配置生效source /etc/profile

驗證是否安裝成功

[root@130-node1 ~]# mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_111, vendor: Oracle Corporation, runtime: /usr/local/jdk/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1062.el7.x86_64", arch: "amd64", family: "unix"
[root@130-node1 ~]#

獲取git和maven的命令所在位置

[root@130-node1 SayHi]# which git /usr/bin/git [root@130-node1 SayHi]# which mvn /usr/local/maven/bin/mvn [root@130-node1 SayHi]# 

7.進入Jenkins配置git和maven

配置git

Manage Jenkins->Global Tool Configuration

 配置maven

注意:要取消勾選自動安裝,才會出現對應配置項

直接保存即可

8.Git服務器上新建Maven Web項目

我這里是在Jenkins服務器上執行.第一次執行需要下載很多東西,后面就好你.如果有提示錯誤,多嘗試幾次就可以

復制代碼

mvn archetype:generate -DgroupId=com.companyname.automobile -DartifactId=SayHi -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal   #SayHi是項目名,可自定義,報錯的話可以多執行幾次 cd SayHi/ mvn clean package
git init  #我們需要將這個項目初始化為代碼庫
git add ./*
git config --global user.email "126@qq.com"  #需要標記git用戶,用來識別是誰提交的代碼
git config --global user.name "bp"
git commit -m "add first code"
復制代碼

我們來看一下Maven Web項目結構

復制代碼
[root@130-node1 SayHi]# yum install tree -y
[root@130-node1 SayHi]# tree . |-- pom.xml |-- src | `-- main | |-- resources | `-- webapp | |-- index.jsp | `-- WEB-INF | `-- web.xml `-- target |-- classes |-- maven-archiver | `-- pom.properties |-- SayHi | |-- index.jsp | |-- META-INF | `-- WEB-INF | |-- classes | `-- web.xml `-- SayHi.war 12 directories, 7 files [root@130-node1 SayHi]# cat src/main/webapp/index.jsp <html> <body> <h2>Hello World!</h2> </body> </html> [root@130-node1 SayHi]#
復制代碼

我們的Web項目頁面內容就是index.jsp.如果CI/CD成功的話,我們可以在遠程Tomcat服務器上訪問到這個頁面

9.在Jenkins新增項目任務

創建一個新任務->選擇freestyle project即可.

代碼管理:

我沒有使用用戶帳號秘密憑證,直接通過ssh-copy-id免密登陸git服務器實現的(額,我這里直接ssh免密登陸本機...).通過帳號密碼的話,一直會報錯,搞不懂....

[root@130-node1 SayHi]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:76f9AbSe8JwIovcor9/wUJmE3KIKq8PPXoLTa8Jrnjs root@130-node1
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|     . o         |
|      + o   .    |
|     . o o . .   |
|.   . . S . o    |
| oo. . o o * +   |
|+o.o..+   o * .  |
|oE+.=. B . ..  . |
|+*O=.=+ + oo...  |
+----[SHA256]-----+
[root@130-node1 SayHi]# ssh-copy-id 192.168.2.130
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.130 (192.168.2.130)' can't be established.
ECDSA key fingerprint is SHA256:esdK+w3MSmAlYRl8jeApc+l3TPkJT8ZPVgDt1rWxmkQ.
ECDSA key fingerprint is MD5:dc:f6:b3:1b:a6:0d:fa:36:21:b8:85:7d:e9:bb:41:a7.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.130's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.2.130'"
and check to make sure that only the key(s) you wanted were added.

[root@130-node1 SayHi]# 

配置好git地址.輸入git地址后,系統會自動檢測地址是否正確,不正確會報錯.要配置到不報錯為止

我的git倉庫地址root@192.168.2.130:/root/SayHi

 配置構建:

點擊構建,下拉選擇Execute shell

 配置執行指定命令將war包發送到遠程tomcat的webapp下

PS:請執行配置遠程tomcat服務器,安裝tomcat即可.可參考以下命令

[root@bp-vm webapps]# tail -n 6 /etc/profile
JAVA_HOME=/usr/local/jdk
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:/$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_JRE/bin
export JAVA_HOME JRE_HOME CLASS_PATh PATH
export JAVA_HOME CLASS_HOME PATH
[root@bp-vm webapps]# source /etc/profile
[root@bp-vm webapps]# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
[root@bp-vm webapps]# 

繼續配置我們的jenkins

因為我們需要使用scp傳送文件,所以我們先配置好jenkins服務器可以免密鑰登陸遠程tomcat服務器

[root@130-node1 SayHi]# ssh-copy-id root@192.168.2.129
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.129 (192.168.2.129)' can't be established.
ECDSA key fingerprint is SHA256:esdK+w3MSmAlYRl8jeApc+l3TPkJT8ZPVgDt1rWxmkQ.
ECDSA key fingerprint is MD5:dc:f6:b3:1b:a6:0d:fa:36:21:b8:85:7d:e9:bb:41:a7.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.129's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.2.129'"
and check to make sure that only the key(s) you wanted were added.

[root@130-node1 SayHi]#

在構建部分,我使用的命令是scp -r $WORKSPACE/target/SayHi.war root@192.168.2.129:/root/apache-tomcat-9.0.33/webapps

 5.開始構建

進入該項目,點擊左側的Build Now

這是我的構建日志.可以看到,構建成功的提示

 6.確認是否正常發布到遠程Tomcat服務器

在遠程Tomcat上查看webapps目錄,可以看到有一個SayHi.war,因為Tomcat處於運行狀態,所以還自動解壓出來你SayHi目錄

[root@bp-vm webapps]# pwd
/root/apache-tomcat-9.0.33/webapps
[root@bp-vm webapps]# ls
docs examples host-manager manager ROOT SayHi SayHi.war
[root@bp-vm webapps]#

嘗試訪問遠程Tomcat服務器服務

搞定!!!

Git倉庫上(我這里的即是Git倉庫服務器也是是Jenkins服務器)的Maven Web項目成功編譯測試並發布到遠程Tomcat服務器上,我們可以直接訪問到發布的Web項目服務

7. 日志管理 

7.1 ELK 

7.1.1 部署

環境:Centos7.6最小化安裝
配置:1C2G

下載好jdk和對應的elk包
[root@bp-vm ~]# ls
anaconda-ks.cfg                 jdk-8u111-linux-x64.tar.gz  logstash-7.6.2.rpm
elasticsearch-7.6.2-x86_64.rpm  kibana-7.6.2-x86_64.rpm


配置java環境
[root@bp-vm ~]#tar -zxf jdk-8u111-linux-x64.tar.gz -C /usr/local/
[root@bp-vm ~]# tail -n 5 /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_111
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jre:$JAVA_HOME/lib/tools.jre:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME
[root@bp-vm ~]# source /etc/profile
[root@bp-vm ~]#java -version

部署elasticsearch
[root@bp-vm ~]#yum install elasticsearch-7.6.2-x86_64.rpm -y
[root@bp-vm ~]# tail -n 7 /etc/elasticsearch/elasticsearch.yml   #配置該文件
cluster.name: elk-stack
node.name: elk.com
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.2.133:9300"]            #這個需要修改為自己的ip
discovery.zen.minimum_master_nodes: 1
cluster.initial_master_nodes: ["elk.com"]            #和node.name一致
[root@bp-vm ~]#ss -ntlup| grep -E "9200|9300"

 

 

 部署logstash
[root@bp-vm ~]#yum install logstash-7.6.2.rpm -y
[root@bp-vm ~]#echo 'path.config: /etc/logstash/conf.d' >>/etc/logstash/logstash.yml
[root@bp-vm ~]# cat  /etc/logstash/conf.d/syslog.conf    #配置該文件
input {

  file {
     type => "logtest"
     path => "/var/log/messages"
     start_position => "beginning"
  }

  beats {
     port => 5044
  }

}

 #filter { }

output {

  stdout {
   codec => rubydebug { }
  }

  elasticsearch {
    hosts => ["http://192.168.2.133:9200"]    #修改為自己的ip
    index => "%{type}-%{+YYYY.MM.dd}"
  }

}
[root@bp-vm ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/syslog.conf --path.settings /etc/logstash --config.test_and_exit
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2020-04-18T13:19:00,946][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/var/lib/logstash/queue"}
[2020-04-18T13:19:01,214][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/var/lib/logstash/dead_letter_queue"}
[2020-04-18T13:19:02,193][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-04-18T13:19:04,461][INFO ][org.reflections.Reflections] Reflections took 98 ms to scan 1 urls, producing 20 keys and 40 values
Configuration OK
[2020-04-18T13:19:07,196][INFO ][logstash.runner          ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
[root@bp-vm ~]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/syslog.conf --path.settings /etc/logstash   #前台運行logstash

稍等一會,就會出現類似以下的內容

 

 

 

部署kibana
[root@bp-vm ~]# yum install kibana-7.6.2-x86_64.rpm -y
[root@bp-vm ~]# egrep -v "^#|^$" /etc/kibana/kibana.yml  #配置該文件
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.2.133:9200"]  #修改為自己的ip
[root@bp-vm ~]# yum install -y git
[root@bp-vm ~]#git clone https://github.com/anbai-inc/Kibana_Hanization.git
[root@bp-vm ~]#cd Kibana_Hanization/old
[root@bp-vm ~]#python main.py /usr/share/kibana    #漢話kibana
[root@bp-vm ~]#systemctl start kibana
[root@bp-vm ~]# netstat -tlnp|grep 5601
tcp        0      0 0.0.0.0:5601            0.0.0.0:*               LISTEN      11807/node          
[root@bp-vm ~]#

配置kibana

點擊左下角那個指針圖標->輸入*->選擇timestamp

 

 最終效果

 

 

8. 高可用/集群 

8.1 Lvs 

8.1.1 部署

執行命令。yum源自帶安裝源

yum install ipvsadm*

 

8.2 Keepalived 

8.2.1 部署

yum源自帶

yum install keepalived -y

 

8.3 Haproxy 

8.3.1 部署

yum -y install gcc           
tar zxf haproxy-1.4.21.tar.gz
mv haproxt-1.4.21 haproxy
make TARGET=linux31 PREFIX=/usr/local/haproxy    將haproxy安裝到指定目錄
make install PREFIX=/usr/local/haproxy

 

9. 負載均衡 

9.1 Nginx 

9.1.1 部署

[root@bogon ~]# wget -c http://nginx.org/download/nginx-1.7.9.tar.gz #下載安裝包
[root@bogon ~]# tar zxvf nginx-1.7.9.tar.gz #解壓
[root@bogon ~]# cd nginx-1.7.9/
[root@bogon nginx-1.7.9]# yum -y install gcc-c++ pcre-devel zlib-devel #安裝依賴,主要是安裝這些,而接下來的三步則是編譯安裝必須執行的,其中prefix選項是指安裝位置
[root@bogon nginx-1.7.9]# ./configure --prefix=/usr/etc/nginx
[root@bogon nginx-1.7.9]# make
[root@bogon nginx-1.7.9]# make install
[root@bogon nginx-1.7.9]# cd /usr/etc/nginx
[root@bogon ngin]# cd sbin
[root@bogon sbin]# ./nginx #啟動服務,現在訪問localhost就能看到nginx的歡迎界面了

 

9.2 F5 

10. 性能測試 

10.1 Ab 

10.1.1 部署

yum install httpd-tools -y 

 

10.2 LoadRunner 

11. 存儲技術 

11.1 NFS 

11.1.1 部署

yum install nfs-utils rpcbind -y #安裝NFS相關軟件
mkdir /NFS #創建NFS共享目錄
echo "/NFS *(rw,no_root_squash,sync)">> /etc/exports #共享該NFS共享目錄。建議加上no_root_squash,否則會導致同步時報錯(待確認)
systemctl start rpcbind #開啟rpcbind服務
systemctl start nfs #開啟nfs服務
showmount -e 127.0.0.1  #驗證NFS共享目錄是否共享成功,如下則說明共享成功
Export list for 127.0.0.1: /NFS *

 

11.2 NAS 

12. 版本管理 

12.1 SVN 

12.1.1 部署

安裝包下載地址:

https://pan.baidu.com/s/1miwdBc8 

(1)配置java環境

(2)執行以下操作

建議一步步執行

tar xvf CollabNetSubversionEdge-5.1.4_linux-x86_64.tar.gz 
mkdir /application 
mv csvn/ /application/ 
useradd csvn 
passwd csvn 
chown -R csvn:csvn /application/ 
vim /etc/sudoers     #添加下面一行使csvn可以使用sudo 
    csvn ALL=(ALL) ALL
ln -s /application/csvn/bin/csvn /etc/csvn 
ln -s /application/csvn-httpd /etc/csvn-httpd #原文這里是錯誤的,推薦直接find / -name csvn-httpd
啟動服務:csvn csvn-httpd
service csvn start #這兩條語句,我執行時提示無法識別服務,所以我是直接到csvn下的bin目錄下執行這兩個腳本./csvn start 和 ./csvn-httpd start 
service csvn-httpd start

訪問http://ip:3343/csvn,默認用戶名密碼為:admin admin 進去之后可以進行其它設置。

12.2 Git 

12.2.1 部署

yum install git -y
mkdir -p /data/test/bp.git  #創建倉庫文件
cd /data/test    
git init bp.git       #初始化
useradd git    #創建git用戶
chown -R git:git /data/test/bp.git    #修改權限,因為git用戶需要對這個文件夾內容進行增刪改查
useradd  bp    #新建一個用戶,我們就用這個用戶登錄git服務器進行操作
usermod -G git bp    #把新用戶添加到git組里,因為這個組已經賦予權限了,后續新增用戶直接加入git組即可
passwd bp #修改bp密碼,因為在windows下git時需要密碼

 

13. 備份工具 

13.1 Rsync 

13.1.1 Rsync+NFS實現增量備份 

(1)架構圖

 

 

 (2)自建NFS服務器

在NFS服務器上執行

yum install nfs-utils rpcbind -y #安裝NFS相關軟件
mkdir /NFS #創建NFS共享目錄
echo "/NFS *(rw,no_root_squash,sync)">> /etc/exports #共享該NFS共享目錄。建議加上no_root_squash,否則會導致同步時報錯(待確認)
systemctl start rpcbind #開啟rpcbind服務
systemctl start nfs #開啟nfs服務
showmount -e 127.0.0.1  #驗證NFS共享目錄是否共享成功,如下則說明共享成功
Export list for 127.0.0.1:
/NFS *

(3)掛載NFS

在需要掛載NFS的服務器上執行

此處為Jumpserver服務器

yum install nfs-utils rpcbind -y #安裝NFS相關軟件
mkdir /NFS1 #創建文件夾用來掛載NFS
mount -t nfs NFS服務器ip:/NFS /NFS1 #將NFS共享目錄/NFS掛載到本地/NFS1
df -Th #查看是否掛載成功
ssh-keygen #創建秘鑰
ssh-copy-id root@服務器Node的ip #傳輸秘鑰,免密登錄

(4)配置增量備份腳本

#!/bin/bash
BackupSource=$1 #遠程目標
BackupRoot=$2 #增量備份路徑
BackupName=$3 #備份的名字
BackupNum=$4                   #保留多少個增量備份(用於每周歸檔文件)
checkDir() { #檢查目錄 $1 是否存在,不存在則創建
    if [ ! -d "${BackupRoot}/$1" ] ; then
        mkdir -p "${BackupRoot}/$1"
    fi
}
for i in `seq $(($BackupNum - 1)) -1 1`      #處理增量備份目錄的滾動覆蓋
    do
        if [ -d "${BackupRoot}/daily/$BackupName.$i" ] ; then
            /bin/rm -rf "${BackupRoot}/daily/$BackupName.$((i + 1))"
            mv "${BackupRoot}/daily/$BackupName.$i" "${BackupRoot}/daily/$BackupName.$((i + 1))"
        fi
    done
checkDir "daily" #檢查目錄是否存在
checkDir "daily/${BackupName}.0/" #檢查全量備份(包含所有最新內容的備份目錄)
checkDir "daily/${BackupName}.1/" #檢查增量備份目錄是否存在,不存在則創建
rsync -av --delete -b --backup-dir=${BackupRoot}/daily/${BackupName}.1 $BackupSource ${BackupRoot}/daily/${BackupName}.0

(5)增量備份恢復腳本

[root@VM_16_6_centos ~]# cat rsyncrecover.sh #腳本內容
#!/bin/bash
OlderDir="$1" #增量備份目錄
BackupRoot="$2" #全量備份目錄
BackupName="$3" #輸入你的備份名
BackupNum="$4" #總的增量備份數量(用於遞歸)
where="$5" #輸入你想要恢復的備份
for i in `seq $BackupNum -1 $where` #從最舊的備份開始,一直恢復到想要的那個備份位置
do
rsync -av  $OlderDir$BackupName.$i/    $BackupRoot$BackupName.0
done

 

13.1.2 Rsync+inotify實現實時備份 

(1)實驗簡介

該實驗是為了實現服務器S上的文件夾內容變動后,自動同步到服務器C上,使兩個服務器S和C文件內容保持一致.原理是當inotify監聽到文件內容變動后,自動調用rsync進行文件和文件夾的同步.

系統:Centos7.3

服務器S:192.168.2.128  #需要同步內容的服務器,我們簡稱為S

客戶端C:192.168.2.137  #等待同步內容的服務器,我們簡稱C

我們的最終目的是實現,將S上的內容實時同步到C上

 (2)下載inotify-tools並上傳到服務器S

下載地址

https://github.com/rvoicilas/inotify-tools/wiki

 

 

 (3)關閉防火牆和selinux

在S和C上分別執行:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/enforcing/disabled/" /etc/selinux/config

(4)配置S

在服務器S上執行以下操作
yum install rsync gcc -y
#設置目錄

vi /etc/rsyncd.conf  #文件內容如下

[node1]           #模塊名,可自定義,用來標志和識別rsync同步目錄,建議和path的值目錄名一致,方便記憶
        path = /node1                 #我們需要同步的目錄,這里我假設為node1
        auth user = rsync_backup      #指定用戶同步,建議在系統里也添加這個用戶,並指定該用戶位node1的擁有者
        secrets file = /etc/rsyncd.secrets      #指定保存用戶密碼文件

執行以下命令

mkdir /node1
useradd rsync_backup  #添加rsync用戶用於同步
chown -R rsync_backup:rsync_backup  /node1  #修改文件夾擁有者
rsync --daemon  #啟動服務
netstat -anpt|grep 873  #查看rsync是否正常啟動
echo "rsync_backup:123456" >/etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
touch /node1/file{1..3}
tar -zxvf inotify-tools*
rm -rf *.gz
cd inotify-tools*
./configure && make && make install

編輯實時同步腳本/tmp/1.sh

#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,create,move,delete,attrib /node1 |while read events   
#-m –monitor始終保持事件監聽狀態 -r –recursive遞歸查詢目錄,-q –quiet打印監控事件的信息,-e –event指定刪、增、改等事件
do
rsync -a --delete /node1 這里輸入服務器C的IP::node2 
#-a歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等價於 --delete 刪除那些接收端還有而發送端已經不存在的文件
echo "`date +'%F %T'` 出現事件 $events" >>/tmp/rsync.log 2>&1
done

(5)配置C

yum install rsync 

vi /etc/rsyncd.conf #修改文件內容

[node2]
path=/node2/
read only=false
uid=rsync_backup
gid=rsync_backup

繼續執行以下命令

useradd rsync_backup  #添加rsync用戶用於同步
mkdir /node2
chown -R rsync_backup:rsync_backup  /node2  #修改文件夾擁有者
rsync --daemon
netstat -tlnp|grep 873

(6)測試實時同步功能

在服務器S上執行以下操作
nohup sh /tmp/1.sh &   #執行該1.sh腳本,啟動監聽,當S上有內容變動時,會自動同步到C上

嘗試在服務器S上創建一個文件
echo "aaa">>/node1/file1

那么在服務器C上也會自動在對應位置上生產該新文件

14. 虛擬化 

14.1 KVM 

14.1.1 部署

實驗環境:

系統:Centos7.7最小化安裝

配置:1C4G

平台:VM

虛機配置成靜態IP地址

配置虛擬機,開啟VT_x/EPT or AMD-V/RVI

(1)配置虛機支持虛擬化

需要確認是否支持虛擬化

grep -E 'vmx|svm' /proc/cpuinfo 

出現vmx之類的虛擬化技術字眼即代表支持虛擬化。不同cpu顯示的可能不一樣

確認支持虛擬化后再執行以下步驟

(2)開始安裝

 

yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install -y 
systemctl enable libvirtd && systemctl start libvirtd
lsmod | grep kvm          #正常會顯示kvm
virsh -c qemu:///system list
ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
mkdir /vm-images          #存放kvm虛擬機目錄  
mkdir -p /data/iso         #存放iso鏡像目錄
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-br0

注意,還需要修改
/etc/sysconfig/network-scripts/ifcfg-br0如下兩個參數值 TYPE=Bridge DEVICE=br0 echo "BRIDGE=br0" >>/etc/sysconfig/network-scripts/ifcfg-ens33
注意,還需要注釋vi
/etc/sysconfig/network-scripts/ifcfg-ens33如下參數值,防止ip沖突 #IPADDR=x.x.x.x #NETMASK=x.x.x.x #GATEWAY=x.x.x.x #DNS1=x.x.x.x echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf #做流量轉發 sysctl -p /etc/sysctl.conf      #使/etc/sysctl.conf配置生效 systemctl restart NetworkManager.service #重啟網卡服務,使網卡配置生效
修改配置
vi /etc/ssh/sshd_config #ssh開啟X11轉發,取消以下原有的注釋 X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost yes UseDNS yes yum install tigervnc-server -y vncserver      #隨便輸入密碼123456,然后n export DISPLAY=bp-vm主機名:1 #以上命令結束后會顯示XX:1之類的字眼,按照修改即可 xhost + yum install xorg-x11-apps -y #安裝xclock測試是否可以正常彈出圖形界面
xclock                        #執行xclock應該會跳出一個時鍾
yum install virt-manager -y 另外需要注意如果系統使用中文編碼的話,會有亂碼問題.建議直接使用英文編碼即可 在windows系統上安裝好xshell和Xmanager.必須安裝xmanager,否則無法彈出virt-manager界面,對kvm進行管理 配置xshell會話時,需要配置屬性→隧道→轉發X11到xmanager
virt-manager

 

virt-manager彈出的窗口

14.2 Xen 

14.2.1 部署

通過官網下載安裝鏡像即可,像平時安裝虛擬機一樣。

14.3 VMware 

14.4 Hyper-V 

15. 容器 

15.1 Docker 

15.1.1 部署

yum install -y yum-utils device-mapper-persistent-data lvm2  
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #添加docker的yum源
yum list docker-ce --showduplicates | sort -r  #查看可用版本
yum install -y docker-ce-17.12.0.ce  #安裝指定版本docker

 

15.2 K8s 

15.2.1 部署

以下實驗都是在VM虛擬機中進行部署的,僅供個人學習測試,不建議直接上生產環境.

PS:其中,master的CPU核數至少需要2核,否則會直接報錯,還沒有測試過1G內存是否可以正常安裝

 

 

部署步驟:


三個節點分別執行以下命令
192.168.2.130執行該命令
hostnamectl set-hostname k8s-master
192.168.2.134執行該命令
hostnamectl set-hostname k8s-node01
192.168.2.135執行該命令
hostnamectl set-hostname k8s-node02

 

三個節點全部執行以下命令
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
swapoff -a                         #關閉swap交換分區
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab      #禁止swap交換分區開機自啟


#配置hosts文件
cat >> /etc/hosts << EOF        
192.168.2.130 k8s-master
192.168.2.134 k8s-node01
192.168.2.135 k8s-node02
EOF


#內核調整,將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system                        #使上一條命令的配置生效
yum install -y ntpdate                  #安裝ntpdate用於校准時間,確保master和node時間同步
ntpdate time.windows.com            #校准時間
yum install wget -y


#如果以下安裝docker的方式失敗,可以參考我的博客https://www.cnblogs.com/biaopei/p/11937292.html
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
#以下命令用來配置鏡像地址..
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
systemctl enable docker
systemctl start docker


#因為默認k8s鏡像倉庫需要翻出去,所以配置國內鏡像地址
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
systemctl enable kubelet

 

以下操作只需要在master中執行
#記得將192.168.2.130修改為master的ip地址,其余不變.需要等待幾分鍾才可執行完成.會提示[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver.只是警告可忽略.(如果master的cpu核數只有1核,這里還會提示cpu核數達不到要求的2核)
kubeadm init \
--apiserver-advertise-address=192.168.2.130 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.15.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16


#執行完上一條語句后,會有類似如下命令的提示,根據提示執行即可.還有一條kubeadm join 192.168.2.130:6443 --token,這個是用來在node上執行,加入到k8s集群中的,我們稍后需要用到
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

以下操作在兩個node中執行
#不要直接復制這里的,是kubeadm init執行完成后,后面提示的那條語句.就是我們剛才說的那個
kubeadm join 192.168.2.130:6443 --token c1qboh.pg159xmk61z5rbeg \
    --discovery-token-ca-cert-hash sha256:ff09b3a7b0989de094b73e811bf378d8ab1cf3c1e413e3753ebd5de826075931

以下操作在master執行
#配置flannel網絡
wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

vi kube-flannel.yml
#修改以下行對應內容,注意不能使用tab鍵,只能使用空格進行對啟,注意格式要按照原來的,不能多一個空格,也不能少一個空格

106    image: lizhenliang/flannel:v0.11.0-amd64   
120    image: lizhenliang/flannel:v0.11.0-amd64

kubectl apply -f kube-flannel.yml
ps -ef|grep flannel|grep -v grep                   #可能需要10分鍾左右啟動初始化完成,才有返回結果.然后再執行下一步
kubectl get nodes                               #可能需要等待十幾分鍾,狀態才能全部轉為ready.然后再執行下一步
kubectl get pod -n kube-system                       #可能需要等待十幾分鍾,直至所有狀態才能全部轉為ready 1/1.然后再執行下一步
kubectl create deployment nginx --image=nginx                #創建nginx服務
kubectl expose deployment nginx --port=80 --type=NodePort       #暴露nginx服務80端口
kubectl get pods,svc                               #查看運行中的服務80:31214/TCP.我們從宿主機訪問masterip:31214即可訪問到nginx服務.但是也需要等待幾分鍾,直到該端口可以telnet通..然后再執行下一步

訪問nginx,效果:

 

 

#配置k8s UI界面
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml


vi kubernetes-dashboard.yaml
#修改以下行對應內容,注意不能使用tab鍵,只能使用空格進行對啟,注意格式要按照原來的,不能多一個空格,也不能少一個空格

......
      - name: kubernetes-dashboard
        image: lizhenliang/kubernetes-dashboard-amd64:v1.10.1   # 替換此行
......
spec:
  type: NodePort     # 增加此行
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001   # 增加此行
  selector:
    k8s-app: kubernetes-dashboard

kubectl apply -f kubernetes-dashboard.yaml    #現在訪問https://192.168.2.130:30001.當然也需要等一會.注意是https

訪問K8S UI界面,效果:

會提示鏈接不安全,點擊高級->接受風險並繼續即可

 

 

kubectl create serviceaccount dashboard-admin -n kube-system                  #創建管理員帳號
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin      #配置管理員帳號為集群管理員帳號?

#執行以下命令后,會生成對應的token,在https://192.168.2.130:30001中選擇token,輸入該token即可登陸k8s管理后台
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

輸入Token,登陸K8S UI界面,效果:

 

登錄后

 

 K8S部署完成.

16. 雲計算 

16.1 OpenStack 

16.2 CloudStack 

17. 自建服務 

17.1 Posfix 

17.2 DNS 

17.3 VPN 

18. CMDB/Wiki 

18.1 iTop 

18.2 藍鯨 

18.3 Codo 

18.4 Confluence 

19. 認證 

19.1 openLDAP 

19.2  

20. 自動化 

20.1 Ansible 

20.1.1 部署

可以簡單理解為ansible通過ssh連接到被控制端執行相應的命令.

在需要安裝ansible的服務器上執行以下操作

[root@130-node1 ~]# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y      #安裝yum源

[root@130-node1 ~]# yum install ansible -y      #安裝ansible
[root@130-node1 ~]# ssh-keygen           #生成密鑰
[root@130-node1 ~]# ssh-copy-id 192.168.2.129   #傳輸密鑰
[root@130-node1 ~]# cat /etc/ansible/hosts|grep -v ^#|grep -v ^$     #配置hosts文件,可以通過定義[test]模塊,對被控制主機進行分組           
[test]
192.168.2.129
[root@130-node1 ~]#
[root@130-node1 ~]# ansible test -m command -a "ip addre"      #直接返回129的ip addre信息,test組名,-m模塊類型為command,-a命令
192.168.2.129 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7a:62:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.129/24 brd 192.168.2.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3c80:13ad:301b:495c/64 scope link tentative noprefixroute dadfailed
       valid_lft forever preferred_lft forever
    inet6 fe80::3129:687a:1538:d692/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@130-node1 ~]#

20.2 Saltstack 

20.3 Puppet 

20.3.1 部署

puppet是一種Linux、Unix、windows平台的集中配置管理系統,使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。puppet把這些系統實體稱之為資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關系。

puppet采用C/S星狀的結構,所有的客戶端和一個或幾個服務器交互。每個客戶端周期的(默認半個小時)向服務器發送請求,獲得其最新的配置信息,保證和該配置信息同步。每個puppet客戶端每半小時(可以設置)連接一次服務器端, 下載最新的配置文件,並且嚴格按照配置文件來配置客戶端. 配置完成以后,puppet客戶端可以反饋給服務器端一個消息. 如果出錯,也會給服務器端反饋一個消息.
 
實驗環境:
Puppet Server:192.168.2.130      主機名130-node1(隨便起,只要Server和Client不一樣即可)
Puppet Client:192.168.2.129       主機名bp-vm
 
Server:
[root@130-node1 ~]#yum install epel-release -y

[root@130-node1 ~]# cat /etc/hostname    #獲取主機名,下面hosts文件需要用到
130-node1
[root@130-node1 ~]# vi /etc/hosts    #配置對應的ip和主機名
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.130 130-node1
192.168.2.129 bp-vm
[root@130-node1 ~]#yum install puppet-server -y

[root@130-node1 ~]#puppet master --no-daemonize --debug    #前台運行puppet,方便排錯.然后另開一個窗口執行后續操作
[root@130-node1 ~]#vi /etc/puppet/manifests/site.pp    #配置.這里的意思是修改Client上的/tmp/helloworld.txt的內容為Hello World!
node default {
    file { "/tmp/helloworld.txt" :
        content => "Hello World!",
    }
}
[root@130-node1 ~]#
 
 
Client:
[root@bp-vm ~]#yum install epel-release -y
[root@bp-vm ~]#yum install puppet -y
[root@bp-vm ~]# cat /etc/hostname    #獲取主機名,下面hosts文件需要用到
bp-vm
[root@bp-vm ~]# vi /etc/hosts    #配置對應的ip和主機名
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.130 130-node1
192.168.2.129 bp-vm
[root@bp-vm ~]# cat /etc/puppet/puppet.conf|grep -v '#'|grep -v ^$
[main]
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl
[agent]
    classfile = $vardir/classes.txt
    localconfig = $vardir/localconfig
    server=130-node1        #只需要修改這里即可.指定Puppet的地址
[root@bp-vm ~]# puppet agent --test    #開始測試,puppet涉及到認證授權問題,因為Client沒正式得到授權,所以這里只是向Server發起認證申請,因此會返回報錯,不用管
 
 
Server:
[root@130-node1 ~]# puppet cert list --all    #查看Server的授權信息,有+號在前面就是得到授權了,可以看到我們的Client(bp-vm)沒有得到授權
  "bp-vm"     (SHA256) 3C:97:3B:C7:EB:5D:D2:67:77:D6:9C:6D:50:90:1E:49:D8:DA:14:40:4D:18:6B:5B:7F:F2:0E:8C:02:98:91:F2
+ "130-node1" (SHA256) 6A:C2:ED:5C:B4:E6:CE:AC:0B:48:CB:48:46:10:10:5D:13:C1:0F:78:D8:86:62:00:98:B8:52:C4:60:46:34:FD
[root@130-node1 ~]# puppet cert sign bp-vm  #確認授權給bp-vm
Notice: Signed certificate request for bp-vm
Notice: Removing file Puppet::SSL::CertificateRequest bp-vm at '/var/lib/puppet/ssl/ca/requests/bp-vm.pem'
[root@130-node1 ~]# puppet cert list --all    #bp-vm有+號就是得到授權
+ "130-node1" (SHA256) 6A:C2:ED:5C:B4:E6:CE:AC:0B:48:CB:48:46:10:10:5D:13:C1:0F:78:D8:86:62:00:98:B8:52:C4:60:46:34:FD
+ "bp-vm"     (SHA256) B7:EE:85:62:BE:C8:BD:46:54:A4:BC:09:D4:F5:94:0A:E0:CC:8B:0E:D9:E2:68:3E:93:56:CD:1D:6B:9E:A7:04
[root@130-node1 ~]#
 
Client:

[root@bp-vm ~]# cat /tmp/helloworld.txt
cat: /tmp/helloworld.txt: 沒有那個文件或目錄
[root@bp-vm ~]# puppet agent --test  #之前沒有授權就報錯了,授權后執行新增/tmp/helloworld.txt文件
Info: Caching certificate for bp-vm
Info: Caching certificate_revocation_list for ca
Info: Caching certificate for bp-vm
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for bp-vm
Info: Applying configuration version '1587394106'
Notice: /Stage[main]/Main/Node[default]/File[/tmp/helloworld.txt]/ensure: defined content as '{md5}ed076287532e86365e841e92bfc50d8c'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 0.01 seconds
[root@bp-vm ~]# cat /tmp/helloworld.txt
Hello World![root@bp-vm ~]#

21. 開發語言 

21.1 Shell 

21.2 Python

個人WeChat

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM