Glusterfs 分布式存储系统

June 22, 2018 20:51


Glusterfs 是一个部署简单,使用方便的开源存储系统。

Init

方便起见,这里使用 docker 的方式来部署,下面是 docker-compose.yml

version: '3'

services:
  g1:
    image: gluster/gluster-centos:gluster4u0_centos7
    restart: always

    # 如果是多台服务器一对一部署的话,取消下面的注释
    # 现在我们以docker 单机部署多个实例为例
    # network_mode: host 
    privileged: true

    volumes:
      - ./conf:/etc/glusterfs:z
      - ./data:/var/lib/glusterd:z
      - ./logs:/var/log/glusterfs:z
      - ./gvs:/gvs:z

      # 如果是多台服务器一对一部署的话,取消下面的注释
      # - /sys/fs/cgroup:/sys/fs/cgroup:ro
      # - /dev:/dev

    # 如果使用 host 网络,不用配置 IP,删除这3行
    networks:
      app_net:
        ipv4_address: 172.10.0.2

  g2:
    image: gluster/gluster-centos:gluster4u0_centos7
    restart: always

    # 如果是多台服务器一对一部署的话,取消下面的注释
    # 现在我们以docker 单机部署多个实例为例
    # network_mode: host 
    privileged: true

    volumes:
      - ./conf:/etc/glusterfs:z
      - ./data:/var/lib/glusterd:z
      - ./logs:/var/log/glusterfs:z
      - ./gvs:/gvs:z

      # 如果是多台服务器一对一部署的话,取消下面的注释
      # - /sys/fs/cgroup:/sys/fs/cgroup:ro
      # - /dev:/dev

# 如果使用 host 网络,不用配置 IP,删除 networks 配置
networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.10.0.0/24

然后启动两个 gluster 节点

docker-compose up -d

Link Nodes

现在我们来连接两个节点,先进入 g1 节点 console

$ docker exec -ti gluster_g1_1 bash

然后使用 gluster peer probe 增加节点

$ gluster peer probe 172.10.0.3

当然,也可以在 g2 运行上面的命令来加入 g1,都是一样的。在 Gluster 中,每个节点的地位都是相同的

Create Volume

Gluster 有下面几种类型的 Volume

以上卷类型可以结合, 比如创建 Distributed ReplicatedDistributed DispersedDistributed Striped Replicated 卷。更多请参考 官方文档

创建卷之前,我们需要先了解什么是 Brick: 简单来说,一个数据卷就是一个或多个 Brick 的集合,卷类别是定义数据如何存放到 Brick 中,Brick 是最终数据的存放点。

现在我们来创建两个卷,一个分布式卷,一个镜像卷。在任意一个 gluster 节点执行下列命令

创建分布式卷。 172.10.0.2:/gvs/gv1 表示在 172.10.0.2 位于 /gvs/gv1 的 Brick

$ gluster volume create gv1 172.10.0.2:/gvs/gv1 172.10.0.3:/gvs/gv1
$ gluster volume start gv1 # 启动卷

上面在两个节点上分别创建一个 Brick 作为 gv1 卷的容器。当然我们也可以在同一节点创建多个 Brick ,只要使用不同的目录就好了。但通常同一个卷下,Brick 应该分布到不同的节点中。

接下来创建镜像卷,方式类似

$ gluster volume create gv2 replica 2 172.10.0.2:/gvs/gv2 172.10.0.3:/gvs/gv2
$ gluster volume start gv2

上面分别在两个节点的 /gvs/gv2 下创建了一个 Brick。当在 gv2 中写入数据时,会在两个节点中写入相同的数据。

最后,可以通过下面命令来查看卷

$ gluster volume info
$ gluster volume status

Mount Volumes

gluster 卷的使用比较简单,只需要在客户端上安装对应版本的 glusterfs-client,然后使用下列命令 mount

mkdir gv1 gv2
mount -t glusterfs 172.10.0.2:/gv1 ./gv1
mount -t glusterfs 172.10.0.2:/gv2 ./gv2

使用节点地址 + 卷名就可以了。 需要注意的是,我们配置的系统只能在内网使用。 并且需要使用节点地址和 peer 时一样的。我试过如果使用 hosts 为域名设置别名,使用时也需要使用别名,不然会 mount 失败

在 Mount 时可以设置一些参数,比如 backupvolfile-server: 当 mount 的服务器无效时,会使用这此服务器

mount -t glusterfs -o backupvolfile-server=172.10.0.3 172.10.0.2:gv1 ./gv1

更多参数可以参考官方文档

Delete Volume

删除卷,需要先停止

$ gluster volume stop gv1
$ gluster volume delete gv1

Add/Remove Brick for Volume

如果某个节点需要关闭,可以通过下列命令安全的删除 Brick。删除时会自动迁移 Brick 中的数据。 迁移完所有 Brick 后,就可以移除节点了。

$ gluster volume remove-brick gv1 172.10.0.2:/gvs/gv1 start # 开始迁移
$ gluster volume remove-brick gv1 172.10.0.2:/gvs/gv1 status # 查看状态
$ gluster volume remove-brick gv1 172.10.0.2:/gvs/gv1 commit # 当迁移完成后,提交修改,就完成了

如果新加了一个节点 172.10.0.4,可以通过下列命令来增加 Brick 到新节点

$ gluster volume add-brick gv2 172.10.0.4:/gvs/gv2

然后 rebalance 数据,如果是分布式卷的话,没有必要了,按官方说的,新加的文件会自动放入到新的 Brick 中

$ gluster volume rebalance gv2 start # 开始
$ gluster volume rebalance gv2 status # 查看状态

更多 rebalance 请参考官方文档

Heal Volume

当镜像卷的某个 Brick 遇到数据损坏时,可以使用下列命令自动修复

$ gluster volume heal gv2 // 只是文件级别
# or
$ gluster volume heal gv2 full // 对整个卷进行修复

More

还有很多功能就不一一讲解了,这里简单列几个。其它的可以去看官方文档

Comments: