GlusterFS学习手记06-基于glusterfs的web应用[原创]

看glusterfs的东西也有段时间了,不过一直一来也是停留在对这个分布式系统的学习,当然对于一个软件的学习不能仅仅停留在对这个软件的熟悉,还要考虑它所适用的范围。最近就在思考,到底对于我们的什么应用合适,我这边接触的比较多的结构就是N台Web+单个NFS。我就再想,既然glusterfs是个聚合分布式文件系统,而且支持HA的功能,是不是可以使用glusterfs来替换NFS,既可以达到共享文件的用途,有可以解决了单点的问题。

先来看下我预计的拓扑结构

下面来解释一下这个拓扑,前端的web应用,每台web上的应用都放置在glusterfs共享出来的硬盘上,尽管我图上画的是一个diskpool,但实际的容量大小是几台web中glusterfs共享空间最小的那个大小。而且对于上面这个拓扑的应用,我并不需要独立的NAS来做共享,完全可以使用每台web服务器上未用的硬盘空间(注:当然你可以选择使用NAS来进行存储,在存储量很大的情况下)。

接下来就来看下实现的方式:
web01:192.168.220.128 共享出来的地址:/var/app
web02:192.168.220.129 共享出来的地址:/var/app
两台机器都事先安装好glusterfs和fuse(安装方法可以参考我前几篇文章)
首先来配置web01的server端

cat /etc/glusterfs/server.vol

volume brick
type storage/posix # POSIX FS translator
option directory /var/app # Export this directory
end-volume

volume locker
type features/posix-locks
subvolumes brick
end-volume

### Add network serving capability to above brick.
volume server
type protocol/server
option transport-type tcp/server
option listen-port 6996 # Default is 6996
subvolumes locker
option auth.addr.brick.allow * # Allow access to "brick" volume
option auth.addr.locker.allow *
end-volume

web02上的server端配置相同
cat /etc/glusterfs/server.vol

volume brick
type storage/posix # POSIX FS translator
option directory /var/app # Export this directory
end-volume

volume locker
type features/posix-locks
subvolumes brick
end-volume

### Add network serving capability to above brick.
volume server
type protocol/server
option transport-type tcp/server
option listen-port 6996 # Default is 6996
subvolumes locker
option auth.addr.brick.allow * # Allow access to "brick" volume
option auth.addr.locker.allow *
end-volume

服务器端配置完毕,接下来就是client端的配置,因为两台机器互为对方的sever又同时是自己的server所以两台上都需要配置client端。
首先看下web01上的配置
cat /etc/glusterfs/replicate.vol

volume client0
type protocol/client
option transport-type tcp/client
option remote-host 127.0.0.1 # IP address of the remote brick
option remote-port 6996 # default server port is 6996
option remote-subvolume locker # name of the remote volume
end-volume

volume client1
type protocol/client
option transport-type tcp/client
option remote-host 192.168.211.129
option remote-port 6996
option remote-subvolume locker
end-volume

volume bricks
type cluster/replicate
subvolumes client0 client1
option read-subvolume client0
end-volume

再来看下web02上的配置
cat /etc/glusterfs/replicate.vol

volume client0
type protocol/client
option transport-type tcp/client
option remote-host 127.0.0.1 # IP address of the remote brick
option remote-port 6996 # default server port is 6996
option remote-subvolume locker # name of the remote volume
end-volume

volume client1
type protocol/client
option transport-type tcp/client
option remote-host 192.168.211.128
option remote-port 6996
option remote-subvolume locker
end-volume

volume bricks
type cluster/replicate
subvolumes client0 client1
option read-subvolume client0
end-volume

到此,配置就已经完成了,接下来就可以测试咯,首先两台机器上需要加载fuse
modprobe fuse
如果没有报错,说明fuse模块加载完毕,然后在两台机器上启动server端和client端
web01上执行

启动服务端
glusterfsd -f /etc/glusterfs/server.vol

启动client端
glusterfs -f /etc/glusterfs/replicate.vol /usr/local/nginx/html/blog

web02上如法炮制
然后就可以在web01上的/mnt上放置web的内容了,web02上可以自动的看到相应的内容,并不需要人为的干预,没台机器上都会有一份web应用的拷贝,这样无论那台web宕机,web的提供的服务是不会中断,也不会受到影响的,从而避免了,单点NFS故障导致服务中断,同时避免了,双NFS数据同步的问题。同时每台web优先读取自己硬盘上的copy,所以可以减少网络负载。
但这个方案还不是最完美的,因为这种方案对于写频繁的应用来说是存在问题的,如果出现同时写一个文件的情况,就会造成数据的不一致,所以如果web应用是读频繁的话,还是很有优势的,而且如果后台人员需要对应用进行更新,只需要更新第一台server的就行,默认情况下replicate的应用,subvolumes client0 client1 中的一个就是主server,这里只要对于client0上的数据进行更新就可以做到同步了。

GlusterFS学习手记03-cluster/Replicate 的学习[原创]

今天主要把我学习的文件复制功能写出来

Replicate

type cluster/replicate

Replicate(前身是AFR)为glusterfs提供了类似RAID-1的功能。Replicate会复制文件或者文件夹到各个subvolumes里。因此,如果replicate部分设置了4个subvolume,那就会4分的文件或者文件夹的拷贝副本。replicate同样提供了高可用,比如如果其中的一个subvolume down掉了(或者说一台存储服务器坏了,网络连接出现问题)replicate依然可以使用冗余的拷贝副本来提供服务。
Replicate同样提供了自动修复功能,比如,如果一台crash掉的服务器恢复了,这台服务器上存储的过期的文件或者文件夹就会被更新成最新的版本。Replicate使用了后端文件系统的扩展功能来跟踪文件或者文件夹的版本来提供自动恢复的功能

volume replicate-example
type cluster/replicate
subvolumes brick1 brick2 brick3
end-volume

上面的例子将会把所有文件都复制到brick1 brick2 brick3中

所有读的操作都会从第一台活着的sbuvolume进行。如果三个sub-volume都是启用的状态,就从brick1读;如果brick1 down了,就从brick2读。如果读的操作刚刚完成brick1就down了,复制就会传递给brick2.

概念讲完了,下面就来说下配置吧

模拟环境:
vmware6.0 两个linux server:192.168.211.128 client:192.168.211.129
两个存储node,一个client

先来看看server上的配置
cat /etc/glusterfs/glusterfs-server0.vol

### Export volume “brick” with the contents of “/home/export” directory.

volume brick
type storage/posix # POSIX FS translator
option directory /home/dir1 # Export this directory
end-volume

volume locker
type features/posix-locks
subvolumes brick
end-volume

### Add network serving capability to above brick.
volume server
type protocol/server
option transport-type tcp/server
option bind-address 192.168.211.128 # Default is to listen on all interfaces
option listen-port 6996 # Default is 6996
subvolumes locker
option auth.addr.brick.allow * # Allow access to “brick” volume
option auth.addr.locker.allow *
end-volume

cat /etc/glusterfs/glusterfs-server1.vol

### Export volume “brick” with the contents of “/home/export” directory.
volume brick
type storage/posix # POSIX FS translator
option directory /home/dir2 # Export this directory
end-volume

volume locker
type features/posix-locks
subvolumes brick
end-volume

### Add network serving capability to above brick.
volume server
type protocol/server
option transport-type tcp/server
option bind-address 192.168.211.128 # Default is to listen on all interfaces
option listen-port 6997 # Default is 6996
subvolumes locker
option auth.addr.brick.allow * # Allow access to “brick” volume
option auth.addr.locker.allow *
end-volume

然后是client端的配置
cat /etc/glusterfs/replicate-client.vol

### Add client feature and attach to remote subvolume
volume client0
type protocol/client
option transport-type tcp/client
option remote-host 192.168.211.128 # IP address of the remote brick
option remote-port 6996 # default server port is 6996
option remote-subvolume locker # name of the remote volume
end-volume

volume client1
type protocol/client
option transport-type tcp/client
option remote-host 192.168.211.128
option remote-port 6997
option remote-subvolume locker
end-volume

volume bricks
type cluster/replicate
subvolumes client0 client1
end-volume

到此,配置就都完成了
接下来启动服务
server端

glusterfsd -f /etc/glusterfs/glusterfs-server0.vol
glusterfsd -f /etc/glusterfs/glusterfs-server1.vol
当然启动的时候可以加上-l /dir/glusterfs.log参数,把日志加入
然后通过ps fax查看进程如下
2206 ? Ssl 0:00 glusterfsd -f /etc/glusterfs/glusterfs-server1.vol
2396 ? Ssl 0:00 glusterfsd -f /etc/glusterfs/glusterfs-server0.vol
说明,服务正常启动起来了

client端

modprobe fuse
glusterfs -l /tmp/glustfs.log -f /etc/glusterfs/replicate-client.vol /mnt
通过df -h查看是否服务正常启动,如下
[root@contos5-1-4 mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 7.1G 2.5G 4.3G 37% /
/dev/sda1 190M 11M 170M 7% /boot
tmpfs 125M 0 125M 0% /dev/shm
glusterfs 7.1G 2.9G 3.9G 43% /mnt
如果没有如上红色标记的,请查看日志然后进行排查

接下来就是测试阶段
首先在/mnt目录下touch 1空文件
然后在server端ls /home/*查看如下

[root@contos5-1-1 home]# ls *
dir1:
1

dir2:
1

可以看到dir2中已经同步了1这个文件
然后现在我么在server上把dir1这个进程kill掉

2206 ? Ssl 0:00 glusterfsd -f /etc/glusterfs/glusterfs-server1.vol
2396 ? Ssl 0:00 glusterfsd -f /etc/glusterfs/glusterfs-server0.vol
kill -9 2396
这时client端/mnt应该只会挂载dir2了

这是/mnt中的文件是0字节的

[root@contos5-1-4 mnt]# ll
total 0
-rw-r–r– 1 root root 0 Feb 17 12:42 1

现在我们echo “123456789” >1中
cat 1返回如下
[root@contos5-1-4 mnt]# cat 1
123456789

再来看下server上dir1中的1
[root@contos5-1-1 home]# ll /home/dir1
total 8
-rw-r–r– 1 root root 0 Feb 17 12:42 1

可以发现是0字节

dir2中的1
[root@contos5-1-1 home]# ll /home/dir2/
total 8
-rw-r–r– 1 root root 10 Feb 17 12:42 1
可以看到是10字节

如此看来,dir1被我们模拟down机后,修改等请求都已经传送到dir2上了,现在让我们来恢复dir1,看下效果

glusterfsd -f /etc/glusterfs/glusterfs-server0.vol
在client上cat 1的内容
[root@contos5-1-4 mnt]# cat 1
123456789

然后看下server上dir1的情况
[root@contos5-1-1 home]# ll /home/dir1/
total 8
-rw-r–r– 1 root root 10 Feb 17 12:42 1
dir1上已经同步成10字节了

由以上测试可以证明,复制操作是正常进行的,至于性能方面还需要进一步的测试,这个放到稍后进行

开头概念解释属于自己翻译的官方文档

具体请参看 http://www.gluster.org/docs/index.php/User_Guide中的replicate部分