超详细的GFS分布式文件系统理论+架构部署

一 、GlusterFS概述

1.1 GlusterFS简介

Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储.
Glusterfs通过TCP/IP或InfiniBand RDMA网络链接将客户端的存储资块源聚集在一起,使用单一的全局命名空间来管理数据,磁盘和内存资源.
Glusterfs基于堆叠的用户空间设计,可以为不同的工作负载提供高优的性能.

1.2 GlusterFS特点

●扩展性和高性能
GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(Elastic Hash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。
●高可用性
GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。

●全局统一命名空间
全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展,比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量限制,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。

●弹性卷管理

数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。

●基于标准协议

Gluster存储服务支持NFS, CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口。

1.3 GlusterFS术语

●Brick:GFS中的存储单元,通过是一个受信存储池中的服务器的一个导出目录。可以通过主机名和目录名来标识,如’SERVER:EXPORT’
●Volume:一组bricks的逻辑集合(卷)
●FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码。通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接。
●VFS:虚拟文件系统
●Glusterd:Gluster management daemon,要在trusted storage pool中所有的服务器上运行。

二、GlusterFS工作原理

2.1 GlusterFS工作流程
  • 客户端或应用程序通过GlusterFS的挂载点访问数据
  • linux系统内核通过VFS API收到请求并处理
  • VFS将数据递交给FUSE内核文件系统,fuse文件系统则是将数据通过/dev/fuse设备文件递交给了 GlusterFS client端
  • GlusterFS client收到数据后,client根据配置文件的配置对数据进行处理
    通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上
2.2 弹性HASH算法
  • 通过HASH算法得到一个32位的整数
  • 划分为N个连续的子空间,每个空间对应一个Brick(存储块)
  • 弹性HASH算法的优点
    ◆ 保证数据平均分布在每一个Brick中
    ◆解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈

在这里插入图片描述

三、GlusterFS的卷类型

3.1 分布式卷

3.1.1分布式简介
没有对文件进行分块处理
通过扩展文件属性保存HASH值
支持的底层文件系统有EXT3、EXT4、ZFS、XFS等

3.1.2分布式卷的特点
文件分布在不同的服务器,不具备冗余性
更容易和廉价地扩展卷的大小
单点故障会造成数据丢失
依赖底层的数据保护

3.1.3 创建分布式卷
创建一个名为dis-volume的分布式卷,文件将根据HASH分布在server1:/dir1、server2:/dir2和server3:/dir3中

gluster volume create dis-vol node1:/data/sdb1 node2:/data/sdb1 force
3.2 条带卷

●根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
●存储大文件时,性能尤为突出
●不具备冗余性,类似Raid0
●特点
数据被分割成更小块分布到块服务器中的不同条带区
分布减少了负载且更小的文件加速了存取的速度
没有数据冗余
●创建条带卷
创建了一个名为stripe-vol的条带卷,文件将被分块轮询的存储在node1:/data/sdc node2:/data/sdc中

gluster volume create stripe-vol stripe 2 transport tcp node1:/data/sdc1 node2:/data/sdc1
3.3 复制卷

■ 同一文件保存一份或多分副本
■ 因为要保存副本,所以磁盘利用率较低
若多个节点上的存储空间不一致,将按照木桶效应取最低节点的容量作为该卷的总容量
●特点
卷中所有的服务器均保存一个完整的副本
卷的副本数量可由客户创建的时候决定
至少有两个块服务器或更多服务器
具备冗余性
●创建复制卷
创建名为rep-vol的复制卷,文件将同时存储两个副本,分别在node3:/data/sdb node4:/data/sdb两个Brick中

gluster volume create rep-vol replica 2 node3:/data/sdb1 node4:/data/sdb1 force
3.4 分布式条带卷

●兼顾分布式卷和条带卷的功能
●主要用于大文件访问处理
●最少需要4台服务器
●创建分布式条带卷
创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)

gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
3.5 分布式复制卷

●兼顾分布式卷和复制卷的功能
●用于需要冗余的情况

●创建分布式复制卷
创建名为dis-rep的分布式条带卷,配置分布式复制卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)

  gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force

四、部署GlusterFS卷

4.1实验环境

主机名ip地址格式化的磁盘挂载点
node120.0.0.10/dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1
node220.0.0.11/dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1
node320.0.0.12/dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1
node420.0.0.13/dev/sdb1 /dev/sdc1 /devsdd1 /dev/sde1/data/sdb1 /data/sdc1 /data/sdd1 /data/sde1

4.2构建存储池子

4.2.1 修改主机名并解析到本地hosts文件中
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# bash
[root@node1 ~]# vi /etc/hosts
20.0.0.10   node1
20.0.0.11   node2
20.0.0.12   node3
20.0.0.13   node4
4.2.2 创建硬盘(四台服务器都要)

在这里插入图片描述

[root@node1 ~]# fdisk -l   ##查看你创建的硬盘
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
[root@node1 ~]# fdisk /dev/sdb  ###给磁盘分区
[root@node1 ~]# fdisk /dev/sdc
[root@node1 ~]# fdisk /dev/sdd
[root@node1 ~]# fdisk /dev/sde
4.2.3 格式化,挂载硬盘
[root@node1 ~]# mkfs.ext4 /dev/sdb1  ###格式化硬盘
[root@node1 ~]# mkfs.ext4 /dev/sdc1
[root@node1 ~]# mkfs.ext4 /dev/sdd1
[root@node1 ~]# mkfs.ext4 /dev/sde1
[root@node1 ~]# mkdir -p /data/{sdb1,sdc1,sdd1,sde1}  ##创建挂载点
[root@node1 ~]# mount /dev/sdb1 /data/sdb1            ##挂载硬盘
[root@node1 ~]# mount /dev/sdc1 /data/sdc1
[root@node1 ~]# mount /dev/sdd1 /data/sdd1
[root@node1 ~]# mount /dev/sde1 /data/sde1
[root@node1 ~]# df -h                  ###查看挂载
/dev/sdb1       4.8G   20M  4.6G    1% /data/sdb1
/dev/sdc1       4.8G   20M  4.6G    1% /data/sdc1
/dev/sdd1       4.8G   20M  4.6G    1% /data/sdd1
/dev/sde1       4.8G   20M  4.6G    1% /data/sde1


4.2.4 安装glusterfs相应软件并启动服务
[root@node1 ~]# vi /etc/yum.repos.d/glfs.repo  ##重新配置一个yum仓库,不然安装不全glusterfs所需要的软件
[GLFS]
name=glfs
baseurl=file:///root/gfsrepo
gpgcheck=0
enable=1
[root@node1 ~]# unzip gfsrepo.zip  ##把gfs软件包导入root目录下解压
[root@node1 ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma  ##最后安装gfs相应的软件
[root@node1 ~]# systemctl start glusterd   ##启动服务
[root@node1 ~]# systemctl status glusterd   ##查看服务启动状态

软件包讲解:
glusterfs:命令软件包
glusterfs-server:glusterfs服务软件
glusterfs-fuse:内核模块软件
glusterfs-rdma:通讯协议RDMA软件包

4.2.5 时间同步
[root@node1 ~]# ntpdate ntp1.aliyun.com
16 Nov 23:02:41 ntpdate[51674]: step time server 120.25.115.20 offset -36001.090537 sec
4.2.6 构建存储池子(在任意节点即可)
[root@node3 ~]# gluster peer probe node2
peer probe: success. 
[root@node3 ~]# gluster peer probe node1
peer probe: success. 
[root@node3 ~]# gluster peer probe node4
peer probe: success. 
[root@node3 ~]# gluster peer status
Number of Peers: 3

Hostname: node2
Uuid: 024f7b0e-19ed-4611-8091-bc84ff665ae3
State: Accepted peer request (Connected)

Hostname: node1
Uuid: 80f7866d-f683-4866-a19c-db9e67a6dec8
State: Accepted peer request (Connected)

Hostname: node4
Uuid: d8a878bc-488c-4f5c-8e6e-3b003db6c0aa
State: Accepted peer request (Connected)

4.3 规划GlusterFS卷

客户端配置:

[root@client ~]# vi /etc/hosts
20.0.0.10   node1
20.0.0.11   node2
20.0.0.12   node3
20.0.0.13   node4

[root@client ~]# yum -y install glusterfs glusterfs-fuse
[root@client ~]# dd if=/dev/zero of=/demo1.log bs=40M count=1   ##创建5个40M的文件 
[root@client ~]# dd if=/dev/zero of=/demo2.log bs=40M count=1
[root@client ~]# dd if=/dev/zero of=/demo3.log bs=40M count=1
[root@client ~]# dd if=/dev/zero of=/demo4.log bs=40M count=1
[root@client ~]# dd if=/dev/zero of=/demo5.log bs=40M count=1

4.3.1创建分布式卷
[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 info dis-vol  ##查看卷的相关信息
 
Volume Name: dis-vol
Type: Distribute
Volume ID: 5671c5a2-9d73-4c9b-8a9c-d1e5093f412b
Status: Created
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 start dis-vol   ##启动卷
volume start: dis-vol: success
[root@node1 ~]# gluster volume info dis-vol
...省略内容
Status: Started

#客户端挂载分布式卷到/test/dis目录下,并将5个所有测试文件拷贝进去

[root@client ~]# mkdir -p /test/dis
[root@client ~]# mount.glusterfs node1:dis-vol /test/dis/
[root@client ~]# cp /demo* /test/dis/

[root@node1 ~]# ll -h /data/sdb1  ##查看测试文件分布情况
总用量 161M
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo1.log
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo2.log
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo3.log
-rw-r--r--. 2 root root 40M 11月 17 01:04 demo4.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node2 ~]# ll -h /data/sdb1
总用量 41M
-rw-r--r-- 2 root root 40M 11月 17 12:04 demo5.log
drwx------ 2 root root 16K 11月 18 2020 lost+found

4.3.2创建复制卷
[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 status rep-vol   ##查看情况
Status of volume: rep-vol
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node3:/data/sdb1                      49152     0          Y       3874 
Brick node4:/data/sdb1                      49152     0          Y       12841
Self-heal Daemon on localhost               N/A       N/A        Y       53199
Self-heal Daemon on node2                   N/A       N/A        Y       51547
Self-heal Daemon on node4                   N/A       N/A        Y       12861
Self-heal Daemon on node3                   N/A       N/A        Y       3894 
 
Task Status of Volume rep-vol
------------------------------------------------------------------------------
There are no active volume tasks


#客户端挂载复制卷到/test/rep目录下,并将5个所有测试文件拷贝进去

[root@client ~]# mkdir -p /test/rep
[root@client ~]# mount.glusterfs node1:rep-vol /test/rep/
[root@client ~]# cp /demo* /test/rep/

[root@node3 ~]# ll -h /data/sdb1   ##查看分配情况
总用量 201M
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo1.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo2.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo3.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo4.log
-rw-r--r--. 2 root root 40M 11月 17 01:07 demo5.log
drwx------. 2 root root 16K 11月 16 22:09 lost+found
[root@node4 ~]# ll -h /data/sdb1
总用量 201M
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo1.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo2.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo3.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo4.log
-rw-r--r-- 2 root root 40M 11月 17 12:07 demo5.log
drwx------ 2 root root 16K 11月 18 2020 lost+found

4.3.3创建条带卷
[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 status stripe-vol 
Status of volume: stripe-vol
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/data/sdc1                      49153     0          Y       53421
Brick node2:/data/sdc1                      49153     0          Y       51668
 
Task Status of Volume stripe-vol
------------------------------------------------------------------------------
There are no active volume tasks

#客户端挂载条带卷到/test/strip目录下,并将5个所有测试文件拷贝进去

[root@client ~]# mkdir -p /test/strip
[root@client ~]# mount.glusterfs node1:stripe-vol /test/strip/
[root@client ~]# cp /demo* /test/strip/

[root@node1 ~]# ll -h /data/sdc1
总用量 101M
-rw-r--r--. 2 root root 20M 1117 01:16 demo1.log
-rw-r--r--. 2 root root 20M 1117 01:16 demo2.log
-rw-r--r--. 2 root root 20M 1117 01:16 demo3.log
-rw-r--r--. 2 root root 20M 1117 01:16 demo4.log
-rw-r--r--. 2 root root 20M 1117 01:16 demo5.log
drwx------. 2 root root 16K 1117 2020 lost+found
[root@node2 ~]# ll -h /data/sdc1
总用量 101M
-rw-r--r-- 2 root root 20M 1117 12:16 demo1.log
-rw-r--r-- 2 root root 20M 1117 12:16 demo2.log
-rw-r--r-- 2 root root 20M 1117 12:16 demo3.log
-rw-r--r-- 2 root root 20M 1117 12:16 demo4.log
-rw-r--r-- 2 root root 20M 1117 12:16 demo5.log
drwx------ 2 root root 16K 1118 2020 lost+found
4.3.4 创建分布式复制卷
[root@node1 ~]# gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
volume create: dis-rep: success: please start the volume to access data
[root@node1 ~]# gluster volume start dis-
dis-rep  dis-vol  
[root@node1 ~]# gluster volume start dis-rep 
volume start: dis-rep: success
[root@node1 ~]# gluster volume status dis-rep 
Status of volume: dis-rep
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/data/sde1                      49154     0          Y       53597
Brick node2:/data/sde1                      49154     0          Y       51728
Brick node3:/data/sde1                      49153     0          Y       4054 
Brick node4:/data/sde1                      49153     0          Y       13015
Self-heal Daemon on localhost               N/A       N/A        Y       53617
Self-heal Daemon on node3                   N/A       N/A        Y       4074 
Self-heal Daemon on node2                   N/A       N/A        Y       51748
Self-heal Daemon on node4                   N/A       N/A        Y       13035
 
Task Status of Volume dis-rep
------------------------------------------------------------------------------
There are no active volume tasks

#客户端挂载分布式复制卷到/test/dis_rep目录下,并将5个所有测试文件拷贝进去

[root@client ~]# mkdir -p /test/dis_rep
[root@client ~]# mount.glusterfs node1:dis-rep /text/dis_rep/
[root@client ~]# cp /demo* /test/dis_rep

[root@node1 ~]# ll -h /data/sde1
总用量 161M
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo1.log
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo2.log
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo3.log
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo4.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node2 ~]# ll -h /data/sde1
总用量 161M
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo1.log
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo2.log
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo3.log
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo4.log
drwx------ 2 root root 16K 11月 18 2020 lost+found
[root@node3 ~]# ll -h /data/sde1
总用量 41M
-rw-r--r--. 2 root root 40M 11月 17 01:20 demo5.log
drwx------. 2 root root 16K 11月 16 22:09 lost+found
[root@node4 ~]# ll -h /data/sde1
总用量 41M
-rw-r--r-- 2 root root 40M 11月 17 12:20 demo5.log
drwx------ 2 root root 16K 11月 18 2020 lost+found

4.3.5 创建分布式条带卷
[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 status dis-stripe 
Status of volume: dis-stripe
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1:/sdd1                           49155     0          Y       53738
Brick node2:/data/sdd1                      49155     0          Y       51814
Brick node3:/data/sdd1                      49154     0          Y       4141 
Brick node4:/data/sdd1                      49154     0          Y       13100
 
Task Status of Volume dis-stripe
------------------------------------------------------------------------------
There are no active volume tasks

#客户端挂载分布式条带卷到/tex/d目录下,并将5个所有的测试文件拷贝进去

[root@client ~]# mkdir -p /test/dis_strip
[root@client ~]# mount.glusterfs node1:dis-stripe /text/dis_strip/
[root@client ~]# cp /demo* /text/dis_strip/

[root@node1 ~]# ll -h /data/sdd1
总用量 81M
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo1.log
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo2.log
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo3.log
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo4.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node2 ~]# ll -h /data/sdd1
总用量 81M
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo1.log
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo2.log
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo3.log
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo4.log
drwx------ 2 root root 16K 11月 17 2020 lost+found
[root@node3 ~]# ll -h /data/sdd1
总用量 21M
-rw-r--r--. 2 root root 20M 11月 17 00:54 demo5.log
drwx------. 2 root root 16K 11月 17 2020 lost+found
[root@node4 ~]# ll -h /data/sdd1
总用量 21M
-rw-r--r-- 2 root root 20M 11月 17 11:54 demo5.log
drwx------ 2 root root 16K 11月 17 2020 lost+found

4.4 访问控制

#仅拒绝某个用户
[root@node1 ~]# gluster volume set dis-rep auth.reject 20.0.0.10
volume set: success
#仅允许某个用户
[root@node1 ~]# gluster volume set dis-rep auth.allow 20.0.0.10
volume set: success

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值