目录

一、GFS的概述

1.GFS简介

2.GFS特点

3.GFS文件系统的作用

4.GFS文件系统的挂载使用

5.GFS术语

二、GFS工作流程

1.GFS的工作流程(服务端)

2.GFS的工作流程图(客户端)

三、GFS的数据类型

1.GFS卷类型

2.GFS卷的特点

四、部署GlusterFSt群集

1.实验环境

2.使用脚本对硬盘进行分区挂载

3.配置/etc/hosts文件

4.安装GFS分布式文件系统

5.创建卷

6.创建客户端挂载GFS文件系统

7.测试Gluster文件系统

8.验证gluster文件系统

五、GFS文件系统的维护命令

1.查看GlusterFS卷

2.查看所有卷的信息

3.查看所有卷状态

4.停止一个卷

5.删除一个卷

6.黑白名单


一、GFS的概述

1.GFS简介

开源的分布式文件系统

由存储服务器、客户端以及NFS/Samba存储网关组成

无元数据服务器

2.GFS特点

扩展性和高性能:分布式特点

高可用性:分布式特点

全局统一命名空间:共享资源(名称空间:隔离、独立的整体/环境,与其他名称空间是隔离独立的)

弹性卷管理:条带、复制、分布式、分布式条带、分布式复制;类似raid

基于标准协议

3.GFS文件系统的作用

从系统角度来看,文件系统是对文件存储设备的空间进行组织和备份

负责文件存储并对存入的文件进行保护和检索的系统

具体地说,它负责为用户建立文件、存入、读出、修改、转储文件、控制文件的存储

4.GFS文件系统的挂载使用

除根文件系统以外的文件系统创建后要使用需要先挂载至挂载点后才可以被访问,挂载点即分区设备文件关联的某个目录文件;

类比: NFS

5.GFS术语

Brick存储服务器:实际存储用户数据的服务器

Volume:本地文件系统的"分区”

FUSE:用户 空间的文件系统(类比EXT4),“这是一个伪文件系统”;以本地文件系统为例,用户想要读写一个文件,会借助于EXT4文件系统,然后把数据写在磁盘上;而如果是远端的GFS,客户端的请求则应该交给FUSE(为文件系统),就可以实现跨界点存储在GFS上

VFS(虚拟端口) :内核态的虚拟文件系统,用户是先提交请求交给VFS然后VFS交给FUSE,再交给GFS客户端,最后由客户端交给远端的存储

Glusterd(服务):是允许在存储节点的进程

二、GFS工作流程

1.GFS的工作流程(服务端)

写入过程

GFS客户端服务器

(1)交由VFS的API接受请求–>组合功能模块,将数据交给FUSE(内核伪文件系统)

(2)FUSE可以模拟操作系统,可以对文件系统进行转存,转存的设备位置为: /dev/fuse (用于传输的设备-虚拟设备文件)

(3)/dev/fuse 虚拟设备文件会将数据交给GFS客户端

(4)GFS客户端client会根据配置文件对数据进行处理,然后再通过TCP/IB/rdma网络发送到GFS服务端

GFS服务端服务器

接收到数据之后

会将数据保存在对应的存储节点上

2.GFS的工作流程图(客户端)

读取过程

(1)交由VFS的API接受请求–>组合功能模块,将数据交给FUSE(内核伪文件系统)

(2)FUSE在/dev/fuse (用于传输的设备-虚拟设备文件)查询缓存,执行page函数读取(read)内存,若缓存有,则返回客户端

(3)若没有缓存,GFS客户端会去GFS服务端获取数据,GFS服务端通过VFS接口去本地读取缓存

(4)再把缓存存储在/dev/fuse,读取了缓存数据之后再通过VFS返回给客户端

三、GFS的数据类型

1.GFS卷类型

基本卷:分布式卷、条带卷、复制卷

符合卷:分布式条带卷、分布式复制卷、条带复制卷、分布式条带复制卷

2.GFS卷的特点

分布式卷:文件通过HASH算法分布到Brick Server上,这种卷是Glusterf的基础;以文件为单位根据HASH算法散列到不同的Brick,其实只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件及的RAID 0,不具有容错能力。

条带卷:类似RAID 0 ,文件被分成数据块并以轮询的方式分布到多个Brick Server上,文件存储以数据块为单位,支持大文件存储,文件越大,读取效率越高。

复制卷:将文件同步到多个 Brick 上,使其具备多个文件副本,属于文件级RAID 1,具有容错能力。因为数据分散在多个 Brick中,所以读性能得到很大提升,但写性能下降。

分布式条带卷:Brick Server 数量是条带数(数据块分布的 Brick数量)的倍数,兼具分布式卷和条带卷的特点。

分布式复制卷:Brick Server数量是镜像数(数据副本数量)的倍数,兼具分布式卷和复制卷的特点。

条带复制卷:类似 RAID 10,同时具有条带卷和复制卷的特点。

分布式条带复制卷:三种基本卷的复合卷,通常用于类Map Reduce应用。

四、部署GlusterFSt群集

1.实验环境

节点 ip 磁盘 挂载点
node1 192.168.150.10 sdb1、sdc1、sdd1、sde1 /data
node2 192.168.150.20 sdb1、sdc1、sdd1、sde1 /data
node3 192.168.150.30 sdb1、sdc1、sdd1、sde1 /data
node4 192.168.150.40 sdb1、sdc1、sdd1、sde1 /data
client 192.168.150.100

2.使用脚本对硬盘进行分区挂载

[root@localhost ~]# vim /home/fdisk.sh

#!/bin/bash
	echo "the disks exist list:"
	#grep出系统所带磁盘
	fdisk -l |grep '磁盘 /dev/sd[a-z]'    
	echo "=================================================="
	PS3="chose which disk you want to create:"
	#选择需要创建的磁盘编号
	select VAR in `ls /dev/sd*|grep -o 'sd[b-z]'|uniq` quit   
	do
   	 case $VAR in
   	 sda)
	#本地磁盘就退出case语句
     	   fdisk -l /dev/sda   
     	   break ;;
  	  sd[b-z])
    	    #create partitions
       	 echo "n    ##创建磁盘
          	      p
        	        
           	     w"  | fdisk /dev/$VAR
 
        	#make filesystem
	#格式化
      	  mkfs.xfs -i size=512 /dev/${VAR}"1" &> /dev/null    
		#mount the system
      	  mkdir -p /data/${VAR}"1" &> /dev/null
	#永久挂载
        	echo -e "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0\n" >> /etc/fstab
	#使得挂载生效
     	   mount -a &> /dev/null
      	  break ;;
    	quit)
     	   break;;
  	  *)
       	 echo "wrong disk,please check again";;
   	 esac
	done

[root@localhost ~]# chmod +x /home/fdisk.sh
[root@localhost ~]# cd /home
[root@localhost ~]# sh fdisk.sh

3.配置/etc/hosts文件

建立地址映射,四台节点都操作

[root@localhost ~]# vim /etc/hosts
...
192.168.150.10 node1
192.168.150.20 node2
192.168.150.30 node3
192.168.150.40 node4

4.安装GFS分布式文件系统

编辑GFS的源,四台节点都操作

[root@localhost opt]# ls
gfsrepo.zip  rh             #在/opt放置关于gfs的软件包
[root@localhost opt]# unzip gfsrepo.zip             #解压
[root@localhost opt]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir repos.bak       #将原来的源移动到新建的目录中
[root@localhost yum.repos.d]# mv Cent* repos.bak/
[root@localhost yum.repos.d]# ls
repos.bak
[root@localhost yum.repos.d]# vim local.repo
[GLFS]
name= glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

[root@localhost yum.repos.d]# yum clean all && yum makecache

安装GFS软件包,四台节点都做

[root@localhost ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma    #安装-glusterfs-server服务端软件、glusterfs-fuse使用gfs文件系统软件
[root@localhost ~]# systemctl start glusterd.service      #启动
[root@localhost ~]# systemctl enable glusterd.service     #开机自启
[root@localhost ~]# systemctl status glusterd.service     #查看状态

添加存储信任池(只在节点1操作即可)

[root@node1 ~]# gluster peer probe node2
peer probe: success. 
[root@node1 ~]# gluster peer probe node3
peer probe: success. 
[root@node1 ~]# gluster peer probe node4
peer probe: success. 
[root@node1 ~]# gluster peer status       #在每个node节点查看集群状态
Number of Peers: 3

Hostname: node2
Uuid: 47dbbd0a-2b68-413a-b1bf-07bd764af828
State: Peer in Cluster (Connected)

Hostname: node3
Uuid: 6a28956d-0706-483f-a7e8-946bf8cbc6e7
State: Peer in Cluster (Connected)

Hostname: node4
Uuid: 08cbaccb-13a4-4dec-938b-3c6f0d18bc51
State: Peer in Cluster (Connected)

5.创建卷

根据规划创建如下卷

卷名称 卷类型 Brick
dis-volume 分布式卷 node1(/data/sdb1)、node2(/data/sdb1)
stripe-volume 条带卷 node1(/data/sdc1)、node2(/data/sdc1)
rep-volume 复制卷 node3(/data/sdb1)、node4(/data/sdb1)
dis-stripe 分布式条带卷 node1(/data/sdd1)、node2(/data/sdd1)、node3(/data/sdd1)、node4(/data/sdd1)
dis-rep 分布式复制卷 node1(/data/sde1)、node2(/data/sde1)、node3(/data/sde1)、node4(/data/sde1)

创建分布式卷

利用node1和node2上的两块磁盘创建,dis-vol为磁盘名,force表示强制

[root@node1 ~]# gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 force
volume create: dis-vol: success: please start the volume to access data
[root@node1 ~]# gluster volume start dis-vol       #启动dis-vol卷
volume start: dis-vol: success
[root@node1 ~]# gluster volume info dis-vol        #查看该卷的状态
 
Volume Name: dis-vol
Type: Distribute
Volume ID: 0a676197-c893-4430-9537-a9ea7dbff87c
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdb1
Brick2: node2:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

创建条带卷

[root@node1 ~]# gluster volume create stripe-vol stripe 2 node1:/data/sdc1  node2:/data/sdc1 force
volume create: stripe-vol: success: please start the volume to access data
[root@node1 ~]# gluster volume start stripe-vol
volume start: stripe-vol: success
[root@node1 ~]# gluster volume info stripe-vol
 
Volume Name: stripe-vol
Type: Stripe
Volume ID: adc9ec83-136b-43af-8963-4a9dab077b6a
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdc1
Brick2: node2:/data/sdc1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

创建复制卷

[root@node1 ~]# gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force
volume create: rep-vol: success: please start the volume to access data
[root@node1 ~]# gluster volume start rep-vol
volume start: rep-vol: success
[root@node1 ~]# gluster volume info rep-vol
 
Volume Name: rep-vol
Type: Replicate
Volume ID: 0905b894-2dde-4426-8f80-b4d63dbfe571
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node3:/data/sdb1
Brick2: node4:/data/sdb1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

创建分布式条带卷

[root@node1 ~]# gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
volume create: dis-stripe: success: please start the volume to access data
[root@node1 ~]# gluster volume start dis-stripe
volume start: dis-stripe: success
[root@node1 ~]# gluster volume info dis-stripe
 
Volume Name: dis-stripe
Type: Distributed-Stripe
Volume ID: 5b69fec8-7e78-4186-96ef-a33718ed7bff
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sdd1
Brick2: node2:/data/sdd1
Brick3: node3:/data/sdd1
Brick4: node4:/data/sdd1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on

创建分布式复制卷

[root@node1 ~]# gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 forcevolume create: dis-rep: success: please start the volume to access data
[root@node1 ~]# gluster volume start dis-rep
volume start: dis-rep: success
[root@node1 ~]# gluster volume info dis-rep
 
Volume Name: dis-rep
Type: Distributed-Replicate
Volume ID: d8c48244-e45a-4142-95f9-bd1f2ded5c54
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/sde1
Brick2: node2:/data/sde1
Brick3: node3:/data/sde1
Brick4: node4:/data/sde1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

6.创建客户端挂载GFS文件系统

配置GFS源,安装GFS软件

[root@client ~]# cd /opt/
[root@client opt]# ls
gfsrepo.zip  rh
[root@client opt]# unzip gfsrepo.zip
[root@client opt]#  vim /etc/yum.repos.d/GLFS.repo
[GLFS]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

[root@client yum.repos.d]# yum clean all && yum makecache
[root@client opt]# cd ~
[root@client ~]# yum -y install glusterfs glusterfs-fuse

创建挂载目录

[root@client opt]# mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
[root@client opt]# ls /test/
dis  dis_rep  dis_stripe  rep  stripe

配置/etc/hosts文件

[root@client ~]# vim /etc/hosts
...
192.168.150.10 node1
192.168.150.20 node2
192.168.150.30 node3
192.168.150.40 node4

挂载Gluster文件系统(临时挂载)

[root@client test]# mount.glusterfs node1:dis-volume /test/dis
[root@client test]# mount.glusterfs node1:stripe-volume /test/stripe
[root@client test]# mount.glusterfs node1:rep-volume /test/rep
[root@client test]# mount.glusterfs node1:dis-stripe /test/dis_stripe
[root@client test]# mount.glusterfs node1:dis-rep /test/dis_rep
[root@client ~]# df -hT
文件系统         类型            容量  已用  可用 已用% 挂载点
/dev/sda2        xfs              10G  3.8G  6.3G   38% /
devtmpfs         devtmpfs        474M     0  474M    0% /dev
tmpfs            tmpfs           489M     0  489M    0% /dev/shm
tmpfs            tmpfs           489M  7.2M  482M    2% /run
tmpfs            tmpfs           489M     0  489M    0% /sys/fs/cgroup
/dev/sda5        xfs             4.0G   37M  4.0G    1% /home
/dev/sda1        xfs             4.0G  158M  3.9G    4% /boot
tmpfs            tmpfs            98M  4.0K   98M    1% /run/user/42
tmpfs            tmpfs            98M   20K   98M    1% /run/user/0
/dev/sr0         iso9660         4.3G  4.3G     0  100% /run/media/root/CentOS 7 x86_64
node1:dis-vol    fuse.glusterfs   10G  167M  9.9G    2% /text/dis
node1:stripe-vol fuse.glusterfs   10G  167M  9.9G    2% /text/strip
node3:rep-vol    fuse.glusterfs  5.0G   84M  5.0G    2% /text/rep
node2:dis-stripe fuse.glusterfs   20G  334M   20G    2% /text/dis-str
node4:dis-rep    fuse.glusterfs   10G  167M  9.9G    2% /text/dis-rep

7.测试Gluster文件系统

卷中写入文件,客户端操作

[root@client ~]# cd /opt
[root@client opt]# dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
记录了40+0的读入
记录了40+0的写出
41943040字节(42MB)已复制,0.0262489秒,1.6 GB/秒
[root@client opt]# dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
记录了40+日 的读入
记录了40+0的写出
41943040字节(42 MB)己复制,0.0395467秒,1.1 GB/秒
[ root@client opt]# dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
记录了40+0的读入
记录了40+0的写出
41943040字节(42 MB)己复制,0.027494秒,1.5 GB/秒
[root@client opt]# dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
记录了40+0的读入
记录了40+0的写出
41943040字节(42MB)已复制,0.319676 秒,131 MB/秒
[root@client opt]# dd if=/dev/zero of=/opt/demo5.log bs=1M count=40
记录了40+0的读入
记录了40+0的写出
41943040字节(42MB)已复制,0.506533 秒,82.8 MB/秒
[root@client opt]# ls -lh
总用量 276M
-rw-r--r--. 1 root root 4OM 11月17 10:10 demo1.log
-rw-r--r--. 1 root root 40M 11月17 10:10 demo2.log
-rw-r--r--. 1 root root 40M 11月17 10:10 demo3.log
-rw-r--r--. 1 root root 40M 11月17 10:10 demo4.log
-rw-r--r--. 1 root root 40M 11月17 10:10 demo5.log
drwxr-xr-x. 3 root root 12k 10月31 2019 gfsrepo
-rw-r--r--. 1 root root 76M 2月 17 2020 gfsrepo.zip
drwxr-xr-x. 2 root root   6 9月  7 2017 rh
[root@client opt]# cp demo* /test/dis		
[root@client opt]# cp demo* /test/stripe/
[root@client opt]# cp demo* /test/rep/
[root@client opt]# cp demo* /test/dis_stripe/
[root@client opt]# cp demo* /test/dis_rep/
[root@client opt]# ls /test/dis
demo1.log demo2.log demo3.log demo4.log demo5.log
[root@client opt]# ls /test/stripe
demo1.log demo2.log demo3.log demo4.log demo5.log
[root@client opt]# ls /test/rep
demo1.log demo2.log demo3.log demo4.log demo5.log
[root@client opt]# ls /test/dis_stripe
demo1.log demo2.log demo3.log demo4.log demo5.log
[root@client opt]# ls /test/dis_rep
demo1.log demo2.log demo3.log demo4.log demo5.log

8.验证gluster文件系统

查看分布式文件分布

[root@node1 ~]# ls -lh /data/sdb1		#没有被分片,文件分开节点存放
总用量160M
-rw-r--r-- 2 root root 40M 12月18 14:50 demo1.log
-rw-r-—r-- 2 root root 40M 12月18 14:50 demo2.log
-rw-r--r-- 2 root root 40M 12月18 14:50 demo3.log
-rw-r--r-- 2 root root 40M 12月18 14:50 demo4.log
[root@node2 ~]#ll -h / data/ sdbl
总用量40M
-rw-r--r-- 2 root root 40M 12月18 14:50 demo5.log

查看条带卷文件分布

[root@node1 ~]# ls -lh /data/sdc1      #数据被分片50%没副本没冗余
总用量101M
-rw-r--r-- 2 root root 20M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo4.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo5.log
[root@node2 ~]# ls -lh /data/sdc1      #数据被分片50%没副本没冗余
总用量101M 
-rw-r--r-- 2 root root 20M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo4.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo5.log

查看复制卷文件分布

[root@node3 ~]# ls -lh /data/sdb1    #数据没有被分片,有副本,有冗余
总用量201M
-rw-r--r-- 2 root root 40M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo4.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo5.log
[root@node4 ~]# ls -lh /data/sdb1    #数据没有被分片,有副本,有冗余
总用量201M
-rw-r--r-- 2 root root 40M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo4.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo5.log

查看分布式条带卷分布

[root@node1 ~]# ls -lh /data/sdd1      #数据被分片50%,没副本,没冗余
总用量80M
-rw-r--r-- 2 root root 20M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo4.log
[root@node2 ~]# ls -lh /data/sdd1
总用量80M
-rw-r--r-- 2 root root 20M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12月18 14:51 demo4.log
[root@node3 ~]# ls -lh /data/sdd1
总用量20M
-rw-r--r-- 2 root root 20M 12月18 14:51 demo5.log
[root@node4 ~]# ls -lh /data/sdd1
总用量20M
-rw-r--r-- 2 root root 20M 12月18 14:51 demo5.log

查看分布式复制卷分布

[root@node1 ~]# ls -lh /data/sde1      #数据没有被分片,有副本,有冗余
总用量160M
-rw-r--r-- 2 root root 40M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo4.log
[root@node2 ~]# ls -lh /data/sde1      #数据没有被分片,有副本,有冗余
总用量160M
-rw-r--r-- 2 root root 40M 12月18 14:51 demo1.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo2.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo3.log
-rw-r--r-- 2 root root 40M 12月18 14:51 demo4.log
[root@node3 ~]# ls -lh /data/sde1      #数据没有被分片,有副本,有冗余
总用量40M
-rw-r--r-- 2 root root 40M 12月18 14:51 demo5.log
[root@node4 ~]# ls -lh /data/sde1      #数据没有被分片,有副本,有冗余
总用量40M
-rw-r--r-- 2 root root 40M 12月18 14:51 demo5.log

五、GFS文件系统的维护命令

1.查看GlusterFS卷

[root@node1 ~]# gluster volume list 

2.查看所有卷的信息

[root@node1 ~]# gluster volume info

3.查看所有卷状态

[root@node1 ~]# gluster volume status

4.停止一个卷

[root@node1 ~]# gluster volume stop dis-stripe

5.删除一个卷

[root@node1 ~]# gluster volume delete dis-stripe

6.黑白名单

[root@node1 ~]# gluster volume set dis-rep auth.allow 192.168.150.*   #设置192.168.150.0网段的所有IP地址 都能访问dis-rep卷(分布式复制卷)
volume set: success 
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐