企業架構web服務器的文件及時同步
學習目標和內容
1、能夠理解為何要服務器間文件同步
2、能夠簡單描述實現文件同步的幾種方式
3、能夠實現服務器文件實時同步的案例
一、同步文件介紹
1、服務器文件同步的必要性
根據業務發展需求,業務網站架構已經發展到以上模式。實現了線上服務的提供,可以給用戶提供穩定的整個的web服務。但是,在最近的操作中,也發現了一些問題。
①當業務代碼發生改變上傳到web服務器時,因為架構已經不是單臺服務器提供服務器,而是由多臺web服務器提供服務,業務代碼需要同時上傳到多臺web服務器,在操作上帶來了很多不便。
故需要解決以上問題, 就需要web服務器中的業務代碼能夠及時同步,保證業務代碼的一致性。
業務集群:
線上 對外提供服務的 10臺 提供給用戶對外服務 存儲(分布式存儲 解決服務器單例硬盤資源不夠的情況)
線下 代碼發布(CI CD git、jenkins、gitlab)灰度發布,監控(主機、服務 zabbix),日志收集分析(ELK elasticsearch(elasticsearch-head) logstash kibana kafka消息隊列)
2、同步文件的幾種方式
server01 web1服務器 /usr/local/nginx/html/tp5shop
server03 web2服務器 /usr/local/nginx/html/tp5shop
①scp
scp是 secure copy的縮寫, scp是linux系統下基于ssh登陸進行安全的遠程文件拷貝命令 ==全量同步==
問題:全部復制過去 比較慢 效率低一些 scp不能夠遠程刪除
②rsync
rsync命令是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件。rsync使用所謂的“rsync算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法==只傳送兩個文件的不同部分==,而不是每次都整份傳送,因此速度相當快 ==增量同步==
問題:當文件變動,不能夠實時同步
③rsync+sersync
inotify-tools和sersync屬于同類
sersync是基于inotify+rsync的大量文件的多服務器自動同步程序
使用==Linux 2.6 內核的 inotify 監控 Linux 文件系統事件==,被監聽目錄下如果有文件發生修改,sersync 將通過內核自動捕獲到事件,并將該文件利用 rsync 同步到多臺遠程服務器。sersync 僅僅同步發生增、刪、改事件的單個文件或目錄,不像rsync鏡像同步那樣需要比對雙方服務器整個目錄下數千萬的文件,并且支持多線程同步,因此效率非常高
sersync主要用于服務器同步,web鏡像等功能。基于boost1.43.0,inotify api,rsync command.開發
特點:
1、sersync是使用c++編寫,而且對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾(詳細見附錄,這個過濾腳本程序沒有實現),所以在結合rsync同步的時候,節省了運行時耗和網絡資源。因此更快。
相比較上面兩個項目,sersync配置起來很簡單,其中bin目錄下已經有基本上靜態編譯的
2、二進制文件,配合bin目錄下的xml配置文件直接使用即可。
另外本項目相比較其他腳本開源項目,使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
3、本項目有出錯處理機制,通過失敗隊列對出錯的文件重新同步,如果仍舊失敗,則按設定時長對同步失敗的文件重新同步。
4、本項目自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時間整體同步一次。無需再額外配置crontab功能。
5、本項目socket與http插件擴展,滿足您二次開發的需要。
二、同步文件案例
源服務器 web1 server01 原文件所在服務器 192.168.19.102
目標服務器 web2 server03 需要復制到的服務器 192.168.19.101
1、scp
語法:scp 本地文件路徑 用戶名@遠程IP:遠程存儲路徑
由于需要遠程登錄,故需要輸入密碼不是很方便,添加機器的公鑰到允許列表中
①生成公鑰(源服務器)
shell > ssh-keygen
②添加公鑰到允許文件(源服務器)
web2允許web1登錄,不需要輸入密碼
③測試遠程登錄
④測試修改業務代碼
源服務器操作
⑤通過scp推送同步
源服務器操作
shell > scp -r /usr/local/nginx/html/tp5shop root@192.168.17.102:/usr/local/nginx/html
可以把以上推送命令,寫入到腳本中,業務代碼變化之后,直接執行腳本就可以
2、rsync
①web1文件變動
②在web1執行推送
shell > rsync -av /usr/local/nginx/html/tp5shop root@192.168.17.102:/usr/local/nginx/html
③在web2上查看
--delete
delete extraneous files from destination dirs
從目的地目錄刪除無關文件
以上操作,可以增量同步,刪除已經無關的文件。
問題:不能夠文件變動就同步,想折中的版本通過計劃任務(crontab),crontab默認一分鐘
①添加到腳本中
注意執行權限
②添加計劃任務
③查看計劃任務日志
Tip:更新時間間隔頻繁的方式
①定時腳本實現
②啟動腳本
③查看日志
3、rsync+sersync
實現方式:
源服務器 安裝sersync 監控文件(inotify)的變動 調用rsync傳輸數據給目標服務器
目標服務器 啟動rsync的服務
###3.1、目標服務器配置
####配置rsync服務
1、安裝rsync
yum -y install rsync
2、配置rsync
vim /etc/rsyncd.conf
配置文件內容
uid = root gid = root use chroot = no #設置允許登錄的ip,這里沒有限制IP hosts allow=* #設置最大連接數 max connections = 3 #設置啟動rsync服務器的文件 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock #同步模塊 [tp5shop] #需要的文件及其文件夾路徑 path = /usr/local/nginx/html/tp5shop #備注 comment = tp5shop #只讀關閉 read only = false
3、以守護進程方式啟動rsync
/usr/bin/rsync --daemon
###3.2、源服務器配置
shell > mv sersync2.5.4_64bit_binary_stable_final.tar.gz /usr/local/ shell > cd /usr/local/ shell > tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz shell > mv GNU-Linux-x86 sersync
配置serync示例文件說明
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> #保留字段,默認即可 <debug start="false"/> #是否開啟調試模式,默認false即可 <fileSystem xfs="true"/> #是否開啟支持xfs文件系統,Centos7默認都是xfs的了,所以建議true開啟 <filter start="false"> #是否開啟過濾模式,根據需求開啟,例:過濾以.php結尾的文件(.*)\.php <exclude expression="(.*)\.svn"></exclude> #過濾以.svn結尾的文件 <exclude expression="(.*)\.gz"></exclude> #過濾以.gz結尾的文件 <exclude expression="^info/*"></exclude> #過濾監控目錄下的info路徑 <exclude expression="^static/*"></exclude> #過濾監控目錄下的static路徑 <exclude expression="wwwroot/blogwhsir/*"></exclude> #過濾wwwroot/blogwhsir/目錄下所有文件 </filter> <inotify> #inotify監控事件 <delete start="true"/> #如果不開啟此項,在刪除監控目錄下的文件時,目標服務器的文件則不會同時刪除,根據需求開啟 <createFolder start="true"/> #不開啟不能監控子目錄,建議true <createFile start="false"/> #關閉提高通訊性能,默認就好 <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify><sersync> <localpath watch="/opt/tongbu"> #指定要監控的本地目錄 <remote ip="127.0.0.1" name="tongbu1"/> #指定要同步的目標服務器的IP地址,及目標服務器rsync的[模塊] <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> #配置rsync <commonParams params="-artuz"/> #rsync的參數 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> #是否開啟rsync的認證模式,需要配置users及passwordfile,根據情況開啟(如果開啟,注意密碼文件權限一定要是600) <userDefinedPort start="false" port="874"/><!-- port=874 --> #遠程目標服務器的端口不是默認端口時使用 <timeout start="false" time="100"/><!-- timeout=100 --> #是否開啟rsync的超時時間 <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> #目標服務器傳輸失敗時會重新傳輸,再次失敗會寫入rsync_fail_log中,每隔一段時間(timeToExecute)執行腳本再次傳輸 <crontab start="false" schedule="600"><!--600mins--> #對監控目錄與目標服務器每隔一段時間進行一次整體同步,默認600分鐘,根據個人情況是否開啟 <crontabfilter start="false"> #如果之前開啟了文件過濾,這里也要設置過濾 <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync><plugin name="command"> #下面就是插件的設置(不做過多說明) <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin><plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="https://blog.whsir.com"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head>
修改使用配置文件
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"><host hostip="localhost" port="8008"></host><debug start="false"/><fileSystem xfs="false"/><filter start="false"><exclude expression="(.*)\.svn"></exclude><exclude expression="(.*)\.gz"></exclude><exclude expression="^info/*"></exclude><exclude expression="^static/*"></exclude></filter><inotify><delete start="true"/><createFolder start="true"/><createFile start="false"/><closeWrite start="true"/><moveFrom start="true"/><moveTo start="true"/><attrib start="false"/><modify start="false"/></inotify><sersync><!--1、監控本地目錄--><localpath watch="/usr/local/nginx/html/tp5shop"><!--2、目標服務器IP,同步到的服務器 name為目標服務器rsyncd.conf里配置的模塊名稱--><remote ip="192.168.17.101" name="tp5shop"/><!--<remote ip="192.168.8.39" name="tongbu"/>--><!--<remote ip="192.168.8.40" name="tongbu"/>--></localpath><rsync><commonParams params="-artuz"/><auth start="false" users="root" passwordfile="/etc/rsync.pas"/><userDefinedPort start="false" port="874"/><!-- port=874 --><timeout start="false" time="100"/><!-- timeout=100 --><ssh start="false"/></rsync><failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--><crontab start="false" schedule="600"><!--600mins--><crontabfilter start="false"><exclude expression="*.php"></exclude><exclude expression="info/*"></exclude></crontabfilter></crontab><plugin start="false" name="command"/></sersync><plugin name="command"><param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--><filter start="false"><include expression="(.*)\.php"/><include expression="(.*)\.sh"/></filter></plugin><plugin name="socket"><localpath watch="/opt/tongbu"><deshost ip="192.168.138.20" port="8009"/></localpath></plugin><plugin name="refreshCDN"><localpath watch="/data0/htdocs/cms.xoyo.com/site/"><cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/><sendurl base="http://pic.xoyo.com/cms"/><regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/></localpath></plugin> </head>
啟動sersync服務
/usr/local/sersync/sersync2 -n 10 -d -o /usr/local/sersync/confxml.xml
-n 啟用線程數量 -d daemon方式啟動 -o 指定配置文件
過濾不需要同步的文件
第6行開始 <filter start="true"><exclude expression="(.*)\.cfg"></exclude><!--<exclude expression="(.*)\.svn"></exclude><exclude expression="(.*)\.gz"></exclude><exclude expression="^info/*"></exclude><exclude expression="^static/*"></exclude>--> </filter>
三、企業業務架構回顧
1、企業LNMP單點部署
單點服務器滿足基本業務需求,用戶可以通過線上服務訪問網站業務
2、企業數據庫服務器單點部署
①多個業務軟件,同時在一個服務器,會有資源爭搶的現象
②數據庫服務器,數據是最重要的,需要單獨進行管理
數據庫服務器進行嚴格的權限要求:
特定的用戶操作特定庫 一個業務一個用戶
3、企業架構雙點熱備單活HA
HA 高可用 多個(起碼兩個以上)服務器節點,如果單點服務器出現問題,就由其他服務器進行接管服務。整個業務服務,是高度可用的。業務不受影響
VIP 虛擬IP 多臺服務器,同時爭搶一個IP
vrrp 網卡mac地址 => IP 確定VIP是否被綁定
使用keepalived
主master備backup 默認主優先
雙備 優先級 可以設置不爭搶
多備模式 權重
vip切換 腦裂(裂腦) 通信不順暢
①防火墻禁用發包
②禁止發廣播(組播) 可以使用單播 unicast
4、企業架構HA、LB
單點web服務器,已經不能夠滿足業務流量需求,需要增加服務器同時進行提供業務服務
SLB server load blance 把業務流量[平均]分配(分發)到多臺服務器
二層 mac地址
三層 ip地址
四層 ip+port
七層 http url
lvs 四層以下 nat 四層和三層 、二層
NAT 跨網段轉發 CIP192.168.39.72
DS兩個網段(192.168.39.73,192.168.17.104) RS (192.168.17.101 ,103)
DR DS和RS都綁定VIP ,默認訪問時,RS不要響應通過VIP訪問的請求,由DS響應,DS分發到RS上,RS找VIP發現是自己,返回數據給CIP即可。 請求通過DS,返回直接通過RS給CS 。DS和RS在同一個網段 二層修改了mac地址
nginx 七層 proxy_pass轉發 請求 到 upstream 分發
四層
haproxy 四層 model tcp 主動監測后端服務是否可用
七層 model http
瀏覽器(app)=>web服務器=>后端服務(php)=> 數據庫
5、企業架構MySQL數據服務器主從復制
主從類型: M-S M-S-S M S S S M-M
一主多從的使用最多
延時復制 從同步主的延遲時間,作為誤操作的一個備份
半同步 默認主從是異步,為了保證數據實時一致性,主確認從已經寫入relay-log,才完成寫入,返回用戶,有一個等待時間
mysql的安全權限控制
grant 權限 on 數據庫.數據表 to 用戶名@主機 idetified by ‘密碼’;
revoke
日志(錯誤、二進制、中繼、慢查詢[mysql優化] ) 備份
二進制日志開啟: bin-log = 存儲路徑和名稱 server-id 服務器唯一識別標識
備份:tar 打包 mysqldump xtrabackup innobackupex、percona
備份的影響:冷備份 溫備份 熱備份
備份的類型:物理(copy) 邏輯(sql導出再執行)
備份的粒度:全量 增量
主從復制:bin-log
slave 通過讀取master的bin-log 寫入relay-log中,再進行重放操作,復制同步數據。
默認異步線程的
master auto.cnf
①開啟bin-log server-id 1
②授權slave replication slave 權限
③mysql > show master status;
slave
①配server-id 2
②配置slave服務
mysql > stop slave
mysql > change master masterhost ,masteruser · ········
日志文件名稱 logfile 日志記錄位置 position
mysql > start slave;
mysql > show slave status\G;
兩個yes,一個yes就看看下面的報錯信息,解決
6、企業架構讀寫分離
M-S S不能寫
S 用來讀
M 又讀又寫 來回切換模式,效率不高
M寫 S讀 讀寫分離 S down 為了業務可用性 M可以提供讀服務
實現讀寫分離的兩種方式:
①業務代碼分離
②中間件(mycat)
mycat java編寫
jdk jre
jdk :openjdk oraclejdk 授權方式不一樣 java8 之后99.99%
mycat兩種:
雙寫 writeHost writeHost M宕機 S不影響,可以讀 也可以寫 業務上S不讓寫 在S的配置上寫read-only
單寫單讀 writeHost readHost M宕機 S不可用
mycat 客戶端口 8066
管理端口 9066 mysql > show @@heartbeat;
7、企業架構緩存memcached
①LB的業務模式下,session出現不能夠訪問的情況
ip_hash session入庫 memcached
②高速內存緩存軟件 緩存了首頁的category欄目數據
memcached
nosql key=>value
內存存儲數據 要注意數據的備份
memcached redis key=>value store
mongodb doucument store
默認允許在11211端口
./memcached -uroot -d -p 11211 -m 內存大小 -M 禁用LRU機制
存儲緩存機制
①懶惰機制 當key過期后,不會直接刪除 當被使用時,確認過期,才會刪除
節省系統的資源
②LRU 如果一個key存儲的時候,發現存儲空間不足。先刪除已經過期的key,刪了已經過期key還是不能夠存儲。會刪除最近最少使用的key。刪除這個key,存儲新的key。
這個也是緩存的一種理想模式。不用的話,就沒有必須占用內存空間
-M 可以禁用LRU
8、企業架構緩存redis
redis比memcache
①數據類型豐富
string 緩存字符串 計算器 incr
list 可以進行數據的雙向操作
set 交集 并集 差集 sns 好友圈
zset 排序 score 權排序 score從大到小 或者從小到大 控制排序也就是控制score的大小
hash key:(field:value)
②數據持久化 snappshotting 快照 dump.rdb save
save 900 1
save 300 10
save 60 10000
aof append only file 文件追加寫
每次 每秒 根據系統資源情況 閑時
③redis 主從模式
④redis默認存儲string的value 512BM memcached 1M
⑤redis 單核 memcached 多核
redis hash 效果高 壓縮高 返回數據快
memcached 超過100k以上,效果好一些
一般使用,緩存都可以 它們的每秒并發都可以達到幾w級別
商城業務使用redis:
set記錄登錄的用戶數,統計活躍用戶及其數量
master-slave
master bind 127.0.0.1 外網訪問網卡
requirepass 密碼
slave 配置master slave of ~~~~
masterauth ~~~~
9、企業架構nosql之mongodb
mongodb用來進行訪問日志記錄
mongodb特點:
①存儲 PB bson結構 存儲靈活
②效率 讀寫
③結構 collection 集合 document 文檔 field 域
CURD
use devops;
db.student.insert({name:1})
db.student.find({name:1},{age:1,_id:0})
db.student.remove()
db.student.update({查詢條件},{‘$set’:{}})
基礎知識點技術:
ssh、sftp、gcc、make、cmake、nginx(tengine、openresty)
server01-server10
server01 web1 nginx php-fpm keepalived sersync
server02 master MySQL mysql
server03 web2 nginx php-fpm keepalived rsync
server04 LB nginx|haproxy|lvs keepalived
server05 backupLB nginx|haproxy|lvs keepalived
server06 slave MySQL mysql
server07 mycat mycat java
server08 master cache memcached redis
server09 slave cache redis
server10 mongodb
四、模擬壓力測試
1、web測試
ab 是httpd apache內置的一個壓力測試工具,可以通過模擬并發的方式,檢測出請求所用時間,每秒吞吐量。
ab的安裝,可以源碼編譯的httpd中在/usr/local/httpd/bin里
rpm安裝需要yum -y install httpd_tools
ab --help 查看相關參數
常見使用語法:
ab -c 并發次數[同時請求數] -n 總的請求數 訪問URI路徑
靜態頁面(html)
單機測試
負載均衡
動態頁面(php)
單機測試
負載均衡
動態頁面使用負載均衡提供了并發量,實際是有多個PHP-FPM可使用了。
單機優化,cpu和內存資源沒有完全使用到。70%-90%
單機多實例php測試
sysbench mysql壓力測試工具