gluster分布式存储 入门篇

简介

GlusterFS是一个可伸缩的分布式文件系统,适用于云存储和媒体流等数据密集型任务。实现了全部标准POSIX接口,并用fuse实现虚拟化,让用户看起来就像是本地磁盘一样。能够处理千数量级的客户端。

特征:

  • 容量可以按比例的扩展,且性能却不会因此而降低。
  • 廉价且使用简单,完全抽象在已有的文件系统之上。
  • 扩展和容错设计的比较合理,复杂度较低
  • 适应性强,部署方便,对环境依赖低,使用,调试和维护便利

安装

在生产中,网络要求全部千兆环境,gluster 服务器至少有 2 块网卡,1 块网卡绑定供 gluster 使用,剩余一块分配管理网络 IP,用于系统管理。如果有条件购买万兆交换机,服务器配置万兆网卡,存储性能会更好。网络方面如果安全性要求较高,可以多网卡绑定。

【注意】GlusterFS将动态生成的配置文件存储在/var/lib/glusterd,如果GlusterFs无法写入此文件,会导致集群不稳定,或者脱机。建议为创建单独的分区,以减少发生这种情况的机会。

  • 每个主机至少有两个磁盘,一个用于安装操作系统,一个用于GlusterFS存储。
  • 设置NTP,确保集群时间统一。

系统环境

IP 主机名
192.168.229.130 server1
192.168.229.131 server2
192.168.229.132 server3
  1. 时间同步
[root@server1 ~]# ntpdate 0.asia.pool.ntp.org
  1. 配置各主机可通过主机名解析IP地址 [略]

  2. 格式化磁盘

三个节点都要执行此操作

[root@server1 ~]# mkfs.xfs -i size=512 /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=1310656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@server1 ~]# mkdir -p /data/brick1

[root@server1 ~]# echo '/dev/sdb1 /data/brick1 xfs defaults 1 2' >> /etc/fstab

[root@server1 ~]# mount -a && mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=1005092k,nr_inodes=251273,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=33,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=203216k,mode=700)
/dev/sdb1 on /data/brick1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
[root@server1 ~]# 

可以看到 /dev/sdb1 已经挂在到 /data/brick1

安装GlusterFS

安装glusterfsyum仓库
yum install centos-release-gluster41.noarch

    [root@server3 ~]# cat /etc/yum.repos.d/CentOS-Gluster-4.1.repo 
    # CentOS-Gluster-4.1.repo
    #
    # Please see http://wiki.centos.org/SpecialInterestGroup/Storage for more
    # information
    
    [centos-gluster41]
    name=CentOS-$releasever - Gluster 4.1 (Long Term Maintanance)
    baseurl=http://mirror.centos.org/$contentdir/$releasever/storage/$basearch/gluster-4.1/
    gpgcheck=1
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage
    
    [centos-gluster41-test]
    name=CentOS-$releasever - Gluster 4.1 Testing (Long Term Maintenance)
    baseurl=http://buildlogs.centos.org/centos/$releasever/storage/$basearch/gluster-4.1/
    gpgcheck=0
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage


安装软件
yum install glusterfs-server

启动glusterfs
[root@server1 ~]# systemctl start glusterd.service
[root@server1 ~]# systemctl status glusterd.service
● glusterd.service - GlusterFS, a clustered file-system server
   Loaded: loaded (/usr/lib/systemd/system/glusterd.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-06-10 11:23:13 EDT; 7s ago
  Process: 4506 ExecStart=/usr/sbin/glusterd -p /var/run/glusterd.pid --log-level $LOG_LEVEL $GLUSTERD_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 4507 (glusterd)
   CGroup: /system.slice/glusterd.service
           └─4507 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

Jun 10 11:23:13 server1 systemd[1]: Starting GlusterFS, a clustered file-system server...
Jun 10 11:23:13 server1 systemd[1]: Started GlusterFS, a clustered file-system server.
[root@server1 ~]# 

glusterd服务充当Gluster弹性卷管理器,监视glusterfs进程,并协调动态卷操作,例如跨多个存储服务器添加和删除卷。

将存储主机加入受信任主机池

在任意开启glusterd服务的主机上,将其他主机加入到受信任主机池

[root@server1 ~]# gluster peer probe server2
peer probe: success. 
[root@server1 ~]# gluster peer probe server3
peer probe: success. 
[root@server1 ~]# 

查看主机池中主机状态

[root@server1 ~]# gluster peer status
Number of Peers: 2

Hostname: server2
Uuid: b1d87a2d-83bb-4412-9d21-c22007ce2c33
State: Accepted peer request (Connected)

Hostname: server3
Uuid: 033444d4-886d-4a18-a051-3c537b9d75f5
State: Accepted peer request (Connected)
[root@server1 ~]# 

【注意】 一旦主机池建立,只能由主机池中的主机添加新的主机,不能由新主机探测已经存再的主机池

设置一个GlusterFS卷

  1. 在所有的节点上执行
mkdir /data/brick1/gv1
  1. 在任一台服务器上执行
gluster volume create gv1 replica 3 server1:/data/brick1/gv1 server2:/data/brick1/gv1 server3:/data/brick1/gv1
gluster volume start gv1
  1. 确认volume启动成功
[root@server1 brick1]# gluster volume info
 
Volume Name: gv1
Type: Replicate
Volume ID: 5bfedb9a-b5df-4564-bbdc-20f57ad2f260
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: server1:/data/brick1/gv1
Brick2: server2:/data/brick1/gv1
Brick3: server3:/data/brick1/gv1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

测试GlusterFS 卷

在其中一台服务器挂载卷。通常,是从外部机器(称为“客户机”)执行此操作。
由于使用这种方法将需要在客户机上安装额外的包,所以此处将使用其中一个服务器作测试。

mount -t glusterfs server1:/gv1 /mnt
for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done

查看客户端挂载点

[root@server1 brick1]# ls -lA /mnt/copy* | wc -l
100

查看每个server的 GlusterFS 挂载点

[root@server1 brick1]# ls -lA /data/brick1/gv1/copy*

正常应该可以在每个server上看到100个文件

GlusterFS卷

分布式卷

这是默认的glusterfs卷i。如果没有指定卷的类型,则在创建卷时,默认选项是创建分布式卷。在这里,文件分布在卷中的各个bricks上。因此,file1可以只存储在brick1或brick2中,但不能同时存储在这两个文件中。因此没有数据冗余。这样一个存储卷的目的是方便和廉价地扩展卷大小。然而,这也意味着砖块故障将导致数据完全丢失,必须依赖底层硬件来保护数据丢失。

创建一个三节点的分布式卷

[root@server1 brick1]# mkdir /data/brick1/exp2
[root@server1 brick1]# gluster volume create test-volume server1:/data/brick1/exp2 server2:/data/brick1/exp2 server3:/data/brick1/exp2
volume create: test-volume: success: please start the volume to access data

查看volume信息

[root@server1 brick1]# gluster volume info
Volume Name: test-volume
Type: Distribute
Volume ID: 6ca102ae-9de8-4b74-a203-d008575a3e16
Status: Created
Snapshot Count: 0
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: server1:/data/brick1/exp2
Brick2: server2:/data/brick1/exp2
Brick3: server3:/data/brick1/exp2
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

复制式卷

Replicated: 复制式卷,类似 RAID 1

在复制卷中,解决了分布式卷中面临的数据丢失问题。在创建卷时,replica 数必须等于 volume 中 brick 所包含的存储服务器数,可用性高,这种卷的一个主要优点是,即使一个块失败,仍然可以从它的复制块访问数据。这样的卷用于更好的可靠性和数据冗余。

创建具有两个server的复制卷

[root@server1 brick1]# gluster volume create test-volume3 replica 2 transport tcp server1:/data/brick1/test1/ server2:/data/brick1/test1/
Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/.
Do you still want to continue?
 (y/n) y
volume create: test-volume3: success: please start the volume to access data

纠错卷

Dispersed Volume基于ErasureCodes(纠错码)提供了对磁盘或服务器故障的空间有效保护。它将原始文件的编码片段存储到每个块中,以一种只需要片段子集就可以恢复原始文件的方式存储。在不丢失对数据访问的情况下,可以丢失的块的数量由管理员在卷创建时配置。
类似于RAID5/6。通过配置Redundancy(冗余)级别提高可靠性,在保证较高的可靠性同时,可以提升物理存储空间的利用率。

分布式纠错卷

分布式复制卷

Distributed Replicated: 分布式的复制卷,最少需要4台服务器才能创建。 brick 所包含的存储服务器数必须是 replica 的倍数,兼顾分布式和复制式的功能。

指定brick的顺序也很重要,因为相邻的砖块会成为彼此的复制品。当由于冗余和可伸缩存储而需要高可用性数据时,使用这种类型的卷。所以如果有8个brick和2个replica,那么前两个brick就会变成彼此的复制品,然后是下两个brick,以此类推。

创建volume 时 replica 2 server = 4 个节点

创建一个有两个replica的分布式复制卷

# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
Creation of test-volume has been successful
Please start the volume to access data

FUSE

GlusterFS是一个用户空间文件系统,它利用FUSE(用户空间中的文件系统)与内核VFS交互。长期以来,用户空间文件系统的实现被认为是不可能的。FUSE就是为解决这个问题而开发的。FUSE是一个内核模块,它支持内核VFS和非特权用户应用程序之间的交互,并且它有一个可以从用户空间访问的API。使用这个API,几乎可以使用您喜欢的任何语言编写任何类型的文件系统,因为FUSE和其他语言之间有许多绑定。

这显示了一个文件系统“hello world”,它被编译为一个二进制“hello”。
它使用文件系统挂载点/tmp/fuse执行。然后用户在挂载点/tmp/fuse上发出ls -l命令。这个命令通过glibc到达VFS,由于mount /tmp/fuse对应于基于fuse的文件系统,所以VFS将其传递给fuse模块。FUSE内核模块在用户空间(libfuse)中通过glibc和FUSE库之后,将与实际的文件系统二进制文件“hello”进行联系。结果由“hello”通过相同的路径返回,并到达ls -l命令。
FUSE内核模块与FUSE库(libfuse)之间的通信是通过一个特殊的文件描述符进行的,该文件描述符是通过打开/dev/fuse. .获得的这个文件可以打开多次,获得的文件描述符被传递到挂载的syscall,以便将描述符与挂载的文件系统匹配起来。


Translators(未完成)

Translating “translators”:
translator将用户请求转换为存储请求

1对1,1对多,1对零(例如缓存)

https://www.cnblogs.com/myvic/p/6816924.html
https://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/
https://docs.gluster.org/en/latest/Quick-Start-Guide/Architecture/

posted @ 2019-06-12 23:10  漂泊的蒲公英  阅读(4413)  评论(0编辑  收藏  举报