iscsi

本文详细介绍了在CentOS7环境中如何部署iSCSI存储共享及GFS2集群文件系统。从iSCSI的配置、存储的导出与导入,到使用pacemaker构建集群环境,再到GFS2集群文件系统的创建与维护,提供了完整的步骤与注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iscsi是存储共享,和NFS等网络文件系统不同的是,NFS以文件为最小单位,挂载目录使用,文件系统在server端。这个ISCSI是将硬盘分区直接共享出去,在客户端进行文件系统的创建。

在centos7环境部署iscsi:

实验1:1个导出端,1个导入端

storage 172.16.0.50
node1 172.16.0.51

准备工作要完成。

1、 配置存储端

[root@storage ~]# pvcreate /dev/sdb
[root@storage ~]# vgcreate vgs /dev/sdb
[root@storage ~]# lvcreate -L 5G -n iscsi1 vgs
[root@storage ~]# lvs
  LV     VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   centos -wi-ao---- 20.00g                                                    
  swap   centos -wi-ao----  2.00g                                                    
  iscsi1 vgs    -wi-a-----  5.00g 	<-----

要有epel源
安装软件

[root@storage ~]# yum install -y scsi-target-utils
[root@storage ~]# cd /etc/tgt/
[root@storage /etc/tgt]# ls
conf.d  targets.conf  tgtd.conf
[root@storage /etc/tgt]# vim targets.conf 
	结尾添加
<target iqn.2019-12.com.up.storage:iscsi1>	//IQN号,是存储的唯一标识
//写法:iqn.年-月.主机名倒序:名字
    backing-store   /dev/vgs/iscsi1			//导出的存储设备
    write-cache off							//关闭写缓存
</target>
[root@storage ~]# systemctl start tgtd
[root@storage ~]# systemctl enable tgtd
[root@storage ~]# netstat -antp | grep tgtd
tcp        0      0 0.0.0.0:3260    0.0.0.0:*  LISTEN      1095/tgtd
tcp6       0      0 :::3260         :::*       LISTEN      1095/tgtd

查看导出的存储:

[root@storage ~]# tgtadm --lld iscsi --mode target --op show
Target 1: iqn.2019-12.com.up.storage:iscsi1
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 5369 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: rdwr
            Backing store path: /dev/vgs/iscsi1
            Backing store flags: 

2、 导入端

[root@node1 ~]# yum install -y iscsi-initiator-utils

发现存储:

[root@node1 ~]# iscsiadm -m discovery -t st -p 172.16.0.50
172.16.0.50:3260,1 iqn.2019-12.com.up.storage:iscsi1

导入存储:

[root@node1 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi1 -p 172.16.0.50 -l

Logging in to [iface: default, target: iqn.2019-12.com.up.storage:iscsi1, portal: 172.16.0.50,3260] (multiple)
Login to [iface: default, target: iqn.2019-12.com.up.storage:iscsi1, portal: 172.16.0.50,3260] successful.

使用存储:

[root@node1 ~]# ls /dev/sdb
/dev/sdb

可以直接创建pv
可以分区
可以直接格式化

把这个设备看做是本机的第二块硬盘。

实验2:1个导出端 2个导入端

这样做完后,同一个存储挂载到两个节点上去,创建文件的innde码相同。

[root@node1 /mnt/sdb1]# ls -i f1 
67 f1
[root@node2 /mnt/sdb1]# ls -i f2
67 f2

最终哪个文件会写入存储,未知。

单机环境的文件系统,不适用于iscsi。

解决:集群文件系统

redhat:
    GFS2 全局文件系统第二版
    允许所有的节点并行访问,理论上支持8EB的文件系统,实际上支持100TB;节点的最大数量是16个。
    如果存储空间不足,支持lvm(C-Cluster lvm)拉伸,

oracle:
    OCFS2用户OVM云环境
vmware:
    VMFS用于esxi云虚拟化环境

GFS2名词解释:
【1】节点 集群的节点
    使用GFS2,需要构建集群环境
      centos6用 conga(luci ricci)
      centos7用 pacemaker
【2】文件系统数量
    约束可以使用集群文件系统的节点数
【3】文件系统名称
    集群名:文件系统名
      在同一个局域网,集群名不可以重复
【4】日志
    用来保存文件系统信息

常用的命令:
    mount umount
fsck.gfs2:检查并修复文件系统,要求文件系统必须处于clean状态,比较耗时的。
    一定要卸载
    一定要在没有业务的时间段进行

    mkfs.gfs2:创建文件系统
    gfs2_jadd:增加节点数
    gfs2_grow:拉伸文件系统

开始实验:

tail -4 /etc/hosts
172.16.0.50	storage.up.com	storage
172.16.0.51	node1.up.com	node1
172.16.0.52	node2.up.com	node2
172.16.0.53	node3.up.com	node3

1、 存储端

重新准备

[root@storage ~]# pvcreate /dev/sdb
[root@storage ~]# vgcreate vgs /dev/sdb
[root@storage ~]# lvcreate -L 5G -n iscsi1 vgs
[root@storage ~]# yum install -y scsi-target-utils
[root@storage ~]# vim /etc/tgt/targets.conf
<target iqn.2019-12.com.up.storage:iscsi1>
    backing-store   /dev/vgs/iscsi1
    write-cache off
</target>
[root@storage ~]# systemctl start tgtd
[root@storage ~]# systemctl enable tgtd
[root@storage ~]# tgtadm --lld iscsi --mode target --op show
Target 1: iqn.2019-12.com.up.storage:iscsi1

2、 导入端 node1 node2

[root@node1 ~]# yum install -y iscsi-initiator-utils
[root@node2 ~]# yum install -y iscsi-initiator-utils

发现并导入存储:

[root@node1 ~]# iscsiadm -m discovery -t st -p 172.16.0.50
[root@node1 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi1 -p 172.16.0.50 -l
[root@node2 ~]# iscsiadm -m discovery -t st -p 172.16.0.50
[root@node2 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi1 -p 172.16.0.50 -l
[root@node1 ~]# ls /dev/sdb
/dev/sdb
[root@node2 ~]# ls /dev/sdb
/dev/sdb

部署集群环境:
centos7使用pacemaker。
node1

[root@node1 ~]# yum install -y pcs pacemaker corosync fence-agents-all

[root@node1 ~]# systemctl start pcsd
[root@node1 ~]# systemctl enable pcsd

node2

[root@node2 ~]# yum install -y pcs pacemaker corosync fence-agents-all

[root@node2 ~]# systemctl start pcsd
[root@node2 ~]# systemctl enable pcsd

设置用户的密码:
node1和node2

[root@node1 ~]# echo "ABC123qwe#" | passwd --stdin hacluster
[root@node2 ~]# echo "ABC123qwe#" | passwd --stdin hacluster

验证节点:

[root@node1 ~]# pcs cluster auth node1 node2
Username: hacluster     //这个是用户
Password: ABC123qwe#	//这个是设置的密码
node1: Authorized
node2: Authorized

创建集群:

[root@node1 ~]# pcs cluster setup --start --name cluster0 node1 node2
同局域网内名字不能重复。。

启动集群:

[root@node1 ~]# pcs cluster start --all

[root@node1 ~]# pcs cluster enable --all

查看集群的状态:

[root@node1 ~]# pcs cluster status
PCSD Status:
  node1: Online
  node2: Online  看到这个online就是ok了

构建集群文件系统:

[root@node1 ~]# yum install -y gfs2-utils lvm2-sysvinit lvm2-cluster
[root@node2 ~]# yum install -y gfs2-utils lvm2-sysvinit lvm2-cluster

创建lvm:

[root@node1 ~]# pvcreate /dev/sdb
[root@node1 ~]# vgcreate cvg0 /dev/sdb
[root@node1 ~]# lvcreate -L 2G -n clv01 cvg0

这时创建pv vg lv等,node1创建node2 也能同步看到。

[root@node2 ~]# pvs
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sda2  centos lvm2 a--  22.00g  4.00m
  /dev/sdb   cvg0   lvm2 a--  <5.00g <3.00g
[root@node2 ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  centos   1   2   0 wz--n- 22.00g  4.00m
  cvg0     1   1   0 wz--n- <5.00g <3.00g
[root@node2 ~]# lvs
  LV    VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  centos -wi-ao---- 20.00g                                                    
  swap  centos -wi-ao----  2.00g                                                    
  clv01 cvg0   -wi-------  2.00g 

让lvm支持集群:

[root@node1 ~]# lvmconf --enable-cluster
[root@node2 ~]# lvmconf --enable-cluster
[root@node1 ~]# vim /etc/lvm/lvm.conf
 785     locking_type = 3	#<--
上边的命令就是修改配置文件中这一行内容。

启动服务:

[ro**加粗样式**ot@node1 ~]# systemctl start dlm
[root@node1 ~]# systemctl enable dlm
[root@node2 ~]# systemctl start dlm
[root@node2 ~]# systemctl enable dlm

dlm 分布式锁协议,在集群文件系统,锁定文件

[root@node1 ~]# /etc/init.d/clvmd start
[root@node1 ~]# chkconfig clvmd on
[root@node2 ~]# /etc/init.d/clvmd start
[root@node2 ~]# chkconfig clvmd on

clvmd 集群模式的lvm

创建集群文件系统:

[root@node1 ~]# mkfs.gfs2 -p lock_dlm -j 2 -t cluster0:clv01 /dev/cvg0/clv01 
	-p	指定分布式锁协议
	-j	指定节点数
	-t	指定文件系统名
		集群名:文件系统名
**挂载使用:**
[root@node1 ~]# mkdir /mnt/clv01 
[root@node1 ~]# mount /dev/cvg0/clv01 /mnt/clv01/
[root@node2 ~]# mkdir /mnt/clv01
[root@node2 ~]# mount /dev/cvg0/clv01 /mnt/clv01/

[root@node1 ~]# cd /mnt/clv01/
[root@node1 /mnt/clv01]# ls
[root@node1 /mnt/clv01]# touch f1
[root@node1 /mnt/clv01]# ls
f1

[root@node2 ~]# cd /mnt/clv01/
[root@node2 /mnt/clv01]# ls
f1
[root@node2 /mnt/clv01]# touch f2
[root@node2 /mnt/clv01]# ls -i *
 8761 f1  72746 f2

这时的innde码不同了。

维护阶段:
集中存储应该挂载在 /var/www/html 。

在kvm虚拟化环境,导入的第一块硬盘是sda。

开机自动挂载:
存储节点启动完成,一切正常。才可以启动计算节点。
所以要使用/etc/rc.local实现开机挂载。而不能用fstab,因为这个要启动很多的服务才能挂载,fstab则是在开机时启动服务之前执行的。
mount /dev/cvg0/clv01 挂载点

卸载和删除:

[root@node1 ~]# umount /mnt/clv01/
[root@node2 ~]# umount /mnt/clv01/
lvremove /dev/cvg0/clv01 
vgremove cvg0
pvremove /dev/sdb
pvs
lvs
vgs

[root@node1 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi1 -p 172.16.0.50 -u
[root@node1 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi1 -p 172.16.0.50 -o delete

或者

[root@node2 ~]# systemctl stop iscsi
[root@node2 ~]# systemctl stop iscsid

[root@node2 /var/lib/iscsi]# ls nodes/
iqn.2019-12.com.up.storage:iscsi1
[root@node2 /var/lib/iscsi]# ls send_targets/
172.16.0.50,3260

[root@node2 /var/lib/iscsi]# rm -fr nodes/*
[root@node2 /var/lib/iscsi]# rm -fr send_targets/*

删除这两个文件目录。

其他操作,增加节点扩容等等

# tail -4 /etc/hosts
172.16.0.50	storage.up.com	storage
172.16.0.51	node1.up.com	node1
172.16.0.52	node2.up.com	node2
172.16.0.53	node3.up.com	node3

1、 存储端导出存储

[root@storage ~]# pvcreate /dev/sdb
[root@storage ~]# vgcreate vgs /dev/sdb
[root@storage ~]# lvcreate -L 5G -n iscsi1 vgs
[root@storage ~]# yum install -y scsi-target-utils
[root@storage ~]# vim /etc/tgt/targets.conf 
<target iqn.2019-12.com.up.storage:iscsi1>
    backing-store   /dev/vgs/iscsi1
    write-cache off
</target>
[root@storage ~]# systemctl start tgtd
[root@storage ~]# systemctl enable tgtd
[root@storage ~]# tgtadm --lld iscsi --mode target --op show
Target 1: iqn.2019-12.com.up.storage:iscsi1

2、 导入端 node1 node2

导入存储

[root@node1 ~]# yum install -y iscsi-initiator-utils
[root@node2 ~]# yum install -y iscsi-initiator-utils

[root@node1 ~]# iscsiadm -m discovery -t st -p 172.16.0.50
[root@node1 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi1 -p 172.16.0.50 -l

部署集群

[root@node1 ~]# yum install -y pcs pacemaker corosync fence-agents-all
[root@node2 ~]# yum install -y pcs pacemaker corosync fence-agents-all

启动服务

[root@node1 ~]# systemctl start pcsd
[root@node2 ~]# systemctl start pcsd
[root@node1 ~]# systemctl enable pcsd
[root@node2 ~]# systemctl enable pcsd

设置密码

[root@node1 ~]# echo "ABC123qwe#" | passwd --stdin hacluster
[root@node2 ~]# echo "ABC123qwe#" | passwd --stdin hacluster
[root@node1 ~]# pcs cluster auth node1 node2
Username: hacluster
Password: 
node1: Authorized
node2: Authorized
[root@node1 ~]# pcs cluster setup --start --name cluster0 node1 node2
创建集群

[root@node1 ~]# pcs cluster start --all
[root@node1 ~]# pcs cluster enable --all
启动集群
[root@node1 ~]# pcs cluster status
PCSD Status:
  node1: Online
  node2: Online
集群状态

部署clvm

[root@node1 ~]# yum install -y gfs2-utils lvm2-sysvinit lvm2-cluster
[root@node2 ~]# yum install -y gfs2-utils lvm2-sysvinit lvm2-cluster

[root@node1 ~]# lvmconf --enable-cluster
[root@node2 ~]# lvmconf --enable-cluster
[root@node1 ~]# pvcreate /dev/sdb
[root@node1 ~]# vgcreate cvg0 /dev/sdb
[root@node1 ~]# lvcreate -L 1G -n clv01 cvg0
[root@node2 ~]# pvs 2> /dev/null | tail -2
  /dev/sda2  centos lvm2 a--  22.00g  4.00m
  /dev/sdb   cvg0   lvm2 a--  <5.00g <4.00g
[root@node2 ~]# vgs 2> /dev/null | tail -2
  centos   1   2   0 wz--n- 22.00g  4.00m
  cvg0     1   1   0 wz--n- <5.00g <4.00g
[root@node2 ~]# lvs 2> /dev/null | tail -2
  swap  centos -wi-ao----  2.00g                                                    
  clv01 cvg0   -wi-------  1.00g 
[root@node1 ~]# systemctl start dlm
[root@node1 ~]# systemctl enable dlm
[root@node2 ~]# systemctl start dlm
[root@node2 ~]# systemctl enable dlm

[root@node1 ~]# /etc/init.d/clvmd start
[root@node1 ~]# chkconfig clvmd on
[root@node2 ~]# /etc/init.d/clvmd start
[root@node2 ~]# chkconfig clvmd on

创建集群文件系统

[root@node1 ~]# mkfs.gfs2 -p lock_dlm -j 2 -t cluster0:clv01 /dev/cvg0/clv01

安装apache留作测试用

[root@node1 ~]# yum install -y httpd
[root@node2 ~]# yum install -y httpd

[root@node1 ~]# mount /dev/cvg0/clv01 /var/www/html/
[root@node1 ~]# echo "mount /dev/cvg0/clv01 /var/www/html/" >> /etc/rc.local 
[root@node1 ~]# chmod +x /etc/rc.d/rc.local 
[root@node2 ~]# mount /dev/cvg0/clv01 /var/www/html/
[root@node2 ~]# echo "mount /dev/cvg0/clv01 /var/www/html/" >> /etc/rc.local 
[root@node2 ~]# chmod +x /etc/rc.d/rc.local 

[root@node1 ~]# echo "gfs2_apache_0" > /var/www/html/index.html 

[root@node1 ~]# systemctl start httpd
[root@node1 ~]# echo "systemctl start httpd" >> /etc/rc.local
[root@node2 ~]# systemctl start httpd
[root@node2 ~]# echo "systemctl start httpd" >> /etc/rc.local

[root@storage ~]# curl 172.16.0.51
gfs2_apache_0
[root@storage ~]# curl 172.16.0.52
gfs2_apache_0

加入第三节点
装一堆包

[root@node3 ~]# yum install -y iscsi-initiator-utils
[root@node3 ~]# yum install -y pcs pacemaker corosync fence-agents-all
[root@node3 ~]# yum install -y gfs2-utils lvm2-sysvinit lvm2-cluster
[root@node3 ~]# yum install -y httpd

发现和导入存储

[root@node3 ~]# iscsiadm -m discovery -t st -p 172.16.0.50
[root@node3 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi1 -p 172.16.0.50 -l
[root@node3 ~]# systemctl start pcsd
[root@node3 ~]# systemctl enable pcsd
[root@node3 ~]# echo "ABC123qwe#" | passwd --stdin hacluster

就能看到有3个节点

[root@node1 ~]# pcs cluster auth node1 node2 node3
Username: hacluster
Password: 
node1: Authorized
node3: Authorized
node2: Authorized

将node3加入集群:

[root@node1 ~]# pcs cluster node add node3

心跳配置文件:

[root@node1 ~]# vim /etc/corosync/corosync.conf

资源配置文件:

[root@node1 ~]# vim /var/lib/pacemaker/cib/cib.xml
[root@node3 ~]# pcs cluster start node3
启动3

[root@node1 ~]# pcs cluster status
PCSD Status:
  node3: Online
  node1: Online
  node2: Online
  查看状态有3个连接
[root@node3 ~]# pvs
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sda2  centos lvm2 a--  22.00g  4.00m
  /dev/sdb   cvg0   lvm2 a--  <5.00g <4.00g	<--
[root@node3 ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree 
  centos   1   2   0 wz--n- 22.00g  4.00m
  cvg0     1   1   0 wz--n- <5.00g <4.00g	<--
[root@node3 ~]# lvs
  LV    VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  centos -wi-ao---- 20.00g                                                    
  swap  centos -wi-ao----  2.00g                                                    
  clv01 cvg0   -wi-a-----  1.00g 	<--
[root@node3 ~]# systemctl start dlm
[root@node3 ~]# systemctl enable dlm

[root@node3 ~]# lvmconf --enable-cluster

[root@node3 ~]# /etc/init.d/clvmd start
[root@node3 ~]# chkconfig clvmd on

挂载报错,因为之前设置的连接数有2个,到上限了

[root@node3 ~]# mount /dev/cvg0/clv01 /var/www/html/
mount: mount /dev/mapper/cvg0-clv01 on /var/www/html failed: Too many users

增加一个节点数:

[root@node1 ~]# gfs2_jadd -j 1 /var/www/html
Filesystem: /var/www/html
Old journals: 2
New journals: 3

在挂载就没问题了

[root@node3 ~]# mount /dev/cvg0/clv01 /var/www/html/

[root@node3 ~]# systemctl start httpd

[root@storage ~]# curl 172.16.0.53
gfs2_apache_0

拉伸lv
【1】VG空间充足

[root@node3 ~]# lvextend -L 4G /dev/cvg0/clv01
	||
[root@node3 ~]# lvcreate -L + 3G /dev/cvg0/clv01		这个最好别用!!!如果中间+打错,就会变成将lv变为3G原来有100G也会变成3G

[root@node3 ~]# lvs 2> /dev/null | tail -1
  clv01 cvg0   -wi-ao----  4.00g 

[root@node3 ~]# gfs2_grow /var/www/html

[root@node3 ~]# df -h | tail -1
/dev/mapper/cvg0-clv01   4.0G  164M  3.9G   4% /var/www/html

【2】VG空间不足
在存储节点上再导出一个存储:

[root@storage ~]# lvcreate -L 6G -n iscsi2 vgs
[root@storage ~]# vim /etc/tgt/targets.conf
<target iqn.2019-12.com.up.storage:iscsi1>
    backing-store   /dev/vgs/iscsi1
    write-cache off
</target>
<target iqn.2019-12.com.up.storage:iscsi2>	#<--增加
    backing-store   /dev/vgs/iscsi2
    write-cache off
</target>
[root@storage ~]# systemctl reload tgtd
	千万不能restart!!!
[root@storage ~]# tgtadm --lld iscsi --mode target --op show
Target 1: iqn.2019-12.com.up.storage:iscsi1
Target 2: iqn.2019-12.com.up.storage:iscsi2

3个节点发现并导入存储:

[root@node1 ~]#  iscsiadm -m discovery -t st -p 172.16.0.50
[root@node1 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi2 -p 172.16.0.50 -l
[root@node2 ~]#  iscsiadm -m discovery -t st -p 172.16.0.50
[root@node2 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi2 -p 172.16.0.50 -l
[root@node3 ~]#  iscsiadm -m discovery -t st -p 172.16.0.50
[root@node3 ~]# iscsiadm -m node -T iqn.2019-12.com.up.storage:iscsi2 -p 172.16.0.50 -l

lsblk查看信息

[root@node3 ~]# pvcreate /dev/sdc
[root@node3 ~]# vgextend cvg0 /dev/sdc
[root@node3 ~]# vgs
  cvg0     2   1   0 wz--n- 10.99g 6.99g

[root@node3 ~]# lvextend -L 7G /dev/cvg0/clv01
[root@node3 ~]# lvs
  clv01 cvg0   -wi-ao----  7.00g

[root@node3 ~]# gfs2_grow /var/www/html

okl

资源下载链接为: https://pan.quark.cn/s/3d8e22c21839 随着 Web UI 框架(如 EasyUI、JqueryUI、Ext、DWZ 等)的不断发展与成熟,系统界面的统一化设计逐渐成为可能,同时代码生成器也能够生成符合统一规范的界面。在这种背景下,“代码生成 + 手工合并”的半智能开发模式正逐渐成为新的开发趋势。通过代码生成器,单表数据模型以及一对多数据模型的增删改查功能可以被直接生成并投入使用,这能够有效节省大约 80% 的开发工作量,从而显著提升开发效率。 JEECG(J2EE Code Generation)是一款基于代码生成器的智能开发平台。它引领了一种全新的开发模式,即从在线编码(Online Coding)到代码生成器生成代码,再到手工合并(Merge)的智能开发流程。该平台能够帮助开发者解决 Java 项目中大约 90% 的重复性工作,让开发者可以将更多的精力集中在业务逻辑的实现上。它不仅能够快速提高开发效率,帮助公司节省大量的人力成本,同时也保持了开发的灵活性。 JEECG 的核心宗旨是:对于简单的功能,可以通过在线编码配置来实现;对于复杂的功能,则利用代码生成器生成代码后,再进行手工合并;对于复杂的流程业务,采用表单自定义的方式进行处理,而业务流程则通过工作流来实现,并且可以扩展出任务接口,供开发者编写具体的业务逻辑。通过这种方式,JEECG 实现了流程任务节点和任务接口的灵活配置,既保证了开发的高效性,又兼顾了项目的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值