利用 rsync 同步项目代码、数据文件

利用 rsync 同步项目代码、数据文件

背景:当前IT环境下,网络安全越来越重要,其中在等级保护条例中,有提交系统或项目代码、数据的同步和备份是数据安全非常关键一环,并要求定时备份且定时加密,个人在实际场景已经使用rsync完成等保相关要求,以下为以小项目作为完整配置说明

1、安装rsync

两台服务器安装 yum install -y rsync 或者在官网https://rsync.samba.org/ 下载离线包编译安装

https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz

2、添加配置文件:

rsync默认没有配置文件,需自行新建

mkdir -p /etc/rsync
touch rsyncd.conf rsyncd.pw rsyncd.motd
chmod 600 rsyncd.pw

主服务器配置

pid file = /var/run/rsyncd.pid  
motd file = /etc/rsyncd/rsyncd.motd
log file = /var/log/rsync.log    
log format = %t %a %m %f %b                                                            
syslog facility = local3 
timeout = 60 

port = 31873                                                                             
address = 192.168.100.4                                           
uid = root                                                                               
gid = root                                                                                      
use chroot = yes                                                                         
read only = yes                                                                                                                                
hosts allow=192.168.100.5 
hosts deny=*                                                                            
max connections = 4                                                                     


# 同步代码文件
[django_apps]                                                                             
path = /root/mydjango                                                   
list=yes                                                                                 
ignore errors                                                                             
auth users = root                                                                         
secrets file = /etc/rsyncd/rsyncd.pw                                           
comment =  webapps data sync                                                         
exclude = logs/

# 同步数据文件
[apps_mysql]                                                                             
path = /root/apps_mysql
list=yes                                                                                 
ignore errors                                                                             
auth users = root                                                                         
secrets file = /etc/rsyncd/rsyncd.pw                                           
comment =  webapps mysql db data sync                                                         

参数说明:

这里的端口已经被重新设定为5位数,安全考虑,并且防火墙iptables要放通该端口

read only:只容许客户端对服务器的同步目录读,保证安全

[django_apps] :模块名,自己定义,可以在下方添加多个模块,每个模块对应一个目录。须与客户端执行命令中的模块名一致。

因为客户端命令:rsync://192.168.100.4/django_apps 这里django_apps就是模块名

path:要备份的服务端文件夹路径。
hosts allow:允许的客户端连接IP,多个IP用逗号隔开,也可以写一段IP。
secrets file:服务端密码文件,内容格式为,用户名:密码,uid=root,所以这里用户名设为root,密码不需要设置为服务器登录密码,可以是其他密码。
auth users:有权限的用户名,与密码文件中用户名一致。

exclude:排除不需要同步目录,例如这里 logs/

注意:https://download.samba.org/pub/rsync/rsync.html以及

https://download.samba.org/pub/rsync/rsyncd.conf.html

官方使用指引,非常详细,推荐参考

3、配置账户密码,这里使用root账户,但密码是随机设置,请勿设置服务器登录密码!

vim rsyncd.pw

root:Jp219881_$Ah

4、 mysql 数据定时导出

创建mysql_daily_bak.sh脚本,数据文件放在/data/bak目录下

# 导出目标库,以sql形式导出
/opt/app/bin/mysqldump bigdata >/data/bak/bigdata-`date +%Y%m%d`.sql
/opt/app/bin/mysqldump cns >/data/bak/cns-`date +%Y%m%d`.sql
/opt/app/bin/mysqldump ems >/data/bak/ems-`date +%Y%m%d`.sql
# 保留半年数据
find /data/bak/ -mtime +180 -name '*.sql' -exec rm -rf {} \;

加入到定时任务,例如每天凌晨一点备份

0 */1 * * * sh /etc/rsync/mysql_daily_bak.sh

5、修改 rsyncd.motd

它是定义 rysnc 服务器在客户端同步登陆显示的欢迎条,可自行定义,最好说明来自哪里的同步server

files syncon blog server which server IP is

6、在主服务器上启动rsyncd.sh

后台进程启动:

rsync --daemon --config=/etc/rsync/rsyncd.conf

加入开机自启:

在 rc.local 末尾追加一行,如下:

vi /etc/rc.d/rc.local
/usr/bin/rsync --daemon --config=/etc/rsync/rsyncd.conf

但以上配置也会引起 rsync启动失败,因为rsync重启时需要根据rsyncd.conf创建/var/run/rsyncd.pid ,但因之前启动已经创建,导致提示文件已存在而无法启动,所以正确配置如下:

创建一个脚本 restart_rsync.sh 可以放在/etc/rsyncd/

rm -f /var/run/rsyncd.pid
rsync --daemon --config=/etc/rsync/rsyncd.conf

再将脚本加入到开机自启

因在centos7上, /etc/rc.d/rc.local权限默认没有执行权限,需重赋权限,该文件上也有提示要加入可执行权限Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure that this script will be executed during boot

chmod +x /etc/rc.d/rc.local

内容 追加vi /etc/rc.d/rc.local

sh /etc/rsync/restart_rsync.sh

7、在备服务器上,配置简单很多

创建 /etc/rsyncd文件,里面只需要

新建sh文件etc/rsyncd/run_rsync.sh

rsync -ztruvoglp  --password-file=/etc/rsync/rsyncd.secrets  
--delete rsync://192.168.100.4:31873/django_apps  /root/mydjango/

# 如有多个目录,可以继续添加
rsync -ztruvoglp  --password-file=/etc/rsync/rsyncd.secrets  
--delete rsync://192.168.100.4:31873/django_blog  /root/myblog/

这里rsync://IP/对应服务器rsyncd.conf配置需要同步的“module”,也就是django_apps,注意不是目录路径

/root/mydjango/ 对应在备服务器上创建与主服务器一致的文件目录路径,如果备服务器已经创建了该目录,那么rsync不在创建,而是同步文件和目录

rsync -ztruvoglp 参数说明

-a 以archive模式操作、复制目录、符号连接 
-r 递归,同步目录及其子目录所有文件
-l 是链接文件,意思是拷贝链接文件;
-p 表示保持文件原有权限;
-t 保持文件原有时间;
-g 保持文件原有用户组;
-o 保持文件原有属主;
-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
-e ssh的参数建立起加密的连接。
-u 只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
--progress是指显示出详细的进度情况
--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
--password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了

这里为何创建run_rsync.sh,因为rsync客户端侧,没有定时运行功能,因此需要自行写个sh,然后在crontab里设定定时任务,定时向rsync服务器端更新文件

*/1 * * * * /etc/rsyncd/run_rsync.sh 每1分钟从主服务器增量同步一次

也可以为不同同步目录创建不同的sh来控制其同步间隔

例如大文件 */30 * * * * /etc/rsyncd/large_file_rsync.sh 每30分钟从主服务器增量同步一次

注:若所同步的文件夹为小文件且数量多、更改频繁的,同步时间间隔可以设为较大值

若所同步的文件为大文件,其删改频率低,同步时间间隔可以设为较大值

8、主服务器防火墙放通rsync端口

防火墙配置是一个非常重要环节,在很多技术产品部署过程中,很多教程都让你先关闭防火墙以便排除网络、端口连通性故障,但实际生产或者项目正式使用时,防火墙必须打开,而且需要写入精细的acl策略,保证系统安全。

centos7.5

firewall-cmd --zone=public --add-port=31873/tcp --permanent
firewall-cmd --reload

redhat6.5 使用iptables配置防火墙

直接在shell命令行加入,通过save操作,将其写入到/etc/sysconfig/iptables,保证永久生效

iptables -A INPUT -p tcp --dport 31873 -s 192.168.100.0/24 -j ACCEPT
/etc/rc.d/init.d/iptables save
service iptables restart

或者在iptables文件中详细写入相关规则

iptables 的策略配置:

  • 首先拒绝所有包访问主服务器
  • 逐条放通某个端口或者某个IP访问该主服务器
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 以三条 
:blog-server - [0:0] 

-A INPUT -j blog-server
-A FORWARD -j blog-server
-A OUTPUT -j blog-server

-A blog-server -i lo -j ACCEPT
-A blog-server -p icmp --icmp-type any -j ACCEPT
-A blog-server -m state --state ESTABLISHED,RELATED -j ACCEPT
# 放通rsyncd端口31873,仅192.168.100.0/24可访问
-A blog-server -p tcp --dport 31873 -s 192.168.100.0/24 -j ACCEPT

# 放通ssh端口31873,仅192.168.100.0/24可访问
-A blog-server -p tcp --dport 31022 -s 192.168.100.0/24 -j ACCEPT
# 服务器禁ping
-A blog-server -j REJECT --reject-with icmp-host-prohibited
COMMIT

你可能感兴趣的:(Linux)