3、存储服务

集群化存储

目录

一、集群化存储概述

1、用于存储的网络技术

① DAS Direct-Attached Storage

② Network Attached Storage

③ Storage Area Network

2、实现存储的技术分类

① 块存储

② 文件存储、网络存储

③ 对象存储、分布式存储、存储桶

3、常见的一些存储名词以及背后使用技术对应关系

4、存储实现技术与存储网络之间的联系

① 块存储 + DAS

②块存储 + NAS

③ 块存储 + SAN

④ 文件存储 + NAS

⑤ 对象存储 + SAN

二、文件存储 – NFS

1、NFS 概述

① 何为 NFS ?

② NFS功能

③ NFS 原理

④ NFS 优点

2、NFS 安装及配置

① 安装软件包介绍

② NFS Server 配置代码记录

③ 配置文件 /etc/exports 书写规则

④ 共享权限解释

三、分布式存储 – MFS

1、什么是 MFS?

① MFS 相关介绍

② MFS 的特性说明

③ MFS 缺点

④ MFS 的应用场景

2、MFS 组件说明

① 管理服务器

② 元数据备份服务器.

③ 数据存储服务器组

④ 客户机服务器组

3、数据操作组件之间的协同过程

① MFS的读数据过程

② MFS的写数据过程

③ MFS的删除文件过程

④ MFS修改文件内容的过程

⑤ MFS重命名文件的过程

⑥ MFS遍历文件的过程

4、补充描述

5、MFS 集群构建

① 实验集群拓扑

② 实验代码记录

③、后期维护操作

四、块存储之 ISCSI 服务

1、ISCSI 概述

① ISCSI 与 SCSI 原理差别

2、常见用于 ISCSI 服务的网络拓扑类型

③ ISCSI 工作方式

① 命令行方式 – 临时构建(理解过程)

② 配置文件修改方式 – 永久生效(生产环境使用)

一、集群化存储概述

1、用于存储的网络技术

① DAS Direct-Attached Storage

**说明:**直接附加存储,等同于存储设备通过数据线、光缆、SATA 直连主机

优点

  1. 技术简单
  2. 传输效率最高

**缺点:**存储设备与主机相互绑定,不利于后期扩展与共享

网络拓扑

在这里插入图片描述

② Network Attached Storage

**说明:**网络附加存储,通过网络在存储主机与使用主机之间传输数据

优点

  1. 技术相对简单
  2. 不要求存储设备直连本机,只需在局域网下即可

**缺点:**存储速率较慢

网络拓扑

在这里插入图片描述

③ Storage Area Network

**说明:**存储区域网络,将生产网络与存储网络进行隔离,有效增加各部效率,减轻网络设备压力,适合大并发业务

优点

1)存储安全性较高

2)存储速率较高

缺点

  1. 造价昂贵
  2. 技术难度相对较高

网络拓扑

在这里插入图片描述

2、实现存储的技术分类

① 块存储

常见设备
在这里插入图片描述

优点

  1. 可用通过 Raid、LVM 等简单技术实现高可用
  2. 可独立使用

**缺点:**不利于在多台网络设备之间进行共享

② 文件存储、网络存储

常见设备
在这里插入图片描述

优点

  1. 构建资金较低
  2. 可在不同主机之间共享存储

**缺点:**读写效率低,传输效率慢

③ 对象存储、分布式存储、存储桶

常见设备

在这里插入图片描述

优点

1)读写效率高

2)可在不同主机之间共享存储

缺点

  1. 造价昂贵

    2)技术实现难度较高

3、常见的一些存储名词以及背后使用技术对应关系

文件存储、网络存储 FTP、SAMBA、Apache、Nginx

对象存储、分布式存储、云存储 CEPH、MooseFS、RHCS、ClusterFS

块存储 ISCSI

4、存储实现技术与存储网络之间的联系

① 块存储 + DAS

**结构描述:**块存储直连主机设备是最常见的存储方式,也是后边所有存储方式的基石

结构拓扑

在这里插入图片描述

②块存储 + NAS

**结构描述:**将块设备通过局域网络共享至其它使用主机节点,提升空间利用率,便于后期扩展

结构拓扑

在这里插入图片描述

③ 块存储 + SAN

**结构描述:**将块设备通过局域网络共享至其它使用主机节点,提升空间利用率。并且将用户访问网络与存储网络相隔离,利用提升存储效率以后后期维护扩展

结构拓扑

在这里插入图片描述

④ 文件存储 + NAS

**结构描述:**利用共享服务将文件通过网络传输至使用设备,便于文件在多台机器之间的共享操作

结构拓扑

在这里插入图片描述

⑤ 对象存储 + SAN

**结构描述:**利用分布式文件存储结构提升文件读写并发效率,并且将用户访问网络与存储网络相隔离,利用提升存储效率以后后期维护扩展

结构拓扑
在这里插入图片描述

二、文件存储 – NFS

1、NFS 概述

① 何为 NFS ?

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS最早是由Sun公司发展出来的,后被逐渐完整以及整合至 Linux 内核

② NFS功能

它就是是可以透过网络,让不同的主机、不同的操作系统可以共享存储

③ NFS 原理

NFS 在文件传送或信息传送过程中依赖于 RPC 协议。远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制所以只要用到NFS 的地方都要启动 RPC 服务,不论是 NFS SERVER 或者 NFS CLIENT 。这样 SERVER 和 CLIENT 才能通过 RPC 来实现 PROGRAM PORT 的对应。可以这么理解 RPC 和 NFS 的关系:NFS 是一个文件系统,而 RPC 是负责负责信息的传输

④ NFS 优点

1)节省本地存储空间,将常用的数据存放在一台 NFS 服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用

2)用户不需要在网络中的每个机器上都建有 Home 目录,Home 目录可以放在NFS 服务器上且可以在网络上被访问使用

3)一些存储设备 CDROM 和 Zip 等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量

2、NFS 安装及配置

① 安装软件包介绍

1)nfs-utils: 这个是 NFS 服务主程序(包含rpc.nfsd、rpc.mountd、daemons)

2)rpcbind: 这个是 CentOS6.X 的 RPC 主程序(CentOS5.X的为portmap)

② NFS Server 配置代码记录

yum –y install rpcbind nfs-utils # 服务器端安装 rpcbind 和 NFS-utils 软件包

/etc/init.d/rpcbind status # 查看 rpcbind 当前状态

LANG=en # 查看当前语言

lsof –i :111

rpcinfo –p localhost

/etc/init.d/nfs status

lsof –i :2049

③ 配置文件 /etc/exports 书写规则

/etc/exports文件的配置格式为:

NFS共享目录 NFS客户端地址1(参数1,参数2,参数3…) 客户端地址2(参数1,参数2,参数3…)

NFS共享目录 NFS客户端地址(参数1,参数2,参数3…)

showmount -e ip #查看挂载情况

mount -t nfs ip:/file /file1 # 在客户端进行 NFS 的挂载操作

④ 共享权限解释

rw:read-write,可读写,注意,仅仅这里设置成读写客户端还是不能正常写入,还要正确地设置共享目录的权限 ;

ro:read-only,只读;

sync:文件同时写入硬盘和内存;

async:文件暂存于内存,而不是直接写入内存;

no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的;

root_squash:NFS 客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用 nobody 或 nfsnobody 身份 ;

all_squash:不论 NFS 客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;

anonuid:匿名用户的 UID 值,通常是 nobody 或 nfsnobody,可以在此处自行设定 ;

anongid:匿名用户的GID值;

三、分布式存储 – MFS

1、什么是 MFS?

① MFS 相关介绍

MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问MFS的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样,从其对文件系统的情况看MooseFS就相当于UNIX的文件系统

② MFS 的特性说明

1)高可靠性:每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上

2)高可扩展性:可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的存储量

3)高可容错性:我们可以通过对mfs进行系统设置,实现当数据文件被删除后的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据

4)高数据一致性:即使文件被写入、访问时,我们依然可以轻松完成对文件的一致性快照

③ MFS 缺点

  • master目前是单点,虽然会把数据信息同步到备份服务器,但是恢复需要时间
  • master服务器对主机的内存要求略高
  • 默认metalogger复制元数据时间较长(可调整)

内存使用问题

对于master服务器来说,资源型要求就是内存大小,为了整个系统访问更快,mfs会把所以访问的元数据metadada信息放在内存中提供用户访问,因此,当文件数量增加时,内存使用量就会增加,根据官方说法,处理一百万个文件chunkserver,大概需要300M的内存空间。据此,推算如果未来要出来1个亿的文件chunkserver,大概需要30G内存空间.

④ MFS 的应用场景

1)大规模高并发的线上数据存储及访问(小文件,大文件都适合)

2)大规模的数据处理,如日志分析,小文件强调性能不用HDFS

2、MFS 组件说明

① 管理服务器

管理服务器 managing server 简称 master :这个组件的角色是管理整个mfs文件系统的主服务器,除了分发用户请求外,还用来存储整个文件系统中每个数据文件的metadata信息,metadate(元数据)信息包括文件(也可以是目录,socket,管道,块设备等)的大小,属性,文件的位置路径等

② 元数据备份服务器.

元数据备份服务器 Metadata backup servers 简称metalogger: 这个组件的作用是备份管理服务器master的变化的metadata信息日志文件,文件类型为changelog_ml.*.mfs。以便于在管理服务器出问题时,可以经过简单的操作即可让新的主服务器进行工作

③ 数据存储服务器组

数据存储服务器组data servers(chunk servers)简称data:这个组件就是真正存放数据文件实体的服务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当,当配置数据的副本多于一份时,据写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份

④ 客户机服务器组

客户机服务器组(client servers)简称 client:这个组件就是挂载并使用mfs文件系统的客户端,当读写文件时,客户端首先会连接主管理服务器获取数据的metadata信息,然后根据得到的metadata信息,访问数据服务器读取或写入文件实体,mfs客户端通过fuse mechanism实现挂载mfs文件系统的,因此,只有系统支持fuse,就可以作为客户端访问mfs整个文件系统

3、数据操作组件之间的协同过程

基础结构拓扑

在这里插入图片描述

MFS的读数据过程

1)client当需要一个数据时,首先向master server发起查询请求;

2)管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置ip|port|chunkid;

3)管理服务器将数据服务器的地址发送给客户端;

4)客户端向具体的数据服务器发起数据获取请求;

5)数据服务器将数据发送给客户端;

MFS的写数据过程

1)当客户端有数据写需求时,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如:文件名|大小|份数等);

2)管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块;

3)数据服务器返回创建成功的消息;

4)管理服务器将数据服务器的地址返回给客户端(chunkIP|port|chunkid);

5)客户端向数据服务器写数据;

6)数据服务器返回给客户端写成功的消息;

7)客户端将此次写完成结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间;

MFS的删除文件过程

1)客户端有删除操作时,首先向Master发送删除信息;

2)Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理;

3)响应客户端删除成功的信号

MFS修改文件内容的过程

1)客户端有修改文件内容时,首先向Master发送操作信息;

2)Master申请新的块给.swp文件;

3)客户端关闭文件后,会向Master发送关闭信息;

4)Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块;

5)若无,则直接删除.swp文件块;

MFS重命名文件的过程

1)客户端重命名文件时,会向Master发送操作信息;

2)Master直接修改元数据信息中的文件名;返回重命名完成信息;

MFS遍历文件的过程

1)遍历文件不需要访问chunk server,当有客户端遍历请求时,向Master发送操作信息;

2)Master返回相应元数据信息;

3)客户端接收到信息后显示;

4、补充描述

1)Master记录着管理信息,比如:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等,元数据信息存在于内存中,会定期写入metadata.mfs.back文件中,定期同步到metalogger,操作实时写入changelog.*.mfs,实时同步到metalogger中。master启动将metadata.mfs载入内存,重命名为metadata.mfs.back文件。

2)文件以chunk大小存储,每chunk最大为64M,小于64M的,该chunk的大小即为该文件大小(验证实际chunk文件略大于实际文件),超过64M的文件将被切分,以每一份(chunk)的大小不超过64M为原则;块的生成遵循规则:目录循环写入(00-FF 256个目录循环,step为2)、chunk文件递增生成、大文件切分目录连续。

3)Chunkserver上的剩余存储空间要大于1GB(Reference Guide有提到),新的数据才会被允许写入,否则,你会看到No space left on device的提示,实际中,测试发现当磁盘使用率达到95%左右的时候,就已经不行写入了,当时可用空间为1.9GB。

4)文件可以有多份copy,当goal为1时,文件会被随机存到一台chunkserver上,当goal的数大于1时,copy会由master调度保存到不同的chunkserver上,goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存。

5、MFS 集群构建

① 实验集群拓扑

在这里插入图片描述

② 实验代码记录

Master Server Node:

tar zxf moosefs-3.0.84-1.tar.gz

cd moosefs-3.0.84

useradd mfs -s /sbin/nologin # 创建 MFS 用户,用于 MFS 运行身份

./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs # 编 译 安 装

MFS 软件

make && make install

chmod a+x /usr/local/mfs/sbin/* # 优化配置,使 MFS 命令便于调用

ln -s /usr/local/mfs/sbin/* /usr/local/sbin/

cd /usr/local/mfs/etc/mfs # 启用 MFS-Master 节点配置文件

cp -a mfsmaster.cfg.sample mfsmaster.cfg

cp mfsexports.cfg.sample mfsexports.cfg # 设置 MFS 挂载权限

vim mfsexports.cfg

10.10.10.0/24 . rw,alldirs,maproot=0

cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs # 拷贝MFS 元数据信息文件(初始)

mfsmaster start # 启动 MFS-Master 服务

主配置配置文件说明解释:

WORKING_USER = mfs

WORKING_GROUP = mfs

SYSLOG_IDENT = mfsmaster #在 syslog 中的表示, 说明这是 mfsmaster 产生的

LOCK_MEMORY = 0 # 是否执行 mlockall()以避免 mfsmaster 内存溢出(默认为 0)

NICE_LEVEL = -19 # 运行的优先级(默认-19, 注意, 这进程必须是 root 启动 )

DATA_PATH = /usr/local/mfs/var/mfs # 数 据 存 放 路 径 , 该 目 录 下 有 三 大 类 文 件 ,

changelog,sessions,stats

EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg #被挂载目录以及其权限控制文

件的存放位置

BACK_LOGS = 50 #元数据的改变日志文件数量(默认是 50)

MATOML_LISTEN_HOST = * # 元数据日志服务器监听的 IP 地址(默认是*, 代表任何 IP)

MATOML_LISTEN_PORT = 9419 # 元数据日志服务器监听的端口地址, 默认是 9419

MATOCS_LISTEN_HOST = * # 用于存储服务器(Chunk Server) 连接的 IP 地址

MATOCS_LISTEN_PORT = 9420 # 是存储服务器(Chunk server) 连接的端口地址

REPLICATIONS_DELAY_INIT = 300 # 延迟复制的时间(默认是 300)

CHUNKS_LOOP_MIN_TIME = 300 # chunks 的回环率

CHUNKS_SOFT_DEL_LIMIT = 10

CHUNKS_WRITE_REP_LIMIT = 2,1,1,4 在一个循环里复制到一个 CHUNK Server 的最大 chunks

数目

CHUNKS_READ_REP_LIMIT = 10,5,2,5

MATOCL_LISTEN_PORT = 9421

Metadata Server Node:

useradd mfs -s /sbin/nologin # 创建 MFS 用户,并编译安装 MFS 软件

./configure --prefix=/usr/local/mfs --with-default-user=mfs --withdefault-group=mfs

make && make install

cp mfsmetalogger.cfg.sample mfsmetalogger.cfg # 拷贝 MFS 元数据服务配置文件

vim mfsmetalogger.cfg

META_DOWNLOAD_FREQ = 2 # 设置完整同步间隔为 2 小时

MASTER_HOST = 10.10.10.11 # 设置 MFS-Master 服务器 IP 地址

chmod a+x /usr/local/mfs/sbin/* # 优化 MFS 服务配置,便于命令调用

ln -s /usr/local/mfs/sbin/* /usr/local/sbin/

mfsmetalogger start # 启动 MFS-Logger 服务

lsof -i :9419

cd /usr/local/mfs/var/mfs/

Chunk Server Node:

useradd mfs -s /sbin/nologin # 创建 MFS 用户,给 MFS 运行提供身份

./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-defaultgroup=mfs && make &&

make install # 编译安装 MFS 软件

cd /usr/local/mfs/etc/mfs/

cp mfschunkserver.cfg.sample mfschunkserver.cfg # 拷贝 Chunkserver 配置文件

vim mfschunkserver.cfg

MASTER_HOST = mfsmaster # 指定 MFS-Master 服务器地址

MASTER_PORT = 9420 # 指定 MFS-Master 服务器端口

HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg # 指定提供存储的配置文

件位置

mkdir /mnt/sdb1 # 创建挂载点目录

vim /usr/local/mfs/etc/mfs/mfshdd.cfg # 修改 MFS 服务 HDD 路径

/mnt/sdb1

fdisk /dev/sdb # 分区

partprobe

mkfs.ext4 /dev/sdb1 # 格式化

mount /dev/sdb1 /mnt/sdb1/

chown -R mfs.mfs /mnt/sdb1/

mfschunkserver start # 启动 MFSChunkserver

Client Node:

yum -y install fuse fuse-devel fuse-libs # 安装 Fuse

tar zxf moosefs-3.0.84-1.tar.gz

cd moosefs-3.0.84 # 编译安装 MFS Client 工具

./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-defaultgroup=mfs

–disable-mfsmaster --disable-mfschunkserver && make && make install

/usr/local/mfs/bin/mfsmount /mnt/mfsclient/ -H 10.10.10.12

③、后期维护操作

  1. 误删除处理,垃圾回收站机制

    mfssettrashtime 64800 /mnt/mfs/test1 设置保存时间

    mkdir /back

    chown mfs.mfs /back

    mfsmount -m /back -H 10.10.10.11

    tree . 定位删除文件目录

    mv 002/00000002\|1.txt /back/trash/undel/

    查看恢复文件

  2. 快照功能

    mkdir bb

    chown mfs.mfs bb/

    mfsmakesnapshot 1.txt bb/

    cd bb/

    ll

  3. 冗余 goal 设置

    mfssetgoal 3 /mnt/mfs/test1

    mfssetgoal /mnt/mfs/test1

    mfsfileinfo /mnt/mfs/test1

  4. 还原 master

    mfsmaster -a

四、块存储之 ISCSI 服务

1、ISCSI 概述

① ISCSI 与 SCSI 原理差别

在这里插入图片描述

2、常见用于 ISCSI 服务的网络拓扑类型

1)SAN:Storage Area Network,存储区域网络,多采用高速光纤通道,对速率、冗余性要求高

在这里插入图片描述

2)Network Attachment Storage,网络附加存储,采用普通以太网,对速率、冗余无特别要求

在这里插入图片描述

③ ISCSI 工作方式

1)工作模式 C/S 结构

  • 服务(设备)端 ---- target
  • 客户(应用)端 ---- initiator

2)工作拓扑图

在这里插入图片描述

  1. ISCSI 服务构建记录

命令行方式 – 临时构建(理解过程)

1)lvm整合

pvcreate /dev/sdb # 创建物理卷

vgcreate vg0 /dev/sdb # 创建卷组

lvcreate -L 1G -n lv0 vg0 # 创建逻辑卷

mkfs -t ext4 /dev/vg0/lv0 # 对创建的逻辑卷进行格式化

2)在 target 端创建 IQN 标签

yum -y install scsi-target-utils yum # 安装包,创建iSCSI对象

service tgtd start # 开启服务

netstat -anpt | grep tgtd # 查看服务是否开启

tgtadm -L(指定驱动类型) iscsi -o(制定操作类型) new -m(制定管理的对象) target -t (制定当前存储资源id号)1 -T(制定iqn标签,命名规则:iqn.创建年-月.域名反写:自定义) iqn.2016-2.com.xdl.www:lvm

example:tgtadm -L iscsi -o new -m target -t 1 -T iqn.2016-2.com.xdl.www:lvm

tgtadm -L iscsi -o show -m target # 查看target创建的信息

3)绑定 IQN 标签到存储设备

tgtadm -L(指定驱动类型) iscsi -o new -m(管理的对象) logicalunit -t (tat标签)1 -l(逻辑存储单元的标签) 1 -b(设备名称) /dev/vg0/lv0

tgtadm -L iscsi -o bind -m target -t 1 -I 192.168.66.12

4)客户端配置

yum -y install iscsi-initiator-utils

iscsiadm -m discovery -t st -p(指定服务器IP地址) 192.168.66.11

iscsiadm -m node -T iqn.2016-2.com.xdl.www:lvm --login # 在客户端进行挂载

iscsiadm -m node -T iqn.2016-2.com.xdl.www:lvm --logout # 在客户端进行卸载

vi /etc/fstab 修改自动挂载文件

/dev/sdb /mnt ext4 defaults,_netdev 0 0 (添加)

② 配置文件修改方式 – 永久生效(生产环境使用)

vim /etc/tgt/targets.conf

<target iqn.2016-2.com.xdl.www:lvm>

backing-store /dev/vg0/lv0

initiator-address 192.168.66.12

</target>
2.com.xdl.www:lvm

tgtadm -L iscsi -o show -m target # 查看target创建的信息

3)绑定 IQN 标签到存储设备

tgtadm -L(指定驱动类型) iscsi -o new -m(管理的对象) logicalunit -t (tat标签)1 -l(逻辑存储单元的标签) 1 -b(设备名称) /dev/vg0/lv0

tgtadm -L iscsi -o bind -m target -t 1 -I 192.168.66.12

4)客户端配置

yum -y install iscsi-initiator-utils

iscsiadm -m discovery -t st -p(指定服务器IP地址) 192.168.66.11

iscsiadm -m node -T iqn.2016-2.com.xdl.www:lvm --login # 在客户端进行挂载

iscsiadm -m node -T iqn.2016-2.com.xdl.www:lvm --logout # 在客户端进行卸载

vi /etc/fstab 修改自动挂载文件

/dev/sdb /mnt ext4 defaults,_netdev 0 0 (添加)

② 配置文件修改方式 – 永久生效(生产环境使用)

vim /etc/tgt/targets.conf

<target iqn.2016-2.com.xdl.www:lvm>

backing-store /dev/vg0/lv0

initiator-address 192.168.66.12

</target>

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值