CentOS7 安装ceph(mimic版)

一、系统环境

由ceph1、ceph2、ceph3三台主机组成,其中ceph1、ceph2、ceph3是为Ceph存储集群节点,它们分别作为MON节点和OSD节点,各自拥有专用于存储数据的磁盘设备/dev/sdb,操作系统环境均为CentOS Linux release 7.9.2009。系统最小化安装,配置两块磁盘,一块为系统盘,另一块为裸设备(未做分区格式化)。ceph1上安装ceph-deploy用以部署ceph集群。ceph版本为mimic
在这里插入图片描述

~]#  lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  └─centos-root 253:0    0   99G  0 lvm  /
sdb               8:16   0  100G  0 disk

二、基础配置

最小化安装操作系统,关闭防火墙,禁用SELinux,配置本地域名解析,配置时间同步

~]# systemctl stop firewalld; systemctl disable firewalld; systemctl mask firewalld
~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config && setenforce 0
~]# sed -i '/swap/s/^[^#]/#&/' /etc/fstab 

配置hosts解析

~]#  cat /etc/hosts
192.168.20.61	ceph1
192.168.20.62	ceph2
192.168.20.63	ceph3

配置阿里yum源

~]# curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/Centos-7.repo

安装基础软件,安装epel源

~]# yum -y install bash-completion vim-enhanced net-tools make cmake gcc gcc-c++ zip unzip yum-utils tree wget curl lrzsz epel-release

配置时间同步

~]# yum install chrony -y 
~]# vim /etc/chrony.conf 
server ntp1.aliyun.com iburst 
server ntp2.aliyun.com iburst 
server ntp3.aliyun.com iburst 
allow 192.168.1.0/24     # 只允许192.168.1网段的客户端进行时间同步
~]# systemctl enable chronyd.service; systemctl restart chronyd.service
~]# chronyc sources -v  #说明:^* #已同步

在这里插入图片描述

三、安装ceph集群

安装Ceph官方的仓库 http://download.ceph.com/

~]# rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm

创建部署ceph的特定账号(不要使用ceph),并设置无密码运行sudo命令的权限

~]# useradd cephdep
~]# echo "ceph" | passwd --stdin cephdep 
~]# echo "cephdep ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephdep
~]# chmod 0440 /etc/sudoers.d/cephdep

在ceph1上用cephdep用户配置免秘钥登陆整个集群

~]# su - cephdep
[cephdep@ceph1 ~]$ ssh-keygen -t rsa -b 2048 -N '' ~/.ssh/id_rsa
[cephdep@ceph1 ~]$ ssh-copy-id cephdep@ceph1
[cephdep@ceph1 ~]$ ssh-copy-id cephdep@ceph2
[cephdep@ceph1 ~]$ ssh-copy-id cephdep@ceph3

修改管理节点上cephadm用户的 ~/.ssh/config 文件,设定其访问Ceph集群各节点时默认使用的用户名为cephdep

[cephdep@ceph1 ~]$ vim ~/.ssh/config
Host ceph1
    Hostname ceph1
    User cephdep
Host ceph2
    Hostname ceph2
    User cephdep
Host ceph3
    Hostname ceph3
User cephdep

[cephdep@ceph1 ~]$ chmod 0600 ~/.ssh/config

Ceph存储集群的部署的过程可通过管理节点使用ceph-deploy全程进行,这里首先在管理节点安装ceph-deploy及其依赖到的程序包:

[cephdep@ceph1 ~]$ sudo yum -y install ceph-deploy python-setuptools python2-subprocess32

以cephadm用户创建集群相关的配置文件目录:

[cephdep@ceph1 ~]$ mkdir ceph-cluster; cd ceph-cluster

初始化第MON节点,准备创建集群

[cephdep@ceph1 ceph-cluster]$ ceph-deploy new ceph1 ceph2 ceph3

编辑生成的ceph.conf文件,例如在[global]配置段中设置Ceph集群面向客户端通信时使用的IP地址所在的网络,即公网网络地址:public network = 192.168.20.0/24
安装ceph集群,ceph-deploy命令能够以远程的方式连入Ceph集群各节点完成程序包安装等操作
ceph版本为13.2.10

[cephdep@ceph1 ceph-cluster]$ ceph-deploy install ceph1 ceph2 ceph3
[root@ceph1 ~]# rpm -qa | grep ceph
ceph-deploy-2.0.1-0.noarch
ceph-common-13.2.10-0.el7.x86_64
ceph-mds-13.2.10-0.el7.x86_64
ceph-radosgw-13.2.10-0.el7.x86_64
ceph-release-1-1.el7.noarch
python-cephfs-13.2.10-0.el7.x86_64
ceph-base-13.2.10-0.el7.x86_64
ceph-osd-13.2.10-0.el7.x86_64
ceph-mon-13.2.10-0.el7.x86_64
ceph-13.2.10-0.el7.x86_64
python-ceph-argparse-13.2.10-0.el7.x86_64
libcephfs2-13.2.10-0.el7.x86_64
ceph-selinux-13.2.10-0.el7.x86_64
ceph-mgr-13.2.10-0.el7.x86_64

配置初始MON节点,并收集所有密钥:

[cephdep@ceph1 ceph-cluster]$ ceph-deploy mon create-initial

把配置文件和admin密钥拷贝Ceph集群各节点,以免得每次执行”ceph“命令行时不得不明确指定MON节点地址和ceph.client.admin.keyring;在Ceph集群中需要运行ceph命令的的节点上(或所有节点上)以root用户的身份设定用户cephadm能够读取/etc/ceph/ceph.client.admin.keyring文件

[cephdep@ceph1 ceph-cluster]$ ceph-deploy admin ceph1 ceph2 ceph3
[cephdep@ceph1 ceph-cluster]$ sudo setfacl -m u:cephdep:r /etc/ceph/ceph.client.admin.keyring

配置Manager节点,启动ceph-mgr进程(仅Luminious+版本):

[cephdep@ceph1 ceph-cluster]$ ceph-deploy mgr create ceph1 ceph2

在Ceph集群内的节点上以cephadm用户的身份运行如下命令,测试集群的健康状态:

[cephdep@ceph1 ceph-cluster]$ ceph -s
  cluster:
    id:     1345fb27-3a07-4882-b716-675c61ba612c
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 297 GiB / 300 GiB avail
    pgs  

向RADOS集群添加OSD
“ceph-deploy disk”命令可以检查并列出OSD节点上所有可用的磁盘的相关信息:
[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk list ceph1 ceph2 ceph3
/dev/sda为系统盘在这里插入图片描述
使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD,命令格式
为”ceph-deploy disk zap {osd-server-name} {disk-name}“,需要注意的是此步会清除目标设备上的所有数据。

[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk zap ceph1 /dev/sdb
[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk zap ceph2 /dev/sdb
[cephdep@ceph1 ceph-cluster]$ ceph-deploy disk zap ceph3 /dev/sdb

把节点上的设备/dev/sdb添加为OSD:

[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd create ceph1 --data /dev/sdb   
[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd create ceph2 --data /dev/sdb
[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd create ceph3 --data /dev/sdb

使用”ceph-deploy osd list”命令列出指定节点上的OSD:

[cephdep@ceph1 ceph-cluster]$ ceph-deploy osd list ceph1 ceph2 ceph3

管理员也可以使用ceph命令查看OSD的相关信息:

[cephdep@ceph1 ceph-cluster]$ ceph osd stat
3 osds: 3 up, 3 in; epoch: e13
[cephdep@ceph1 ceph-cluster]$ ceph -s
  cluster:
    id:     1345fb27-3a07-4882-b716-675c61ba612c
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 297 GiB / 300 GiB avail
    pgs    

从RADOS集群中移除OSD的方法
Ceph集群中的一个OSD通常对应于一个设备,且运行于专用的守护进程。在某OSD设备出现故障,或管理员出于管
理之需确实要移除特定的OSD设备时,需要先停止相关的守护进程,而后再进行移除操作。对于Luminous及其之后
的版本来说,停止和移除命令的格式分别如下所示:
1.停用设备:ceph osd out {osd-num}
2.停止进程:sudo systemctl stop ceph-osd@{osd-num}
3.移除设备:ceph osd purge {id} --yes-i-really-mean-it
若类似如下的OSD的配置信息存在于ceph.conf配置文件中,管理员在删除OSD之后手动将其删除。
[osd.1] host = {hostname}
不过,对于Luminous之前的版本来说,管理员需要依次手动执行如下步骤删除OSD设备:
1.于CRUSH运行图中移除设备:ceph osd crush remove {name}
2.移除OSD的认证key:ceph auth del osd.{osd-num}
3.最后移除OSD设备:ceph osd rm {osd-num}

四、ceph集群应用

1、Ceph块设备接口(RBD)

• RBD, 全称RADOS Block Devices, 是一种建构在RADOS存储集群之上为客户端
提供块设备接口的存储服务中间层
• 这类的客户端包括虚拟化程序KVM(结合qemu) 和云的计算操作系统OpenStack和
CloudStack等
• RBD基于RADOS存储集群中的多个OSD进行条带化, 支持存储空间的简配(thinprovisioning) 和动态扩容等特性, 并能够借助于RADOS集群实现快照、 副本和一
致性
• BD自身也是RADOS存储集群的客户端, 它通过将存储池提供的存储服务抽象为一
到多个image(表现为块设备) 向客户端提供块级别的存储接口
• RBD支持两种格式的image, 不过v1格式因特性较少等原因已经处于废弃状态, 当前默认
使用的为v2格式
•客户端访问RBD设备的方式有两种
• 通过内核模块rbd.ko将image映射为节点本地的块设备, 相关的设备文件一般为
/dev/rdb#(#为设备编号, 例如rdb0等)
• 另一种则是librbd提供的API接口, 它支持C/C++和Python等编程语言, qemu即是此类接
口的客户端
例如,下面的命令创建一个名为rbddata的存储池,在启用rbd功能后对其进行初始化:
创建存储池rbdpool,PG数为128,并把存储池rbdpool设置为rbd,执行初始化

[cephdep@ceph1 ceph-cluster]$ ceph osd pool create rbdpool 128
pool 'rbdpool' created
[cephdep@ceph1 ceph-cluster]$ ceph osd pool application enable rbdpool rbd
enabled application 'rbd' on pool 'rbdpool'
[cephdep@ceph1 ceph-cluster]$ rbd pool init -p rbdpool

查看创建的存储池以及PG数

[cephdep@ceph1 ceph-cluster]$ ceph osd lspools
1 rbdpool
[cephdep@ceph1 ceph-cluster]$ ceph osd pool get rbdpool pg_num
pg_num: 128
[cephdep@ceph1 ceph-cluster]$ ceph -s
  cluster:
    id:     1345fb27-3a07-4882-b716-675c61ba612c
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active), standbys: ceph2
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   1 pools, 128 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 297 GiB / 300 GiB avail
    pgs:     128 active+clean

rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。rbd命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快
照和查看快照等管理操作。
创建一个名为img1的镜像,大小为20G
创建的镜像默认具有5个特性features,这些特性可以单独启用或禁用

[cephdep@ceph1 ceph-cluster]$ rbd ls --pool rbdpool
img1
[cephdep@ceph1 ceph-cluster]$ rbd create img1 --size 20G --pool rbdpool
[cephdep@ceph1 ceph-cluster]$ rbd --image img1 --pool rbdpool info
rbd image 'img1':
	size 20 GiB in 5120 objects
	order 22 (4 MiB objects)
	id: 5e846b8b4567
	block_name_prefix: rbd_data.5e846b8b4567
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Fri May 21 22:56:31 2021

禁用镜像特性

[cephdep@ceph1 ceph-cluster]$ rbd feature disable --pool rbdpool --image img1 object-map fast-diff deep-flatten
[cephdep@ceph1 ceph-cluster]$ rbd --image img1 --pool rbdpool info
rbd image 'img1':
	size 20 GiB in 5120 objects
	order 22 (4 MiB objects)
	id: 5e846b8b4567
	block_name_prefix: rbd_data.5e846b8b4567
	format: 2
	features: layering, exclusive-lock
	op_features: 
	flags: 
	create_timestamp: Fri May 21 22:56:31 2021

创建拥有访问相关存储池权限的账号,该账号对mon有只读,对rbdpool存储池有所有权限

[cephdep@ceph1 ~]$ ceph auth get-or-create client.userbd mon 'allow r' osd 'allow * pool=rbdpool'
[client.rbd]
	key = AQCLSahge5jYHBAAEBKEO6+hF8QKB2v6NvienQ==
[cephdep@ceph1 ~]$ ceph auth get client.userbd -o ceph.client.userbd.keyring
[client.rbd]
	key = AQCLSahge5jYHBAAEBKEO6+hF8QKB2v6NvienQ==
[root@ceph1 ceph]# ceph auth get client.userbd -o ceph.client.userbd.keyring
exported keyring for client.userbd
[root@ceph1 ceph]# ls
ceph.client.admin.keyring  ceph.client.userbd.keyring  ceph.conf  rbdmap  tmpbCpHL8

把ceph.conf 和keyring文件复制到客户端(ceph.client.admin.keyring或者ceph.client.userbd.keyring)

在客户端主机上,用户通过内核级的rbd驱动识别相关的设备,即可对其进行分区、创建文件系统并挂载使用。命令modinfo ceph可查看内核是否支持filename: /lib/modules/3.10.0-1160.el7.x86_64/kernel/fs/ceph/ceph.ko.xz
安装ceph-common
[root@hlro ~]# yum -y install ceph-common
拷贝ceph.conf 和keyring文件至/etc/cpeh目录下
[root@hlro ceph]# ls
ceph.client.userbd.keyring ceph.conf rbdmap
把存储池rbdpool下的img1镜像映射至客户端

[root@hlro ceph]# rbd showmapped
[root@hlro ceph]# rbd --user userbd map rbdpool/img1
/dev/rbd0
[root@hlro ceph]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  └─centos-root 253:0    0   99G  0 lvm  /
sr0              11:0    1  973M  0 rom  
rbd0            252:0    0   20G  0 disk 
[root@hlro ceph]# rbd showmapped
id pool    image snap device    
0  rbdpool img1  -    /dev/rbd0 

取消映射用[root@hlro ceph]# rbd unmap /dev/rbd0
对磁盘分区格式化后,挂载使用

[root@hlro ceph]# mkfs.xfs /dev/rbd0
Discarding blocks...Done.
meta-data=/dev/rbd0              isize=512    agcount=16, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@hlro ceph]# mkdir /rbddata; mount /dev/rbd0 /rbddata
[root@hlro ceph]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   99G  2.3G   97G   3% /
/dev/sda1               1014M  151M  864M  15% /boot
tmpfs                    182M     0  182M   0% /run/user/0
/dev/rbd0                 20G   33M   20G   1% /rbddata

2、CephFS

• CephFS用于为RADOS存储集群提供一个POSIX兼容的文件系统接口
• 基于RADOS存储集群将数据与元数据IO进行解耦
• 动态探测和迁移元数据负载到其它MDS, 实现了对元数据IO的扩展
• 第一个稳定版随Jewel版本释出
• 自Luminous版本起支持多活MDS(Multiple Active MDS)
CephFS需要至少运行一个元数据服务器(MDS)守护进程(ceph-mds),此进程管理与CephFS上存储的文件相关
的元数据,并协调对Ceph存储集群的访问。因此,若要使用CephFS接口,需要在存储集群中至少部署一个MDS实

[root@ceph1 ~]# su - cephdep
[cephdep@ceph1 ~]$ cd ceph-cluster/
[cephdep@ceph1 ceph-cluster]$ ceph-deploy mds create ceph1
[cephdep@ceph1 ceph-cluster]$ ceph mds stat
, 1 up:standby

使用CephFS之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。下面创建一个
名为cephfs的文件系统用于测试,它使用cephfs-metadata为元数据存储池,使用cephfs-data为数据存储池:

[cephdep@ceph1 ceph-cluster]$ ceph osd pool create cephfs-metadata 64
pool 'cephfs-metadata' created
[cephdep@ceph1 ceph-cluster]$ ceph osd pool create cephfs-data 64
pool 'cephfs-data' created
[cephdep@ceph1 ceph-cluster]$ ceph fs new cephfs cephfs-metadata cephfs-data
new fs with metadata pool 1 and data pool 2
[cephdep@ceph1 ceph-cluster]$ ceph osd pool ls
cephfs-metadata
cephfs-data
[cephdep@ceph1 ceph-cluster]$ ceph mds stat
cephfs-1/1/1 up  {0=ceph1=up:active}
[cephdep@ceph1 ceph-cluster]$ ceph fs status cephfs
cephfs - 0 clients
======
+------+--------+-------+---------------+-------+-------+
| Rank | State  |  MDS  |    Activity   |  dns  |  inos |
+------+--------+-------+---------------+-------+-------+
|  0   | active | ceph1 | Reqs:    0 /s |   10  |   13  |
+------+--------+-------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 2286  | 93.9G |
|   cephfs-data   |   data   |    0  | 93.9G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)

客户端通过内核中的cephfs文件系统接口即可挂载使用cephfs文件系统,或者通过FUSE接口与文件系统进行交互。
内核文件系统:ceph, libcephfs,客户端安装ceph-common
用户空间文件系统(FUSE):libcephfs,客户端安装ceph-fuse
创建访问存储池授权账号

[cephdep@ceph1 ceph-cluster]$ ceph auth get-or-create client.fsclient mon 'allow r' mds 'allow rw' osd 'allow * pool=cephfs-data,allow * pool=cephfs-metadata' -o ceph.client.fsclient.keyring
[cephdep@ceph1 ceph-cluster]$ ceph auth get client.fsclient 
exported keyring for client.fsclient
[client.fsclient]
	key = AQCgcahgX7+DIhAATyvysu8/A+Z1qRrWBIhQjw==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow * pool=cephfs-data"

内核文件系统挂载:客户端挂载使用需要把key和用户名需要分开指定,即需要把key和用户名分开保存

[cephdep@ceph1 ceph-cluster]$ ceph auth print-key client.fsclient > ceph.client.fsclient.key

客户端安装对应版本的ceph-common

[root@hlro ~]# yum -y install ceph-common

把ceph.conf 和ceph.client.fsclient.key复制到客户端的/etc/ceph
创建挂载点并挂载

[root@hlro ceph]# mkdir /fsdata
[root@hlro ceph]# mount -t ceph ceph1:6789,ceph2:6789,ceph3:6789:/ /fsdata -o name=fsclient,secretfile=/etc/ceph/ceph.client.fsclient.key  #ceph1,2,3为mon运行的节点
[root@hlro ceph]# mount
192.168.20.61:6789,192.168.20.62:6789:/ on /fsdata type ceph (rw,relatime,name=fsclient,secret=<hidden>,acl,wsize=16777216)
设置开机自动挂载
[root@hlro ceph]# vim /etc/fstab
ceph1:6789,ceph2:6789,ceph3:6789/       /fsdata ceph    name=fsclient,secretfile=/etc/ceph/ceph.client.fsclient.key,_netdev,noatime 0 0

用户空间文件系统(FUSE):若内核不支持ceph,则使用该方式(性能不如内核文件系统)
安装对应版本的ceph-fuse
[root@hlro ~]# yum -y install ceph-fuse
把把ceph.conf 和ceph.client.fsclient.keyring文件复制到客户端的/etc/ceph
创建挂载点并挂载

[root@hlro ceph]# mkdir /fsdata
[root@hlro ceph]# ceph-fuse -n client.fsclient -m ceph1:6789,ceph2:6789,ceph3:6789 /fsdata   #ceph1,2,3为mon运行的节点
ceph-fuse[1574]: starting ceph client2021-05-22 11:39:59.684 7f0abcac1c00 -1 init, newargv = 0x5577d4551e00 newargc=7

ceph-fuse[1574]: starting fuse
[root@hlro ceph]# mount
ceph-fuse on /fsdata type fuse.ceph-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
开机自动挂载
[root@hlro ceph]# vim /etc/fstab 
none    /fsdata         fuse.ceph       ceph.id=fsclient,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0
[root@hlro ceph]# vim /etc/fstab
取消挂载后,执行mount -a验证
[root@hlro ceph]# umount /fsdata 
[root@hlro ceph]# mount -a
ceph-fuse[1775]: starting ceph client
2021-05-22 11:48:19.227 7f032d0f1c00 -1 init, newargv = 0x5637a1de7b90 newargc=9
ceph-fuse[1775]: starting fuse
[root@hlro ceph]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   99G  1.7G   98G   2% /
/dev/sda1               1014M  151M  864M  15% /boot
tmpfs                    182M     0  182M   0% /run/user/0
ceph-fuse                 94G     0   94G   0% /fsdata
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值