阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

GlusterFS 分布式存储部署使用

179次阅读
没有评论

共计 8505 个字符,预计需要花费 22 分钟才能阅读完成。

GlusterFS 是一款非常易于使用的分布式文件存储系统,实现了全部标准 POSIX 接口,并用 fuse 实现虚拟化,让用户看起来就像是本地磁盘一样。因此程序想从本地磁盘切换到 GlusterFS 时是不用修改任何代码的,做到了无缝切换。并且让多台电脑的程序看起来在使用同一块硬盘,简化了很多逻辑。如果您的应用单机磁盘不够放时,不妨考虑下 GlusterFS。

一、GlusterFS 源码安装

1. glusterfs 依赖安装

a. CentOS 下 yum 安装

yum install -y flex bison openssl-devel libacl-devel sqlite-devel libxml2-devel libtool automake autoconf gcc attr

liburcu-bp 需源码安装,yum 源里面没有

先执行常规命令安装,进入源码目录后

./bootstrap

./configure

make

sudo make install

执行完常规安装命令后需要执行下面两个命令,才可以让系统找到 urcu.

sudo ldconfig

sudo pkg-config –libs –cflags liburcu-bp liburcu

b. Ubuntu 下 apt-get 安装

sudo apt-get install flex bison libssl-dev libacl1-dev  libsqlite3-dev libxml2-dev liburcu-dev automake autoconf gcc attr

d. 可选安装

此外如果要 geo 复制功能,需要额外安装,并开启 ssh 服务:

yum install -y passwd openssh-client openssh-server

e. docker 下安装额外操作

如果机器只有一台,又想测试集群,可以考虑用 docker,然而 docker 对应用有些功能限制,所以不能直接使用,需要多操作一些。

①需要安装 attr

yum install attr -y

②没有 fuse 的时候需要手动建一个

mknod /dev/fuse c 10 229

③运行容器的时候需要提升权限

docker run –privileged=true

例如:

sudo docker run –privileged=true -it -h glfs0 -v /dk/d0:/d –name=glfs0  gfs7:2  /bin/bash

sudo docker run –privileged=true -it –rm -v /dk/rm0:/d gfs7:2 /bin/bash

④. 需要加载一个本地卷,将数据文件放在本地卷的目录中,否则磁盘的额外属性不能使用。

2. glusterfs 编译安装

安装完以上依赖后,我们从官网 http://www.gluster.org/download/ 下载源码,再编译 glusterfs,gluserfs 编译命令为常规命令,配置时加上 –enable-debug 表示编译为带 debug 信息的调试版本

./configure –prefix=/usr

make

sudo make install

二、GlusterFS 服务启停

glusterfs 的大部分命令都需要在 root 权限下运行,没有 root 权限会出现各种错误,因此我这里的命令前面都加了 sudo,如果您直接用 root 登录,需免去 sudo。

1. 启动命令

sudo service glusterd start

sudo /etc/init.d/glusterd start

sudo glusterd

2. 停止命令

sudo service glusterd stop

sudo /etc/init.d/glusterd stop

ps aux|grep glusterd

sudo kill xxxxxx-pid

或 ubuntu 下

sudo killall glusterd

直接 kill 需要先停止各 volume 才比较安全。

三、集群关联

1. 准备机器(或虚拟机、docker)若干台,我这里启动了 4 个 docker,IP 为 172.17.0.2 ~ 172.17.0.5

2. 在每台机器上启动 glusterFS 服务,如上一节。

3. 得到每一台机器的 ip 或 hostname

4. 在第一台机器 (172.17.0.2) 上执行关联命令,

sudo gluster peer probe 172.17.0.3

sudo gluster peer probe 172.17.0.4

sudo gluster peer probe 172.17.0.5

……

这样所有机器已经连在一起,注意该命令的意思相当于集群邀请某人加入自己的组织。

四、卷 /volume 操作

1.创建 volume

a. 单磁盘,调试环境推荐

sudo gluster volume create vol_name 172.17.0.2:/d/disk0

b. 多磁盘,无 raid,试验、测试环境推荐。

sudo gluster volume create vol_name 172.17.0.2:/d/disk0 172.17.0.3:/d/disk0 172.17.0.4:/d/disk0 172.17.0.5:/d/disk0

c. 多磁盘,有 raid1。线上高并发环境推荐。

sudo gluster volume create vol_name replica 2 172.17.0.2:/d/disk0 172.17.0.3:/d/disk0 172.17.0.4:/d/disk0 172.17.0.5:/d/disk0

注意:以上命令中,磁盘数量必须为复制份数的整数倍。

此外有 raid0,raid10,raid5,raid6 等方法,但是在线上小文件集群不推荐使用。

2.启动 volume

刚创建好的 volume 还没有运行,需要执行运行命令方可使用。

sudo gluster volume start vol_name

3.挂载 volume

sudo mkdir /local_mount_dir

sudo mount -t glusterfs -o acl 172.17.0.2:/vol_name /local_mount_dir

4.使用 GlusterFS

a. 挂载了 GlusterFS 的某个卷后,就可以将其当做本地文件访问,代码中只需使用原生的文件 api 即可。这种方式使用不一定需要 root 权限,只要拥有对应目录或文件的权限即可。

b. 直接 API 方式,这种方式需要 root 权限才能使用,并且 Java、Python、ruby 的 api 包装目前都不够完整,一般情况不推荐使用。

5.卸载 volume

卸载与挂载操作是一对。虽然没有卸载也可以停止 volume,但是这样做是会出问题,如果集群较大,可能导致后面 volume 启动失败。

sudo umount /local_mount_dir

6.停止 volume

停止与启动操作是一对。停止前最好先卸载所有客户端。

sudo gluster volume stop vol_name

7.删除 volume

删除与创建操作是一对。删除前需要先停止 volume。在生产上一般不会删除 volume

sudo gluster volume delete vol_name

8.在线修复

当某块磁盘损坏后,需要换一块新的磁盘回去,这时集群中恰好还预留了备用磁盘,因此用备用磁盘替换损坏的磁盘,命令如下两条命令

sudo gluster volume replace-brick vol_name 172.17.0.3:/d/damaged_disk 172.17.0.16:/d/new_disk commit

sudo gluster volume heal vol_name full

9.在线扩容

随着业务的增长,集群容量不够时,需要添加更多的机器和磁盘到集群中来。

a. 普通情况只需要增加分布的广度就可以,增加的磁盘数量必须为最小扩容单元的整数倍,即 replica×stripe,或 disperse 数的整数倍:

sudo gluster volume add-brick vol_name 172.17.0.11:/d/disk0 172.17.0.12:/d/disk0  172.17.0.13:/d/disk0  172.17.0.14:/d/disk0

该方法执行完后,需要新增的磁盘可能还没有被实际使用,这时需要平衡数据:

sudo gluster volume rebalance vol_name start

b. 当集群达到一定规模,希望增加备份数时,增加的磁盘数量必须为原分布数量的整数倍。gluster volume info 中看到的第一个值,这时需要增加一个参数让系统知道是修改了数据的备份数。假设原先的 replica 是 2,想要改为 3,命令如下:

sudo gluster volume add-brick vol_name replica 3 172.17.0.11:/d/disk0 172.17.0.12:/d/disk0  172.17.0.13:/d/disk0  172.17.0.14:/d/disk0

执行完 add-brick 命令后,新增的磁盘还没有被实际使用,且系统不会自动复制,这时需要修复数据,让系统达到新指定的备份数

sudo gluster volume heal vol_name full

注意:一次只增加一个备份,如果一次增加多个备份,目前版本可能出错。

10.在线收缩

可能原先配置比例不合理,打算将部分存储机器用于其他用途时,跟扩容一样,也分两种情况。

a. 降低分布广度,移除的磁盘必须是一整个或多个存储单元,在 volume info 的结果列表中是连续的多块磁盘。该命令会自动均衡数据。

sudo gluster volume remove-brick vol_name 172.17.0.11:/d/disk0 172.17.0.12:/d/disk0  172.17.0.13:/d/disk0  172.17.0.14:/d/disk0 start

启动后需要查看删除的状态,实际是自动均衡的状态,直到状态从 in progress 变为 completed。

sudo gluster volume remove-brick vol_name 172.17.0.11:/d/disk0 172.17.0.12:/d/disk0  172.17.0.13:/d/disk0  172.17.0.14:/d/disk0 status

状态显示执行完成后,提交该移除操作。

sudo gluster volume remove-brick vol_name commit

b. 降低备份数,移除磁盘必须是符合要求(好难表达)。在 volume info 的结果列表中一般是零散的多块磁盘(ip 可能是连续的)。该命令不需要均衡数据。

sudo gluster volume remove-brick vol_name replica 2 172.17.0.11:/d/disk0 172.17.0.12:/d/disk0  172.17.0.13:/d/disk0  172.17.0.14:/d/disk0 force

降低备份数时,只是简单删除,而且命令最后用的也是 force 参数,如果原先系统数据没有复制好,那么也就会出现部分丢失。因此该操作需要极其谨慎。必须先保证数据完整,执行 sudo gluster volume heal vol_name full 命令修复,并执行 sudo gluster volume heal vol_name info,和 sudo gluster volume status 检查,确保数据正常情况下再进行。

11.配额设定

a. 一个 volume 经常会让多个系统去同时使用,这时为了方便管理,可以为一级或二级目录加上磁盘配额,避免因某个系统的过量使用,而影响其他系统的正常使用。

sudo gluster volume quota vol_name enable

sudo gluster volume quota vol_name limit-usage /srv_a 10GB

sudo gluster volume quota vol_name limit-usage /srv_b 200MB

b. 查看当前配额使用量,会以相当直观的列表展示。

sudo gluster volume quota vol_name list

c. 去掉某个目录的配额,

sudo gluster volume quota vol_name remove /srv_a

d. 停止配额,该方法慎用,否则会全部清除,往往不是自己想要的结果,因为重新 enable 后,原先设定的配额都已消失。当然,如果打算重新配置所有目录时则比较合适。

sudo gluster volume quota vol_name disable

e. 如果系统不打算将所有磁盘都用于 GlusterFS,那么可以在根目录上设置配额。考虑到 glusterFS 不能充分利用所有的磁盘空间,因此最好将大小设置的比实际空间稍小。

sudo gluster volume quota vol_name limit-usage / 100TB

f. 并且想将这个配额当做磁盘的大小使用,需要执行如下命令,这样 df 时显示的磁盘大小就是配额了。配额使用的是 1024 进制的,而非磁盘的 1000 进制。当配额量超过磁盘量时,df 也会显示配额量,因此一定不能这样设置。

gluster volume set vol_name quota-deem-statfs on

以上配额是针对磁盘使用量,另外 glusterFS 提供文件数量的配额,limit-objects,list-object。可以根据场景使用。

磁盘配额功能 gluster volume quota 目录容量达到目标大小时,不是马上生效,而是有一定的时间窗口,(若干秒),在这个时间内,数据还可以写入。这样的特性在配额比较大的时候并不影响,一般不会在短时间内超过太多。

12.raid 选型

raid1:适合线上中小文件场景,创建命令如前文。

单磁盘,无 raid,raid0 三种方式只适合于实验环境,允许数据的丢失,一旦数据丢失,基本上需要从头来过。

raid0:适合大文件实验环境。

sudo gluster volume create vol_name stripe 3 172.17.0.2:/d/disk0 172.17.0.3:/d/disk0 172.17.0.4:/d/disk0 172.17.0.5:/d/disk0 172.17.0.6:/d/disk0 172.17.0.7:/d/disk0

raid10:适合大文件场景。

sudo gluster volume create vol_name replica 2 stripe 3 172.17.0.2:/d/disk0 172.17.0.3:/d/disk0 172.17.0.4:/d/disk0 172.17.0.5:/d/disk0 172.17.0.6:/d/disk0 172.17.0.7:/d/disk0

raid5,raid6 等,一般不适合线上环境,但适合 geo 备份环境,因为是用软件的方式实现 raid5 等功能,因此 cpu 开销较大,而且一旦有磁盘损坏,计算的 cpu 开销更加大,如果在压力较大的线上环境跑,容易造成较大延迟。如果线上的读写压力很小,也可以考虑使用。

raid5:不很推荐,因为不够平衡,容错性太低,而且开销比较大。

sudo gluster volume create vol_name disperse 6 redundancy 1 172.17.0.2:/d/disk0 172.17.0.3:/d/disk0 172.17.0.4:/d/disk0 172.17.0.5:/d/disk0 172.17.0.6:/d/disk0 172.17.0.7:/d/disk0

raid6:可以使用,比 raid5 平衡,容错性比 raid5 高很多,开销只是稍大。

sudo gluster volume create vol_name disperse 7 redundancy 2 172.17.0.2:/d/disk0 172.17.0.3:/d/disk0 172.17.0.4:/d/disk0 172.17.0.5:/d/disk0 172.17.0.6:/d/disk0 172.17.0.7:/d/disk0 172.17.0.8:/d/disk0

更为安全的离线 geo 备份集群 raid 推荐:(最大可以允许一半的磁盘损坏,具有极高容错性,数据可用性可达 10 个 9)

sudo gluster volume create vol_name disperse 10 redundancy 5 172.17.0.2:/d/disk0 172.17.0.3:/d/disk0 172.17.0.4:/d/disk0 172.17.0.5:/d/disk0 172.17.0.6:/d/disk0 172.17.0.7:/d/disk0 172.17.0.8:/d/disk0 172.17.0.9:/d/disk0 172.17.0.10:/d/disk0 172.17.0.11:/d/disk0

五、系统特性

1.cache、数据一致性

客户端带有 cache,但是该 cache 并不具备数据一致性,cache 的更新是定时更新,默认间隔 1 秒,也就是说,某个客户端修改或删除一个文件后,需要 1 秒钟以后,整个集群才能全部感知到,这一秒钟内会存在数据的不一致。因此 GlusterFS 不适用于数据一致性要求强的数据。对于图片、语音等文件,在应用中做限定,不修改图片,只增加图片,这样数据的一致性问题就不会出现。

客户端的 cache 会带来性能的提升,因此当集群有一定规模时,合理的规划客户端访问的文件也是有必要的,能够增强 cache 的利用率。

2.用户、权限

GlusterFS 所用的用户是 linux 自身的用户,linux 用户有两个属性,一个是用户名,一个是用户号,linux 在文件系统总标识一个文件的权限是用用户号的,而这个用户号可以在 GlusterFS 之间传递。比如某用户名 user1,用户号 1001,user1 用户创建了文件 A,权限是 0600。

这时另外一台电脑,有用户名 user1,用户号 1002,这时该用户不能访问 A 文件。

但是该电脑有一个用户 user3,用户号是 1001,该用户号与前面的 user1 用户号相同,可以访问 A 文件。

为了让用户名和用户号不冲突,在创建系统用户时,指定一个用户号,并且是不容易被系统自动分配到的区间,这样在集群之间能使用一致的用户权限。

六、集群规模

客户端或 mount 进程会跟所有 brick 连接,并且端口是小于 1024 的,因此 brick 数量一定不能超过 1024,

在 replica 模式下,每个服务器有个 glusterfs 进程会以客户端形式连接每个 brick,如果再在这些服务器上要进行 mount,那么最大 brick 数小于 500.

由于端口是使用有限的小于 1024 的端口,因此要注意保留部分常用的端口,如 21,22,80,443 端口。避免由于端口被占用导致重要服务无法启动。

修改 /etc/sysctl.conf 文件,添加一行,具体端口更据需要设定。

net.ipv4.ip_local_reserved_ports=0-25,80,443

然后执行 sysctl 命令使其生效:

sudo sysctl -p

线上集群,不同规模下,集群配置如下表。假设表中的每台机器拥有 12 块磁盘,平均可用于存储的磁盘 10 块。另外 2 块用于安装系统、记录日志、备用等功能。

GlusterFS 分布式存储部署使用

系统根据不同时期,不断进行扩容,最大规模可达 500 台。

系统需要准备一定的备用磁盘或备用机器,以备磁盘或机器损坏时可以及时修复数据。当规模在 2 -15 台时,准备 1 - 3 块磁盘作为备用;当规模在 15-500 台时,准备 1 - 3 台电脑作为备用。

系统集群较大时,要保证让数据的多个备份在不同的机器上,这样才可以在系统的某台机器宕机的情况,整个系统还是处于可用状态。

CentOS 7 搭建 GlusterFS  http://www.linuxidc.com/Linux/2015-10/124331.htm

使用 GlusterFS 作为 KVM 后端存储 http://www.linuxidc.com/Linux/2013-08/89108.htm

分布式存储系统 GlusterFS 初体验 http://www.linuxidc.com/Linux/2013-08/89107.htm

GlusterFS 全局统一命名空间 http://www.linuxidc.com/Linux/2013-08/89106.htm

设计新 Xlator 扩展 GlusterFS http://www.linuxidc.com/Linux/2013-08/89105.htm

GlusterFS Rebalance 简析 http://www.linuxidc.com/Linux/2013-08/89104.htm

CentOS 6.0-x86_64 下体验 Glusterfs  http://www.linuxidc.com/Linux/2015-01/111211.htm

GlusterFS 的详细介绍:请点这里
GlusterFS 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-11/125106.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计8505字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中