集群規划說明
集群架構概念圖示
集群案例規划
集群主機規划表
關於主機規划注意事項:
- 灰色IP地址屬於臨時使用,企業場景一般沒有。
- 負載均衡器的 VIP10.0.0.3/24
- 帶外網IP的服務器的內網IP不配置網關和dns
- 外部IP該配啥配啥
host解析(/etc/hosts 針對內網地址和主機名)
備份服務器(10.195.236.142)
Rsync服務:具有可視本地和遠程兩台主機之間的數據快速復制同步鏡像、遠程備份的功能,這個功能類似ssh帶有的scp命令,但是優於scp命令,scp只能全量拷貝,rsync可以增量拷貝。
rsync 具有如下的基本特性:
-
可以鏡像保存整個目錄樹和文件系統
-
可以很容易做到保持原來文件的權限、時間、軟硬鏈接等
-
無須特殊權限即可安裝
-
優化的流程,文件傳輸效率高
-
可以使用 rsh、ssh 方式來傳輸文件,當然也可以通過直接的 socket 連接(服務端和客戶端)。
-
支持匿名傳輸,以方便進行網站鏡象
rsync企業兩個應用場景
cron+rsync和inotify+rsync
rsync工作方式
1)本地使用:
rsync [OPTION...] SRC... [DEST]
2)通過遠程 Shell 使用:
拉: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST:DEST
3)以守護進程(socket)方式傳輸數據(重點):
拉: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST::DEST
拉: rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推: rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
其中:
-
SRC: 是要復制的源位置
-
DEST: 是復制目標位置
-
若本地登錄用戶與遠程主機上的用戶一致,可以省略 USER@
-
使用遠程 shell 同步時,主機名與資源之間使用單個冒號“:”作為分隔符
-
使用 rsync 服務器同步時,主機名與資源之間使用兩個冒號“::”作為分隔符
-
當訪問 rsync 服務器時也可以使用 rsync:// URL
-
“拉”復制是指從遠程主機復制文件到本地主機
-
“推”復制是指從本地主機復制文件到遠程主機
-
當進行“拉”復制時,若指定一個 SRC 且省略 DEST,則只列出資源而不進行復制
-
若使用普通用戶身份運行 rsync 命令,同步后的文件的屬主將改變為這個普通用戶身份。
-
若使用超級用戶身份運行 rsync 命令,同步后的文件的屬主將保持原來的用戶身份。
-
/home : 表示將整個 /home 目錄復制到目標目錄
-
/home/ : 表示將 /home 目錄中的所有內容復制到目標目錄
參數總結:
-a, ––archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等價於 -rlptgoD (注意不包括 -H)
-z, ––compress 在傳輸文件時進行壓縮處理
--ignore-existing 忽略那些已經存在於接收端的文件,僅備份那些新創建的文件
--bwlimit=RATE limit socket i/o bandwidth
--password-file = /etc/rsync.password #指定連接模塊的密碼文件
搭建backup服務器之rsyncdaemon服務模式-服務端配置過程
1、確保服務安裝rsync服務 yum install -y rsync
2、vim /etc/rsyncd.conf #創建編寫配置文件(啟動rsync -daemon模式必須),一般沒有此文件
#rsync_config created by dsh 20181220 # uid = rsync #該選項指定當該模塊傳輸文件時守護進程應該具有的uid gid = rsync use chroot = no #安全相關配置 max connections = 200 #最大連接數 timeout = 300 #超時時間 pid file = /var/run/rsyncd.pid #進程對應的進程號文件 lock file = /var/run/rsyncd.lock #鎖文件 log file = /var/log/rsyncd.log # 日志文件 [backup] #模塊名稱 path = /backup # 服務器提供的訪問目錄 ignore errors #忽略錯誤 read only = false #可寫 list =false #不能列表
hosts allow = 10.195.236.0/24 #
#hosts deny = 0.0.0.0/32 #拒絕,和allow同時使用時,會有異常,建議單獨使用一個。
auth users = rsync_backup #該選項指定由空格或逗號分隔的用戶名列表,只有這些用戶才允許連接該模塊。這里的用戶和系統用戶沒有任何關系。如果"auth users"被設置,那么客戶端發出對該模塊的連接請求以后會被rsync請求challenged進行驗證身份這里使用的challenge/response認證協議。用戶的名和密碼以明文方式存放在"secrets file"選項指定的文件中。默認情況下無需密碼就可以連接模塊(也就是匿名方式)。
secrets file = /etc/rsync.password #該選項指定一個包含定義用戶名:密碼對的文件。只有在"auth users"被定義時,該文件才有作用。文件每行包含一個username:passwd對。一般來說密碼最好不要超過8個字符。沒有默認的secures file名,需要限式指定一個(例如:/etc/rsyncd.passwd)。注意:該文件的權限一定要是600,否則客戶端將不能連接服務器
3、創建用戶
useradd rsync -s /sbin/nologin -M
4、創建 並 修改備份路徑的屬主屬組
mkdir /backup -p
chown -R rsync.rsync /backup/
5、根據rsyncd.conf的auth users 創建虛擬賬號的密碼文件
echo 'rsync_backup:oldboy' >/etc/rsync.password
6、修改密碼文件的權限為600
chmod 600 /etc/rsync.password
7、啟動服務
rsync --daemon
8、加入開機自啟動
echo "/usr/bin/rsync --daemon" >> /etc/rc.local
搭建backup服務器之rsyncdaemon服務模式-客戶端配置
1、生成連接服務器的密碼文件 ,注意,此時只保存密碼,無需賬號。
echo "oldboy" >/etc/rsync.password
2、為密碼文件配置權限600,此時客戶端配置完成。
chmod 600 /etc/rsync.password
3、同步文件(daemon模式下,只在客戶端執行命令)
推送:
rsync -az /tmp/ rsync://rsync_backup@10.195.236.142/backup/ --password-file=/etc/rsync.password
拉取:
rsync -az /tmp/ rsync://rsync_backup@10.195.236.142/backup/ /tmp/ --password-file=/etc/rsync.password
注意:上述/backup/表示服務端配置文件中的模塊名稱。
搭建backup服務器之rsyncdaemon服務模式-開發啟動/停止腳本
1、創建服務文件
vim /etc/init.d/rsyncd,鍵入以下腳本后保存。
#!/bin/sh
#rsync 啟動、停止、重啟腳本 #source function library . /etc/rc.d/init.d/functions start(){ rsync --daemon if [ $? -eq 0 -a `ps -ef | grep -v grep| grep rsync |wc -l ` -gt 0];then action "Starting Rsync:" /bin/true sleep 1 else action "Starting Rsync:" /bin/false sleep 1 fi } stop(){ pkill rsync;sleep 1;pkill rsync if [`ps -ef | grep -v grep | grep "rsync --daemon"| wc -l` -lt 1];then action "Stopting Rsync:`ps -ef | grep -v grep | grep rsync | wc -l`" /bin/true sleep else action "Stopting Rsync:`ps -ef | grep -v grep | grep "rsync --daemon"| wc -l`" /bin/false sleep 1 fi } case "$1" in start) start; ;; stop) stop; ;; restart|reload) $0 stop; $0 start; ;; *) echo $"Usage:$0 {start|stop|restart|reload}" ;; esac
2、chmod 700 /etc/init.d/rsyncd
3、chkconfig rsyncd on
搭建backup服務器之rsyncdaemon服務模式-客戶端推送排除
排除單個文件推送:
rsync -avz -exclude=a /data/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password
排除多個文件推送:
rsync -avz -exclude={a,d} /data/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password
rsync -avz -exclude={a..d} /data/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password
rsync優缺點
優點:
1、增量備份,支持socket(daemon),daemon模式需要傳輸加密需要利用vpn服務或ipsec服務
缺點:
1、大量小文件時候,在同步時,比對時間較長,可能會造成rsync進程意外停止
2、同步大文件,10G這樣的大文件有時候也會異常中斷,未完整同步之前,是以隱藏文件方式存在,可以通過續傳等參數實現傳輸。
企業級備份案例1:周期性定時備份web服務器站點目錄
要求:
- web服務器a和備份服務器b的備份目錄必須都為/backup
- web服務器站點目錄假定為/var/www/html
- web服務器本地僅保留七天內備份,並且每天備份當天數據到backup服務器
- 備份服務器上檢查備份結果是否正常,並在每天06點將備份結果發送給管理員信箱
- 備份服務器上每周六的數據都保留,其他備份僅保留180天。
思路:
每晚凌晨01點在web服務器按日期打包需要備份的網站目錄,並通過rsync推送到備份服務器上做備份。每天06點backup服務器校驗發送郵件。
解決方案:
1、配置web服務器為rsync客戶端,備份服務器為rsync服務端。
2、web服務器端進行手動推送驗證
3、開發腳本實現客戶端的打包、備份、推送、校驗、刪除。
#!/bin/bash export PATH=/sbin:/bin:/usr/bin:/usr/sbin IP=$(ifconfig | awk -F "[ :]+" 'NR==2{print $4}') HostName=$(uname -n) BakPath=/backup mkdir $BakPath/$HostName_$IP -p
if [$(date +%w) -eq 7]:then #if [ "$(date +%w)" -eq "4" ]; then
date="$(date +%F -d "-1day")_week6"
else
date="$(date +%F -d "-1day")"
fi cd / &&\ tar -czfh $BakPath/$HostName_$IP/webdata_${date}.tar.gz var/spool/www &&\ tar -czf $BakPath/$HostName_$IP/webaccess_log_${date}.tar.gz var/log/httpd &&\ find $BakPath/$HostName_$IP/ -type f -mtime -1 -name "*.tar.gz"|xargs md5sum > $BakPath/$HostName_$IP/md5_flag_${date} #給所生成的壓縮包文件生成md5校驗碼並存到flag文件中。 rsync -az $BakPath/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password #推送到備份服務器 find $BakPath -type f -mtime +7 -exec rm -f {} \ #刪除七天以前文件
4、web服務器端配置定時任務每天00執行
5、backup服務器開發腳本實現校驗、刪除、郵件通知
開發腳本實現校驗刪除動作
#!/bin/bash export LANG=en find /backup/ -name "flag_$(date +%F -d "-1day")*" |xargs md5sum -c &>/tmp/mail_$(date +%F -d "-1day").log if [$(date +%w) -eq 7]:then date="$(date +%F -d "-1day")_week6" else date="$(date +%F -d "-1day")" fi find /backup/ -type f -name "*.tag.gz" -a ! -name "*week6*" -mtime +180 -exec rm -f {} \ mail -s "backup check results `date +%F" "%X`" 1246436536@qq.com </tmp/mail_$(date +%F -d "-1day").log \cp /tmp/mail_$(date +%F -d "-1day").log{,.ori} echo "default mail md5 flag error" >/tmp/mail_$(date +%F -d "-1day").log
利用mail工具使用第三方郵件服務器發送郵件,前提需要在/etc/mail.rc文件中添加第三方郵件郵件服務商的賬號的相關信息.
set from=dsh_hello@163.com smtp=smtp.163.com smtp-auth-user=dsh1246436536 smtp-auth-password=abc123456 smtp-auth=login
echo "測試郵件內容" | mail -s "-s指定郵件主題" 1246436536@qq.com
mailq #可列出待寄郵件的清單
6、backup服務器配置定時任務每天05點執行
inotify+rsync實現實時備份
1、inotify介紹:它是一個內核用於通知用戶空間程序文件系統變化的機制
2、inotify 實施准備
大前提rsync daemon 服務配置成功,可以再rsync客戶端推送拉取數據,然后才能配置inotify服務。
3、安裝
uname -r #確認linux內核是否為2.3.13以上
ls /proc/sys/fs/inotify/ # 在/proc/sys/fs/inotify目錄下有三個文件:max_user_watches:設置inotifywait或inotifywatch命令可以監視的文件數量(單進程);max_user_instances:設置每個用戶可以運行的inotifywait或inotifywatch命令的進程數。;max_queued_events:設置inotify實例事件(event)隊列可容納的事件數量。
yum -y install inotify-tools #一共安裝了2個工具,即inotifywait和inotifywatch。inotifywait:在被監控的文件或目錄上等待特定文件系統事件(open,close,delete等)發生,執行后處於阻塞狀態,適合shell腳本中使用。inotifywatch:收集被監視的文件系統使用度統計數據,指文件系統事件發生的次數統計
4、inotifywait 命令常用參數介紹

-m ,--monitor 始終保持事件的監聽狀態 -r ,--recursive 遞歸查詢目錄 -q,--quiet 僅打印監控事件的信息 --timefmt 指定時間輸出格式 --format 指定輸出監控信息格式 -e 通過此參數指定需要監控的事件,有以下幾種常用事件類型: create 文件或目錄被創建 close_write 文件被創建或修改 delete 文件被刪除
5、實現在nfs客戶端對nfs自定文件目錄事件(增刪改)的實時監控
/usr/local/inotify/bin/inotifywait -mrq --format 'w%f%' -e close_wait,delete /backup
6、當監控到nfs目錄文件系統事件后,觸發rsync推送變化的文件
#!/bin/bash backup_Server=172.16.1.41 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do cd /data rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password done
提示:
- 上邊那個腳本效率很低,效率低的原因在於只要目錄出現變化就都會導致我整個目錄下所有東西都被推送一遍。因此,我們可以做如下改動提高效率
#!/bin/bash Path=/data backup_Server=172.16.1.41 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do if [ -f $line ];then rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password else cd $Path &&\ rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password fi done
腳本可以加入開機啟動:
echo "/bin/sh /server/scripts/inotify.sh &" >> /etc/rc.local #提示:一個& 代表從后台開始運行該條命令。
7、優化
使用echo命令修改/proc/sys/fs/inotify目錄下的三個文件
echo "50000000" > /proc/sys/fs/inotify/max_user_watches echo "326790" > /proc/sys/fs/inotify/max_queued_events sysctl -p
8、inotify優缺點
優點:
簡單易用,監控文件系統事件變化,通過同步工具rsync實時同步數據
缺點:
並發如果大於200個文件(10-100k),同步會有延時
9、高並發數據實時同步方案小結
1)inotify(sersync)+ rsync,是文件級別的。
2)drbd文件系統級別,文件系統級別,基於block塊同步,缺點:備節點數據不可用
3)第三方軟件的同步功能:mysql同步(主從復制),oracle,mongodb
4)程序雙寫,直接寫兩台服務器。
5)利用產品業務邏輯解決(讀寫分離,備份讀不到,讀主)
6)NFS集群(1,4,5方案整合)(雙寫主存儲,備存儲用inotify(sersync)+rsync)如下所示(讀寫分離方案)
sersync實現實時備份
特點:
支持配置文件管理
真正的守護進程socket
可以對失敗文件定時重傳(定時任務功能)
第三方的http接口(例如更新cdn緩存)
默認多線程rsync同步
1、實現rsync推送到backup服務器
2、安裝sersync工具
sersync下載地址:https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz,上傳sersync2.5.4_64bit_binary_stable_final.tar.gz到/usr/local/src目錄下
#cd /usr/local/src
#tar zxvfsersync2.5.4_64bit_binary_stable_final.tar.gz #解壓
#mv GNU-Linux-x86 /usr/local/sersync #移動目錄到/usr/local/sersync
3、配置sersync
#cd /usr/local/sersync #進入sersync安裝目錄
#cp confxml.xml confxml.xml-bak #備份原文件
vim confxml.xml
localpath watch="/home/Sync":#源服務器同步目錄
<remote ip="192.168.0.50" name="Sync"/>:#目標服務器IP地址
name="Sync": #目標服務器rsync同步目錄模塊名稱
users="Sync": #目標服務器rsync同步用戶名
passwordfile="/etc/passwd.pass": #目標服務器rsync同步用戶的密碼在源服務器的存放路徑
remote ip="192.168.0.50": #目標服務器ip,每行一個
failLogpath="/tmp/rsync_fail_log.sh" #腳本運行失敗日志記錄
start="true" #設置為true,每隔600分鍾執行一次全盤同步
vim sersync/confxml.xml 修改24--28行 24 <localpath watch="/opt/tongbu"> 25 <remote ip="127.0.0.1" name="tongbu1"/> 26 <!--<remote ip="192.168.8.39" name="tongbu"/>--> 27 <!--<remote ip="192.168.8.40" name="tongbu"/>--> 28 </localpath> 修改后的內容為: 24 <localpath watch="/data/www"> 25 <remote ip="10.1.20.109" name="www"/> 26 </localpath> 修改29--35行,認證部分(rsync密碼認證) 29 <rsync> 30 <commonParams params="-artuz"/> 31 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> 32 <userDefinedPort start="false" port="874"/><!-- port=874 --> 33 <timeout start="false" time="100"/><!-- timeout=100 --> 34 <ssh start="false"/> 35 </rsync> 修改后的內容如下: 27 <rsync> 28 <commonParams params="-artuz"/> 29 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> 30 <userDefinedPort start="false" port="874"/><!-- port=874 --> 31 <timeout start="true" time="100"/><!-- timeout=100 --> 32 <ssh start="false"/> 33 </rsync>
4、開啟sersync守護進程同步數據
/usr/local/sersync/sersync2 -d -r -n 10 -o /usr/local/sersync/confxml.xml #開啟datemon模式
echo "/usr/local/sersync/sersync2 -d -r -n 10 -o /usr/local/sersync/confxml.xml &" >> /etc/rc.local #加入開機自啟動
5、inotify sersync總結
為什么要用Rsync+sersync架構?
1)、sersync是基於Inotify開發的,類似於Inotify-tools的工具
2)、sersync可以記錄下被監聽目錄中發生變化的(包括增加、刪除、修改)具體某一個文件或某一個目錄的名字,然后使用rsync同步的時候,只同步發生變化的這個文件或者這個目錄。
Rsync+Inotify-tools與Rsync+sersync這兩種架構有什么區別?
1)、Rsync+Inotify-tools
(1):Inotify-tools只能記錄下被監聽的目錄發生了變化(包括增加、刪除、修改),並沒有把具體是哪個文件或者哪個目錄發生了變化記錄下來;
(2):rsync在同步的時候,並不知道具體是哪個文件或者哪個目錄發生了變化,每次都是對整個目錄進行同步,當數據量很大時,整個目錄同步非常耗時(rsync要對整個目錄遍歷查找對比文件),因此,效率很低。
2)、Rsync+sersync
(1):sersync可以記錄下被監聽目錄中發生變化的(包括增加、刪除、修改)具體某一個文件或某一個目錄的名字;
(2):rsync在同步的時候,只同步發生變化的這個文件或者這個目錄(每次發生變化的數據相對整個同步目錄數據來說是很小的,rsync在遍歷查找比對文件時,速度很快),因此,效率很高。
小結:當同步的目錄數據量不大時,建議使用Rsync+Inotify-tools;當數據量很大(幾百G甚至1T以上)、文件很多時,建議使用Rsync+sersync。
NFS共享存儲服務器(10.195.236.142)
必備知識點:
多個nfs客戶端同時讀寫文件,需要有以下幾個權限注意:
- nfs服務器/etc/exports配置文件中的(rw)讀寫共享權限是否正確
- nfs服務器實際要共享的NFS目錄權限是否具有w權限,及服務器本地目錄的安全權限
- 每台機器都對應存在和nfs默認配置UID相同的UID65534的nfsnobody用戶(確保所有客戶端的訪問權限統一(使用all_squash參數),否則每個機器需要同時建立相同uid用戶,並覆蓋nfs的默認用戶配置)
同時滿足以上三個條件,即可實現多客戶端同時對共享目錄文件有讀寫權限。
重要文件
/etc/exports #nfs服務的主配置文件,配置nfs具體共享服務的目錄地址。
/usr/sbin/showmount #常在客戶端執行,用以查看nfs配置及掛載結果。
/proc/mounts #客戶端掛載參數。用於客戶端查看掛載情況,比df 命令更加高效快捷,常用於監控掛載。
服務端啟動順序
/etc/init.d/rpcbind start
/etc/init.d/nfs start
exports語法格式
NFS共享目錄 NFS客戶端地址(參數1,參數2......)
- NFS共享目錄:為nfs服務端要共享的實際目錄,要用絕對路徑,注意要共享目錄的本地權限。如果需要讀寫共享,務必要讓此共享目錄可以被nfs客戶端的用戶(nfsnobody)讀寫。
- nfs客戶單地址:可以為單個主機地址,也可以為一個網段,還可以用* 來匹配素有客戶端服務器。這里所謂的客戶端一般來說就是前端的業務服務器。例如web服務。
- 參數介紹:
rw 讀寫 ; ro 只讀 ; sync 數據直接寫入磁盤,安全性高 ; async 數據會先寫入緩沖區,效率高;
all_squash 所有客戶端登入nfs主機訪問共享目錄,統一映射為nobody用戶權限,以便所有文件共享。
anonuid 指定客戶端登陸訪問用戶的UID
anongid 指定客戶端登陸訪問用戶的UID
nfs優化:
- 硬件:sas/ssd磁盤,多塊,raid5/raid10。網卡至少千兆(多塊bond)
- 服務器端配置 /data 10.195.236.135(rw,sync,all_squash,anonuid=65534,anongid=65534)
- nfs客戶端mount 掛載企業優化命令參數:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev, rsize=131072,wsize=131072 10.195.236.140:/data
- nfs內核優化
服務器端(增大緩存大小):
cat >>/etc/sysctl.conf<<eof
net.core.wmen_default = 8388608
net.core.rmen_default = 8388608
net.core.wmen_max = 16777216
net.core.rmen_max = 16777216
eof
sysctl -p
- 大型網站nfs采用分布式系統,常見有GlusterFS、FastDFS.
nfs優缺點:
優點:服務穩定,簡單高效
局限:
存在單點故障,可以通過負責均衡及高可用方案彌補。
高並發場合效率低,性能受限(指的是日並發超過2千萬的日PV量)
多個客戶端掛載同一個nfs 服務器時,連接管理維護麻煩。
企業應用場景:使用nfs搭建web服務集群的共享存儲。
nfs服務端配置
1、nfs軟件安裝:yum -y install nfs-utils rpcbind
- nfs-utils:nfs服務主程序包,包括rpc.nfsd、rpc.mountd這兩個daemon
- rpcbind:centos6下面RPC的主程序。nfs可以視為一個rpc程序,再啟動任何一個rpc之前。
2、啟動PRC服務:
/etc/init.d/rpcbind start
rpcinfo -p localhost #查看rpc中是否有nfs資源
3、啟動nfs服務:
/etc/init.d/nfs start
- chkconfig rpcbind on
- chkconfig nfs on
4、配置nfs服務端配置文件
默認路徑:/etc/exports ,並且默認為空,vim /etc/exports
/data 10.195.236.135(rw,sync,all_squash)
5、給共享目錄授權
chown -R nfsnobody.nfsnobody /data
6、showmount -e 服務端IP #查看配置文件的路徑有沒有生效
nfs客戶端配置
1、安裝啟動rpcbind
/etc/init.d/rpcbind start
2、掛載
mount -t nfs 10.195.236.142:/data /mnt #如果掛載失敗嘗試安裝nfs-utis,然后使用showmount -e 10.195.236.142測試是否有顯示遠程服務端共享路徑
3、開機自動掛載
echo "mount -t nfs 10.195.236.142:/data /mnt" >>/etc/rc.local #設置開機掛載,不能放到fstab中,因為是網絡掛載,網卡啟動比fstab慢。
ssh批量管理 服務
/etc/init.d/sshd
/etc/ssh/sshd_config
ssh 企業安全優化
1、vim /etc/ssh/sshd_config
Port 2211
ListenAddresss 10.195.236.41 #多網卡情況下,修改監聽地址為單一內網地址
PermitRootLogin no #不允許root登陸,實際使用中,使用su從其他用戶切換
PermitEmptyPasswords no #禁止空密碼登陸
CSSAPIAuthentication no # 優化ssh連接登陸響應時間。
UseDNS no ## 優化ssh連接登陸響應時間。
2、使用密鑰登陸,不使用密碼登陸
ssh批量分發管理部署步驟(使用管理機進行批量分發管理)
1、創建用戶及密碼(管理機和后台服務器集群都需要)
#創建管理用戶,讓此用戶使用密鑰對進行遠程管理,無需口令密碼。 useradd oldgirl echo 123456 |passwd --stdin oldgirl su - oldgirl #目標服務器上配置sudoers,給oldgirl管理用戶提權(rsync命令)否則系統權限目錄無法進行文件推送: echo "oldgirl ALL= NOPASSWD: /usr/bin/rsync" >>/etc/sudoers visudo -c
2、管理機上創建密鑰對
交互式:ssh-keygen -t dsa #直接回車三次
[root@zqq-study dsh]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@zqq-study dsh]# ls /root/.ssh/
id_dsa id_dsa.pub #創建密鑰后,會在/root/.ssh目錄下生成鎖和鑰匙
非交互式:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
3、從管理機上分發密鑰(鎖)到各個服務器
cd ~
ssh-copy-id -i .ssh/id_dsa.pub oldgirl@172.16.1.8 #使用默認端口
ssh-copy-id -i .ssh/id_dsa.pub " -p 2211 oldgirl@172.16.1.6" #指定自定義端口時,使用雙引號
非交互式:sshpass -p '123456' ssh-copy-id -i .ssh/id_rsa.pub -p 2211 oldgirl@10.195.236.142
4、測試
ssh -p2211 oldboygirl@172.16.1.8 /sbin/ifconfig eth0
成功標志:連接目標服務器,不適用密碼可以直接操作。
5、批量分發文件,腳本優化
#批量分發腳本,服務器固定,源文件、目的路徑作為參數 #!/bin/bash if [$# -ne 2]:then echo " USAGE:/bin/sh $0 Sourcefile Destfile" exit 1 fi source /etc/init.d/functions for key in 8 9 12 14 15 18 21 45 67 do scp -P2211 ~/$1 oldgirl@172.16.1.${key}:~ >/dev/null 2>&1&&\ ssh -p2211 oldgirl@172.16.1.$key sudo rsync ~/$1 $2 >dev/null 2>&1 #執行遠程sudo 使用-t參數開終端執行。 if [$? -eq 0]:then action "FenFa host 172.16.1.$key" /bin/true else action "FenFa host 172.16.1.$key" /bin/fslse fi done
#批量分發腳本,指定單個服務器、源文件、目的路徑作為參數 #!/bin/bash if [$# -ne 3]:then echo " USAGE:/bin/sh $0 Sourcefile Destfile IPADDR" exit 1 fi source /etc/init.d/functions scp -P2211 ~/$1 oldgirl@$3:~ >/dev/null 2>&1&&\ ssh -p2211 oldgirl@$3 sudo rsync ~/$1 $2 >dev/null 2>&1 if [$? -eq 0]:then action "FenFa host $3" /bin/true else action "FenFa host $3" /bin/fslse fi done
#批量分發腳本,依次指定源文件、目的路徑、IP地址若干作為參數 #!/bin/bash if [$# -le 3]:then echo " USAGE:/bin/sh $0 Sourcefile Destfile IPADR......" exit 1 fi source /etc/init.d/functions shift 2 #移動變量,表示移除前幾個變量 for key in $@ do scp -P2211 ~/$1 oldgirl@172.16.1.${key}:~ >/dev/null 2>&1&&\ ssh -p2211 oldgirl@172.16.1.$key sudo rsync ~/$1 $2 >dev/null 2>&1 if [$? -eq 0]:then action "FenFa host 172.16.1.$key" /bin/true else action "FenFa host 172.16.1.$key" /bin/fslse fi done
6、批量分發中權限問題解決方法(例:批量分發hosts文件覆蓋到目標服務器/etc/hosts,本方案使用(2))
1)直接使用root用戶執行,批量分發管理絕大多數企業選用root(條件是允許root用戶登錄,但是我們實際環境中已經做了root禁止登錄的優化)
2)sudo提權實現沒有權限用戶使用rsync拷貝
#目標服務器上配置sudoers,給oldgirl用戶提權: echo "oldgirl ALL= NOPASSWD: /usr/bin/rsync" >>/etc/sudoers visudo -c #迂回方案:先拷貝hosts文件到各自家目錄下 scp -P2211 hosts oldgirl@172.16.1.8:~ #使用rsync管道模式拷貝更好(增量、加密) -az hosts -e 'ssh -p2211' oldgirl@172.16.1.8:~ #然后使用遠程sudo,rsync 拷貝hosts文件覆蓋到/etc/hosts ssh -p2211 -t oldgirl@172.16.1.8 sudo rsync ~/hosts /etc/hsots #-t允許執行遠程sudo命令
WEB服務
http請求響應流程
URL 是URI命名機制的一個子集。
網頁分類
1、靜態網頁
靜態網頁資源常見擴展名為:
- 純文本類程序或文件:htm、html、xml、js、css
- 圖片類或數據文檔:jpg、gif、png、doc、ppt等
- 視頻流媒體類文件:MP4、swf、avi、wmv等
靜態網頁特征
- 每個頁面都有一個固定的URL地址,且URL一般以htm、html等常見形式為后綴,而且地址中不含有?或&等特殊符號
- 網頁內容已經發布到網站服務器上,無論是否有用戶訪問,每個頁面的內容都是保存在王章服務器的文件系統上的,也就是說,靜態網頁是實實在在保存在服務器上的文件,每個網頁都是一個獨立的文件。
- 網頁內容是固定不變的,因此,容易被搜索引擎收錄(容易被用戶找到)(優點)
- 網頁沒有數據庫的支持,在網站制作和維護方面的工作量比較大,因此當網站信息量很大的時候,完全依靠靜態網頁制作的方式比較困難。(缺點)
- 網頁的交互性較差,在程序功能實現方面局限性。(缺點)
- 網頁程序在用戶瀏覽器端解析,如:IE瀏覽器,程序解析效率很高,由於服務端不進行解析,並且不需要讀取數據庫,因此服務器端可以接受更多的並發訪問。當客戶端向服務器請求數據時,服務器直接把數據從磁盤上返回(不做任何解析),待客戶端拿到數據后,在瀏覽器端解析並展示出來,服務端不解析,所以並發性能更高。(優點)
2、動態網頁
形式特點:
- 通常以asp、aspx、php、js、do、cgi等形式為后綴
- 一般網址中會有標志性符號?&
- 網頁一般以數據庫技術為基礎,大大降低了網站維護的工作量。
- 采用動態網頁技術的網站可以實現很多交互功能,比如:用戶注冊、登陸、在線調查、投票、用戶管理、訂單管理、發博文等
- 動態網頁並不是獨立存在於服務器上的網頁文件,當用戶請求服務器上的動態程序時,服務器解析這些程序並讀取數據庫然后返回一個完整的網頁內容。服務器端解析。
- 動態網頁中的?&在搜索引擎的收錄方面存在一定的問題,一般搜索引擎不會去抓取網址中?后面的內容,因此在企業通過搜索引擎進行推廣時,需要針對動態網頁的網站做一定的技術處理(偽靜態技術),以便適應搜索引擎抓取需求
- 有關動態網頁的架構思想:一般來說靜態網頁性能是動態網頁的10-30倍,在高並發的場景中,應盡可能的把動態網頁轉換成靜態網頁提供服務。動態轉靜態,幾乎是所有高並發網站必備架構方案思路,也是架構師的職責所在。
3、偽靜態網頁(rewrite技術實現,跟業務需求掛鈎,一般由開發實現,運維發布更新)
缺點:偽靜態網頁不會提高性能,反而會一定程度降低。
功能:
- 一是讓搜索引擎收錄網站內容,方便推廣。
- 二是提升用戶訪問體驗(url中無&?等符號)
網站流量度量術語
ip訪問量:獨立IP計數,同一IP多次訪問計數為1
pv訪問量:Page View
uv訪問量:Unique Vistor 獨立訪客量
www服務概述
1、常用提供靜態程序服務軟件apache、nginx
2、常用提供動態服務軟件
- php:配合apache解析動態程序,使用mod_php5.so(module);配合nginx解析動態程序常用Fastcgi守護進程模式。
- tomcat:Tomcat只能算Web Container,是官方指定的JSP&Servlet容器。只實現了JSP/Servlet的相關規范,不支持EJB(硬傷啊)!不過Tomcat配合jboss和apache可以實現j2ee應用服務器功能一般來說考慮stucts等架構tomcat就可以了,但如果考慮EJB的話,WebLogic是比較好的選擇。
- Jboss (免費):JBoss是一個管理EJB的容器和服務器,支持EJB 1.1、EJB 2.0和EJB3的規范。但JBoss核心服務不包括支持servlet/JSP的WEB容器,一般與Tomcat或Jetty綁定使用。
- weblogic (收費) :weblogic是j2ee的應用服務器(application server),包括ejb ,jsp,servlet,jms等等,全能型的。是商業軟件里排名第一的容器(JSP、servlet、EJB等),並提供其他如JAVA編輯等工具,是一個綜合的開發及運行環境。
- resin:大型動態web服務主流,互聯網java容器主流(如jsp、do)
- IIS:微軟windows下的web服務軟件(如asp、aspx)
NginxWeb服務
主要應用場景:
- 使用Nginx運行html、js、css、小圖片等靜態數據
- Nginx結合FastCGI運行PHP等動態程序(常用用fastcgi_pass方式)
- Nginx結合tomcat/resin等支持java動態程序(常用proxy_pass方式)
安裝nginx(編譯安裝)
- 1、yum install pcre pcre-devel openssl-devel -y #安裝依賴
- 2、useradd www -s /sbin/nologin -M
- 3、wget -q http://nginx.org/download/nginx-1.8.1.tar.gz #到nginx官網http://nginx.org/復制下載鏈接,然后使用wget命令下載到本地
- 4、tar -xf nginx-1.8.1.tar.gz
- 5、./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/user/local/nginx-1.8.1/ #配置
- 6、make &&make install #編譯 &安裝
- 7、ln -s /usr/local/nginx-1.8.1/ /application/nginx #創建位置軟連接,提供給開發或者其他腳本調用,以方便升級維護nginx
- 8、/usr/local/nginx-1.8.1/sbin/nginx #啟動nginx 不加任何參數
- 9、/usr/local/nginx-1.8.1/sbin/nginx -V #顯示nginx相關信息,和編譯參數。
yum安裝nginx
- wget -q http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
- rpm -ivh epel-release-6-8.noarch.rpm
- yum install nginx -y
虛擬主機概念
在web服務里就是一個獨立的網站站點,這個站點對應獨立的域名(也可能是IP或端口),具有獨立的程序及資源目錄,可以獨立得對外提供服務,對於apache來說,一個虛擬主機的標簽段通常包含在<VirtualHost></VirtualHost>一對標簽內,對於nginx來說,就是一個server{}段
基於域名的虛擬主機訪問:DNS解析到IP地址后,根據IP:端口,建立tcp-http連接,sever端根據客戶端的請求報文的請求頭(如果使用ip訪問,則沒有請求頭,直接找第一個位置的虛擬主機),拿到server_name,然后將請求發給相同server_name的虛擬站點。
基於IP的虛擬主機訪問:
基於端口的虛擬主機訪問:
location語法
=精確匹配,優先級最高
~區分大小寫匹配
~*不區分大小寫匹配
^~常規字符匹配后,不做正則表達式檢查
rewrite
語法格式

rewrite <regex> <replacement> [flag]; 關鍵字 正則 替代內容 flag標記 關鍵字:其中關鍵字rewrite不能改變 正則:perl兼容正則表達式語句進行規則匹配 替代內容:將正則匹配的內容替換成replacement flag標記:rewrite支持的flag標記 flag標記說明: last #本條規則匹配完成后,繼續向下匹配新的location URI規則 break #本條規則匹配完成即終止,不再匹配后面的任何規則 redirect #返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址 permanent #返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址
使用位置:server,location,if
舉例說明(permanent301 redirect302)

server { listen 80; server_name www.360buy.com; rewrite ^/(.*) http://www.jd.com/$1 permanent; } server { listen 80; server_name www.jd.com; location / { root html/www; index index.html index.htm; } }

http { # 定義image日志格式 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 開啟重寫日志 rewrite_log on; server { root /home/www; location / { # 重寫規則信息 error_log logs/rewrite.log notice; # 注意這里要用‘’單引號引起來,避免{} rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4; # 注意不能在上面這條規則后面加上“last”參數,否則下面的set指令不會執行 set $image_file $3; set $image_type $4; } location /data { # 指定針對圖片的日志格式,來分析圖片類型和大小 access_log logs/images.log mian; root /data/images; # 應用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,如果還不在就跳轉到最后一個url里 try_files /$arg_file /image404.html; } location = /image404.html { # 圖片不存在返回特定的信息 return 404 "image not found\n"; } } ### 對形如/images/ef/uh7b3/test.png的請求,重寫到/data?file=test.png,於是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在則正常響應,如果不存在則重寫tryfiles到新的image404 location,直接返回404狀態碼。 ###
nginx訪問認證(了解)
1、添加配置文件
location或server中
auth_basic "oldboy training";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
2、htpasswd -cb /usr/local/nginx/conf/htpasswd oldboy 123456 #生成密碼文件
403狀態的解決
1、沒有index.html、或者沒有設置index
2、沒有權限
PHP服務
FastCGI介紹
一個可伸縮的、高速的在HTTP服務器和動態腳本語言間通信的接口(在linux下,FastCGI接口即為socket),主要優點是把動態語言和HTTP服務器分離開來
nginx通過FastCGI借口和動態腳本語言PHP交換邏輯圖
php安裝
1、檢查php安裝所需的lib庫
libmcrypt-devel在官方的yum源中沒有,需要首先配置epel第三方yum源:
wet -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
rpm -qa libxml2-devel libpng-devel libjpeg-devel libmcrypt-devel mcrypt
rpm -qa freetype-devel gd-devel curl-devel libxslt-devel zlib-devel mhash
libiconv-devel包無yum源,需下載安裝指定repo包然后再指定yum的repo包安裝(https://pkgs.org/download/libiconv-devel; wget https://forensics.cert.org/cert-forensics-tools-release-el7.rpm;rpm -Uvh cert-forensics-tools-release-el7.rpm; yum --enablerepo=forensics install libiconv-devel -y)
2、下載、配置PHP安裝參數
./configure --prefix=/usr/local/php-5.6.38 \ --enable-fpm \ --enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-fpm-user=www \
--with-fpm-group=www \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d
make && make install
注意: --prefix=安裝目錄 --with-使用包名稱[=包目錄] --enable-需要激活的功能 --with-mysql=mysqlnd,如果本機沒有安裝mysql,使用mysqlnd代替,因為php已經自帶了mysql的客戶端工具
--with-fpm-user=www,php指定用戶要和nginx一樣
--with-apxs2=/usr/local/apache/bin/apxs #php使用此選項生成模塊嵌入到apache(到httpd.conf)來配合apache的動態交互.當然也可以使用fastcgI,但LAMP中一般都用模塊方式。
如果失敗,使用make clean ,然后重新配置、編譯、安裝。
3、調整配置文件
pwd /usr/local/php-5.6.38 php --ini #檢查php安裝的配置文件定義的路徑 cp php.ini-production /etc/php.ini mkdir -p /etc/php.d cp /usr/local/php-5.6.38/etc/php-fpm.conf.default /usr/local/php-5.6.38/etc/php-fpm.conf cp /usr/local/php-5.6.38/sbin/php-fpm /etc/init.d/php-fpm ln -s /usr/local/php-5.6.38 /usr/local/php
/usr/init.d/php-fpm #啟動php
4、配置測試解析php
#去除nginx.conf中匹配php的location注釋,然后主要修改的就是fastcgi_param中的/scripts 為 $document_root location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
編輯vim test.php文件放到根目錄html下
<?php
phpinfo();
?>
/usr/local/nginx/sbin/nginx -s reload
瀏覽器輸入地址/test.php,驗證是否可以正常解析。
mysql數據庫
https://www.cnblogs.com/he-ding/p/10020688.html
DNS服務
windows 客戶端DNS解析相關維護命令
1)查看windows客戶端本地dns緩存
ifconfig /displaydns #顯示dns cache
2)清除windows客戶端本地dns緩存的dns解析記錄
ipconfig /flushdns
3)windows系統下hosts域名解析記錄位置
C:\Windows\System32\drivers\etc\hosts
Tomcat
概述:
web應用服務器和nginx、apache、lighthttpd等web服務器一樣,具有處理html頁面功能,主要用於servlet和jsp容器。java最為廣泛應用的容器,其他還有resin、weblogic(收費國企等)
安裝
官網下載jdk和tomcat安裝包 部署Java環境 tar xf jdk-8u60-linux-x64.tar.gz -C /application/ ln -s /application/jdk1.8.0_60 /application/jdk sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/:$JAVA_HOME/lib/tools.jar' /etc/profile source /etc/profile java -version 安裝tomcat tar -xf apache-tomcat-8.0.27.tar.gz -C /application/ ln -s /application/apache-tomcat-8.0.27 /application/tomcat echo 'export TOMCAT_HOME=/application/tomcat\nexport CATALINA_HOME=/application/tomcat' >>/etc/profile source /etc/profile /application/tomcat/bin/version.sh chown -R root:root /application/jdk/ /application/tomcat/
tomcat啟動成功的標志:tail /usr/local/tomcat/logs/catalina.out 日志中找到org.apache.catalina.startup.Catalina.start Server startup in 573 ms 語句
日常運維注意/log/文件夾下catalina.out運行日志文件不斷增大占用空間。
配置tomcat管理頁面登陸(生產環境務必關閉)
vim conf/tomcat-users.xml #修改用戶管理配置文件,增加管理角色賬號
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
vim webapps/manager/META-INF/context.xml #修改manger訪問地址控制
vim webapps/host-manager/META-INF/context.xml #修改host-manger訪問地址控制
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.195\.\d+\.\d+"
重啟tomcat
tomcat安裝目錄
bin 目錄是二進制運行文件
webapps/ROOT 目錄是默認站點目錄
生產環境tomcat安全優化
cd /webapps
mv docs examples host-manager manger /tmp/ #移除webapps目錄下ROOT意外所有文件夾
mv ROOT/* /tmp #清空ROOT 文件夾
tomcat配置文件
/tomcat/conf/server.xml #主配置文件
<Server port="8005" shutdown="SHUTDOWN"> <!-- 關閉tomcat的端口和口令 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> <!-- tomcat默認端口重定向端口 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!--與httpd通信的AJP協議端口,因常用nginx,注釋關閉即可。-->
<Engine name="Catalina" defaultHost="localhost"> #配置域名
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"> <!-- 應用程序app定義自動解壓自動加載選項 -->
Redis
概述
參考維護文檔
Redisdoc.com
特點:
緩存服務器(數據庫)
速度快、支持多種數據結構、持久化、主從復制、支持過期時間、支持事務、消息訂閱
對比memcached,多了主從和持久化功能以及多數據結構支持。
應用場景:
數據緩存、會話緩存(保存web回話信息)、排行榜/計數器、消息隊列
安裝配置.
docker
概述
docker的三大特性構建、運輸、運行(一次構建、多處運行)
docker是傳統cs架構,組要分為三大組件鏡像、容器、倉庫。
安裝
[root@pbx ~]# yum -y install docker [root@pbx ~]# systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. [root@pbx ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd-current --registry-mirror=https://a14c78qe.mirror.aliyuncs.com \ #找到ExecStart行,添加registry-mirror參數,修改docker下載倉庫地址。 [root@pbx ~]# systemctl daemon-reload [root@pbx ~]# systemctl start docker [root@pbx ~]# systemctl status docker
簡單操作
鏡像操作 docker search nginx docker pull nginx docker save nginx >/tmp/nginx.tar.gz #保存鏡像(導出鏡像) docker load < /tmp/nginx.tar.gz #導入鏡像 docker images # 查看鏡像列表 docker rmi nginx #刪除鏡像 /var/lib/docker/ #docker默認路徑 /usr/lib/systemd/system/docker.service #docker配置文件,可指定docker內核參數(centos7)環境變量等,需daemon-reload 重啟docker服務 docker daemon --help #查看docker內核參數幫助 容器操作 docker run -it --name mytest alpine sh #啟動鏡像alpine,使用-it參數進入到docker終端中,--name參數指定容器運行名字而不是隨機生成 docker inspect mytest #查看容器運行的詳細信息。 exit#退出docker終端,此時如果此運行中的鏡像里無其他進程運行,那么退出終端時,此鏡像會自動關閉,使用docker ps 命令無法顯示。讓退出終端后的空鏡像繼續運行操作:ctrl 不放手 p q docker rm -f mytest #強制刪除容器,運行中的也可以刪除。 docker ps #顯示正在運行的docker容器 docker ps -a #顯示所有容器 docker exec <running-container-id> #docker exec 命令會在運行中的容器執行一個新進程。 docker commit <container-id> #docker commit命令將容器的可讀寫層轉換為一個只讀層,這樣就把一個容器轉換成了不可變的鏡像。 docker inspect <container-id> or <image-id> #ocker inspect命令會提取出容器或者鏡像最頂層的元數據。
docker的http代理配置(通過修改/lib/systemd/system/docker.service文件增加配置環境方法無效)
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service] #鍵入配置內容
Environment="HTTP_PROXY=http://pill:pill@node2:3128/"
systemctl daemon-reload #重新加載配置文件
systemctl restart docker # 重啟docker
docker search nginx #搜索nginx鏡像 測試http連接