架构图解
服务器环境规划
创建9台服务器集群
系统 centos7
内存 至少2G/1c(特殊情况,给1c/1g也够了)
网卡
eth0,使用NAT、模拟外网环境 ,网段是10.0.0.xx,网关10.0.0.254
eth1,使用LAN区段,模拟内网环境,网段是172.16.1.xx,网关172.16.1.254
硬盘容量,40G
外网地址
模拟互联网的公网ip
你可以直接使用windows,ping通该地址,(xshell)ssh连接该地址(服务器)
内网地址
模拟服务器的内网,局域网环境
无法直接通过xshell连接该服务器
配置清单
安装centos7
1.进入内核选择界面时,按上下方向键,取消自动选择
2.输入tab键,复制粘贴进去如下代码
#centos7默认是 ens33
#按照如下操作,修改为eth0
net.ifnames=0 biosdevname=0
3.输入回车,启动
4.请注意,必须是英文,以后再也别用中文了,因为你要看日志
5.只需要修改亚洲上海时区,其他全部默认
6.网络设置、修改静态ip地址、设置主机名
模板机,主机名 yuchao-template-100
ip,10.0.0.100
网关,10.0.0.254
添加第二块网卡改为LAN模式
修改NAT模式参数
按下2个空格复制下面命令
net.ifnames=0 biosdevname=0
设置时区为亚洲上海
关闭KDUMP内核崩溃机制
网络配置
设置密码,这里密码为123123
图解双网卡的配置
配置初始环境
配置网卡
[root@master-61 ~]# cd /etc/sysconfig/network-scripts/
eth0
[root@master-61 network-scripts]# cat ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=10.0.0.61
PREFIX=24
GATEWAY=10.0.0.254
DNS1=223.5.5.5
eth1
cp ifcfg-eth0 ifcfg-eth1
sed -i 's#eth0#eth1#g' ifcfg-eth1
sed -i 's#10.0.0.61#172.16.1.61#' ifcfg-eth1
sed -i -r '/(GATEWAY|DNS)/d'ifcfg-eth1
[root@master-61 network-scripts]# cat ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.61
PREFIX=24
重启网络服务让配置生效
service network restart
关闭网络配置图形化界面、防火墙、selinux
关闭网络配置图形化界面
systemctl stop firewalld NetworkManager
systemctl disable firewalld NetworkManager
查看防火墙状态
[root@master-61 ~]# getenforce
Enforcing
[root@master-61 ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
关闭防火墙、selinux
临时关闭内置防火墙
setenforce 0
[root@master-61 ~]# getenforce
Permissive
1.永久关闭内置防火墙selinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
[root@master-61 ~]# grep -i 'selinux=' /etc/selinux/config
# SELINUX= can take one of these three values:
SELINUX=disabled
#需要reboot重启服务器,可以先把外置防火墙关闭后重启。
2.清空防火墙规则
iptables -F
关闭firewalld防火墙服务
systemctl stop firewalld
systemctl disable firewalld
iptables -X
iptables -Z
3.最后检查
[root@master-61 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@master-61 ~]# systemctl is-enabled firewalld NetworkManager
disabled
disabled
加速ssh连接
默认ssh连接的时候,可能比较慢,因为它默认进行了dns解析,关闭这个功能。
修改如下2个参数
GSSAPIAuthentication yes
改为GSSAPIAuthentication no
#UseDNS yes
改为UseDNS no
#PidFile
改为PidFile
[root@master-61 ~]# grep -Ei '^(usedns|gssapiauth|pidfile)' /etc/ssh/sshd_config
GSSAPIAuthentication no
UseDNS no
PidFile /var/run/sshd.pid
重启sshd服务
systemctl restart sshd.service
由于重启了sshd服务,进程id必然会变化
如何查找该服务的进程id?
看进程
[root@master-61 ~]# ps -ef | grep sshd
root 1255 1 0 11:07 ? 00:00:00 sshd: root@pts/0
root 1288 1 0 11:16 ? 00:00:00 /usr/sbin/sshd -D
root 1290 1257 0 11:16 pts/0 00:00:00 grep --color=auto sshd
看端口
[root@master-61 ~]# ss -tnlp |grep sshd
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1288,fd=3))
LISTEN 0 128 :::22 :::* users:(("sshd",pid=1288,fd=4))
根据pidfile文件,找到sshd服务的进程id
[root@master-61 ~]# cat /var/run/sshd.pid
1288
优化PS1变量
echo 'export PS1="[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\] \[\e[31;1m\]\w\[\e[0m\]]\\$"' >> /etc/profile
配置可用yum源
1.备份旧的默认repo
cd /etc/yum.repos.d/
mkdir bakrepo
mv *.repo bakrepo/
2.下载新的repo
#发现安装不了因为没有wget命令
#用curl安装
curl + 重定向>
[root@master-61 /etc/yum.repos.d]#curl https://mirrors.aliyun.com/repo/Centos-7.repo > /etc/yum.repos.d/centos-base.repo
或者用 curl -o
[root@master-61 /etc/yum.repos.d]#curl -o /etc/yum.repos.d/epel.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
安装tab补齐工具(安装基础软件部分里有)
因为最小化安装没有tab补齐工具
1.检查是否安装tab补齐软件包(如果是最小化安装,默认没有)
rpm -q bash-completion
2.yum安装bash-completion
yum -y install bash-completion
3.立即生效配置
source /etc/profile.d/bash_completion.sh
安装基础软件
yum install -y tree wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip telnet ntpdate lsof vim
关闭邮件告警
echo 'unset mailcheck' >> /etc/profile
source /etc/profile
配置hosts解析,通过主机名访问不同的机器
cat > /etc/hosts <<EOF
# 外网地址 内网地址 主机名
10.0.0.61 172.16.1.61 master-61
10.0.0.5 172.16.1.5 slb-5
10.0.0.6 172.16.1.6 slb-6
10.0.0.7 172.16.1.7 web-7
10.0.0.8 172.16.1.8 web-8
10.0.0.9 172.16.1.9 web-9
10.0.0.31 172.16.1.31 nfs-31
10.0.0.41 172.16.1.41 rsync-41
10.0.0.51 172.16.1.51 db-51
EOF
练习awk
时间同步
检查时间同步服务是否运行
[root@master-61 ~]#systemctl status crond
写入时间同步信息
[root@master-61 ~]#crontab -e
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
检查定时任务、
[root@master-61 ~]#crontab -l
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
#或者
[root@master-61 ~]#cat /var/spool/cron/root
关闭swap交换分区
取消swap的功能,不适用这个从磁盘获取而来的部分内存容量
[root@master-61 ~]# swapoff -a
[root@master-61 ~]# free -m
total used free shared buff/cache available
Mem: 1982 97 1409 9 475 1699
Swap: 0 0 0
[root@master-61 ~]#
注释掉`/dev/mapper/centos-swap swap swap defaults 0 0`
[root@master-61 ~]# vim /etc/fstab
[root@master-61 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Apr 18 01:03:08 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=16dbd4b1-60b3-4770-b20a-4d0b59b39e4a /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
[root@master-61 ~]#
拍摄快照
克隆新的虚拟机
新虚拟机,克隆完毕后
检查一下初始化的配置是否正确
ip、主机名是否正确,按照规划的来
是否可以ssh
是否可以上网
全部做好首次的快照
循环操作,完成9台机器的创建
绘制架构图,理解今日所学的网站架构演进,以及虚拟机创建
编写修改IP脚本
[root@master-61 ~]# cat change_network.sh
#!/bin/bash
read -p "Please enter the IP:" my_ip
read -p "Please enter a hostname:" host_name
echo '正在修改网卡配置文件eth0'
sed -i "/IPADDR/s#61#${my_ip}#g" /etc/sysconfig/network-scripts/ifcfg-eth0
echo '正在修改网卡配置文件eth1'
sed -i "/IPADDR/s#61#${my_ip}#g" /etc/sysconfig/network-scripts/ifcfg-eth1
service network restart
echo '网卡配置文件修改完毕'
echo '正在修改主机名'
hostnamectl set-hostname ${host_name}
bash
echo "====================="
echo "此时的ethe配置是:"
cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo "====================="
echo "此时的eth1配置是:"
cat /etc/sysconfig/network-scripts/ifcfg-eth1
执行脚本
bash change_network.sh
文件共享服务
文件共享服务方案有很多,了解即可
ftp(简单文件传输服务)
提供用户认证机制
可以输入账号密码
python -m SimpleHTTPServer
nginx也提供了文件下载的功能
提供用户认证机制
反向代理,负载均衡
web服务器,静态文件服务器的作用
如ftp服务器的作用
samba(linux和windows之间共享数据)
提供用户认证机制
nfs(主要用这个)
重点学习,工作里用的是
nfs
nginx
平时,简易的快速进行文件下载,下载服务器上的资料
python -m SimpleHTTPServer
搭建ftp共享服务
(一)服务器准备
客户端 172.16.1.41 yang-ftpclient01 安装ftp客户端
服务端 172.16.1.31 yang-ftpserver01 账号kefu密码123 部署vsftpd服务
(二)服务器端创建账号
[root@nfs-31 ~]#useradd kefu01
[root@nfs-31 ~]#echo 123 | passwd --stdin kefu01
Changing password for user kefu01.
passwd: all authentication tokens updated successfully.
(三)服务器端搭建VSFTPD服务
FTP是一种传输协议,实现了这种协议的工具,有一款Linux平台上的程序,名为vsftpd(ver secure ftp daemon,非常安全的FTP守护进程)
①安装软件
[root@nfs-31 ~]#yum install vsftpd -y
②根据需求修改配置文件
由于vsftpd更新后加强了安全检查。如果某用户被限制在其家目录下,那么该用户的家目录不能再具有写权限,否则会报错。vsftpd-3.0(Centos7)才具有这种特
性。vsftpd-2.2(Centos6)并不具有该属性。
解决办法:可以在主配置文件里添加allow writeable chroot=YES
(推荐)
注意:笔记的解释,别写入linux中,写笔记上否则可能会导致编码不识别,程序出错
1.查找vsftpd配置文件目录
[root@nfs-31 ~]#rpm -ql vsftpd |grep '.conf$'
/etc/vsftpd/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.conf
2.修改如下配置参数,有些没找到的,需要自己添加
注释掉其他的匿名参数
vim /etc/vsftpd/vsftpd.conf
禁用匿名模式
11 # Allow anonymous FTP? (Beware - allowed by default if you comment this out ).
12 anonymous_enable=NO #禁止匿名用户访问
130 ## by yang
131 local_root=/data/kefu #指定本地用户的默认数据根目录
132 chroot_local_user=YES #禁锢本地用户的默认数据目录(禁止用户切换到其他目录)
133 allow_writeable_chroot=YES #允许ftp用户登录后,可以创建数据
③创建ftp目录
mkdir -p /data/kefu
授权给kefu用户
chown -R kefu01:kefu01 /data
[root@nfs-31 /data/kefu]#chown -R kefu01:kefu01 /data
[root@nfs-31 /data/kefu]#ll -d
drwxr-xr-x 2 kefu01 kefu01 24 Sep 5 21:14 .
④启动vsftpd服务
[root@nfs-31 ~]#systemctl restart vsftpd
[root@nfs-31 ~]#netstat -tnlp | grep vsftpd
tcp6 0 0 :::21 :::* LISTEN 1595/vsftpd
⑤使用ftp客户端,验证fp的登录,数据查看
安装ftp
[root@rsync-41 ~]#yum install ftp -y
登录ftp设备的命令
ftp 机器的ip地址
如:
[root@rsync-41 ~]#ftp 172.16.1.31
Connected to 172.16.1.31 (172.16.1.31).
220 (vsFTPd 3.0.2)
Name (172.16.1.31:root): kefu01
331 Please specify the password.
Password:123
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp提供了上传下载功能
下载功能
ftp> ls
227 Entering Passive Mode (10,0,0,31,195,13).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Sep 05 13:53 test.png
-rw-r--r-- 1 1000 1000 0 Sep 05 13:14 测试.txt
226 Directory send OK.
ftp> get
(remote-file) test.png
(local-file) rest1.png
local: rest1.png remote: test.png
227 Entering Passive Mode (10,0,0,31,185,246).
150 Opening BINARY mode data connection for test.png (0 bytes).
226 Transfer complete.
ftp> exit
221 Goodbye.
[root@rsync-41 /home]#ls
rest1.png
上传功能
ftp> put /home/114.png 114.png
local: /home/114.png remote: 114.png
227 Entering Passive Mode (10,0,0,31,53,227).
150 Ok to send data.
226 Transfer complete.
ftp> ls
227 Entering Passive Mode (10,0,0,31,189,88).
150 Here comes the directory listing.
-rw-r--r-- 1 1000 1000 0 Sep 05 13:56 114.png
-rw-r--r-- 1 0 0 0 Sep 05 13:53 test.png
-rw-r--r-- 1 1000 1000 0 Sep 05 13:14 测试.txt
226 Directory send OK.
ftp>
搭建samba文件共享服务
我们所了解过的FTP文件传输,的确可以让不同主机之间进行文件传输,此方式特点是 传输文件
,用户想要在客户端直接修改服务器的数据,还是较为麻烦。
既然如此,Linux上有一款应用叫做Samba,是一个能让Linux系统应用。
微软网络通讯协议的软件微软为了解决局域网的文件共享,制定了SMB协议,也就是 ( ServerMessages Block,服务器消息块 ) ,后来SMB通信协议应用到了Linux系统上,就形成了现在的 samba软件
。
Samba最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享
Samba既可以用于windows与Linux之间的文件共享
也可以用于Linux与Linux之间的资源共享
由于NFS(网络文件系统)可以很好的完成Linux与Linux之间的数据共享
因而 Samba较多的用在了Linux与windows之间的数据共享上面。
samba配置信息
1.软件安装
yum install samba -y
2.检查安装了哪些samba相关软件
rpm -qa | grep ^samba
3.配置文件查看
[root@rsync-41 ~]#ls /etc/samba/
lmhosts smb.conf smb.conf.example
smb.sonf.example
配置样例文件,里面有关于配置Samba服务器样例 smb的配置文件,主要分为 全局配置
和 共享配置
[global] 全局
共享
[home]
[printers]
默认smb.conf
/etc/samba/smb.conf
存储服务NFS--原理
已知samba主要用于Linux与windows之间共享文件夹
那用于Linux之间进行文件共享则是用NFS服务(Network FileSystem)
目的在于让不同的机器,不同的操作系统可以彼此分享各自的文件数据。
NFS服务可以将远程Linux系统上的文件共享资源挂载到本地机器的目录上。
NFS很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和Linux系统的samba服务类似。
一般情况下,Windows网络共享服务或samba服务用语办公局域网共享,而中小型网站集群架构后端通常用NFS数据共享,如果大型网络集群,还会用更复杂的文件系统,如GusterFS、FasIDFS等。
NFS系统已有30年发展历史,代表了一个稳定的网络文件系统,具备可扩展,高性能等特点。
由于网络速度的加快和延迟的减少,NFS系统一直是通过网络提供文件系统的不错的选择,特别是在中小型互联网企业用的广泛。
NFS在企业的应用架构
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、静态文件,通常网站用户上传的文件也都会放在NFS共享里,例如BBS产品(论坛)产生的图片、附件、头像等,然后前端所有的节点访问静态资源时都会读取NFS存储上的资源。
阿里云等公有云平台的NAS就是云版的NFS服务应用。
企业生产集群为什么需要共享存储
先看一下如果没有共享存储的问题
A用户上传图片到web01服务器,然后用户B访该图片,结果B的请求被负载均衡分发到了Web02,但是由于没有配置共享存储,web02没有该图片,导致用户B看不到该资源,用户心理很不爽呀。
那么如果配置了共享存储,无论A用户上传的图片是发给了web01还是其他,最终都会存储到共享存储上,用户B再访问该图片的时候,无论请求被负载均衡发给了web01、web02、web03最终都会去共享存储上寻找资源,这样也就能够访问到资源了。
这个共享存储对于中小企业,也就是使用服务器配置NFS网络文件共享系统实现。
学习NFS的任务背景
问题来了,如何部署这个NFS网络文件系统呢? 我们来部署如下的操作
部署一台淘宝网服务器,网页服务器,提供静态网页的展示,该网站的html等静态资源远程存储在NFS服务器。
任务分析
淘宝网使用的nginx技术(web服务器部署技术)
部署NFS服务器,创建共享文件夹(提供静态文件),发布该共享目录,提供给web服务器使用.
最终效果
什么是共享存储
简单说就是将很多台服务器的数据,都可以保存在同一个 存储服务器
上。
这样可以在服务器集群内,数据统一存储到一台机器上,以实现共享存储。
这样在基于负载均衡的web集群下,用户无论请求哪一台机器都可以获取到同样的数据。
什么是NFS
network file system 网络文件系统。
NFS主要使用在局域网下,让不同的主机之间可以共享文件、或者目录数据。
主要用于linux系统上实现文件共享的一种协议,其客户端主要是Linux。
没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用。
不需要输入账号密码,在配置文件中,定义好可访问该NFS的机器,ip地址即可, 还得借助其他用户认证的插件,结合NFS,提高安全性
支持多节点同时挂载并发写入。
NFS使用场景
1.在服务器集群下。多台Web服务器的图片、HTML、视频等静态资源,全都统一保存作NFS服务器上
2.以及NFS服务器也可以当做备份服务器
NFS架构图
NFS程序运行后,产生如下组件
RPC(Remote Procedure Cal Protocol)):远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。
rpcbind //负责NFS的数据传输,远程过程调用
tcp/udp协议
端口111nfs-utils //控制共享哪些文件,权限管理
什么是RPC
RPC(Remote Procedure Cal)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
下面举个简单的例子来理解 RPC。
运程过程调用,对应的就是,本地过程调用。
rpc一般是开发中的网络编程知识
1.本地地写好了一个代码文件,如he110-wor1d.py,本地运行谈程序。这就是本地过程调用(执行程序,拿到结果)
2.选程过程调用
你在将代码文件放在远程服务器上,在自己笔记术上,运程调用、执行该代码文件。执行结果会通过网络把数据发回来。
NFS和RPC的关系
我们已知NFS是通过网络来进行数据传输(网络文件系统),因此NFS会使用一些port来传输数据。 关键点:
但是NFS在传输数据的时,使用的端口是随机选择(可以重启NFS服务查看端口)。
既然NFS是随机端口选择(好比银行的取钱窗口总发生变化,你知道几号窗口是取钱业务吗?)
那么NFS在传输数据的时候,怎么知道NFS服务器使用的端口是哪个呢?
答案就是NFS使用的RPC(Remote Procedure Cal,就是远程过程调用)协议来实现的。
NFS工作原理(重要)
安装并启动
rpcbind
。NFS服务端启动后,将端口信息注册到
rpcbind
服务中。NFS客户端通过TCP/IP的方式,连接到NFS服务端提供的
rpcbind
服务,并且从该服务中获得具体的端口信息。NFS客户拿到具体的端口信息后,将自己需要执行的函数,通过网络发给NFS服务端对应的端口。
NFS服务端接收到请求后,通过rpc.nfsd进程判断该客户端是否有权限连接。
最终NFS服务端会将客户端请求的函数,识别为本地可以执行的命令,传递给内核、最终内核驱动硬件。
结论:nfs的客户端、服务端之间的通信基于rpc协议,且必须运行rpcbind服务。
rpcbind服务的作用
nfs的数据传输是通过rpc协议的。
NFS服务就是使用RPC协议的帮忙,RPC服务实现的功能是记录每个NFS功能对应的端口号,并且在NFS客户端发出请求的时候,把该功能和对应的端口信息传递给发出请求的NFS客户端,保证客户端能够正确的连接到NFS的端口,达到数据传输的目的。
RPC就好比是一个中介,处在客户端、服务端之间。
当NFS服务器启动时会随机采用若干端口,并且主动在RPC服务中注册相关端口以及功能信息。
RPC服务就知道NFS服务对应的端口。
RPC服务默认使用固定111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给NFS客户端。
NFS工作流程(原理)
在启动NFS服务端之前,必须先启动RPC服务,在centos7服务器下为rpcbind服务,否则NFServer无法向RPC注册信息了。
另外如果RPC服务重启,原来注册的NFS服务端信息也就失效了,也必须重启服务,再次注册信息给RPC服务。
特别要注意的是,修改NFS配置文件后不需要重启NFS,只需要执行 exportfs -rv
命令即可或是 systemctl reload nfs
图解NFS工作原理
NFS服务部署--常用的文件共享服务
NFS软件列表
安装nfs服务,需要安装如下软件包
nfs-utils:NFS服务的主程序,包括了rpc.nfsd、rpc.mountd这两个守护进程以及相关文档,命令
rpcbind:是centos7/6环境下的RPC程序
rpm -qa nfs-utils rpcbind
如果没有,需要安装nfs和rpc软件
yum install nfs-utils rpcbind -y
环境配置
NFS也是C/S模式,准备NFS服务端,多个NFS客户端、多台Linux机器。
yum install nfs-utils rpcbind -y
配置文件修改
语法
默认配置文件路径是/etc/exports
exports配置文件语法
NFS共享目录 NFS客户端地址(参数1、参数2...) 客户点地址2(参数1、参数2...)
例如
/ hostname1(rw) hostname2(rw,no_root_squash)
/pub *(rw)
/home/yang/log 172.16.1.0/24(ro)
只读共享,例如一些生成服务器的日志目录,又不想给开发服务器的权限,可以用此办法,共享目录给他人只读查看
参数解释
1.NFS共享目录:为NFS服务器要共享的实际目录,必须绝对路径,注意目录的本地权限,如果要读写共享,要让本地目录可以被NFS客户端的(nfsnobody)读写。
2.NFS客户端地址,也就是NFS服务器端授权可以访问共享目录的客户端地址,详见下表"**NFS客户端地址说明"
3.权限参数,对授权的NFS客户端访问权限设置,见下表
NFS客户端地址说明
NFS配置文件参数解释
ro 只读
rw 读写
root_squash 当nfs客户端以root访问时,它的权限映射为NFS服务端的匿名用户,它的用户ID/GID会变成nfsnobody
no_root_squash 同上,但映射客户端的root为服务器的root,不安全,避免使用
all_squash 所有nfs客户端用户映射为匿名用户,生产常用参数,降低用户权限,增大安全性。
sync 数据同步写入到内存与硬盘,优点数据安全,缺点性能较差
async 数据写入到内存,再写入硬盘,效率高,但可能内存数据会丢
/etc/exports man 5 exports
共享目录 共享选项
/nfs/share *(ro,sync)
共享主机:
* :代表所有主机
172.16.1.0/24:代表共享给某个网段
172.16.1.0/24(rw) 172.16.1.0/24(ro) :代表共享给不同网段
172.16.1.31:共享给某个IP
*.haloyang.top:代表共享给某个域下的所有主机
共享选项:
ro:只读,不常用
rw:读写
sync:实时同步,直接写入磁盘
async:异步,先缓存在内存再同步磁盘
anonuid:设置访问nfs服务的用户的uid,uid需要在/etc/passwd中存在
anongid:设置访问nfs服务的用户的gid
root_squash :默认选项 root用户创建的文件的属主和属组都变成nfsnobody,其他人nfs-server端是它自己,client端是nobody。
no_root_squash:root用户创建的文件属主和属组还是root,其他人server端是它自己uid,client端是nobody。
all_squash: 不管是root还是其他普通用户创建的文件的属主和属组都是nfsnobody
说明:
anonuid和anongid参数和all_squash一起使用。
all_squash表示不管是root还是其他普通用户从客户端所创建的文件在服务器端的拥有者和所属组都是nfsnobody;服务端为了对文件做相应管理,可以设置anonuid和anongid进而指定文件的拥有者和所属组
rpcbind服务管理
NFS服务都是基于RPC协议通信的默认端口是111,要确保系统运行了rpcbind服务。
要注意的是 rpcbind服务
即使停止,111端口也不会挂掉,因为还有 rpcbind.socket
服务。
意思是,启动rpc服务由2个结合运行 rpcbind.service rpcbind.socket
[root@nfs-31 ~]#systemctl start rpcbind.service
[root@nfs-31 ~]#systemctl start rpcbind.socket
[root@nfs-31 ~]#systemctl start nfs
[root@nfs-31 ~]#netstat -tunlp | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1840/rpcbind
tcp6 0 0 :::111 :::* LISTEN 1840/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 1840/rpcbind
udp6 0 0 :::111 :::* 1840/rpcbind
[root@nfs-31 ~]#
NFS服务端部署实践(重要)
1.安装软件
yum install nfs-utils rpcbind -y
2.启动、检查rpcbind进程
netstat -tunlp | grep rpc
systemctl status rpcbind
systemctl start rpcbind.service
systemctl start rpcbind.socket
netstat -tunlp | grep rpc
3.创建nfs配置文件
all_squash:不管是root还是其他普通用户创建的文件的属主和属组都是nfsnobody
rw 允许读写
sync 数据同步到磁盘
cat > /etc/exports << EOF
/nfs-data 172.16.1.0/24(rw,sync,all_squash)
EOF
exportfs -r
4.创建NFS其华文件类(设置权限,给nfs默认的匿名用户,降低权限,保护系统安全)
mkdir -p /nfs-data
chown -R nfsnobody.nfsnobody /nfs-data/
5.启动NFS服务
systemctl start nfs
6.检查nfs服务状态、以及端口、进程信息
systemctl status nfs
netstat -tunlp | grep nfs
ps -ef | grep nfs
#每次重启nfs服务,nfs都会更改端口号。
#可以使用systemctl reload nfs(不会更改端口号)。
#可以使用rpcinfo -p 命令查看nfs每次更新后的端口,是哪些发生了变化。
7.检查nfs服务端的共享情况,使用showmount命令查看
showmount -e 172.16.1.31
8.查看nfs服务端远程共享的所有参数,是系统自动生成的,以及我们配置文件里定义的,都是默认的不需要修改
cat /var/lib/nfs/etab
9.设置nfs服务端开机自启、包括rpncbind服务
systemctl enable rpncbind nfs
注意:
/etc/exports文件的语法不要写错
修改/etc/exports文件后,注意要重启systemctl reload nfs或者是experts -r 重新加载配置,无需重启。(使用重新加载,方式NFS端口号会再次变化)
NFS客户端部署实践(重要)
1.安装软件
yum install nfs-utils rpcbind -y
#只安装不用启动nfs服务,目的是能让系统能识别nfs文件系统。
systemctl start rpcbind
mkdir -p /test-nfs
2.查看机器的挂载情况
mount -l
3. 查看磁盘分区挂载情况
df -h
4.挂载nfs,查看nfs(将服务端的/nfs-data挂载到客户端的/test-nfs)
[root@web-7 ~]#mount -t nfs 172.16.1.31:/nfs-data/ /test-nfs
[root@web-7 ~]#df -h
5.尝试读写数据
ls /test-nfs
touch /test-nfs/hello.log # 发现没有权限
6.更新nfs服务端的读写权限后,再次测试数据操作
[root@nfs-31 ~]#chown -R nfsnobody.nfsnobody /nfs-data/
7.测试
[root@nfs-31 /nfs-data]#touch 你好
[root@web-7 ~]#touch /test-nfs/可以了吗
[root@web-7 ~]#ll /test-nfs/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 22 10:58 你好
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 22 11:12 可以了吗
[root@nfs-31 /nfs-data]#ls
你好 可以了吗
[root@web-7 ~]#echo "今天又是氪金的一天" >> /test-nfs/你好
-bash: /test-nfs/你好: Permission denied #发现没有权限
#客户端创建的文件属主属组是root,不是nfsnobody,所以没有权限。
8.修改服务端共享目录的other的rw权限
[root@nfs-31 /nfs-data]#chmod 646 你好
9.再次写入测试
[root@web-7 ~]#echo "今天又是氪金的一天" >> /test-nfs/你好
[root@web-7 ~]#cat /test-nfs/你好
今天又是氪金的一天
[root@nfs-31 /nfs-data]#echo "冲他个十万吧 勇士" >> 你好
[root@web-7 ~]#cat /test-nfs/你好
今天又是氪金的一天
冲他个十万吧 勇士
NFS结合nginx实现共享存储
安装部署nfs服务端
生产环境下的参数rw,sync,all_squash,anonuid,anongid
rw,sync,
all_squash ,将web-7的任意用户root,bob01,,在该共享目录下的操作,全部改为nfsnobody以实现权限控制
web-7 /test-nfs 172.16.1.31:/nfs-data
无论是root去读写 、/test-nfs
还是bob01读写 /test-nfs
创建的数据,都会被改为user,group都是 默认的nfsnobody
anonuid=id号
anongid=
集合这俩参数,就可以限制在 该nfs共享目录下的所有用户操作,统一被限制为了某个指定的用户
任务需求
nginx的启动用户必须是www,uid是 1500,不允许登录。
nfs共享存储用户也是www,uid是 1500,不允许发录,允许读写。
nginx网站可以正常读写共享存储资料。
1. nginx的启动用户必须是www,uid是 1500,不允许登录。
[root@web-7 ~]#useradd www -u 1500 -M -s /sbin/nologin
1.1 安装nginx
yum install nginx -y
1.2 修改nginx配置文件,指定是www用户运行
vim /etc/nginx/nginx.conf
把第5行的 user nginx;改为user www;
[root@web-7 ~]#cat -n /etc/nginx/nginx.conf
1 # For more information on configuration, see:
2 # * Official English Documentation: http://nginx.org/en/docs/
3 # * Official Russian Documentation: http://nginx.org/ru/docs/
4
5 user www;
6 worker_processes auto;
1.3 启动nginx
systemctl start nginx
1.4 检查nginx进程
[root@web-7 ~]#ps -ef|grep nginx
root 6042 1 0 21:04 ? 00:00:00 nginx: master process /usr/sbin/nginx
www 6043 6042 0 21:04 ? 00:00:00 nginx: worker process
2. nfs共享存储用户也是www,uid是 1500,不允许发录,允许读写。
修改nfs配置文件如下,限定客户端在该目录中的操作,权限都被转化为www用户。
限制nginx机器才能访问
[root@nfs-31 ~]#mkdir /nfs-nginx
[root@nfs-31 ~]#useradd www -u 1500 -M -s /sbin/nologin
2.1 修改配置文件
[root@nfs-31 ~]#vim /etc/exports
/nfs-nginx 172.16.1.7(rw,sync,all_squash,anonuid=1500,anongid=1500)
[root@nfs-31 ~]#exportfs -r
[root@nfs-31 ~]#showmount -e 172.16.1.7
2.2 重新加载nfs(reload是针对已经有进程在运行了,重新读取配置文件)
systemctl reload nfs
3. 修改共享目录的属主、属组为www
[root@nfs-31 /nfs-nginx]#chown -R www.www /nfs-nginx/
[root@nfs-31 /nfs-nginx]#ll -d /nfs-nginx/
drwxr-xr-x 2 www www 6 Sep 11 21:06 /nfs-nginx/
4. nginx网站可以正常读写共享存储资料。
先挂载nfs
[root@web-7 ~]#mount -t nfs 172.16.1.31:/nfs-nginx /usr/share/nginx/html/
[root@web-7 /]#df -h |grep nginx
172.16.1.31:/nfs-nginx 37G 1.8G 36G 5% /usr/share/nginx/html
客户端生成网页,和图片等静态资源,查看是否写入到NFS服务端
[root@web-7 ~]#vim /usr/share/nginx/html/index.html
模拟用普通用户,到该nginx目录下,生成一个数据图片
[root@web-7 ~]#useradd client01
[root@web-7 ~]#su - client01
[client01@web-7 ~]$
[client01@web-7 ~]$wget -O /usr/share/nginx/html/liyunlong.jpg https://p2.itc.cn/q_70/images03/20221110/8d17ab1ae903426b9850d9d3ae3018df.gif
5.修改nginx网页,加载该用户自己创建的图片信息
[client01@web-7 /usr/share/nginx/html]$vim index.html
<meta charset=utf-8>
把我李云龙的意大利炮拿来
<img src='./liyunlong.jpg'>
6.模拟用户访问该nginx网站
http://10.0.0.7/
NFS故障案例
1.客户端未挂载NFS
[root@web-7 ~]#umount /usr/share/nginx/html
重新挂载
mount -t nfs 172.16.1.31:/nfs-nginx /usr/share/nginx/html/
2.服务端出问题,nfs挂了
导致nginx页面卡死,nginx网页目录操作也都卡死
此时明确了共享存储出问题了
去共享存储NFS服务器上找原因
发现nfs挂了,重启即可
systemctl restart nfs
3.nfs修复后,客户端的挂载可以恢复
4.如果真的nfs死机了,且暂时无法恢复,你还得快速恢复网站的业务,可以强制取消挂载
使用强制卸载参数,先看看挂载了什么
mount -l |grep nfs
umount -fl 挂载点 # 取消挂载即可
然后最终还是要以恢复NFS为主
文件备份工具Rsync
备份是太常见、且太重要的一个日常工作了
备份源码、文档、数据库、等等。
类似cp命令拷贝,但是支持服务器之间的网络拷贝,且保证安全性。
任务背景
公司每天都需要对代码进行备份
任务需求
备份机每天夜里2点要同步开发服务器下的
/dev_data/python_code
数据,存放到/backup/dev data/python_code
要求记录同步日志,便于记录、处理故障问题。
任务拆解
选择合适的备份工具,比如scp(为什么不是cp?)
学习rsync工具
编写定时任务
关乎知识点
rsync学习(新知识点)
crontab(复习定时命令知识)
Rsync是什么
Rsync是一款开源的、快速的、多功能的、可实现 全量及增量
的本地或远程数据同步备份的优秀工具。可以不进行改变原有数据的属性信息,实现数据的备份迁移特性。
Rsync软件适用于unix/linux/windows等多种操作系统平台。
Rsync是一个快速和非常通用的文件复制工具。它能本地复制,远程复制,或者远程守护进程方式复制。
它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制。它以其delta-transfer算法闻名。减少通过网络数据发送数量,利用只发送源文件和目标文件之间的差异信息,从而实现数据的增量同步复制。
Rsync被广泛用于数据备份和镜像,并且作为一种改进后的复制命令用于日常运维。
Rsync具备使本地和远程两台主机之间的 数据快速复制
,远程备份的功能
,Rsync命令本身即可实现 异地主机复制数据
,功能类似scp又优于scp,scp每次都是 全量备份
,rsync可以实现 增量拷贝
(和scp样都是基于ssh服务传输),Rsync软件还支持配置守护进程,实现异机数据复制。
增量复制是Rsync一特点,优于scp,cp命令,
Rsync实现如下功能
本地数据同步复制,效果如cp
远程数据同步复制,如scp
本地数据删除,如rm
远程数据查看,如ls
Rsync软件特性
支持拷贝普通文件,特殊文件(link文件,设备文件)
支持排除指定文件、目录的同步功能(同步数据时,指定文件不同步)
支持匿名用户模式传输
Rsync默认运行端口
873端口
rsync三种工作模式
本地模式,类似cp
远程模式,常用,类似scp,不同的机器之间,通过网络拷贝数据
后台服务模式,常用,用于实时数据同步,安全性更高
Rsync备份方式
全量备份
就是完全备份,所有指定的客户端的数据,全部被备份到server01机器上(效率太低,重复性备份文件)
增量备份
rsync自动检测只会将新增加的文件备份到server01下,而不会重复备份已存在的数据备份效率高。
备份架构
客户端-推送-数据(上传)
客户端-拉取-数据(下载)
多服务器备份场景
异地备份架构
Rsync命令所有选项解释
Rsync命令参数详解
rsync [选项] 源数据 目的数据
常用语法
rsync [选项] 源数据 目的数据
1.安装
yum install rsync -y
2.命令语法,分几个模式
- 本地模式
rsync 参数 源路径 目标路径
rsync -xxxxx /var/log /tmp
- 远程模式,推送方式,把自己的数据推送到另一台机器上(上传)
语法1 ,rsync默认走ssh协议
rsync 参数 源路径 user@ip:目标路径
rsync -avzP /var/log/ root@10.0.0.31:/tmp/
语法2
rsync 参数 源路径 user@ip::目标路径
- 远程模式,拉取方式,拉取别人机器的数据到自己的机器上(下载)
rsync 参数 user@ip:源路径 目标路径
rsync 参数 user@ip::源路径目标路径
rsync -avzP root@10.0.0.31:/var/log/ /tmp/
配置源的两种表示方法
第一种:
#用户名@主机地址::共享模块名
rsync -avz root@192.168.79.210::wwwroot /root
#backuper指的是我在同步的时候用的哪个用户身份
#wwwroot代表的是模块,模块下面会写同步的默认路径和一些特性,所以我们只需要写模块就好了
#/root指的是本地节点
第二种:
#rsync:/用户名@主机地址/共享模块名
rsync -avz rsync:/root@192.168.7.210/wwwroot /root
URL:具体的位置点,例如:http://www.baidu.com./class1/men/id01.html
URI:标识的是拥有同一类特性或类型的一个集合 ,例如http://www.baidu.com./class1/men
参数解释
参数解释
-v 详细模式输出
-a 归档模式,递归的方式传输文件,并保持文件的属性,等同于 -rlptgoD
-r 递归拷贝目录
-l 保留软链接
-p 保留原有权限
-t 保留原有时间(修改)
-g 保留属组权限
-o 保留属主权限
-D 等于--devices --specials 表示支持b,c,s,p类型的文件
-R 保留相对路径
-H 保留硬链接
-A 保留ACL策略
-e 指定要执行的远程shell命令
-E 保留可执行权限
-X 保留扩展属性信息 a属性
--stats 给出某些文件的传输状态
--progress 打印同步的过程
--timeout=TIME 同步过程中,IP超时时间,单位为秒
--delete 删除那些目标目录中有而源目录中没有的多余文件。这个是rsync做增量方式的全备份的最佳选择方案!!!!!!
--delete-before 接受者在输出之前进行删除操作。即先将目标目录中文件全部删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!!
--delete-after 在同步操作之后做比较,删除那些目标目录中有而源目录中没有的多余文件
--delete-excluded 删除目标目录中那些被该选项指定排除的文件
--ignore-errors 即使出现IO错误也进行删除,忽略错误
--exclude 指定同步时需要过滤掉的文件或子目录(即不需要同步过去的),后面直接跟不需要同步的单个文件名或子目录(不需要跟路径) ,过滤多个文件或子目录,就使用多个--exclude
--exclude-from 指定同步时需要过滤掉的文件或子目录,后面跟文件(比如/root/exclue.txt),然后将不需要同步的文件和子目录放到/root/exclue.txt下。
--version 打印版本信息
--port=PORT 指定其他的rsync服务端口
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-----------------------------------
rsync delete 参数 rsync -a --delete
比较常用的组合参数
rsync -avzP
-a 保持文件原有属性
-v 显示传输细节情况
-z 对传输数据压缩传输
-P 显示文件传输的进度信息
你在命令行里,执行命令,喜欢看到命令的执行过程
-avzP
脚本里面?
bash xxx.sh
rsync -az
本地备份
Linux机器本身,数据来回发送
在/var/log/目录下创建一个10G大小的文件
[root@rsync-41 /var/log]#dd if=/dev/zero of=10G bs=1M count=10
在/tmp/目录下创建测试数据
[root@rsync-41 /opt]#mkdir tset
[root@rsync-41 /opt]#cd tset/
[root@rsync-41 /opt/tset]#touch test.log
将/var/log/文件夹里的数据备份到/tmp/test/目录下
[root@rsync-41 /opt/test]#rsync -avzP /var/log/ /opt/test/
对文件同步
把本地的的
/var/log/messages
文件 拷贝到/opt/test下
[root@rsync-41 /opt/tset]#rsync -avzP /var/log/messages /opt/test/
sending incremental file list
messages
1,492,042 100% 66.27MB/s 0:00:00 (xfr#1, to-chk=0/1)
sent 205,795 bytes received 35 bytes 411,660.00 bytes/sec
total size is 1,492,042 speedup is 7.25
[root@rsync-41 /opt/test]#ls
messages test.log
拷贝单个大文件,拷贝大文件时,要注意限速,否则占用磁盘IO太多,这时可以使用--bwlimit=10
命令进行限速。
先生成一个10G文件
dd bs=100M count=50 if=/dev/zero of=/var/log/my_self.log
不限速拷贝
rsync -avzP /var/log/my_self.log /opt
iotop查看磁盘的读写IO情况
限制单个大文件的传输,速度只给他20M每秒
rsync -avzP --bwlimit=20 /var/log/my_self.log /opt/test
对目录同步(注意语法的区别)
拷贝后的数据,是否携带该目录本身
[root@rsync-41 ~]# rsync -avzP /var/log /opt/test
不拷贝该目录本身,拷贝目录下的数据
[root@rsync-41 ~]# rsync -avzP /var/log/ /opt/test
增量拷贝
准备测试环境
[root@rsync-41 ~]# mkdir test{1,2}
[root@rsync-41 ~]# touch test1/{1..5}.png
把test1数据增量拷贝到test2文件夹
[root@rsync-41 ~]# rsync -avzP /root/test1/ /root/test2
sending incremental file list
./
1.png
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6)
2.png
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=3/6)
3.png
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=2/6)
4.png
0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=1/6)
5.png
0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=0/6)
sent 311 bytes received 114 bytes 850.00 bytes/sec
total size is 0 speedup is 0.00
变更test1文件夹中数据,再拷贝
[root@rsync-41 ~]#echo "123" > /root/test1/1.png
[root@rsync-41 ~]#rsync -avzP /root/test1/ /root/test2
sending incremental file list
1.png
4 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6)
sent 180 bytes received 35 bytes 430.00 bytes/sec
total size is 4 speedup is 0.02
无差异化拷贝
使用
--delete
参数 将目标目录的数据清空,保证完全和源目录的数据一致
[root@rsync-41 ~/test2]#rename png jpg *.png
[root@rsync-41 ~]#touch test1/孙悟空{1..5}
全量备份:
[root@rsync-41 ~/test2]# rsync -avzP /root/test1/ /root/test2
[root@rsync-41 ~]#ls test1 test2
test1:
1.png 2.png 3.png 4.png 5.png 孙悟空1 孙悟空2 孙悟空3 孙悟空4 孙悟空5
test2:
1.jpg 1.png 2.jpg 2.png 3.jpg 3.png 4.jpg 4.png 5.jpg 5.png 孙悟空1 孙悟空2 孙悟空3 孙悟空4 孙悟空5
差异化备份:
[root@rsync-41 ~/test2]#rsync -azvP --delete /root/test1/ /root/test2/
sending incremental file list
deleting test2/
deleting 5.jpg
deleting 4.jpg
deleting 3.jpg
deleting 2.jpg
deleting 1.jpg
./
[root@rsync-41 ~]#ls test1 test2
test1:
1.png 2.png 3.png 4.png 5.png 孙悟空1 孙悟空2 孙悟空3 孙悟空4 孙悟空5
test2:
1.png 2.png 3.png 4.png 5.png 孙悟空1 孙悟空2 孙悟空3 孙悟空4 孙悟空5
远程备份
PUSH 推送模式,上传模式
需求:把rsync-41 `/root`下的数据拷贝到 nfs-31 `/tmp/back`下
[root@rsync-41 ~]#rsync -avzP /root/ root@172.16.1.31:/tmp/back/
[root@nfs-31 /tmp/back]#ls
anaconda-ks.cfg change_network.sh test1 test2
PULL 拉取模式
需求:把rsync-41 `/temp/back_41/`下的数据,拷贝到 nfs-31 `/tmp/back`下
[root@nfs-31 ~]#rsync -avzP root@172.16.1.41:/tmp/back_41/ /tmp/back/
[root@nfs-31 /tmp/back]#ls
孙行者.png
只传输目录下的文件,不包含目录本身
rsync -avzP root@172.16.1.41:/root/ /tmp/
不同主机之间同步数据 --delete
rsync -avzP --delete root@172.16.1.41:/root /tmp/
坑:如果/和一个空目录进行完全同步,那么效果和删根一样
Rsync服务模式(服务端)
rsync-41
为什么需要守护进程模式
Rsync 借助 SSH 协议同步数据存在的缺陷:
1.使用系统用户(不安全) /etc/passwd
2.使用普通用户(会导致权限不足情况)
3.守护进程传输方式: rsync 自身非常重要的功能(不使用系统用户,更加安全)
默认情况下,rsync只是作为一个命令来进行使用的(ps在查询进程时,找不到对应的服务),但是rsync提供了一种作为系统服务的实现方式。
守护进程传输模式是在客户端和服务端之间进行的数据复制。
服务端需要配置守护进程,在客户端执行命令,实现数据 拉取
和 推送
。
rsync守护进程模式
通过配置文件设置rsync功能
rsync命令变了,通过
模块名
同步指定的文件夹,而不是一个指定的文件夹路径。
修改rsync配置文件(rsync服务端)
1,在rsync-41机器上安装rsync
yum install rsync -y
2,修改配置文件
cat >> /etc/rsyncd.conf << 'EOF'
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = yuchaoit.cn about rsync
path = /backup
[data]
comment = this is secord backup dir,to website data..
path = /data
EOF
配置文件解释
====================全局参数=====================
uid = www #运行进程的用户
gid = www #运行进程的用户组
port = 873 #监听端口
fake super = yes #无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no #禁止推送的数据到某个目录,不允许跳出该目录
max connections = 200 #最大连接数
timeout = 600 #超时时间
ignore errors #忽略错误信息
read only = false #对备份数据可读写
list = false #不允许查看模块信息
auth users = rsync_backup #定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd #定义rsync服务用户连接认证密码文件路径
====================局部参数=====================
[backup] #定义模块信息
comment = yuchaoit.cn about rsync #模块注释信息
path = /backup #定义接收备份数据目录
创建用户、数据目录
根据你的配置文件中定义的信息,创建对应的用户,备份的目录
该无法登录的用户,只是用于运行进程的账户
useradd -u 1000 -M -s /sbin/nologin www
创建配置文件中定义的2个备份目录
mkdir -p /{data,backup}
修改备份目录的权限
chown -R www:www /data/
chown -R www:www /backup/
创建虚拟用户密码文件与授权
注:这一步很重要,有错基本也是来这排查
注意和配置文件里的参数对应/etc/rsyncd.conf
touch /etc/rsync.passwd
echo 'rsync_backup:yangge666' > /etc/rsync.passwd
[root@rsync-41 ~]# cat /etc/rsync.passwd
rsync_backup:yangge666
授权,务必要降低为600权限,否则rsync会报错
[root@rsync-41 ~]# chmod 600 /etc/rsync.passwd
开机启动,运行rsync服务
systemctl start rsyncd
systemctl enable rsyncd
检查是否开机运行
systemctl is-enabled rsyncd
检查端口
# 无论是学习期间还是上班了,都养成好习惯
# 给别人启动了某程序后,给自己启动某程序
# 务必去检查,验证是否正确
ps -ef | grep 'rsync' | grep -v 'grep'
netstat -tunlp | grep rsyuc
编写服务端一键部署脚本
vim install_rsync.sh
#!/bin/bash
yum install rsync -y
cat >> /etc/rsyncd.conf << 'EOF'
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = this is secord backup dir,to website data..
path = /backup
EOF
useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{data,backup}
chown -R www:www /{data,backup}
touch /etc/rsync.passwd
echo 'rsync_backup:yangge666' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
export RSYNC PASSWORD=yangge666
systemctl start rsyncd
systemctl enable rsyncd
Rsync服务模式(客户端)
nfs-31
基本配置
1,安装rsync
yum install rsync -y
2,创建密码文件,用于和rsyncd服务端认证,降低权限
touch /etc/rsync.passwd
echo 'yangge666' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
3,方法一,指定密码文件
rsync -avzP --password-file=/etc/rsync.passwd
4,方法二,不用文件密码形式,采用环境变量形式,更推荐
export RSYNC_PASSWORD=yangge666
5,此时可以进行rsync同步数据了
下载服务端rsync-41的数据
密码文件认证方式
注意此时使用的是rsyncd服务端的模块名,指定要 同步的数据目录以及同步的用户,注意了是rsync_backup
用户
拉取backup模块数据
服务端:rsync-41
[root@rsync-41 ~]# ls /backup
客户端拉取数据:nfs-31
测试:
[root@nfs-31 ~]# rsync -avzP rsync_backup@rsync-41::backup /tmp/
此时会发现要输入密码
1.的确没指定密码文件
2.是否有密码变量呢?
如何需要输入密码呢?
撤销这个密码变量
unset RSYNC_PASSWORD
或者重新登录,只要密码变量失效,就必须得输入密码了,或者使用密码文件。
非交互式的密码认证方式
方法一,使用密码变量
export RSYNC_PASSWORD='yangge666'
rsync -avzP rsync_backup@rsync-41::backup /tmp/
方法二,指定密码文件
rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup /tmp/
推送,备份,发送nfs-31的数据发给rsync-41
把客户端nfs-31
的数据,发送给服务端rsync-41
的backup备份模块下
语法,不一样了,注意语法的写法!!!
实例 把客户端的 /tmp/200M.log 备份,发送到rsync-41机器上的 backup模块下
语法
rsync -avzP 文件路径 账户@主机名::模块名
# 默认无密码变量,也无密码文件,需要你自己输入该rsync_backup虚拟用户的密码
# 需要交互式的输入密码,无法再脚本中使用rsync同步命令
# rsync基本都是和脚本结合使用
rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup
[root@nfs-31 ~]# rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup
非交互式密码的操作,如下2个方法
1. (方法一)生成密码文件,每次连接都指定这个密码文件(在客户端生成)
[root@nfs-31 ~]# echo 'yangge666' > /etc/my_rsync.pwd
还必须降低密码文件的权限才行,必须是600
[root@nfs-31 ~]# chmod 600 /etc/my_rsync.pwd
此时可以传输数据了,往data模块下传输
rsync -avzP --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data
注:如果是脚本中的话,去掉vP显示过程的参数去掉
rsync -az --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync_backup@rsync-41::data
2. (方法二)生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量,以及变量的值,是配置文件中的密码即可
export RSYNC_PASSWORD='yangge666'
rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup
其他疑问
配置文件里指定的www用户,作用是,当rsyncd运行后,工作进程会以www用户去执行,降低权限以及接收到的数据,都会被强转为www用户。
常见rsync错误答疑
注意同步问题
【客户端的错误现象:No route to host】
[root@nfs-31 tmp]# rsync avz /etc/hosts rsync_backup@172.16.1.41::backup
rsync:failed to connect to 172.16,1.41:No route to host (113)
rsync error: error in socket I0(code 10)at clientserver.c(124)[sender=3.0.6]
解决办法
关闭iptables,或添加规则
iptables -F
systemctl stop firewalld
Rsync服务端排错思路
检查rsync服务端的配置文件路径是否正确:
/etc/rsyncd.conf
查看配置文件的
host allow
,host deny
允许的ip网段是否允许客户端访问査看配置文件中的path参数路径是否存在,权限是否正确(和配置文件的UUID参数对应)
查看rsync服务是否启动,端口、进程是否存活
查看iptables防火墙、selinux是否允许rsync服务通过,或是关闭
查看服务端rsync配置文件的密码文件,权限是否600,格式,语法是否正确,且和配置文件的
secrectfiles
参数对应如果是推送数据,要查看配置rsyncd.conf中的用户对该
rsync模块
下的文件是否可以读取
Rsync客户端排错思路
査看rsync客户端配置的密码文件权限是否600,密码文件格式是否正确,是否和服务端的密码一致
尝试teInet连接rsync服务端的
873
端口,检测服务是否可以连接客户端执行命令语法要检查,细心
备份任务实战
今天的任务主要以实际备份任务入手,完成综合练习,完成对rsync的综合运用。
先看需求
再讲解
再次动手实践
客户端需求
客户端需求: 1.客户端每天凌晨1点在服务器本地打包备份(/etc目录和/var/log目录) 2.客户端备份的数据必须存放至以 "主机名 ip地址 当前时间" 命名的目录中 3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器 4.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间
客户端需求拆解
打包压缩
1.客户端每天凌晨1点在服务器本地打包备份(/etc目录和/var/log目录)
以后见到需求,某任务,要写入定时任务
把其他所有的事全搞定了,最后再去写入定时任务
注意tar命令打包,尽量以相对路径去打包
/etc目录是为了备份系统配置文件、应用配置文件
/var/log是为了备份所有应用程序的日志
注意:这里的/momo目录名称必须和服务端创建的备份文件夹名称一致不然,服务端校验md5值会报错。
1.需求是创建/momo目录
mkdir -p /momo
[root@nfs-31 ~]#cd / && tar -zcf /backup/etc.tgz etc
[root@nfs-31 ~]#cd / && tar -zcf /backup/log.tgz var/log
#这里注意文件路径etc前不加 / 根目录
[root@nfs-31 /]#ls /backup/ -lh
total 11M
-rw-r--r-- 1 root root 9.4M Apr 21 12:03 etc.tgz
-rw-r--r-- 1 root root 698K Apr 21 12:04 log.tgz
注:应该在完成第二个要求创建正确备份文件夹后执行打包命令
文件夹命名
2.文件夹命名要求"主机名 ip地址 当前时间"
1.提取主机名
[root@nfs-31 ~]#hostname
nfs-31
2.提取IP地址
[root@nfs-31 ~]#ifconfig eth0 | awk 'NR==2{print $2}'
10.0.0.31
3.时间设置
(date "+%F")
4.拼接在一起,文件夹命名的命令如下:创建文件夹,你也可以用内网ip操作
要求,在备份目录下,创建以格式要求的文件夹。
mkdir -p /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")
5.检查最终的客户端备份目录
[root@nfs-31 ~]#ls /momo/
etc.tgz log.tgz nfs-31_10.0.0.31_2024-09-10
6.备份的etc和log数据,得在这个目录中
cd / && tar -zcf /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/etc.tgz etc
cd / && tar -zcf /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/log.tgz var/log
文件传输
3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器
需求,把/backup目录下的数据,发给备份服务器
# 去看rsync服务端提供的账户密码
# 客户端还得添加密码
export RSYNC_PASSWORD=momo666
rsync -avzP /momo/ momo01@10.0.0.41::momo_data
删除过期文件
4.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间
find /momo -type f -mtime +7 -delete
整合脚本
把客户端的所有部署操作,写成脚本,待会交给定时任务执行即可
把上述拆解的过程,写成一个脚本、批量执行。
当然这个脚本还可以有多的优化。
vim /my_rsync.sh
#!/bin/bash
# 主动在脚本中,定义path变量,防止命令无法执行
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 1.创建目录,注意目录名字规则
mkdir -p /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")
# 2.打包备份数据
cd / && tar -zcf /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/etc.tgz etc
cd / && tar -zcf /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/log.tgz var/log
# 2.1 对数据进行校验,生成校验值的文件
md5sum /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/*.tgz > /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/all_data_md5.txt
# 3.传输客户端备份数据到,rsync备份服务器上,别忘记是如何验证密码的
export RSYNC_PASSWORD=momo666
rsync -avzP /momo/ momo01@10.0.0.41::momo_data/
# 4.删除过期文件
find /momo -type f -mtime +7 -delete
执行脚本
bin/bash /my_rsync.sh
调试脚本
只显示执行过程,而不会真的执行,发生修改,用于调试程序 -x参数。
shell提供了-x参数,能让你看到脚本执行过程,用于调试脚本,不会真的产生数据变动,只会看到执行的过程日志。
bash -x /my_rsync.sh
定时执行任务脚本(最后执行)
1.确保crond是否运行
systemctl status crond
2.写定时任务语句(每天凌晨一点)
crontab -e
0 1 * * * /bin/bash /my_rsync.sh
[root@nfs-31 ~]#crontab -l
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
* * * * * /bin/bash /my_rsync.sh
3.定时任务,最后再去执行
服务端需求
服务端需求: 1.服务端部署rsync,用于接收客户端推送过来的备份数据 。 2.服务端需要每天校验客户端推送过来的数据是否完整 。 3.服务端需要每天校验的结果通知给管理员 。 4.服务端仅保留6个月的备份数据,其余的全部删除 。
服务端用户 rsyncd.conf
配置
虚拟用户:auth users = momo01
密码:momo666
连接认证密码文件路径:secrets file = /etc/rsync_momo.passwd
定义模块1信息:[momo_data]
备份数据存放位置:path = /momo/
定义模块2信息:[momo_data2]
备份数据存放位置:path = /momo2
服务端需求拆解
配置rsyncd.conf
1.服务端部署rsyncd服务用于接收客户端推送过来的备份数据
安装rsync服务
[root@rsync-41 ~]#yum install rsync -y
配置
rsyncd.conf
cat /etc/rsyncd.conf <<EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = momo01
secrets file = /etc/momorsync.passwd
log file = /var/log/rsyncd.log
#####################################
[momo_data]
comment = this is secord backup dir,to website data..
path = /momo/
[momo_data2]
comment = this is secord backup dir,to website data..
path = /momo2
EOF
创建配置文件定义的信息
1.创建配置中的文件目录
mkdir -p /{momo,momo2}
根据你的配置文件中定义的信息,创建对应的用户,备份的目录
该无法登录的用户,只是用于运行进程的账户
useradd -u 1000 -M -s /sbin/nologin www
2.修改权限给www
chown -R www.www /momo
chown -R www.www /momo2
3.创建密码存放文件
touch /etc/momorsync.passwd
chmod 600 /etc/momorsync.passwd
4.创建用于连接的账户密码
echo "momo01:momo666" > /etc/momorsync.passwd
5. 重启服务
systemctl restart rsyncd
编写服务端的rsync安装为脚本
[root@rsync-41 ~]#touch install_rsync.sh
[root@rsync-41 ~]#vim install_rsync.sh
#!/bin/bash
# 主动在脚本中,定义path变量,防止命令无法执行
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 1.安装rsync服务
yum install rsync -y
# 2.写rsyncd.conf配置文件
cat > /etc/rsyncd.conf <<EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = momo01
secrets file = /etc/rsync.momo
log file = /var/log/rsyncd.log
#####################################
[momo_data]
comment = yuchaoit.cn about rsync
path = /momo/
[momo_data2]
comment = this is secord backup dir,to website data..
path = /momo2
EOF
# 3.创建配置中的文件目录
mkdir -p /{momo,momo2}
# 你的配置文件中定义的信息,创建对应的用户,备份的目录
# 法登录的用户,只是用于运行进程的账户
useradd -u 1000 -M -s /sbin/nologin www
# 4.修改权限给www
chown -R www.www /momo/& chown -R www.www /momo2/
# 5.创建密码存放文件
touch /etc/momorsync.passwd && chmod 600 /etc/momorsync.passwd
# 6.创建用于连接的账户密码
echo "momo01:momo666" > /etc/momorsync.passwd
# 7. 重启服务
systemctl restart rsyncd
给脚本添加执行权限
[root@rsync-41 ~]#chmod u+x install_rsync.sh
调试脚本
[root@rsync-41 ~]#bash -x install_rsync.sh
执行脚本
[root@rsync-41 ~]#/bin/bash install_rsync.sh
校验数据完整性
2.服务端需要每天校验客户端推送过来的数据是否完整
在客户端生成md5校验文件
[root@nfs-31 ~]#md5sum /backup/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/*.tgz > /backup/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/all_data_md5.txt
在服务端校验md5值
[root@rsync-41 ~]#md5sum -c /momo/nfs-31_10.0.0.31_2024-09-10/all_data_md5.txt
/momo/nfs-31_10.0.0.31_2024-09-10/etc.tgz: OK
/momo/nfs-31_10.0.0.31_2024-09-10/log.tgz: OK
邮件通知
3.服务端需要每天校验的结果通知给管理员
这里你就照抄就好,固定步骤而已,更换为你自己的163或者QQ邮箱即可。
然后需要打开163邮箱的smtp服务器的授权码,自己去获取。
注意授权码别泄露给别人。
#1.安装配置mailx:
yum install mailx -y
#2.邮箱配置文件,给你的自己的信息
利用的邮箱的smtp协议,需要打开你的qq,163邮箱的smtp功能即可
如下的信息,改为你自己的即可
邮箱的授权码,需要自己去获取
cat > /etc/mail.rc << 'EOF'
set from=mryang_mailbox@163.com
set smtp=smtp.163.com:25
set smtp-auth-user=mryang_mailbox@163.com
set smtp-auth-password= #你自己的授权密码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
EOF
#3.服务端生成备份数据的校验结果文件check_md5_result.txt
md5sum -c /momo/nfs-31_10.0.0.31_$(date "+%F")/all_data_md5.txt > /momo/nfs-31_10.0.0.31_$(date "+%F")/check_md5_result.txt
#4.校验发送命令,把校验结果,发给于超老师的qq邮箱
# 语法 mail -s "邮件主题" 邮箱 < 邮件正文
mail -s "0224-check-rsync-$(date +%F)" mryang_mailbox@163.com < /momo/nfs-31_10.0.0.31_$(date "+%F")/check_md5_result.txt
删除过期文件
4.服务端仅保留6个月的备份数据,其余的全部删除
find /momo -type f -mtime +180 -delete
汇总脚本(服务端、客户端)
为什么要制作为脚本,因为要交给定时任务,统一执行这一系列的备份步骤。
注意先后顺序,先客户端后服务端。
客户端脚本
vim /my_rsync.sh
#!/bin/bash
# 主动在脚本中,定义path变量,防止命令无法执行
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 1.创建目录,注意目录名字规则
mkdir -p /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")
# 2.打包备份数据
cd / && tar -zcf /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/etc.tgz etc
cd / && tar -zcf /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/log.tgz var/log
# 2.1 对数据进行校验,生成校验值的文件
md5sum /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/*.tgz > /momo/$(hostname)_$(ifconfig eth0 | awk 'NR==2{print $2}')_$(date "+%F")/all_data_md5.txt
# 3.传输客户端备份数据到,rsync备份服务器上,别忘记是如何验证密码的
export RSYNC_PASSWORD=momo666
rsync -avzP /momo/ momo01@10.0.0.41::momo_data/
# 4.删除过期文件
find /momo -type f -mtime +7 -delete
定时执行客户端脚本
1.写入定时任务
crontab -e
0 1 * * * /bin/bash /my_rsync.sh
2.查看cron日志
tail -f /var/log/cron
服务端脚本
使用前提配置好rsyncd.conf
和邮件发送配置 /etc/mail.rc
vim /root/my_rsync_server.sh
#!/bin/bash
# 1. 对备份的数据校验,生成校验文件
md5sum -c /momo/nfs-31_10.0.0.31_$(date "+%F")/all_data_md5.txt > /momo/nfs-31_10.0.0.31_$(date "+%F")/check_md5_result.txt
#2.发邮件
mail -s "0224-check-rsync-$(date +%F)" mryang_mailbox@163.com < /momo/nfs-31_10.0.0.31_$(date "+%F")/check_md5_result.txt
#3.删除旧资料
find /momo -type f -mtime +180 -delete
定时执行服务端脚本
1.写入定时任务
crontab -e
* * * * * /bin/bash /root/my_rsync_server.sh
2.查看cron日志
tail -f /var/log/cron
注:这里的定时任务是做测试
可以看到每隔一分钟发送了一次邮件。
crontab -r
:该命令可以删除当前用户的定时任务。sudo crontab -r -u username
:该命令可以删除指定用户的定时任务。