潇洒紫焰 发表于 2018-10-20 11:10:51

中小集群架构之集群共享NFS-server与备份Backup-server

  本文简单搭建 NFS 与 Backup 服务器
  =====================================================
  环境:
  CentOS6.8-x86_642.6.32-642.el6.x86_64
  系统为最小化安装,也做了基础优化。
  NFS:
  IP 192.168.0.81/24eth0
  Backup:
  IP 192.168.0.82/24eth0
  安装测试用这两台机器互动。
  =====================================================
  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 服务安装配置
  # yum install nfs-utils rpcbind -y
  # yum install nfs-utils rpcbind -y      # 服务端客户端都装
  # vim /etc/exports      # 编辑配置文件,6.6 的好像没有这个文件的
  /data      192.168.0.0/24(rw,sync,all_squash)
  # mkdir /data            # 创建共享挂载目录及改权限
  # chown -R nfsnobody:nfsnobody /data/
  # /etc/init.d/rpcbind start   # 必须先启动 rpcbind
  Starting rpcbind:                                          
  # /etc/init.d/nfs start             # 再启动 nfs
  Starting NFS services:                                    
  Starting NFS quotas:                                       
  Starting NFS mountd:                                       
  Starting NFS daemon:                                       

  Starting RPC>  # rpcinfo -p localhost       # 看到以下信息说明端口注册成功
  program vers proto   portservice
  100000    4   tcp    111portmapper
  100000    3   tcp    111portmapper
  100000    2   tcp    111portmapper
  100000    4   udp    111portmapper
  100000    3   udp    111portmapper
  100000    2   udp    111portmapper
  100011    1   udp    875rquotad
  100011    2   udp    875rquotad
  100011    1   tcp    875rquotad
  100011    2   tcp    875rquotad
  100005    1   udp59063mountd
  100005    1   tcp18557mountd
  100005    2   udp12702mountd
  100005    2   tcp51384mountd
  100005    3   udp62641mountd
  100005    3   tcp52345mountd
  100003    2   tcp   2049nfs
  100003    3   tcp   2049nfs
  100003    4   tcp   2049nfs
  100227    2   tcp   2049nfs_acl
  100227    3   tcp   2049nfs_acl
  100003    2   udp   2049nfs
  100003    3   udp   2049nfs
  100003    4   udp   2049nfs
  100227    2   udp   2049nfs_acl
  100227    3   udp   2049nfs_acl
  100021    1   udp32821nlockmgr
  100021    3   udp32821nlockmgr
  100021    4   udp32821nlockmgr
  100021    1   tcp31852nlockmgr
  100021    3   tcp31852nlockmgr
  100021    4   tcp31852nlockmgr
  # showmount -e 127.0.0.1   # 本地测试一下
  Export list for 127.0.0.1:
  /data 192.168.0.0/24               # 如果配置多个目录都会列出来
  # echo "/etc/init.d/rpcbind start" >>/etc/rc.local   # 加入开机启动
  # echo "/etc/init.d/nfs start" >>/etc/rc.local
  # tail -2 /etc/rc.local
  /etc/init.d/rpcbind start
  /etc/init.d/nfs start
  以上服务端配置完成,接下来操作客户端:
  # /etc/init.d/rpcbind start   # 只需要启动 rpcbind
  Starting rpcbind:                                          
  # showmount -e 192.168.0.81   # 测试一下
  Export list for 192.168.0.81:
  /data 192.168.0.0/24
  # mkdir /data                     # 建个目录然后挂载
  # mount -t nfs 192.168.0.81:/data /data
  # df -h
  Filesystem          SizeUsed Avail Use% Mounted on
  /dev/sda3         6.6G1.6G4.7G26% /
  tmpfs               179M   12K179M   1% /dev/shm
  /dev/sda1         190M   33M147M19% /boot
  192.168.0.81:/data6.6G1.6G4.7G26% /data      # 看到挂载成功
  # echo "/etc/init.d/rpcbind start" >>/etc/rc.local   # 加入开机启动
  # tail -1 /etc/rc.local
  /etc/init.d/rpcbind start
  # umount /data               # 卸载命令
  测试:
  # touch /data/test1            # 客户端创建文件 test1
  # ll /data/
  total 0
  -rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
  # ll /data/                  # 服务端可以看到
  total 0
  -rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
  # touch /data/test2                  # 服务端创建文件 test2
  # 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
  # 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
  # rm -f /data/test2            # 客户端可以删除服务端创立的文件 test2
  # ll /data/
  total 0
  -rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
  # ll /data/
  total 0
  -rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 24 05:39 test1
  # rm -f /data/test1                  # 服务端同样可以删除客户端创建的文件 test1
  # ll /data/
  total 0
  # ll /data/
  total 0
  通过测试说明 NFS 服务安装配置成功。

[*]  关于挂载的问题
  客户端开机挂载设置,把挂载命令加入 /etc/rc.local,前提是服务端NFS服务要先启动, 不然客户端开机时无法找到挂载点,系统会 hung 住开不了机。
  # echo "mount -t nfs 192.168.0.81:/data /data" >>/etc/rc.local
  # tail -2 /etc/rc.local
  /etc/init.d/rpcbind start
  mount -t nfs 192.168.0.81:/data /data
  测试开机挂载加入 /etc/fstab,服务端NFS服务是开启状态。
  # vim /etc/fstab
  192.168.0.81:/data      /data                   nfs   defaults      0 0      # 加入这一行
  # reboot
  # df -h
  Filesystem      SizeUsed Avail Use% Mounted on
  /dev/sda3       6.6G1.6G4.7G26% /
  tmpfs         179M   12K179M   1% /dev/shm
  /dev/sda1       190M   33M147M19% /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

[*]  关于内核的优化建议
  # vim /etc/sysctl.conf         # 加入以下参数
  net.core.wmem_default = 8388608      #发送缓存区大小的缺省值
  net.core.rmem_default = 8388608      #接受套接字缓冲区大小的缺省值(以字节为单位)
  net.core.rmem_max = 16777216         #最大接收缓冲区大小的最大值
  net.core.wmem_max = 16777216         #发送缓冲区大小的最大值
  # sysctl -p            # 生效
  2. Backup 服务
  2.1服务简介
  集群中的备份服务器可以通过搭建 rsync 服务来实现。
  rsync(remote synchronize)它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好。
  rsync 包括如下的一些特性:
  能更新整个目录和树和文件系统;
  有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  对于安装来说,无任何特殊权限要求;
  对于多个文件来说,内部流水线减少文件等待的延时;
  能用rsh、ssh 或直接端口做为传输入端口;
  支持匿名rsync 同步文件,是理想的镜像工具;
  2.2 服务搭建
  # rpm -aq rsync
  rsync-3.0.6-12.el6.x86_64                  # 系统默认已经有安装这个包
  # 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
  

  

  
comment = for website data
  
path = /web_backup
  
auth users = www_user
  
secrets file = /etc/www.password
  

  

  
comment = for mysql data
  
path = /sql_backup
  
auth user = sql_user
  
secrets file = /etc/sql.password
  # useradd rsync -s /sbin/nologin -M   # 创建系统用户
  # mkdir /web_backup                            # 创建目录
  # chown -R rsync:rsync /web_backup/
  # echo "www_user:123" >/etc/www.password
  # chmod 600 /etc/www.password
  # mkdir /sql_backup
  # chown -R rsync:rsync /sql_backup/
  # echo "sql_user:123" >/etc/sql.password
  # chmod 600 /etc/sql.password
  # rsync --daemon          # 启动服务,默认端口 873
  # lsof -i:873

  COMMANDPID USER   FD   TYPE DEVICE>  rsync   1712 root    3uIPv412479      0t0TCP *:rsync (LISTEN)
  rsync   1712 root    5uIPv612480      0t0TCP *:rsync (LISTEN)
  # echo "/usr/bin/rsync --daemon" >>/etc/rc.local    # 配置开机启动
  客户端配置:
  # echo "123" >/etc/www.password          # 创建对应的密码文件
  # chmod 600 /etc/www.password            # 全线必须 600
  # echo "123" >/etc/sql.password
  # chmod 600 /etc/sql.password
  # touch /tmp/test01         # 建个测试文件
  # 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 bytesreceived 27 bytes180.00 bytes/sec

  total>  # ll /web_backup/          # 服务端查看
  total 0
  -rw-r--r-- 1 rsync rsync 0 Feb 24 21:28 test01
  # 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 bytesreceived 27 bytes184.00 bytes/sec

  total>  # ll /sql_backup/             # 服务端看到推送成功
  total 0
  -rw-r--r-- 1 rsync rsync 0 Feb 24 21:28 test01
  以上backup服务器搭建完成。


页: [1]
查看完整版本: 中小集群架构之集群共享NFS-server与备份Backup-server