GlusterFS 是一个可扩展的分布式文件系统,可以将多个服务器的磁盘聚合为一个命名空间中统一管理。
相对于其他文件存储方案,优点:
- 可扩展至 PB(PetaBytes) 级别
- 可支持数以千计的客户端
- 兼容 POSIX 系统
- 可使用标准硬件
- 可以使用任何支持扩展属性的 onDisk 文件系统
- 可使用 NFS 和 SMB 等行业标准协议访问
- 支持主从复制、配额、分布式、快照及文件变化检测
- 可优化不同的工作负载
- 完全开源
部署
部署最简易的 Gluster 集群仅需两台机器,官方推荐配置为(2 颗 CPU、4GB 内存、千兆网卡) ,不同发行版的安装方式略有不同,本文以 CentOS 7 x86_64 版本为例。
配置仓库
sudo yum install centos-release-gluster
小贴士:官方仓库默认包含于 Extras 仓库内,默认安装为 LTM 长期维护版。
环境准备
最简集群需要两台机器,本文以三台为例进行搭建(为什么使用三台后面会提到),每台机器包含两块硬盘,一块为系统安装盘,另一块为将来的分布式存储盘。
虽然可以将 Gluster Volume 与 System Volume 合一使用,但是强烈建议不要使用此方案。
节点号 | IP | 主机名 |
---|---|---|
NODE01 | 10.0.0.11 | gluster01 |
NODE02 | 10.0.0.12 | gluster02 |
NODE03 | 10.0.0.13 | gluster03 |
磁盘处理
# ll /dev/sd*
brw-rw---- 1 root disk 8, 0 Nov 22 01:05 /dev/sda
brw-rw---- 1 root disk 8, 1 Nov 22 01:05 /dev/sda1
brw-rw---- 1 root disk 8, 2 Nov 22 01:05 /dev/sda2
brw-rw---- 1 root disk 8, 16 Nov 22 01:05 /dev/sdb
将第二块磁盘建立分区
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x11abb1e2.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
格式化为 XFS 并设置挂载
sudo mkfs.xfs -i size=512 /dev/sdb1
sudo mkdir -p /bricks/brick1
sudo vim /etc/fstab
添加如下一行
/dev/sdb1 /bricks/brick1 xfs defaults 1 2
重新加载分区表并挂载
sudo mount -a && mount
检查分区
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 2.0G 16G 12% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 7.6M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb1 20G 33M 20G 1% /bricks/brick1
小贴士:在 CentOS 6 中格式化或使用 XFS 格式分区需额外安装依赖
sudo yum install xfsprogs
安装服务
sudo yum install -y glusterfs-server
配置服务
配置服务自启动
sudo systemctl enable glusterd
sudo systemctl start glusterd
配置资源池
1). 在节点1上信任节点2与节点3
sudo gluster peer probe gluster02
sudo gluster peer probe gluster03
2). 若添加错误,使用命令删除节点即可
sudo gluster peer detach NODE-NAME
3). 可使用如下命令查看全部已添加节点(看不到自身)
sudo gluster peer status
配置 Volume 卷
在 GlusterFS 中有多种配置卷的模式
- 分布卷(默认)
- 复制卷
- 分布式复制卷
- 条带卷
- 分布式条带卷
类型解释:
「分布卷」说明:文件将会被分配器分配至任一节点中存放。
优点:可以缩放 Volume 卷的大小,且磁盘的大小无需一致。
缺点:无冗余性,任一节点损坏将导致数据丢失,必须依靠底层硬件来提供冗余性如 RAID1。
「复制卷」说明:文件将被存放至每个节点一份,高度冗余性。
优点:高度冗余,任意节点损坏,文件都可从其他节点处获取。
缺点:与 RAID1 一致,空间的利用率低。且每个 Volume 需容量相同。
「分布式复制卷」说明:文件将会被分布式得复制为多份(视 Volume 数量而定),且brick的数量必须是副本数的倍数。且按照相邻的brick的顺序,作为彼此的副本。
优点:兼顾空间与冗余。
缺点:磁盘数量需为副本数的倍数,需要的节点数较多。
「条带卷」说明:考虑将大型文件存储在单brick中,多客户端经常同时访问,将导致单brick上的负载过大,从而降低性能。在条带卷模式中,数据在将其分成不同的“块”后存储在brick中。因此,大文件将被分成较小的块(等于卷中的brick数),每个块存储在一brick中。现在可以分配负载,并且可以更快地获取文件,但不提供数据冗余。
优点:性能极高,对大文件的存储来说极为优秀。
缺点:不提供数据冗余。
「分布式条带卷」说明:与条带卷类似,不同在于条带可以分布在更多数据的brick上,brick的数量必须是条带的倍数。
优点:兼顾性能和分布式
缺点:依然依赖硬件提供数据冗余
注:条带化有个最小限制:128KB。即当文件大小小于这个值时,不进行分隔。其他储存单元中,存在同名文件,但是大小为0。
由以上内容可知,副本数就是文件在逻辑卷中实际存放的数量,只要副本数不为一即可提供数据冗余。砖块数(brick)即为节点数,必须为副本数的整数倍。
创建逻辑卷 Volume 存放路径
sudo mkdir /bricks/brick1/gv0
创建逻辑卷 Volume
sudo gluster volume create gv0 replica 3 gluster{01,02,03}:/bricks/brick1/gv0
启动逻辑卷 Volume
sudo gluster volume start gv0
查看逻辑卷 Volume 状态
sudo gluster volume info
测试服务
sudo mount -t glusterfs gluster03:/gv0 /mnt
for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done
在挂载客户端上检查
ls -lA /mnt | wc -l
每个节点上操作都能看到测试产生的文件。
ls -lA /bricks/brick1/gv0
访问限制
若开启了防火墙,请放行 Gluster 服务(默认监听 TCP/24007),但添加 Volume 时会监听额外的新端口,可使用
sudo gluster volume status
查看全部逻辑卷的状态及监听端口。
架构优化及问题
数据冗余与性能
俗话说鱼和熊掌不可兼得,数据冗余与性能也是相斥的,因此需要找到一个冗余与性能的平衡。
- 在数据重要且不太注重写性能时推荐采用 复制卷 模式。且副本数为 2 即可。
- 若既想追求数据安全又注重性能,推荐采用软硬结合的方式来实现,即在软件层面使用 条带卷 模式,硬件层面使用 RAID 磁盘阵列技术实现冗余,可在最大程度上兼顾性能与冗余。
脑裂问题
Q:在什么场景会出现脑裂的情况呢?
A:比如说目前副本数为 2,分别存放在 Node1 和 Node2 上,写完副本后要通知所有其他的节点写入操作已经完成,其他的节点记录下另外节点副本已经写入完毕,如果这时 Node1 和 Node2 之间的网断了,Node1 就无法通知 Node2,那么 Node2 这边就觉得,我已经写完了,Node1 没给我通信,Node1 有问题;相应地 Node2 也没法给 Node1 报告说我写完了,Node1 也同样认为我写完了而对方有问题,而他们各自连接的客户端连接正常的,都会返回正确的信息给客户端,这样读写看似是正常进行的,但这个文件再次被访问到的时候,Node1 和 Node2 查看日志,都发现自身正常对方有问题,都尝试用自己的内容去恢复对方的内容,这时就出现脑裂了。脑裂的文件访问会出现问题,一般是input/output error这样的问题。
附录
相关链接
参考链接
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2023-12-06 14:33 PM