what is glusterfs

glusterfs 是一个分布式文件存储系统,可以将多台机器的存储资源整合在一起,抽象成新的逻辑存储卷供用户使用。

下图是glusterfs的形象化描述:

image-20220718161932423

如图,glusterfs不存在“中心节点”或者“master节点”的概念,而是所有参与构成的节点共同构成一个storage pool。其中,不同的节点上可以建立若干个brick,然后brick组合,构成volume。构成一个逻辑卷volume的brick可以有不同的协作方式,最典型的有replicated和distributed。replicated的volume的brick之间互为备份,因此具有高可用性(HA high accessablility),不会因为某一节点挂掉而影响资源访问。distributed模式中,volume的brick之间互相扩展,所有brick组合,容量比单个节点更大,而且可以非常方便地加入新节点拓展(scaling)容量。

以上是gluster-server完成的工作,构建起分布式文件系统。访问这个分布式文件系统需要配合glusterfs-client。通过glusterfs-client可以直接将gluster上的volume挂载到本地进行使用,非常便利。

glusterfs的安装

ubuntu

apt install glusterfs-server

附带glusterfs-client一同安装好。

centos

先安装glusterfs的yum仓库:

yum install -y centos-release-gluster

然后就可以安装glusterfs-server了。

yum install glusterfs-server

也会附带安装client等一系列套件。

匹配节点

gluster pool list 列出 storage pool中所有节点

gluster peer status 列出匹配的节点状态

gluster peer probe <hostname/ip> 向storage pool中添加节点

gluster peer detach <hostname/ip> 从storage pool中删除节点,前提是要删除的节点目前没有参与构成volume。如果有,需要先将对应的volume全部删除才可以删除节点。

配置数据卷

创建数据卷

创建replicated模式的数据卷:

gluster volume create <volumename> replica <2> <gluster1:/gluster/brick1> <gluster2:/gluster/brick1> <force>

glusterfs推荐的备份数量最好是奇数个,因此配置为偶数时会有warning。glusterfs还建议使用新的磁盘分区作为brick的存储区域,而不是使用安装有操作系统的分区,如果一定要这么做,要在最后加上force,才能创建成功。

创建distributed模式的数据卷:

gluster volume create <volumename> <gluster1:/gluster/brick2> <gluster2:/gluster/brick2> <force>

glusterfs不指定模式时,默认创建的就是distributed模式的数据卷。

创建完成volume后,要start才能使用:

gluster volume start <volumename>

挂载数据卷

之后,就可以在安装有glusterfs-cli的机器上通过mount挂载gluster volume进行使用:

mount -t glusterfs <gluster1:volume1> </mnt/gluster_test>

查看是否挂载成功:

mount | grep <volume1>

如果volume不再使用,先卸载:

umount /mnt/gluster_test

拓展数据卷

gluster volume add-brick <volume1> <gluster2:/gluster/brick1> 用来向volume中增加brick。

增加了新的brick之后,还不会立即将之前的文件存入该brick,可以通过rebalance命令将文件重新平衡到所有brick中:

gluster volume rebalance <volume1> start 启动rebalance进程。等待rebalance完成后可以使用gluster volume rebalance <volume1> status 命令来查看rebalance的状态(转移文件数等)

压缩数据卷

和拓展数据卷时的操作相反,想要从一个storage pool中移出一个brick的时候,需要将该brick的文件分配到其他brick,然后再移出。命令上也分为两步操作:

首先:

gluster volume remove-brick <volume1> <gluster2:/gluster/brick1> start

这一步会将要移出的brick中的文件平衡到其他的brick中。

最后:

gluster volume remove-brick <volume1> <gluster2:/gluster/brick1> commit 将该brick移出。

中间,可以使用

gluster volume remove-brick <volume1> <gluster2:/gluster/brick1> status 查看移出操作的状态。

数据卷选项

gluster volume get <volume1> all 可以查看一个volume的所有配置项。也可以指定具体的配置项名称进行查看,例如gluster volume get <volume1> auth.allow

gluster volume set <volume1> auth.reject gluster-client,127.0.0.1 可以设置不允许连接gluster的地址。

gluster volume reset <volume1> auth.reject 可以重置某选项。

可以在/var/log/gluster中查看日志,其中bricks的目录中保存了具体brick的日志。

删除数据卷

然后停用volume:

gluster volume stop <volume1>

最后删除volume:

gluster volume delete <volume1>

删除volume后,已经储存在brick中的数据还在,并不会随之删除。如果需要还要手动删除。

volume配额

可以指定配额限制volume的使用。

gluster volume quota <volume1> enable 启动配额。volume必须已经创建并启动。

gluster volume quota <volume1> limit-usage / 20MB 限制volume根目录的使用量为20M。不仅可以设置整个volume的配额,还可以设置某个子目录的配额限制。

使用heketi管理glusterfs cluster

安装配置heketi

下载heketi

{
  cd /tmp
  wget https://github.com/heketi/heketi/releases/download/v10.1.0/heketi-v10.1.0.linux.amd64.tar.gz
  tar zxf heketi*
  mv heketi/{heketi,heketi-cli} /usr/local/bin/
}

设置账户

{
  groupadd -r heketi
  useradd -r -s /sbin/nologin -g heketi heketi
  mkdir {/var/lib,/etc,/var/log}/heketi
}

设置密钥访问gluster node

{
  ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''
  for node in gluster-1 gluster-2; do
    ssh-copy-id -i /etc/heketi/heketi_key.pub root@$node
  done
}

配置heketi

cp /tmp/heketi/heketi.json /etc/heketi/

修改配置文件json,修改user_auth和executor:

  "use_auth": true,

  "_jwt": "Private keys for access",
  "jwt": {
    "_admin": "Admin has access to all APIs",
    "admin": {
      "_key_comment": "Set the admin key in the next line",
      "key": "secretpassword"
    },
    "_user": "User only has access to /volumes endpoint",
    "user": {
      "_key_comment": "Set the user key in the next line",
      "key": "secretpassword"
    }
      
    …………
      
    "executor": "ssh", 

    "_sshexec_comment": "SSH username and private key file information",
    "sshexec": {
        "keyfile": "/etc/heketi/heketi_key", 
        "user": "root", 
        "port": "22", 
        "fstab": "/etc/fstab" 

其余不需要的内容也记得删除,例如ssh下面的其他含有注释说明的配置,以及kubenetes相关的示例配置。

运行heketi服务

首先赋予用户权限

chown -R heketi:heketi {/var/lib,/etc,/var/log}/heketi

然后创建服务:

cat <<EOF >/etc/systemd/system/heketi.service
[Unit]
Description=Heketi Server

[Service]
Type=simple
WorkingDirectory=/var/lib/heketi
EnvironmentFile=-/etc/heketi/heketi.env
User=heketi
ExecStart=/usr/local/bin/heketi --config=/etc/heketi/heketi.json
Restart=on-failure
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
EOF

最后启动服务并设置开机自启:

{
  systemctl daemon-reload
  systemctl enable --now heketi
}

测试连通性:

curl localhost:8080/hello; echo

如果需要在本机使用,则可以将heketi的用户名和密码这些验证信息设置到环境变量中使用:

export HEKETI_CLI_USER=admin
export HEKETI_CLI_KEY=secretpassword

使用heketi管理gluster集群

heketi中有五个概念:

  • cluster 集群
  • zone 类似故障域,heketi会尽量将数据冗余到不同的zone提高容错率
  • node 主机节点
  • device node上的一个可以用来存储数据的分区
  • volume 卷

首先创建cluster:

heketi-cli cluster create

列出cluster:

heketi-cli cluster list

查看cluster信息:

heketi-cli cluster info <cluster-id>

向cluster插入node:

heketi-cli node add --zone=1 --cluster=<cluster_id> --management-host-name=xxx --storage-host-name=xxx

查看所有node列表:

heketi-cli node list

查看node信息:

heketi-cli node info <node-id>

给node添加device:

heketi-cli device add --name </dev/sdc> --node <node-id>

创建volume:

heketi-cli volume create --size=1 --replica=2

只需要告诉heketi希望有多少冗余备份即可,heketi会自动选取最佳的存储方案,创建brick和volume。

如果只有一个节点的话,需要--durability=none,然后不指定replica,否则会报Error: Failed to allocate new volume: No space错误,例如heketi-cli volume create --durability=none --size=10

查看所有volume列表:

heketi-cli volume list

查看volume的信息:

heketi-cli volume info <volume-id>

可以看到挂载点名称,使用这个名称就可以将volume挂载到自己的主机上了。 注意,信息中有mount options,也要在挂载的时候用上,就可以挂载点的主机掉线导致挂载失败了。例如:

mount -t glusterfs -o <Mount Options> <Mount> </mnt>