分布式存储MooseFS的搭建

MooseFS介绍

mooseFS是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。
MooseFS文件系统结构包括以下四种角色:
1 管理服务器managing server (master)
2 元数据日志服务器Metalogger server(Metalogger)
3数据存储服务器data servers (chunkservers)
4 客户机挂载使用client computers
原理图:
存储

存储

搭建的环境介绍

Master server: 10.96.153.223
Metalogger server : 10.96.153.224
chunk server : 10.96.153.221 10.96.153.222
client server : 10.96.153.225
这里使用两台chunk server,master、metalogger和client各一台进行测试,当然,如果由于服务器有限,可以把master和metalogger分别放在chunkserver上。

Master Server安装

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmount –disable-mfschunkserver

3、编译并安装

  1. #make
  2. #make install

4、配置文件

  1. #cd /usr/local/mfs/etc
  2. #cp mfsmaster.cfg.dist mfsmaster.cfg
  3. #cp mfsexports.cfg.dist mfsexports.cfg

更改配置文件mfsexports.cfg

  1. 10.96.153.0/24 / rw,alldirs,maproot=0

5、启动前准备

  1. #cd /usr/local/mfs/var/mfs
  2. #cp metadata.mfs.empty metadata.mfs
  3. #echo "10.96.153.221 mfsmaster" >> /etc/hosts

6、启动mfsmaster

  1. #/usr/local/mfs/sbin/mfsmaster start

7、监控服务

  1. #/usr/local/mfs/sbin/mfscgiserv

浏览器输入10.96.153.221:9425

mfsmetalogger搭建

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmount –disable-mfschunkserver

3、编译并安装

  1. #make
  2. #make install

4、配置文件

  1. #cd /usr/local/mfs/etc
  2. #cp mfsmetalogger.cfg.dist mfsmetalogger.cfg

5、启动前准备

  1. #echo "10.96.153.221 mfsmaster" >> /etc/hosts

6、启动mfsmetalogger

  1. ##/usr/local/mfs/sbin/mfsmetalogger start

Chunk servers 安装

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmount –disable-mfsmaster

3、编译并安装

  1. #make
  2. #make install

4、创建磁盘(100G)

  1. #dd if=/dev/zero of=/mnt/storage/mfschunks1 bs=1024 count=1 seek=$((100*1024*1024-1))
  2. #mkfs -t ext3 /mnt/storage/mfschunks1
  3. #mkdir -p /mnt/mfs1
  4. #mount -t ext3 -o loop /mnt/storage/mfschunks1 /mnt/mfs1

5、配置文件

  1. #cd /usr/local/mfs/etc
  2. #cp mfschunkserver.cfg.dist mfschunkserver.cfg
  3. #cp mfshdd.cfg.dist mfshdd.cfg

更改配置文件mfshdd.cfg,加入:

  1. /mnt/mfs1

6、启动前准备

  1. #echo "10.96.153.221 mfsmaster" >> /etc/hosts
  2. #chown -R mfs:mfs /mnt/mfs1

7、启动chunkserver

  1. ##/usr/local/mfs/sbin/mfschunkserver start

mfsclient安装

1、下载解压

  1. #cd /usr/src
  2. #wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.26/mfs-1.6.26.tar.gz
  3. #tar xzf mfs-1.6.26.tar.gz

2、配置编译参数

  1. #groupadd mfs
  2. #useradd -g mfs mfs
  3. #cd mfs-1.6.26/
  4. #./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –disable-mfsmaster–disable-mfschunkserver

3、编译并安装

  1. #make
  2. #make install

4、启动前准备

  1. mkdir /mnt/mfs
  2. #echo "10.96.153.221 mfsmaster" >> /etc/hosts

5、开始挂载

  1. #/usr/local/mfs/bin/mfsmount /mnt/mfs -H mfsmaster

6、检查
df -h查看输出

MFS维护

5.1、启动MFS集群

  • 1、启动mfsmaster 进程
  • 2、启动所有的mfschunkserver 进程
  • 3、启动mfsmetalogger 进程(如果配置了mfsmetalogger)
  • 4、当所有的chunkservers 连接到MooseFS master 后,任何数目的客户端可以利用mfsmount 去挂接被export 的文件系统。(可以通过检查master 的日志或是CGI 监视器来查看是否所有的chunkserver被连接)。

5.2、停止MFS集群

  • 1、在所有的客户端卸载MooseFS 文件系统(用umount 命令或者是其它等效的命令)
  • 2、用mfschunkserver stop 命令停止chunkserver 进程
  • 3、用mfsmetalogger stop 命令停止metalogger 进程
  • 4、用mfsmaster stop 命令停止master 进程

5.3、MFS chunkservers 的维护

若每个文件的goal(目标)都不小于2,并且没有under-goal 文件(这些可以用mfsgetgoal –r和mfsdirinfo 命令来检查),那么一个单一的chunkserver 在任何时刻都可能做停止或者是重新启动。以后每当需要做停止或者是重新启动另一个chunkserver 的时候,要确定之前的chunkserver 被连接,而且要没有under-goal chunks。

5.4、MFS元数据备份

用rsync定时备份/usr/local/app/soft/mfs/var/mfs/metadata.mfs.back

5.5、MFS Master的恢复

  1. mfsmetarestore -a

5.6、从MetaLogger中恢复Master

  1. mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs

CentOS系统安装过程中配置软RAID-0或RAID-1

什么是RAID-0

RAID-0 (等量模式, stripe):效能最佳。这种模式如果使用相同型号与容量的磁碟来组成时,效果较佳。这种模式的 RAID 会将磁碟先切出等量的区块 (举例来说, 4KB), 然后当一个文件要写入 RAID 时,该文件会依据区块的大小切割好,之后再依序放到各个磁碟里面去。由於每个磁碟会交错的存放数据, 因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁碟上面。举例来说,你有两颗磁碟组成 RAID-0 , 当你有 100MB 的数据要写入时,每个磁碟会各被分配到 50MB 的储存量。RAID-0 的示意图如下所示:
存储
上图的意思是,在组成 RAID-0 时,每颗磁碟 (Disk A 与 Disk B) 都会先被区隔成为小区块 (chunk)。 当有数据要写入 RAID 时,数据会先被切割成符合小区块的大小,然后再依序一个一个的放置到不同的磁碟去。 由於数据已经先被切割并且依序放置到不同的磁碟上面,因此每颗磁碟所负责的数据量都降低了!照这样的情况来看, 越多颗磁碟组成的 RAID-0 效能会越好,因为每颗负责的数据量就更低了! 这表示我的数据可以分散让多颗磁碟来储存,当然效能会变的更好啊!此外,磁碟总容量也变大了! 因为每颗磁碟的容量最终会加总成为 RAID-0 的总容量喔!

只是使用此等级你必须要自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每颗磁盘分区区块的大小, 然后再依序放置到各个磁碟中。想一想,如果某一颗磁碟损毁了,那么文件数据将缺一块,此时这个文件就损毁了。 由於每个文件都是这样存放的,因此 RAID-0 只要有任何一颗磁碟损毁,在 RAID 上面的所有数据都会遗失而无法读取。

另外,如果使用不同容量的磁碟来组成 RAID-0 时,由於数据是一直等量的依序放置到不同磁碟中,当小容量磁碟的区块被用完了, 那么所有的数据都将被写入到最大的那颗磁碟去。举例来说,我用 200G 与 500G 组成 RAID-0 , 那么最初的 400GB 数据可同时写入两颗磁碟 (各消耗 200G 的容量),后来再加入的数据就只能写入 500G 的那颗磁碟中了。 此时的效能就变差了,因为只剩下一颗可以存放数据嘛!

什么是RAID-1

RAID-1 (映射模式, mirror):完整备份。这种模式也是需要相同的磁碟容量的,最好是一模一样的磁碟啦!如果是不同容量的磁碟组成 RAID-1 时,那么总容量将以最小的那一颗磁碟为主!这种模式主要是『让同一份数据,完整的保存在两颗磁碟上头』。举例来说,如果我有一个 100MB 的文件,且我仅有两颗磁碟组成 RAID-1 时, 那么这两颗磁碟将会同步写入 100MB 到他们的储存空间去。 因此,整体 RAID 的容量几乎少了 50%。由於两颗硬盘内容一模一样,好像镜子映照出来一样, 所以我们也称他为 mirror 模式罗~
存储
如上图所示,一份数据传送到 RAID-1 之后会被分为两股,并分别写入到各个磁碟里头去。 由於同一份数据会被分别写入到其他不同磁碟,因此如果要写入 100MB 时,数据传送到 I/O 汇流排后会被复制多份到各个磁碟, 结果就是数据量感觉变大了!因此在大量写入 RAID-1 的情况下,写入的效能可能会变的非常差 (因为我们只有一个南桥啊!)。 好在如果你使用的是硬件 RAID (磁盘阵列卡) 时,磁盘阵列卡会主动的复制一份而不使用系统的 I/O 汇流排,效能方面则还可以。 如果使用软件磁盘阵列,可能效能就不好了。

由於两颗磁碟内的数据一模一样,所以任何一颗硬盘损毁时,你的数据还是可以完整的保留下来的! 所以我们可以说, RAID-1 最大的优点大概就在於数据的备份吧!不过由於磁碟容量有一半用在备份, 因此总容量会是全部磁碟容量的一半而已。虽然 RAID-1 的写入效能不佳,不过读取的效能则还可以啦!这是因为数据有两份在不同的磁碟上面,如果多个 processes 在读取同一笔数据时, RAID 会自行取得最佳的读取平衡。
以上文字转自:http://vbird.dic.ksu.edu.tw/linux_basic/0420quota_2.php

系统安装过程配置raid

下面我们以centos 5.8,两块硬盘/dev/sda和/dev/sdb为例进行操作。

1、自定义分区

在“安装需要对您的硬盘进行分区”的步骤中,选择“建立自定义分区结构”

2、创建RAID分区

2.1 为/boot创建raid分区
点击“RAID”按钮,选择“创建软件RAID分区”,“确定”进行一步。在“允许的驱动器”中只选择“sda”,大小100M即可,之后点击确定。重复之前的步骤,在“允许的驱动器”中只选择”sdb”,其它的与之前的操作相同。如图:
存储
存储
2.2 为swap创建raid分区
根据2.2的步骤,只是大小不同,如内存2G的机器,可以创建2G的swap。
2.3 为 根目录 /创建raid分区
根据2.2的步骤,把剩下的空间全部分配给根目录。
最终状态如下:
存储
存储

3、创建RAID设备

3.1 boot raid设备
点击“RAID”,选择“创建RAID设备”,点击“确定”。挂载点选择“/boot”,文件系统类型“ext3”,raid设备“md0”,raid级别“RAID1”,RAID成员选择“sda1和sdb1”(可以根据大小判断是刚才创建的boot)。点击“确定”完成boot raid设备的创建。
存储
3.2 swap raid设备
点击“RAID”,选择“创建RAID设备”,点击“确定”。文件系统类型“swap”,raid设备“md1”,raid级别“RAID0或RAID1”,RAID成员选择“sda2和sdb2”(可以根据大小判断是刚才创建的swap)。点击“确定”完成swap raid设备的创建。
存储
3.3 root raid设备
点击“RAID”,选择“创建RAID设备”,点击“确定”。挂载点选择“/boot”,文件系统类型“ext3”,raid设备“md2”,raid级别“RAID0或RAID1”,RAID成员选择“sda3和sdb3”(可以根据大小判断是刚才创建的swap)。点击“确定”完成root raid设备的创建。
存储
此时就创建好了RAID,最终状态如下:
存储
存储
存储

DRBD编译安装与配置

DRBD介绍

DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。 DRBD Logo数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)。DBRD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。DBRD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。

DRBD编译安装

安装所需依赖:

  1. yum -y install gcc kernel-devel kernel-headers flex

开始安装drbd,下载地址:http://oss.linbit.com/drbd/
安装用户空间工具:

  1. cd /tmp
  2. wget http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz
  3. tar xzf drbd-8.4.1.tar.gz
  4. cd drbd-8.4.1
  5. ./configure –prefix=/usr/local/drbd –with-km
  6. make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
  7. make install
  8. mkdir -p /usr/local/drbd/var/run/drbd
  9. cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
  10. chkconfig –add drbd
  11. chkconfig drbd on

安装drbd模块:

  1. cd drbd
  2. make clean
  3. make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
  4. cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
  5. depmod

注:usr/src/kernels/2.6.18-274.18.1.el5-i686/这个内核源码树路径需要根据自己的系统修改。

DRBD配置

建立分区

假如现在有第二块硬盘hdb,两个node都要分区。

  1. #fdisk /dev/hdb                                                      //准备为 hdb 建立分区
  2.  The number of cylinders for this disk is set to 20805.
  3.  There is nothing wrong with that, but this is larger than 1024,
  4.  and could in certain setups cause problems with:
  5.  1) software that runs at boot time (e.g., old versions of LILO)
  6.  2) booting and partitioning software from other OSs
  7.    (e.g., DOS FDISK, OS/2 FDISK)
  8.  Command (m for help): n                                              //键入 n 表示要建立分区
  9.  Command action
  10.     e   extended
  11.     p   primary partition (1-4)
  12.  p                                                                    //键入 p 表示建立主要分区
  13.  Partition number (1-4): 1                                            //键入 1 为此主要分区代号
  14.  First cylinder (1-20805, default 1):                                 //开始磁柱值,按下 enter 即可
  15.  Using default value 1
  16.  Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
  17.  Using default value 20805
  18.  Command (m for help): w                                              //键入 w 表示确定执行刚才设定
  19.  The partition table has been altered!
  20.  Calling ioctl() to re-read partition table.
  21.  Syncing disks.
  22.  [root@node1 yum.repos.d]# partprobe                                  //使刚才的 partition table 变更生效

建立分区完成后使用指令 fdisk -l 确定 partition talbe 状态

  1. #fdisk -l
  2.  Disk /dev/hda: 21.4 GB, 21474754560 bytes
  3.  255 heads, 63 sectors/track, 2610 cylinders
  4.  Units = cylinders of 16065 * 512 = 8225280 bytes
  5.     Device Boot      Start         End      Blocks   Id  System
  6.  /dev/hda1   *           1          13      104391   83  Linux
  7.  /dev/hda2              14        2610    20860402+  8e  Linux LVM
  8.  Disk /dev/hdb: 10.7 GB, 10737377280 bytes
  9.  16 heads, 63 sectors/track, 20805 cylinders
  10.  Units = cylinders of 1008 * 512 = 516096 bytes
  11.     Device Boot      Start         End      Blocks   Id  System
  12.  /dev/hdb1               1       20805    10485688+  83  Linux

建立分区完成后请建立 /db 目录。 (Node1 及 Node2 都必须建立)

  1. #mkdir /db

建立drbd配置文件

主要定义两块global和resource。

  1. vi /usr/local/drbd/etc/drbd.conf

写入:

  1. include "drbd.d/global_common.conf";
  2. include "drbd.d/*.res";
  1. vi /usr/local/drbd/etc/drbd.d/global_common.conf

写入:

  1. global {
  2.   usage-count yes;
  3. }
  4. common {
  5.   net {
  6.     protocol C;
  7.   }
  8. }
  1. vi /usr/local/drbd/etc/drbd.d/r0.res

写入:

  1. resource r0 {
  2.   on node1 {
  3.     device    /dev/drbd1;
  4.     disk      /dev/hdb1;
  5.     address   192.168.1.101:7789;
  6.     meta-disk internal;
  7.   }
  8.   on node2 {
  9.     device    /dev/drbd1;
  10.     disk      /dev/hdb1;
  11.     address   192.168.1.103:7789;
  12.     meta-disk internal;
  13.   }
  14. }

设置hostname

根据上面的resource配置文件,需要对192.168.1.101和192.168.1.103分别设置hostname为node1和node2,设置方法如下:

  1. vi /etc/sysconfig/network

修改HOSTNAME为node1

  1. vi /etc/hosts

填入:

  1. 192.168.1.101 node1
  2. 192.168.1.103 node2

使node1 hostnmae临时生效

  1. hostname node1

node2机器设置类似。

设置resource

以下操作需要在node1和node2操作。

  1. #modprobe drbd                                    //载入 drbd 模块
  2. #lsmod|grep drbd                                  //确认 drbd 模块是否载入
  3.  drbd                  228528  0
  4.  #dd if=/dev/zero of=/dev/hdb1 bs=1M count=100     //把一些资料塞到 hdb 內 (否则 create-md 时有可能会出现错误)
  5.  #drbdadm create-md r0                             //建立 drbd resource
  6.  #drbdadm up r0                                  //启动 resource r0

查看node1和node2的状态应该类似下面的:

  1. cat /proc/drbd
  1. version: 8.4.1 (api:1/proto:86-100)
  2. GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@localhost.localdomain, 2012-02-12 06:05:36
  3.  m:res  cs         ro                   ds                         p  mounted  fstype
  4.  0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C

表明现在已经启动服务,但还没有设置同步(即需要设置Primary Node)

设置Primary Node

以下操作仅在node1执行。
设置node1为primary node:

  1. drbdadm primary –force r0

再次查看node1的状态:

  1. #cat /proc/drbd
  2. version: 8.4.1 (api:1/proto:86-100)
  3. GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@localhost.localdomain, 2012-02-12 06:47:37
  4.  
  5.  1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
  6.     ns:52892 nr:0 dw:0 dr:52892 al:0 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

我们看到状态已经变成Primary/Secondary,即设置primary node成功。

创建DRBD文件系统

以下操作仅在node1执行。
上面已经完成了/dev/drbd1的初始化,现在来把/dev/drbd1格式化成ext3格式的文件系统。

  1. #mkfs.ext3 /dev/drbd1

然后将/dev/drbd1挂载到之前创建的/db目录。

  1. #mount /dev/drbd1 /db

现在你只要把数据写入/db目录,drbd即会立刻把数据同步到备机192.168.1.103的/dev/hdb1分区上。

drbd同步测试

当在备机node2启动drbd时,它是无法挂载/dev/hdb1分区的,我们可以尝试写些数据到node1的目录/db上,然后停止node2的drbd。

  1. drbdadm down r0

之后就可以把node2的/dev/hdb1挂载到目录/db

  1. mount -t ext3 /dev/hdb1 /db

我们就可以查看node2的/db目录是否有node1的数据。

手动切换主备机

我们可以把node1改变为备机,而node2改变为主机。
在node1上操作:

  1. umount /dev/drbd1
  2. drbdadm secondary r0

在node2上操作:

  1. drbdadm primary r0

此时应该已经切换成功。
如果配置过程中出现错误,可以参考http://devops.webres.wang/2012/02/drbd-erros-faq/

CentOS安装配置NFS网络文件系统

 NFS是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。

安装NFS

服务端和客户端都需要安装。
只需要一条命令即可安装好nfs:

  1. yum install nfs-utils nfs4-acl-tools portmap

配置NFS服务端

nfs的主配置文件是/etc/exports,这里是配置NFS服务器开放的目录以及客户端访问的权限等。

  1. vi /etc/exports

加入:

  1. /nfsdata 192.168.1.103(rw,root_squash,no_all_squash,sync)

保存设置

  1. exportfs -r

配置解释:
#配置文件每行分为段:
#第一段为共享的目录,使用绝对路径
#第二段为客户端地址及权限:
地址可以使用完整IP或网段,例如192.168.1.103或10.0.0.0/24,10.0.0.0/255.255.255.0当然也可以
地址可以使用主机名,DNS解析的和本地/etc/hosts解析的都行,支持通配符。
权限有:
rw:read-write,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。
配置允许指定客户端连接NFS服务器
注意 NFS 使用 portmap,而且新版本的 portmap 使用 hosts.deny 和 hosts.allow 文件来控制访问源,修改这2个配置文件以便 NFS 客户端能正常连接到服务器:

  1. # vi /etc/hosts.deny 
  2. portmap:ALL 
  3.  
  4. # vi /etc/hosts.allow 
  5. portmap:192.168.1.103

NFS服务端启动与测试

先启动所依赖的postmap

  1. service portmap start或者/etc/init.d/rpcbind start
  2. service nfs start

显示已共享的目录信息:

  1. showmount -e

NFS客户端连接测试

  1. service portmap start或者/etc/init.d/rpcbind start
  2. service nfs start

显示可挂载的目录:

  1. showmount -e 192.168.1.101

挂载网络目录/nfsdata到/root/nfsdata(确保存在)

  1. mount -t nfs 192.168.1.101:/nfsdata /root/nfsdata

检查是否已经挂载好:

  1. mount

如果需要开机挂载的话别忘了在/etc/fstab中加入

  1. /root/nfsdata   192.168.1.101:/nfsdata

相关链接:http://nfs.sourceforge.net/

使用unison实现文件双向同步

Unison是一款跨windows/linux/MAC OS平台的文件同步工具,不仅支持本地对本地同步,也支持通过SSH、RSH和Socket等网络协议进行同步。更棒的是,Unison支持双向同步操作,你既可以从A同步到B,也可以从B同步到A,这些都不需要额外的设定。遗憾的是,unison无法实现实时双向同步。下面介绍unison的安装及使用方法。
在安装unison之前,需要安装ocaml编译器。

ocaml安装

  1. cd /tmp
  2. wget http://caml.inria.fr/pub/distrib/ocaml-3.12/ocaml-3.12.1.tar.gz
  3. tar xzf ocaml-3.12.1.tar.gz
  4. cd ocaml-3.12.1
  5. ./configure
  6. make world opt
  7. make install

unison安装

  1. cd /tmp
  2. wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.40.63.tar.gz
  3. tar xzf unison-2.40.63.tar.gz
  4. cd unison-2.40.63
  5. make UISTYLE=text
  6. mkdir /root/bin
  7. make install
  8. cp /root/bin/unison /usr/bin/

unison的使用

如需要实现远程双向文件同步,两台机子都需要安装unison。
unison的连接传输方式有两种:一是ssh,二是socket。我们这里先用比较安全的ssh。所以为了不需要密码连接,首先为它们配置密钥。

配置双机ssh信任

例假设本地机为:10.178.1.132(linux)
远程机:10.178.1.110(solaris)
1. 在两台机器上创建 RSA密钥
以下操作要在本地机和远程机上都执行一遍
(1)以 root 用户登录
(2)在 root 用户的 主目录内创建.ssh 目录并设置正确的权限

  1. [root@gsgatzhapp1 ~]# mkdir ~/.ssh
  2.    [root@gsgatzhapp1 ~]# chmod 700 ~/.ssh

(3)使用 ssh-keygen 命令生成第 2 版本的 SSH 协议的 RSA 密钥

  1. [root@gsgatzhapp1 ~]# ssh-keygen -t rsa

在提示保存私钥(key)和公钥(public key)的位置时,使用默认值。 如果需要私钥密码(passphrase),则输入一个私钥密码(如果使用私钥密码,使用 ssh 执行远程命令时需要输入私钥密码,因此,本案例中未使用私钥密码),因此,直接回车即可。
2. 添加密钥到授权密钥文件(authorized key file)中
(1)以 root 用户登录
(2)在本地机上执行

  1. [root@gsgatzhapp1 ~] # cd ~/.ssh
  2.      [root@gsgatzhapp1.ssh]#ssh 10.178.1.132 cat /root/.ssh/id_rsa.pub >> authorized_keys
  3.      [oracle@gsgatzhapp1.ssh]#ssh 10.178.1.110 cat /root/.ssh/id_rsa.pub >> authorized_keys
  4.      [oracle@gsgatzhapp1.ssh]#scp authorized_keys 10.178.1.110:/root/.ssh/
  5.      [oracle@gsgatzhapp1 .ssh]# chmod 600  /root/.ssh/authorized_keys

(3)在远程机10.178.1.110 上:

  1. bash-2.05# chmod 600  /root/.ssh/authorized_keys

(4)测试
完成后,在 gsgatzhapp1 上执行:

  1. [root@gsgatzhapp1 ~]# ssh 10.178.1.132  date
  2.      [root@gsgatzhapp1 ~]#ssh 10.178.1.110 date

如果不需要输入密码就出现系统日期,说明 SSH 配置成功。

unison使用方法

unison的命令格式为:unsion 目录1 目录2 选项
例1:unison /home/dir1 /home/dir2
表示同步本地两个目录dir1和dir2。
例2:unison /home/dir1 ssh://192.168.1.2//root/dir
表示本地的目录/home/dir1通过ssh同步远程机器192.168.1.2的目录/root/dir。
例3:unison /home/dir1 ssh://192.168.1.2//root/dir -batch
表示本地的目录/home/dir1通过ssh同步远程机器192.168.1.2的目录/root/dir,并不需要回答任何问题直接同步,batch参数表示不需要回答问题。
下面是一些参数的解释,更多的参数可以用命令unison -help查看。

unison参数说明

Unison有很多参数,这里只介绍经常使用的几个,详细的请参看unison手册:
• -testserver
测试连通性,连接到服务器即退出。示例:
$ unison / ssh://opensou1@bluehost/ -servercmd=~/bin/unison -testserver
如果服务器端 unison 可执行文件不在默认目录下,甚至没有 unison 命令(需要你编译一个上传到服务器),则需要使用 -servercmd 参数告诉要执行的服务器 unison 命令位置。
使用 -testserver 参数,则成功链接即退出,也不会去执行目录的比较等后续操作。
• -servercmd xxx
告诉 unison, 服务器端的 unison 命令是什么。参见上面的示例。
• -auto
接受缺省的动作,然后等待用户确认是否执行。
• -batch
batch mode, 全自动模式,接受缺省动作,并执行。
• -ignore xxx
增加 xxx 到忽略列表中
• -ignorecase [true|false|default]
是否忽略文件名大小写
• -follow xxx
是否支持对符号连接指向内容的同步
• owner = true (保持同步过来的文件属主)
• group = true (保持同步过来的文件组信息)
• perms = -1 (保持同步过来的文件读写权限)
• repeat = 1 (间隔1秒后,开始新的一次同步检查)
• retry = 3 (失败重试)
• sshargs = -C (使用ssh的压缩传输方式)
• xferbycopying = true
• -immutable xxx
不变目录,扫描时可以忽略
• -silent
安静模式
• -times
同步修改时间
• -path xxx 参数
只同步 -path 参数指定的子目录以及文件,而非整个目录。-path 可以多次出现,例如
unison /home/username ssh://remotehost//home/username
-path shared
-path pub
-path .netscape/bookmarks.html

配置文件的使用

unison可以调用配置文件的方式使用,如unison rsync就是调用~/.unison/rsync.prf文件。
下面是我的一个web应用中两个文件夹同步的配置信息:
root = /sina/webdata
root = ssh://root@192.168.60.121//sina/webdata
#force =/sina/webdata
ignore = Path as/*
#prefer = ssh://root@192.168.60.121//sina/webdata
batch = true
#repeat = 1
#retry = 3
owner = true
group = true
perms = -1
fastcheck=false
rsync =false
#debug=verbose
sshargs = -C
xferbycopying = true
log = true
logfile = /root/.unison/sina_122.1547.log
说明如下:
两个root表示需要同步的文件夹
force表示以本地的/var/www/bbsnew文件夹为标准,将该目录同步到远端。注意,如果指定了force参数,那么unison就变成了单项同步了,也就是说会以force指定的文件夹为准进行同步.
Unison本身是可以双向同步的,但是要做到双向同步,就不要设置force参数,如果设置了force参数,就成了单项同步了,此时unison类似与sync.
Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是 A B文件夹的合集.
Unison双向同步的一个缺点是,对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准.
ignore = Path表示忽略/sina/webdata下面的WEB-INF/tmp目录,即同步时不同步它。
batch = true,表示全自动模式,接受缺省动作,并执行
-fastcheck true表示同步时使用文件的创建时间来比较两地文件,如果这个选项为false,unison则将比较两地文件的内容.建议设置为true
log = true表示在终端输出运行信息。
logfile则指定了同时将输出写入log文件。

定时同步的实现

unison很难做到实时同步,不过可以做到定时同步,配合cronjob就可以实现,如:
crontab -e
0 3 * * * unison rsync
参考文章:http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html
http://ixdba.blog.51cto.com/2895551/584334