数据库应用----MongoDB 3.2 版本 基础操作--分片群集以及如何进行分片管理(三)

MongoDB 3.2 版本 基础操作–分片群集以及如何进行分片管理(三)

一、副本的概念

主从复制和副本集区别
主从集群和制本集最大的区别就是副本集没有固定的“主节点";副本整个集群会选出一个主节点当其挂掉后,又在剩下的从节点中选中其他节点为"主节点"。副本集总有一个活跃点(主primary和一 个或多个备份节点(从secondary)。

1、副本集的两种类型

副本集有两种类型三种角色
两种类型:
主节点(Primary) 类型:数据操作的主要连接点,可读写.
次要(辅助、从)节点(Secondaries) 类型:数据冗余备份节点,可以读或选举。

2、三种角色:

主要成员(Primary) :主要接收所有写操作。就是主节点。
副本成员(Replicate) :从主节点通过复制操作以维护相同的数据集。即备份数据,可写操作,但可以读操作但需要配置。是默认的一种从节点类型。
仲裁者(Arbiter) :不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。

3、缺点

相当于只从复制 master宕机后就凉了 ,为了实现高可用,就不得不介绍一下分片的概念了

二、分片概念

分片(sharding) 是一种跨多 台机器分布数据的方法,MongoDB使用分 片来支持具有非常大的数据集和高吞吐量操作的部署。
换句话说:分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。有时也用分区(partitioning)来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载。
具有大型数据集或高吞吐量应用程序的数据库系统可以会挑战单个服务器的容量。例如,高查询率会耗尽服务器的CPU容量。工作集大小大于系统的RAM会强调磁盘驱动器的I / 0容量。

有两种解决系统增长的方法:垂直扩展和水平扩展。

垂直扩展意味着增加单个服务器的容量,例如使用更强大的CPU,添加更多RAM或增加存储空间量。可用技术的局限性可能会限制单个机器对于给定工作负载而言足够强大。此外,基于云的提供商基于可用的硬件配置具有硬性
上限。结果,垂直缩放有实际的最大值。
水平扩展意味着划分系统数据集并加载多个服务器,添加其他服务器以根据需要增加容量。虽然单个机器的总体速度或容量可能不高,但每台机器处理整个工作负载的子集,可能提供比单个高速大容量服务器更高的效率。扩展部署容量只需要根据需要添加额外的服务器,这可能比单个机器的高端硬件的总体成本更低。权衡是基础架构和部署维护的复杂性增加。
MongoDB支持通过分片进行水平扩展。

三、分片集群包含的组件

MongoDB分片群集包含以下组件: .
●分片(存储)shard:每个分片包含分片数据的子集。 每个分片都可以部署为副本集。
●mongos (路由) : mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口。
●config servers (“调度"的配置) : 配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)。
下图描述了分片集群中组件的交互:
在这里插入图片描述

四、部署 MongoDB 分片群集

1、环境准备

mongodb3.2 软件包

2、拓扑图

mark

创建多实例的数据目录和日志文件;
修改ulimit -n 和ulimit -u 的值为25000;

3、环境搭建

tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
cd /opt
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{1,2,3,4}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4}.log
chmod -R 777 /data/mongodb/logs/*.log
ulimit -n 25000        //临时修改 重启后失效   指定同一时间最多可打开的文件数
ulimit -u 25000        //临时修改 重启后失效   用户最多可启动的进程数目。
创建软连接:
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod

4、config配置服务器

vim /usr/local/mongodb/bin/mongodb1.conf
#添加以下内容
port=37017       端口
dbpath=/data/mongodb/mongodb1     数据存储位置
logpath=/data/mongodb/logs/mongodb1.log   日志存储位置
logappend=true      mongos或mongod会将新条目附加到现有日志文件的末尾。
fork=true                   启用在后台运行mongos或mongod进程的守护进程模式                         
maxConns=5000       最大连接数
storageEngine=mmapv1     引擎
configsvr=true     指定配置服务器
启动:

mongod -f /usr/local/mongodb/bin/mongodb1.conf   
mongo --port 37017   //查看端口是否正常开放
netstat -ntap | grep mongod
tcp        0      0 0.0.0.0:37017           0.0.0.0:*               LISTEN      9788/mongod

5、shard服务器

cp -p mongodb1.conf mongodb2.conf
vim mongodb2.conf
   port=47017
    dbpath=/data/mongodb/mongodb2
    logpath=/data/mongodb/logs/mongodb2.log
    logappend=true
    fork=true
    maxConns=5000
    storageEngine=mmapv1
    shardsvr=true
mongod -f /usr/local/mongodb/bin/mongodb2.conf
cp -p mongodb1.conf mongodb3.conf
vim mongodb3.conf
    port=47018
    dbpath=/data/mongodb/mongodb3
    logpath=/data/mongodb/logs/mongodb3.log
    logappend=true
    fork=true
    maxConns=5000
    storageEngine=mmapv1
    shardsvr=true
    启动:

mongod -f /usr/local/mongodb/bin/mongodb3.conf   '启动服务'

[root@localhost bin]# netstat -ntap | grep mongod
tcp        0      0 0.0.0.0:47017           0.0.0.0:*               LISTEN      9846/mongod         
tcp        0      0 0.0.0.0:47018           0.0.0.0:*               LISTEN      9862/mongod         
tcp        0      0 0.0.0.0:37017           0.0.0.0:*               LISTEN      9788/mongod

6、当某节点内存不足时,从其他节点分配内存

sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongod

7、启动路由服务器

–port指定对方连接入口27017
–fork后台运行
–logpath指定日志文件存储路径
–configdb指定给谁处理

[root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.100.150:37017 --chunkSize 1
2020-09-20T11:52:32.727+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.
about to fork child process, waiting until server is ready for connections.
forked process: 10103
child process started successfully, parent exiting

8、设置分片

mongo "进入"
mongos> sh.addShard("192.168.100.150:47017")
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.100.150:47018")
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f66d200f455f68530a8e5f5")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.100.150:47017" }
	{  "_id" : "shard0001",  "host" : "192.168.100.150:47018" }
  active mongoses:
	"3.2.1" : 1
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		No recent migrations
  databases:

五、分片

1. 分片功能

[root@localhost bin]# pwd
/usr/local/mongodb/bin
[root@localhost bin]# ./mongoimport -d li -c users --file /opt/testdb.txt
2020-09-12T21:29:45.069+0800	Failed: open /opt/testdb.txt: no such file or directory
2020-09-12T21:29:45.069+0800	imported 0 documents
[root@localhostl
mongos> use li
switched to db li
mongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"jack"+i})
	WriteResult({ "nInserted" : 1 })
mongos>  show dbs
config  0.031GB
li      0.078GB
mongos> use li
switched to db li
mongos> show collections
system.indexes
users
mongos> db.users.find().limit(5)
{ "_id" : ObjectId("5f5ccd691c0317987a70f828"), "id" : 1, "name" : "jack1" }
{ "_id" : ObjectId("5f5ccd691c0317987a70f829"), "id" : 2, "name" : "jack2" }
{ "_id" : ObjectId("5f5ccd691c0317987a70f82a"), "id" : 3, "name" : "jack3" }
{ "_id" : ObjectId("5f5ccd691c0317987a70f82b"), "id" : 4, "name" : "jack4" }
{ "_id" : ObjectId("5f5ccd691c0317987a70f82c"), "id" : 5, "name" : "jack5" }
mongos> sh.status()          '查看数据库分片信息'
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f66d200f455f68530a8e5f5")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.100.150:47017" }
	{  "_id" : "shard0001",  "host" : "192.168.100.150:47018" }
  active mongoses:
	"3.2.1" : 1
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		No recent migrations
  databases:
	{  "_id" : "li",  "primary" : "shard0000",  "partitioned" : false }

mongos> sh. enableSharding("li")         启用数据库分片'
{ "ok" : 1 }
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f66d200f455f68530a8e5f5")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.100.150:47017" }
	{  "_id" : "shard0001",  "host" : "192.168.100.150:47018" }
  active mongoses:
	"3.2.1" : 1
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		No recent migrations
  databases:
	{  "_id" : "li",  "primary" : "shard0000",  "partitioned" : true }
mongos> db.users.createIndex( {"id":1})            '对users表创建索引'
{
	"raw" : {
		"192.168.100.150:47017" : {
			"createdCollectionAutomatically" : false,
			"numIndexesBefore" : 1,
			"numIndexesAfter" : 2,
			"ok" : 1
		}
	},
	"ok" : 1
}

mongos> sh.shardCollection("li.users",{"id":1})	 '表分片'
{ "collectionsharded" : "li.users", "ok" : 1 }

--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f66d200f455f68530a8e5f5")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.100.150:47017" }
	{  "_id" : "shard0001",  "host" : "192.168.100.150:47018" }
  active mongoses:
	"3.2.1" : 1
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		1 : Success
  databases:
	{  "_id" : "li",  "primary" : "shard0000",  "partitioned" : true }
		li.users
			shard key: { "id" : 1 }
			unique: false
			balancing: true
			chunks:
				shard0000	2
				shard0001	1
			{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0) 
			{ "id" : 4682 } -->> { "id" : 9364 } on : shard0000 Timestamp(2, 1) 
			{ "id" : 9364 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 2) 

mongos> 

2.分片管理

mongos> show dbs
config  0.031GB
li      0.156GB
mongos> use li
switched to db li
mongos> for(var i=1;i<=50000;i++)db.users2.insert({"id":i,"name":"tom"+1})
WriteResult({ "nInserted" : 1 })
mongos> db.users2.count()
50000
mongos> db.users2.find().limit(10)     '查看前10行'
{ "_id" : ObjectId("5f5cce411c0317987a711f38"), "id" : 1, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f39"), "id" : 2, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f3a"), "id" : 3, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f3b"), "id" : 4, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f3c"), "id" : 5, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f3d"), "id" : 6, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f3e"), "id" : 7, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f3f"), "id" : 8, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f40"), "id" : 9, "name" : "tom1" }
{ "_id" : ObjectId("5f5cce411c0317987a711f41"), "id" : 10, "name" : "tom1" }
mongos> db.users2.createIndex({"id":1})                    '创建索引'
{
	"raw" : {
		"192.168.100.150:47017" : {
			"createdCollectionAutomatically" : false,
			"numIndexesBefore" : 1,
			"numIndexesAfter" : 2,
			"ok" : 1
		}
	},
	"ok" : 1
}
mongos> 

mongos> sh.shardCollection("li.users2",{"id":1})		'表分片'
{ "collectionsharded" : "li.users2", "ok" : 1 }
mongos> db.users.stats()
{
	"sharded" : true,
	"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
	"userFlags" : 1,
	"capped" : false,
	"ns" : "li.users",
	"count" : 10000,
	"numExtents" : 9,
	"size" : 1120000,
	"storageSize" : 3489792,
	"totalIndexSize" : 637728,
	"indexSizes" : {
		"_id_" : 351568,
		"id_1" : 286160
	},
	"avgObjSize" : 112,
	"nindexes" : 2,
	"nchunks" : 3,
	"shards" : {
		"shard0000" : {
			"ns" : "li.users",
			"count" : 5319,
			"size" : 595728,
			"avgObjSize" : 112,
			"numExtents" : 5,
			"storageSize" : 2793472,
			"lastExtentSize" : 2097152,
			"paddingFactor" : 1,
			"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
			"userFlags" : 1,
			"capped" : false,
			"nindexes" : 2,
			"totalIndexSize" : 335216,
			"indexSizes" : {
				"_id_" : 188048,
				"id_1" : 147168
			},
			"ok" : 1
		},
		"shard0001" : {
			"ns" : "li.users",
			"count" : 4681,
			"size" : 524272,
			"avgObjSize" : 112,
			"numExtents" : 4,
			"storageSize" : 696320,
			"lastExtentSize" : 524288,
			"paddingFactor" : 1,
			"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
			"userFlags" : 1,
			"capped" : false,
			"nindexes" : 2,
			"totalIndexSize" : 302512,
			"indexSizes" : {
				"_id_" : 163520,
				"id_1" : 138992
			},
			"ok" : 1
		}
	},
	"ok" : 1
}
mongos> sh.addShardTag("shard0000","sales00")		'添加标签'
mongos> sh.addShardTag("shard0001","sales01")		'添加标签'
mongos> exit
bye

3. 连接配置服务器

[root@localhost bin]# mongo --port 37017
MongoDB shell version: 3.2.1
connecting to: 127.0.0.1:37017/test
configsvr> show collections
...
collections
chunks
databases
...

configsvr> db.chunks.findOne()
null
configsvr> db.collections.find()
configsvr> db.databases.find()
{ "_id" : "li", "primary" : "shard0000", "partitioned" : true }
configsvr>

4. 添加/删除分片服务器

[root@localhost bin]# cp -p mongodb3.conf mongodb4.conf
[root@localhost bin]# vim mongodb4.conf
port=47019
dbpath=/data/mongodb/mongodb4
logpath=/data/mongodb/logs/mongodb4.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true

[root@localhost bin]# ls
bsondump       mongodb4.conf  mongoperf     route.log.2020-09-20T03-52-09
mongo          mongodump      mongorestore  route.log.2020-09-20T03-52-32
mongod         mongoexport    mongos        route.log.2020-09-20T04-13-13
mongodb1.conf  mongofiles     mongostat     route.log.2020-09-27T02-02-25
mongodb2.conf  mongoimport    mongotop
mongodb3.conf  mongooplog     route.log
[root@localhost bin]# 

[root@localhost bin]# mongod -f mongodb4.conf
about to fork child process, waiting until server is ready for connections.
forked process: 18898
child process started successfully, parent exiting
[root@localhost bin]# mongo
MongoDB shell version: 3.2.1
connecting to: test
Server has startup warnings: 
2020-09-20T11:52:32.733+0800 I CONTROL  [main] ** WARNING: You are running this process as the root user, which is not recommended.
2020-09-20T11:52:32.734+0800 I CONTROL  [main] 
加入分片
mongos> sh.addShard("192.168.100.150:47019")
{ "shardAdded" : "shard0002", "ok" : 1 }
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f66d200f455f68530a8e5f5")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.100.150:47017",  "tags" : [ "sales00" ] }
	{  "_id" : "shard0001",  "host" : "192.168.100.150:47018",  "tags" : [ "sales01" ] }
	{  "_id" : "shard0002",  "host" : "192.168.100.150:47019" }
  active mongoses:
	"3.2.1" : 1
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		10 : Success
  databases:
	{  "_id" : "li",  "primary" : "shard0000",  "partitioned" : true }
		li.users
			shard key: { "id" : 1 }
			unique: false
			balancing: true
			chunks:
				shard0000	1
				shard0001	1
				shard0002	1
			{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0) 
			{ "id" : 4682 } -->> { "id" : 9364 } on : shard0002 Timestamp(3, 0) 
			{ "id" : 9364 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(3, 1) 
		li.users2
			shard key: { "id" : 1 }
			unique: false
			balancing: true
			chunks:
				shard0000	4
				shard0001	4
				shard0002	3
			{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0002 Timestamp(9, 0) 
			{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(9, 1) 
			{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0) 
			{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0) 
			{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0) 
			{ "id" : 23410 } -->> { "id" : 28092 } on : shard0002 Timestamp(7, 0) 
			{ "id" : 28092 } -->> { "id" : 32774 } on : shard0002 Timestamp(8, 0) 
			{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(8, 1) 
			{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8) 
			{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9) 
			{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10) 
"当你再添加一个新的分片,会自动的将原有数据量均匀分片"
"删除分片"
mongos>  use admin
switched to db admin
mongos> db.runCommand({"removeshard":"192.168.100.150:47019"})
{
	"msg" : "draining started successfully",
	"state" : "started",
	"shard" : "shard0002",
	"note" : "you need to drop or movePrimary these databases",
	"dbsToMove" : [ ],
	"ok" : 1
}
mongos>

"当删除后,又会自动的平均分配"
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f66d200f455f68530a8e5f5")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.100.150:47017",  "tags" : [ "sales00" ] }
	{  "_id" : "shard0001",  "host" : "192.168.100.150:47018",  "tags" : [ "sales01" ] }
	{  "_id" : "shard0002",  "host" : "192.168.100.150:47019",  "draining" : true }
  active mongoses:
	"3.2.1" : 1
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		14 : Success
  databases:
	{  "_id" : "li",  "primary" : "shard0000",  "partitioned" : true }
		li.users
			shard key: { "id" : 1 }
			unique: false
			balancing: true
			chunks:
				shard0000	2
				shard0001	1
			{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0) 
			{ "id" : 4682 } -->> { "id" : 9364 } on : shard0000 Timestamp(4, 0) 
			{ "id" : 9364 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(3, 1) 
		li.users2
			shard key: { "id" : 1 }
			unique: false
			balancing: true
			chunks:
				shard0000	6
				shard0001	5
			{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0000 Timestamp(10, 0) 
			{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(9, 1) 
			{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0) 
			{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0) 
			{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0) 
			{ "id" : 23410 } -->> { "id" : 28092 } on : shard0001 Timestamp(11, 0) 
			{ "id" : 28092 } -->> { "id" : 32774 } on : shard0000 Timestamp(12, 0) 
			{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(8, 1) 
			{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8) 
			{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9) 
			{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值