wordpress使用rsync和openvpn進行同步和備份

wordpress使用rsync加openvpn進行同步和備份


文:鐵樂與貓
2018-9-20

我以前有寫過一篇《wordpress利用rsync同步備份》

實踐了一年後發現,當中的策略存在很大的弊端。下面會詳說。
先介紹一下環境:

環境

  • 阿里雲服務器
    • 1核cpu,2G內存,1M帶寬
  • 系統:openSUSE Leap 42.3
  • 客戶端:win7 64位
  • 己搭建好wordpress,網站目錄路徑爲/www/wordpress
  • wordpress使用mysql做數據庫
  • 服務器上面已做腳本和計劃任務將wordpress使用的數據庫與web目錄每天壓縮備份放到 /data/backup目錄下
  • rsync 3.1.0及cwrsync5.5
  • openVPN 2.3.4

普通同步策略的弊端

之前使用的備份手段是在服務器端使用腳本每天深夜對wordpress相關的數據庫做備份和導出到備份目錄下,數據庫的備份文件普遍只是1M多一點的大小,無礙同步。

關鍵的是我對整個wordpress項目的壓縮備份從以前的30多M慢慢上升到現在的每個文件都達100多M大小了。主要增長的是圖片,由於我將wordpress當成圖牀來用了,還曾經上傳過6M大小的一張圖片。

所以問題就出在一週過後對這些wordpress備份好的壓縮文件同步的時候,雲服務器1M的帶寬並不夠快,經常出現最多同步一到兩個壓縮文件就卡死了。

我是按天備份數據的,以致我從之前的保留15天到現在只保留5天了,就是因爲不想同步太多備份文件。

另外由於每次利用rsync去拉取服務器端的備份文件的時候,並沒有利用上rsync增量同步的優點,因爲你拉取的是備份文件,而壓縮過的備份文件必然是每一份都不同,每一次rsync都需要拉取至少達100多m的數據大小。

且由於這樣惡劣的環境,我是沒有每天去做rsync同步的事情了。

也就是,備份只在服務器上有做好,客戶端這邊想做異地備份沒法好好做。

既然分析出弊端了,相應的解決方案也就有了。

改良的同步方案

  • 服務端的備份方案可以不變,甚至可以保留天數恢復到15天。
  • 客戶端的rsync同步方案需要改變。
    • 一是同步db數據文件;
    • 二是直接同步wordpress整個項目目錄;
    • 三是不再同步備份好的wordpress目錄的壓縮文件。
    • 四是rsync同步時不再直接走公網ip,而是讓服務端搭建好openvpn後,客戶端直接走通過openvpn相連好的10.8.0.1 IP。穩定性比直接跑公網ip同步要好多了。
  • 如此的優點有:
    • 一是數據庫的備份文件小,很快就可以同步到客戶端,一直以來都是不受影響的。
    • 二是直接同步wordpress整個項目目錄,可以最大程度的利用上了rsync的增量同步功能。
    • 三是服務器端有保存wordpress項目的備份了,如果客戶端想做異地備份,可以在客戶端對相應己同步回來的wordpress項目對應的文件做壓縮備份操作。節省時間效率做到同樣的事情。
    • 通過openvpn相連的客戶端與服務端,在做rsync同步時穩定性極大提升。

從頭細說起

以上只是在你有看完《wordpress利用rsync同步備份》一文後能看懂的說明。

下面就是你完全不看前面的也能跟着做的詳細說明了。

當然搭建wordpress博客網站和部署好mysql是不會再從頭說起的,這裏就從假設你搭建完成後說起吧。

備份數據

  • 備份數據庫的腳本文件,供參考:

    /data/shell/mysql_backup.sh
    
    #!/bin/bash
    ##本機每天自動備份wordpress數據庫到備份文件夾##
    
    backup='/data/backup/db' # 定義備份路徑
    time=`date +%Y%m%d`
    dbhost="localhost"
    dbuser="wordpress" # 這裏填寫相應的數據庫用戶名
    dbpass="這裏填寫你的wordpress數據庫的密碼"
    db="wordpress" # 這裏填的就是wordpress的數據庫名了
    
    mysqldump -h${dbhost} -u${dbuser} -p${dbpass} ${db} 2>/dev/null | gzip > $backup/wordpress_$time.sql.gz
    ##導出數據庫備份文件到備份目錄並且進行壓縮成gz格式,解壓時使用gzid -d命令##
    
    sleep 10s
    
    cd $backup
    find ./ -type f -name "wordpress_*.sql.gz" -mtime +15 -exec rm -fv {} \;
    ##超過15天的備份文件自動清除##
    
  • 定時器

    -------------------定時器------------------
    opensuse-wordpress:/data/shell # crontab -l
    # DO NOT EDIT THIS FILE - edit the master and reinstall.
    # (/tmp/crontab.D6KBVq installed on Wed Dec 20 17:30:03 2017)
    # (Cronie version 4.2)
    #每天凌晨0點備份數據庫
    0 0 * * * sh /data/shell/mysql_backup.sh > /dev/null 2>&1
    

打包wordpress項目和備份

  • 打包項目和備份的腳本,供參考:

    /data/shell/wordpress_backup.sh
    
    #!/bin/bash
    ##本機每天自動備份打包wordpress主目錄##
    
    www='/www'
    backup='/data/backup/wordpress'
    time=`date +%Y%m%d`
    
    tar -zcf $backup/wordpress_$time.tar.gz $www
    #對wordpress的整個web目錄進行打包到備份文件夾下
    
    sleep 12s
    
    cd $backup
    find ./ -type f -name "wordpress_*.tar.gz" -mtime +15 -exec rm -fv {} \;
    ##超過15天的備份文件自動清除##
    
  • 定時器

    ---------------------定時器執行---------------
    #每天凌晨0點備份數據庫
    0 0 * * * sh /data/shell/mysql_backup.sh > /dev/null 2>&1
    #每天凌晨1點備份wordpress主web目錄
    0 1 * * * sh /data/shell/wordpress_backup.sh > /dev/null 2>&1
    

服務端安裝rsync

由於是openSUSE系統,使用的是zypper來安裝,如果你的中centos系統則相應使用yum安裝是了。

operation@opensuse-wordpress:~> sudo zypper in rsync
[sudo] password for root:
Loading repository data…
Reading installed packages…
Resolving package dependencies…

The following NEW package is going to be installed:
rsync

1 new package to install.
Overall download size: 323.2 KiB. Already cached: 0 B. After the operation, additional 625.5 KiB will be used.
Continue? [y/n/…? shows all options] (y): y
Retrieving package rsync-3.1.0-8.4.x86_64 (1/1), 323.2 KiB (625.5 KiB unpacked)
Retrieving: rsync-3.1.0-8.4.x86_64.rpm ……………………………………………………………[done]
Checking for file conflicts: …………………………………………………………………….[done]
(1/1) Installing: rsync-3.1.0-8.4.x86_64 ………………………………………………………….[done]

服務端配置rsync

  • rsync服務器端需要兩個配置文件:
    • rsyncd.conf
      • rsyncd.conf默認存放在/etc/目錄下,同時它也是rsync服務器的主配置文件。
      • 該文件配置了rsync服務器的控制認證、訪問、日誌記錄等等。
    • rsyncd.secrets
      • rsyncd.secrets主要用於存儲rsync用戶名和密碼。

如果是編譯安裝的rsync是不會生成以上這兩個配置文件的,需要我們手工進行創建。 不過在這我是用zypper安裝的,當然直接在/etc下面就有rsyncd.confrsyncd.secrets文件。

  • 編輯配置文件

sudo vim /etc/rsyncd.conf

gid = users
read only = true
use chroot = true
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = trusted.hosts
slp refresh = 300
use slp = false
secrets file=/etc/rsyncd.secrets
##以上是全局配置

#[Example]
#path = /home/Example
#comment = An Example
#auth users = user
#secrets file = /etc/rsyncd.secrets
# 這一段是給你參照的例子

[backup]
uid = root
gid = root
path = /data/backup/db
hosts allow = 10.8.0.0/255.255.255.0
ignore errors
read only = true
auth users = wordpress
secrets file = /etc/rsyncd.secrets
# 以上是針對數據庫備份文件所做的同步配置 

[wordpress]
uid = root
gid = root
path = /www/wordpress
hosts allow = 10.8.0.0/255.255.255.0
ignore errors
read only = true
auth users = wordpress
secrets file = /etc/rsyncd.secrets
# 以上是針對wordpress網站項目文件夾所在的同步配置

rsync默認是在nobody用戶下運行的, 但是我們測試爲了同步時不爲各種權限的事情煩惱,就讓其在root用戶下運行。當然如果是生產環境下就要慎重了。個人使用的wordpress的話,且因爲後面是用openvpn相通才運行的話,安全還是有保障的。

  • 創建密碼文件

    配置文件修改完成後,創建密碼文件: vim /etc/rsyncd.secrets

    將wordpress的用戶和密碼編輯進去,例如: wordpress:ABCabc123
    注:該密碼文件中的用戶和密碼可以進行自定義,同時該用戶不一定要在服務器中的系統用戶中存在。

  • 密碼文件創建完畢後,還需要將其權限設置爲600,否則會在以後同步時提示驗證出錯。zypper安裝完成的不用再做此步驟也是600了。

chmod 600 /etc/rsyncd.secrets

一個rsync配置文件中可以包含多個認證模塊(比如上面列表的[backup]),同時一個密碼文件中也可以存放多個用戶和其對應的密碼。其中每一個認證模塊可以對應不同的客戶端。

服務端啓動rsync

sudo rsync –daemon

可以pstree看rsync進程是否有運行和netstat看873端口開起來沒有。

之後修改rsync的配置文件的話,一般不需要重啓rsync進程也能自動生效。如果確實沒有生效,也可以使用systemctl命令來做啓動和重啓及查看狀態等。

例如:systemctl status rsync就是查看rsync進程的狀態。

windows客戶端安裝cwrsync

官網鏈接:https://www.itefix.net/cwrsync

cwRsync-5.5.0-32位的下載鏈接如下: https://www.itefix.net/dl/cwRsync_5.5.0_x86_Free.zip

下載解壓完成,雙擊目錄下的cwrsync.cmd或在cmd命令提示窗口下運行完成批處理安裝。

  • rsync命令添加到系統環境變量:

    右鍵“我的電腦(計算機)”-“屬性”-“高級系統設置”; 彈出“系統屬性”框,再點擊“高級”標籤-“環境變量”; 彈出“環境變量”框,選中下方的系統變量一欄中的“Path”,再點擊“編輯”進行編輯系統變量,如圖:

    Path的變量值一欄結尾,我們要續上cwRsync的絕對路徑進去,注意的是前面要替上一個變量值添加上分號區分。類似我的就是填入;D:\PortableSoft\cwRsync\bin,確定。

  • 放行rsync端口

    安裝完成後,阿里雲服務器安全組上開通873端口(放行rsync),當然如果你的服務器開啓了防火牆的同樣要在防火牆規則中對873端口進行放行。

  • 建立密碼文件

    新建一個單純存放密碼的文本文件, 將服務端設置的對應的用戶的密碼保存進去。比如我就是直接放在cwrsync安裝目錄下,起了個名叫passwd的txt文件。

  • 相關腳本

    新建一個wordpress-rsync.bat文件(也可以直接在記事本中寫好再另存爲bat文件):

    rsync -avz --progress [email protected]::wordpress /cygdrive/e/wordpress --password-file=/passwd.txt
    

    上面是rsync命令的參考,其中--password-file=/passwd.txt表示使用的密碼就是passwd.txt中的密碼。/cygdrive/e/wordpress則表示同步保存到客戶端的e盤下的wordpress文件夾下。

    rsync -avz --progress [email protected]::wordpress則表示客戶端拉取服務端10.8.0.1中rsync配置文件中的wordpress指代的目錄下的所有數據。前面我在服務端的rsync中wordpress指代的路徑就是path = /www/wordpress--progress則是傳輸中顯示百分比。其實這個參數可以不加也行,加上會更好,能直觀的看到腳本運行的時候有沒有卡死。

  • rsync幾個重要參數

    經常使用的幾個參數:-v,-a,-z
    -v, –verbose詳細模式輸出。
    -a, –archive歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性不變。
    -z, –compress對備份的文件在傳輸時進行壓縮處理。
    –delete:刪除那些DST中存在而在SRC中沒有的文件。
    
  • rsync客戶端拉取服務端文件所用到的模式:

    rsync [OPTION]… [USER@]HOST::SRC [DEST]
    

    [email protected]就是表示使用wordpress用戶去連接10.8.0.1服務器。

    當然你要先進行測試的話,就將10.8.0.1換成你測試連接的rsync服務器的公網ip地址好了。

    我這裏之所以填10.8.0.1是因爲我在wordpress服務器中還安裝了openvpn服務,windows則作爲openvpn的客戶端10.8.0.6之類去進行連接,同步的穩定性會高很多。

使用openvpn連接

具體可點擊此鏈接:《openSUSE搭建OpenVPN》

這篇同樣是我寫的文章來參照安裝和連接使用。本文就不再重複詳述了。

這些準備工作都做好後,右鍵之前寫好的rsync腳本wordpress-rsync.bat使用管理員身份運行,就可以看出效果了,如下圖:

運行腳本成功後,可看到己將服務端的wordpress整個目錄給同步下來了,
以後做計劃任務或手動運行同步之類的都是增量同步,效率大大提高。
而你如果想做異地備份的話,還可以在客戶端再做個腳本和計劃任務,
再對客戶端的wordpress目錄直接做本地壓縮,
比起在線拉取服務端的備份壓縮文件好太多了。

計劃任務

我們可以通過windows自帶的任務計劃,讓系統自行進行同步。儘管這個和服務器還是有一定的時間差的,但是有總比沒有好。 實際上要滿足實際需求做到實時同步還應使用inotifywait(雖然不像linux那樣支持inotify,但github上有人開發出windows上適用的inotifywait了) 又或者使用cygwin環境再實行安裝inotify會更適宜初學者去做實時同步。

  • 例1:

    打開任務計劃程序,創建任務,設置好計劃任務,觸發器是每天的3點半,操作是運行e盤上的批處理腳本rsync_inetpub.bat

    看以上例子就可以知道,如果需要做到近似於實時同步,那就是可以將計劃任務相隔時間設置成一分鐘,而不是特定某一時刻。還有一種需求是自己做一個網站項目,在有需要更新線上服務器的時候才觸發rsync腳本推送到線上服務器集羣上增量同步更新,rsync配合jenkins構建就是這麼來的。

    當然,現在我們的需求很簡單,就是每天對線上的wordpress數據做一個拉取同步而己。

  • 結合我前面的配置,實際的計劃任務的例子如下:

    【控制面板】-【管理工具】-【任務計劃程序】-【任務計劃程序庫】-【新文件夾】創建wordpress文件夾-【創建任務】

    起名,【觸發器】填寫每天在什麼時間點進行,或選擇登錄時執行;

    【操作】中瀏覽腳本,選中前面我們創建好的腳本文件,表示當觸發時運行該腳本。

  • 另,之前安裝的openvpn windows客戶端本身就生成服務,可以開機啓動。而rsync也可以安裝成服務端,這樣有特殊需求的也可以做到互相推送同步。詳情可參考我的另一篇文章:《rsync在windows上的安裝和使用二》

【end】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章