参考glusterfs分布式文件系统详细原理
参考glusterfs架构和原理
参考GlusterFS 安装及配置
1 分布式存储系统
分布式存储,如谷歌的分布式文件系统GFS、分布式表格系统google Bigtable,亚马逊的对象存储AWS,阿里的TFS等都是很好的代表,同时也催生了一大批优秀的开源分布式存储系统,包括ceph、swift、Lustre和glusterfs等。
分布式存储按其存储接口分为三种:文件存储、块存储和对象存储。
1.1 文件存储
典型设备:FTP、NFS服务器
为了克服块存储文件无法共享的问题,所以有了文件存储。
在服务器上架设FTP与NFS服务,就是文件存储。
通常支持POSIX接口(如glusterfs,但GFS、HDFS是非POSIX接口的),可以像普通文件系统(如ext4)那样访问,但又比普通文件系统多了并行化访问的能力和冗余机制。主要的分布式文件存储系统有TFS、cephfs、glusterfs和HDFS等。主要存储非结构化数据,如普通文件、图片、音视频等。可以采用NFS和CIFS等协议访问,共享方便。NAS是文件存储类型。
可移植操作系统接口(Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称。
EXT4是第四代扩展文件系统(Fourth extended filesystem,缩写为 ext4)是Linux系统下的日志文件系统,是ext3文件系统的后继版本。
(1)TFS
Taobao File System是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用在淘宝各项应用中。
(2)Ceph FS
一个支持POSIX接口的文件系统,它使用 Ceph 存储集群来存储数据。文件系统对于客户端来说可以方便的挂载到本地使用。Ceph FS构建在RADOS之上,继承RADOS的容错性和扩展性,支持冗余副本和数据高可靠性。
(3)NAS/NFS/CIFS
NAS,网络附加存储,中心词“存储”,是的,它是一个存储设备。比如装个openfiler或freenas系统,再加几块硬盘,对外提供NAS功能,那么这个openfiler或freenas服务器就变成了很简单的“NAS设备”。当然,如果是对于小公司来说,一个openfiler做NAS设备足够了。
网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
CIFS (Common Internet File System)通用Internet文件系统,是微软提出的,全称叫通用internet文件共享,它是一种协议。NFS,网络文件共享,也是一种协议。那两者之间有什么区别呢?一句话,CIFS用于UNIX和windows间共享,而NFS用于UNIX和UNIX之间共享。
所以,NAS是一个设备,一个功能。而CIFS/NFS是一种协议。可以在NAS上启用CIFS/NFS协议,这样,用户就能使用CIFS/NFS协议进行访问了。
1.2 块存储
这种接口通常以QEMU Driver或者Kernel Module的方式存在,主要通过qemu或iscsi协议访问。主要的块存储系统有ceph块存储、sheepdog等。主要用来存储结构化数据,如数据库数据。数据共享不方便。DAS和SAN都是块存储类型。
1.3 对象存储
对象存储系统综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的数据共享等优势。以对象作为基本的存储单元,向外提供RESTful数据读写接口,常以网络服务的形式提供数据访问。主要的对象存储系统有AWS、swift和ceph对象存储。主要用来存储非结构化数据。
1.4 glusterfs术语
(1)GlusterFS是一个开源的分布式文件系统。
(2)Brick:GFS中的存储单元,通常是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’。
(3)Client: 挂载了GFS卷的设备。
(4)FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
(5)GFID:GFS卷中的每个文件或目录都有一个唯一的128位的数据相关联,其用于模拟inode。
(6)Node:一个拥有若干brick的设备。
(7)Volume:一组bricks的逻辑集合。
2 安装Gluster Fs
参考CentOS7 安装GlusterFS
参考GlusterFS官方安装文档
参考GlusterFS 配置及使用
但是NFS以及后边会说到MooseFS都会存在单点故障,为了解决这个问题一般情况下都会结合DRBD进行块儿复制。但是glusterfs就完全不用考虑这个问题了,因为它是一个完全的无中心的系统。
主机两台,两台主机网络互通
10.23.241.202 pda1
10.23.241.224 pda2
至少有两个虚拟磁盘,一个用于OS安装,另一个用于服务GlusterFS存储(sdb)
2.1 安装glusterfs
(1)配置glusterfs 的本地 yum源
#vi /etc/yum.repos.d/gluster-epel.repo
[gluster]
name=gluster
baseurl=https://buildlogs.centos.org/centos/7/storage/x86_64/gluster-3.8/
gpgcheck=0
enabled=1
其中网址https://buildlogs.centos.org/centos/7/storage/x86_64/。
(2)启动gluster服务
yum install glusterfs-server
systemctl start glusterd.service
systemctl enable glusterd.service
glusterfs --version查看版本【3.8.15】
(3)在pda1上执行如下将pda2加入集群
在pda1上查看集群状态
在pda2上查看集群状态
2.2 virtualBox新增虚拟硬盘
pda1和pda2两台机器中均操作。每台主机添加一块虚拟硬盘,各8G。
虚拟机关机状态。
(1)在Virtualbox中选中要添加虚拟硬盘的虚机,点设置 -> 存储 -> SATA控制器->右击,选择“添加虚拟硬盘”。然后,根据需求创建合适的硬盘。
分配大小
配置完成以后
(2)系统中查看新增的磁盘
2.3 格式化分配空间
卷组(Volume Group)将多个物理卷组织成一个整体,屏蔽了底层物理卷细节。在卷组上创建逻辑卷时不用考虑具体的物理卷信息。
例如
使用vgcreate指令创建卷组 "vg1000",并且将物理卷"/dev/sdb1"和"/dev/sdb2"添加到卷组中。在命令行中输入下面的命令:
#vgcreate vg1000 /dev/sdb1 /dev/sdb2
#创建卷组"vg1000"
lvcreate命令用于创建LVM的逻辑卷。逻辑卷是创建在卷组之上的。逻辑卷对应的设备文件保存在卷组目录下,例如:在卷组"vg1000"上创建一个逻辑卷"lvol0",则此逻辑卷对应的设备文件为"/dev/vg1000/lvol0"。
例如
基于卷组vg_1,创建一个指定大小2G的lv,并指定名字为lv_2
lvcreate -L 2G -n lv_2 vg_1
由于/dev/sdb是8G的,所以我申请6G,每个节点都要执行。
#vgcreate myvg /dev/sdb
#lvcreate -L 6G -n mylv myvg
#mkfs.ext4 /dev/myvg/mylv
#mkdir -p /data_gluster
#echo “/dev/mapper/myvg-mylv /data_gluster ext4 defaults 0 0” >> /etc/fstab
#mount -a
2.4 创建和启动卷
(1)创建卷
在pda1上创建卷,卷名称是db_volume。
#gluster volume create db_volume replica 2 pda1:/data_gluster/db pda2:/data_gluster/db force
注意不一定要选裸磁盘作为存储数据的目录。
比如Linux上有/opt/data目录,且该目录有足够的存储,可以直接#gluster volume create db_volume replica 2 pda1:/opt/data/db pda2:/opt/data/db force
(2)启动卷
#高版本中使用下面的命令
gluster volume start db_volume
2.5 使用卷
虽然激活了卷,但是还不能直接使用,要将其挂载出来,将卷db_volume挂载到/mnt/gluster/db目录下,我们只能往/mnt/gluster/db里面写数据,不能直接操作/data_gluster,这个步骤在pda1上执行。后面不想挂载/mnt/gluster/db时可以用"umount -l /mnt/gluster/db"。
mkdir -p /mnt/gluster/db
mount -t glusterfs pda1:/db_volume /mnt/gluster/db
往pda1的目录/mnt/gluster/db中写入数据文件后,会在pda1和pda2的目录/data_gluster/db/下都发现新增数据文件的存在。
3 cluster管理
在创建volume之前需要先将一组存储设备组成一个存储池,通过存储设备提供的bricks来组成卷。
在设备上启动glusterd之后,可通过设备的主机名或IP地址,将设备加到存储池中。
$gluster peer probe host|ip
$gluster peer status #查看除本机外的其他设备状态
$gluster peer detach host|ip #如果希望将某设备从存储池中删除
gluster对于每个节点都会生成一个UUID来标识,因此如果节点的IP或主机名发生了变化,只需要重新执行peer probe即可。不过如果一个主机名曾经用过,想再改回去,则gluster会提示已经保存过。此时只能把节点detach掉,然后重新probe。
4 Volume管理
数据的传输协议支持tcp和infiniband rdma协议。
4.1 卷的类型
(1)distributed volume分布卷
分布卷可以将某个文件随机的存储在卷内的一个brick内,通常用于扩展存储能力,不支持数据的冗余。除非底层的brick使用RAID等外部的冗余措施。
gluster volume create mamm-volume node1:/media node2:/media node3:/media
(2)replicated volume复本卷
复本卷在创建时可指定复本的数量,复本在存储时会在卷的不同brick上,因此有几个复本就必须提供至少几个brick。
gluster volume create mamm-volume repl 2 node1:/media node2:/media
注意:在创建复本卷时,brick数量与复本个数必须相等,否则将会报错。另外如果同一个节点提供了多个brick,也可以在同一个结点上创建复本卷,但这并不安全,因为一台设备挂掉,其上面的所有brick就无法访问了。
(3)striped volume切片卷
分片卷将单个文件分成小块(块大小支持配置,默认为128K),然后将小块存储在不同的brick上,以提升文件的访问性能。
gluster volume create mamm-volume stripe 2 node1:/media node2:/media
stripe后的参数指明切片的分布位置个数
注意:brick的个数必须等于分布位置的个数
(4)distribute replication volume分布复本卷
此类型卷是基本复本卷的扩展,可以指定若干brick组成一个复本卷,另外若干brick组成另个复本卷。单个文件在复本卷内数据保持复制,不同文件在不同复本卷之间进行分布。
gluster volume create dr-volume repl 2 node1:/exp1 node2:/exp2 node3:/exp3 node4:/exp4
注意:复本卷的组成依赖于指定brick的顺序。
brick必须为复本数K的N倍,brick列表将以K个为一组,形成N个复本卷。
(5)distribute striped volume分布切片卷
类似于分布式复本卷,若创建的卷的节点提供的bricks个数为stripe个数N倍时,将创建此类型的卷。
gluster volume create ds-volume stripe 2 node1:/exp1 node1:/exp2 node2:/exp3 node2:/exp4
注意:
切片卷的组成依赖于指定brick的顺序。
brick必须为复本数K的N倍,brick列表将以K个为一组,形成N个切片卷。
(6)striped replicated volume切片复本卷
数据将进行切片,切片在复本卷内进行复制,在不同卷间进行分布。
gluster volume create test-volume stripe 2 replica 2 server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
exp1和exp2组成复本卷,exp3和exp4组成复本卷,两个复本卷组成分片卷。
注意:brick数量必须和stripe个数N和repl参数M的积N*M相等。即对于brick列表,将以M为一组,形成N个切片卷。数据切片分布在N个切片卷上,在每个切片卷内部,切片数据复本M份。
4.2 启/停/删除卷
$gluster volume start mamm-volume
$gluster volume stop mamm-volume
$gluster volume delete mamm-volume