wordpress使用rsync加openvpn进行同步和备份

wordpress使用rsync加openvpn进行同步和备份

[toc]

文:铁乐与猫
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 wordpress@10.8.0.1::wordpress /cygdrive/e/wordpress --password-file=/passwd.txt
    

    上面是rsync命令的参考,其中--password-file=/passwd.txt表示使用的密码就是passwd.txt中的密码。/cygdrive/e/wordpress则表示同步保存到客户端的e盘下的wordpress文件夹下。

    rsync -avz --progress wordpress@10.8.0.1::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]
    

    wordpress@10.8.0.1就是表示使用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】

发表评论

电子邮件地址不会被公开。 必填项已用*标注

13 − 1 =