本文简单搭建 NFS 与 Backup 服务器
=====================================================
环境:
CentOS6.8-x86_64 2.6.32-642.el6.x86_64
系统为最小化安装,也做了基础优化。
NFS:
IP 192.168.0.81/24 eth0
Backup:
IP 192.168.0.82/24 eth0
安装测试用这两台机器互动。
=====================================================
1.NFS服务
1.1 服务简介
NFS(network file system)网络文件系统,NFS服务提供小型网络文件共享服务。
生产场景中用来存储用户上传的共享视频、图片、头像、附件等静态文件。
1.2 工作原理
首先服务端启动 rpcbind 服务,之后启动 NFS 服务,NFS服务启动时会向 rpcbind 服务注册端口;
客户端 只启动 rpcbind 服务,用于跟服务端的 rpcbind 服务沟通;
当客户端进行数据操作时,本地 rpcbind 服务会连接服务端的 rpcbind 获取 NFS 注册的可用端口,拿到端口后客户端就直接与服务端的 NFS 服务进行数据传输。
1.3 配置参数、权限分析、相关命令(摘自网络)
1.3.1 NFS配置的3类选项
a. 访问权限选项:
设置输出目录只读:ro
设置输出目录读写:rw
b. 用户映射选项:
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash:与all_squash取反(默认设置);
root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash:与rootsquash取反;
anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
c. 其它选项:
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
1.3.2 权限的分析
1) 客户端连接时候,对普通用户的检查
a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;
b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;
c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;
2.)客户端连接的时候,对root的检查
a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;
b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;
c. 如果没有明确指定,此时root用户被压缩为nfsnobody;
d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;
1.3.3 相关命令
1、exportfs
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:
# exportfs [-aruv]
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 在export的时候,将详细的信息输出到屏幕上。
具体例子:
# exportfs -au 卸载所有共享目录
# exportfs -rv 重新共享所有目录并输出详细信息
2、nfsstat
查看NFS的运行状态,对于调整NFS的运行有很大帮助。
3、rpcinfo
查看rpc执行信息,可以用于检测rpc运行情况的工具,利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些。
4、showmount
-a 显示已经于客户端连接上的目录信息
-e IP或者hostname 显示此IP地址分享出来的目录
5、netstat
可以查看出nfs服务开启的端口,其中nfs 开启的是2049,portmap 开启的是111,其余则是rpc开启的。
最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。
NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill 来结束,(-9 强制结束)
1.4 服务安装配置
[root@NFS-server ~]# yum install nfs-utils rpcbind -y
[root@Backup-server ~]# yum install nfs-utils rpcbind -y # 服务端客户端都装
[root@NFS-server ~]# vim /etc/exports # 编辑配置文件,6.6 的好像没有这个文件的
/data 192.168.0.0/24(rw,sync,all_squash)
[root@NFS-server ~]# mkdir /data # 创建共享挂载目录及改权限
[root@NFS-server ~]# chown -R nfsnobody:nfsnobody /data/
[root@NFS-server ~]# /etc/init.d/rpcbind start # 必须先启动 rpcbind
Starting rpcbind: [ OK ]
[root@NFS-server ~]# /etc/init.d/nfs start # 再启动 nfs
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
[root@NFS-server ~]# rpcinfo -p localhost # 看到以下信息说明端口注册成功
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 59063 mountd
100005 1 tcp 18557 mountd
100005 2 udp 12702 mountd
100005 2 tcp 51384 mountd
100005 3 udp 62641 mountd
100005 3 tcp 52345 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 32821 nlockmgr
100021 3 udp 32821 nlockmgr
100021 4 udp 32821 nlockmgr
100021 1 tcp 31852 nlockmgr
100021 3 tcp 31852 nlockmgr
100021 4 tcp 31852 nlockmgr
[root@NFS-server ~]# showmount -e 127.0.0.1 # 本地测试一下
Export list for 127.0.0.1:
/data 192.168.0.0/24 # 如果配置多个目录都会列出来
[root@NFS-server ~]# echo "/etc/init.d/rpcbind start" >>/etc/rc.local # 加入开机启动
[root@NFS-server ~]# echo "/etc/init.d/nfs start" >>/etc/rc.local
[root@NFS-server ~]# tail -2 /etc/rc.local
/etc/init.d/rpcbind start
/etc/init.d/nfs start
以上服务端配置完成,接下来操作客户端:
[root@Backup-server ~]# /etc/init.d/rpcbind start # 只需要启动 rpcbind
Starting rpcbind: [ OK ]
[root@Backup-server ~]# showmount -e 192.168.0.81 # 测试一下
Export list for 192.168.0.81:
/data 192.168.0.0/24
[root@Backup-server ~]# mkdir /data # 建个目录然后挂载
[root@Backup-server ~]# mount -t nfs 192.168.0.81:/data /data
[root@Backup-server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.6G 1.6G 4.7G 26% /
tmpfs 179M 12K 179M 1% /dev/shm
/dev/sda1 190M 33M 147M 19% /boot
192.168.0.81:/data 6.6G 1.6G 4.7G 26% /data # 看到挂载成功
[root@Backup-server ~]# echo "/etc/init.d/rpcbind start" >>/etc/rc.local # 加入开机启动
[root@Backup-server ~]# tail -1 /etc/rc.local
/etc/init.d/rpcbind start
[root@Backup-server ~]# umount /data # 卸载命令
测试:
[root@Backup-server ~]# touch /data/test1 # 客户端创建文件 test1
[root@Backup-server ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
[root@NFS-server ~]# ll /data/ # 服务端可以看到
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
[root@NFS-server ~]# touch /data/test2 # 服务端创建文件 test2
[root@NFS-server ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
-rw-r--r-- 1 root root 0 Feb 24 05:40 test2
[root@Backup-server ~]# ll /data/ # 客户端同样可以看到
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
-rw-r--r-- 1 root root 0 Feb 24 05:40 test2
[root@Backup-server ~]# rm -f /data/test2 # 客户端可以删除服务端创立的文件 test2
[root@Backup-server ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
[root@NFS-server ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
[root@NFS-server ~]# rm -f /data/test1 # 服务端同样可以删除客户端创建的文件 test1
[root@NFS-server ~]# ll /data/
total 0
[root@Backup-server ~]# ll /data/
total 0
通过测试说明 NFS 服务安装配置成功。
关于挂载的问题
客户端开机挂载设置,把挂载命令加入 /etc/rc.local,前提是服务端NFS服务要先启动, 不然客户端开机时无法找到挂载点,系统会 hung 住开不了机。
[root@Backup-server ~]# echo "mount -t nfs 192.168.0.81:/data /data" >>/etc/rc.local
[root@Backup-server ~]# tail -2 /etc/rc.local
/etc/init.d/rpcbind start
mount -t nfs 192.168.0.81:/data /data
测试开机挂载加入 /etc/fstab,服务端NFS服务是开启状态。
[root@Backup-server ~]# vim /etc/fstab
192.168.0.81:/data /data nfs defaults 0 0 # 加入这一行
[root@Backup-server ~]# reboot
[root@Backup-server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.6G 1.6G 4.7G 26% /
tmpfs 179M 12K 179M 1% /dev/shm
/dev/sda1 190M 33M 147M 19% /boot
可以看到没有挂载成功。这是因为,系统开机执行 /etc/fstab 里面的挂载项是在网络服务启动之前的,所以依靠网络进行挂载的客户端当然就挂载失败了。
关于挂载的一些优化
1)安全挂载
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.0.81:/data /data
2)性能优化,禁止更新目录和文件的时间戳挂载
mount -t nfs -o noatime,nodirtime 192.168.0.81:/data /data
关于内核的优化建议
[root@NFS-server ~]# vim /etc/sysctl.conf # 加入以下参数
net.core.wmem_default = 8388608 #发送缓存区大小的缺省值
net.core.rmem_default = 8388608 #接受套接字缓冲区大小的缺省值(以字节为单位)
net.core.rmem_max = 16777216 #最大接收缓冲区大小的最大值
net.core.wmem_max = 16777216 #发送缓冲区大小的最大值
[root@NFS-server ~]# sysctl -p # 生效
2. Backup 服务
2.1服务简介
集群中的备份服务器可以通过搭建 rsync 服务来实现。
rsync(remote synchronize)它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好。
rsync 包括如下的一些特性:
能更新整个目录和树和文件系统;
有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
对于安装来说,无任何特殊权限要求;
对于多个文件来说,内部流水线减少文件等待的延时;
能用rsh、ssh 或直接端口做为传输入端口;
支持匿名rsync 同步文件,是理想的镜像工具;
2.2 服务搭建
[root@Backup-server ~]# rpm -aq rsync
rsync-3.0.6-12.el6.x86_64 # 系统默认已经有安装这个包
[root@Backup-server ~]# vim /etc/rsyncd.conf # 创建配置文件
#Rsync server uid = rsync gid = rsync use chroot = no max connections = 2000 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/lock/subsys/rsyncd log file = /var/log/rsyncd.log ignore errors read only = false list = false hosts allow = 192.168.0.0/24 hosts deny = 0.0.0.0/32 [web_backup] comment = for website data path = /web_backup auth users = www_user secrets file = /etc/www.password [sql_backup] comment = for mysql data path = /sql_backup auth user = sql_user secrets file = /etc/sql.password
[root@Backup-server ~]# useradd rsync -s /sbin/nologin -M # 创建系统用户
[root@Backup-server ~]# mkdir /web_backup # 创建目录
[root@Backup-server ~]# chown -R rsync:rsync /web_backup/
[root@Backup-server ~]# echo "www_user:123" >/etc/www.password
[root@Backup-server ~]# chmod 600 /etc/www.password
[root@Backup-server ~]# mkdir /sql_backup
[root@Backup-server ~]# chown -R rsync:rsync /sql_backup/
[root@Backup-server ~]# echo "sql_user:123" >/etc/sql.password
[root@Backup-server ~]# chmod 600 /etc/sql.password
[root@Backup-server ~]# rsync --daemon # 启动服务,默认端口 873
[root@Backup-server ~]# lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 1712 root 3u IPv4 12479 0t0 TCP *:rsync (LISTEN)
rsync 1712 root 5u IPv6 12480 0t0 TCP *:rsync (LISTEN)
[root@Backup-server ~]# echo "/usr/bin/rsync --daemon" >>/etc/rc.local # 配置开机启动
客户端配置:
[root@NFS-server ~]# echo "123" >/etc/www.password # 创建对应的密码文件
[root@NFS-server ~]# chmod 600 /etc/www.password # 全线必须 600
[root@NFS-server ~]# echo "123" >/etc/sql.password
[root@NFS-server ~]# chmod 600 /etc/sql.password
[root@NFS-server ~]# touch /tmp/test01 # 建个测试文件
[root@NFS-server ~]# rsync -avz /tmp/test01 www_user@192.168.0.82::web_backup/ --password-file=/etc/www.password # 测试推送本地文件到服务端的 web_backup 目录
sending incremental file list 对应的虚拟用户是 www_user
test01
sent 63 bytes received 27 bytes 180.00 bytes/sec
total size is 0 speedup is 0.00
[root@Backup-server ~]# ll /web_backup/ # 服务端查看
total 0
-rw-r--r-- 1 rsync rsync 0 Feb 24 21:28 test01
[root@NFS-server ~]# rsync -avz /tmp/test01 sql_user@192.168.0.82::sql_backup/ --password-file=/etc/sql.password # sql_user 推送文件到服务端的 sql_backup 目录
sending incremental file list
test01
sent 65 bytes received 27 bytes 184.00 bytes/sec
total size is 0 speedup is 0.00
[root@Backup-server ~]# ll /sql_backup/ # 服务端看到推送成功
total 0
-rw-r--r-- 1 rsync rsync 0 Feb 24 21:28 test01
以上backup服务器搭建完成。
转载于:https://blog.51cto.com/yuyicong/1918341