Mongodb -(3) replica set+sharding
分片集搭建
---何旭东
目录
分片集搭建...................................................................................................................... 1
生态系统.......................................................................................................................... 2
环境介绍.......................................................................................................................... 2
需求.......................................................................................................................... 2
实际拓扑................................................................................................................... 2
机器端口................................................................................................................... 2
机器功能................................................................................................................... 3
机器IP...................................................................................................................... 3
基础环境................................................................................................................... 4
配置文件.......................................................................................................................... 4
机器一...................................................................................................................... 4
机器二...................................................................................................................... 6
机器三...................................................................................................................... 8
启动................................................................................................................................. 9
第一台..................................................................................................................... 10
第二台..................................................................................................................... 10
第三台..................................................................................................................... 10
启动路由........................................................................................................................ 10
第一台初始化分片及结果......................................................................................... 10
第二台初始化分片及结果......................................................................................... 12
第三台机器添加分片................................................................................................ 13
切分数据.......................................................................................................... 13
结果查看........................................................................................................................ 13
第一个片................................................................................................................. 14
第二个片................................................................................................................. 16
优化............................................................................................................................... 18
常用命令行..................................................................................................................... 18
http://shanqiangwu.blog.51cto.com/8067564/1653968
感谢
感谢大家的帮助及引到,碰到问题不要用百度。找资料去些运维网站
官网网站
2015年7月17日
生态系统
数据服务节点(mongod)
路由节点(mongos)
配置节点(mongod)--config server
投票节点/表决节点(mongod) --arbiter server
环境介绍
需求
三台机器
数据节点,sharding 2片
每个sharding为Replic Set方式,冗余度3(主、从、延迟从)
mongos(路由节点),数量3
config server(配置服务器节点),数量3
arbiter server(表决节点),数量6
实际拓扑
机器端口
机器 |
数据节点 |
配置节点 |
表决节点 |
路由节点 |
||
第一台 |
shard11:28017 |
shard21:28018 |
config1:20000 |
arbiter1:28031 |
arbiter2:28032 |
mongos1: 28885 |
第二台 |
shard12:28017 |
Shard22:28018 |
config2:20000 |
arbiter1:28031 |
arbiter2:28032 |
mongos2:28885 |
第三台 |
shard13:28017 |
Shard23:28018 |
config3:20000 |
arbiter1:28031 |
arbiter2:28032 |
mongos3: 28885 |
机器功能
机器 |
端口 |
功能 |
192.168.200.185 |
28017 |
'shard1' PRIMARY |
主机:mongohost1 |
28018 |
‘shard2’ SECONDARY |
20000 |
配置节点 |
|
28031 |
'shard1' ARBITER |
|
28032 |
‘shard2’ ARBITER |
|
28885 |
路由节点 |
|
41000 |
启动路由 生成此端口 |
|
192.168.200.186 |
28017 |
'shard1' SECONDARY |
主机:mongohost2 |
28018 |
‘shard2’ PRIMARY |
20000 |
配置节点 |
|
28031 |
'shard1' ARBITER |
|
28032 |
‘shard2’ ARBITER |
|
28885 |
路由节点 |
|
41000 |
启动路由 生成此端口 |
|
192.168.200.187 |
28017 |
'shard1' SECONDARY |
主机:mongohost3 |
28018 |
‘shard2’ SECONDARY |
20000 |
配置节点 |
|
28031 |
'shard1' ARBITER |
|
28032 |
‘shard2’ ARBITER |
|
28885 |
路由节点 |
|
41000 |
启动路由 生成此端口 |
机器IP
机器 |
IP地址 |
主机名 |
第一台 |
192.168.200.185 |
mongohost1 |
第二台 |
192.168.200.185 |
mongohost2 |
第三台 |
192.168.200.187 |
mongohost3 |
基础环境
iptables 关闭
selinux 关闭
hosts 地址表添加
配置文件
机器一
mkdir /usr/local/mongodb/shard11
mkdir /usr/local/mongodb/shard21
mkdir /usr/local/mongodb/arbiter1
mkdir /usr/local/mongodb/arbiter2/
mkdir /usr/local/mongodb/config/
mkdir /usr/local/mongodb/logs/
cat > /etc/shard11.conf <<EOF
shardsvr=true
port=28017
dbpath = /usr/local/mongodb/shard11/
logpath = /usr/local/mongodb/logs/shard11.log
logappend=true
fork=true
nojournal=true
rest=true
replSet=shard1
oplogSize=2048
EOF
cat > /etc/shard21.conf <<EOF
shardsvr=true
port=28018
dbpath = /usr/local/mongodb/shard21/
logpath =/usr/local/mongodb/logs/shard21.log
logappend=true
fork=true
nojournal=true
rest=true
replSet=shard2
oplogSize=2048
EOF
cat > /etc/config1.conf <<EOF
configsvr=true
port=20000
dbpath = /usr/local/mongodb/config/
logpath =/usr/local/mongodb/logs/config1.log
logappend=true
fork=true
nojournal=true
EOF
cat > /etc/arbiter1.conf <<EOF
shardsvr=true
replSet=shard1
port=28031
dbpath = /usr/local/mongodb/arbiter1/
logpath =/usr/local/mongodb/logs/arbiter1.log
oplogSize=100
logappend=true
fork=true
nojournal=true
rest=true
EOF
cat > /etc/arbiter2.conf <<EOF
shardsvr=true
replSet=shard2
port=28032
dbpath = /usr/local/mongodb/arbiter2/
logpath =/usr/local/mongodb/logs/arbiter2.log
oplogSize=100
logappend=true
fork=true
nojournal=true
rest=true
EOF
cat > /etc/mongos1.conf <<EOF
configdb=mongohost1:20000,mongohost2:20000,mongohost3:20000
chunkSize=100
port=28885
logpath =/usr/local/mongodb/logs/mongos1.log
logappend=true
fork=true
EOF
机器二
mkdir /usr/local/mongodb/shard12
mkdir /usr/local/mongodb/shard22
mkdir /usr/local/mongodb/arbiter1/
mkdir /usr/local/mongodb/arbiter2/
mkdir /usr/local/mongodb/cofig/
mkdir /usr/local/mongodb/logs/
cat > /etc/shard12.conf <<EOF
shardsvr=true
port=28017
dbpath = /usr/local/mongodb/shard12/
logpath = /usr/local/mongodb/logs/shard12.log
logappend=true
fork=true
nojournal=true
rest=true
replSet=shard1
oplogSize=2048
EOF
cat > /etc/shard22.conf <<EOF
shardsvr=true
port=28018
dbpath = /usr/local/mongodb/shard22/
logpath = /usr/local/mongodb/logs/shard22.log
logappend=true
fork=true
nojournal=true
rest=true
replSet=shard2
oplogSize=2048
EOF
cat > /etc/config2.conf <<EOF
configsvr=true
port=20000
dbpath = /usr/local/mongodb/config/
logpath = /usr/local/mongodb/logs/config2.log
logappend=true
fork=true
nojournal=true
EOF
cat > /etc/arbiter1.conf <<EOF
shardsvr=true
replSet=shard1
port=28031
dbpath = /usr/local/mongodb/arbiter1/
logpath =/usr/local/mongodb/logs/arbiter1.log
oplogSize=100
logappend=true
fork=true
nojournal=true
rest=true
EOF
cat > /etc/arbiter2.conf <<EOF
shardsvr=true
replSet=shard2
port=28032
dbpath = /usr/local/mongodb/arbiter2/
logpath =/usr/local/mongodb/logs/arbiter2.log
oplogSize=100
logappend=true
fork=true
nojournal=true
rest=true
EOF
cat > /etc/mongos2.conf <<EOF
configdb=mongohost1:20000,mongohost2:20000,mongohost3:20000
chunkSize=100
port=28885
logpath = /usr/local/mongodb/logs/mongos2.log
logappend=true
fork=true
EOF
机器三
mkdir /usr/local/mongodb/shard13
mkdir /usr/local/mongodb/shard23
mkdir /usr/local/mongodb/arbiter1/
mkdir /usr/local/mongodb/arbiter2/
mkdir /usr/local/mongodb/cofig/
mkdir /usr/local/mongodb/logs/
cat > /etc/shard13.conf <<EOF
shardsvr=true
port=28017
dbpath = /usr/local/mongodb/shard13/
logpath = /usr/local/mongodb/logs/shard13.log
logappend=true
fork=true
nojournal=true
rest=true
replSet=shard1
oplogSize=2048
EOF
cat > /etc/shard23.conf <<EOF
shardsvr=true
port=28018
dbpath = /usr/local/mongodb/shard23/
logpath = /usr/local/mongodb/logs/shard23.log
logappend=true
fork=true
nojournal=true
rest=true
replSet=shard2
oplogSize=2048
EOF
cat > /etc/config3.conf <<EOF
configsvr=true
port=20000
dbpath = /usr/local/mongodb/config/
logpath = /usr/local/mongodb/logs/config3.log
logappend=true
fork=true
nojournal=true
EOF
cat > /etc/arbiter1.conf <<EOF
shardsvr=true
replSet=shard1
port=28031
dbpath = /usr/local/mongodb/arbiter1/
logpath =/usr/local/mongodb/logs/arbiter1.log
oplogSize=100
logappend=true
fork=true
nojournal=true
rest=true
EOF
cat > /etc/arbiter2.conf <<EOF
shardsvr=true
replSet=shard2
port=28032
dbpath = /usr/local/mongodb/arbiter2/
logpath =/usr/local/mongodb/logs/arbiter2.log
oplogSize=100
logappend=true
fork=true
nojournal=true
rest=true
EOF
cat > /etc/mongos3.conf <<EOF
configdb=mongohost1:20000,mongohost2:20000,mongohost3:20000
chunkSize=100
port=28885
logpath = /usr/local/mongodb/logs/mongos3.log
logappend=true
fork=true
EOF
启动
第一台
mongod -f /etc/shard11.conf
mongod -f /etc/shard21.conf
mongod -f /etc/arbiter1.conf
mongod -f /etc/arbiter2.conf
mongod -f /etc/config1.conf
mongos -f /etc/mongos1.conf
第二台
mongod -f /etc/shard12.conf
mongod -f /etc/shard22.conf
mongod -f /etc/arbiter1.conf
mongod -f /etc/arbiter2.conf
mongod -f /etc/config2.conf
mongos -f /etc/mongos2.conf
第三台
mongod -f /etc/shard13.conf
mongod -f /etc/shard23.conf
mongod -f /etc/arbiter1.conf
mongod -f /etc/arbiter2.conf
mongod -f /etc/config3.conf
mongos -f /etc/mongos3.conf
启动路由
mongos --configdb mongohost3:20000,mongohost2:20000,mongohost1:20000--port 41000 --chunkSize 100 --logpath /usr/local/mongodb/logs/mongos.log--logappend --fork
第一台初始化分片及结果
mongo mongohost1:28017/admin
> config = {_id:'shard1', members:[{_id: 0, host: 'mongohost1:28017'},{_id: 1, host: 'mongohost2:28017'},{"_id" : 2,"host":"mongohost3:28017",slaveDelay :7200 ,priority:0},{_id: 3, host: 'mongohost1:28031', arbiterOnly : true},{_id:4, host: 'mongohost2:28031', arbiterOnly : true},{_id: 5, host:'mongohost3:28031', arbiterOnly : true}]};
{
"_id" : "shard1",
"members" : [
{
"_id" : 0,
"host" :"mongohost1:28017"
},
{
"_id" : 1,
"host" :"mongohost2:28017"
},
{
"_id" : 2,
"host" :"mongohost3:28017",
"slaveDelay": 7200,
"priority" :0
},
{
"_id" : 3,
"host" :"mongohost1:28031",
"arbiterOnly": true
},
{
"_id" : 4,
"host" :"mongohost2:28031",
"arbiterOnly": true
},
{
"_id" : 5,
"host" :"mongohost3:28031",
"arbiterOnly": true
}
]
}
> rs.initiate(config);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
>
第二台初始化分片及结果
mongo mongohost2:28018/admin
> config = {_id:'shard2', members:[{_id: 0, host: 'mongohost2:28018'},{_id: 1, host: 'mongohost1:28018'},{"_id" : 2,"host":"mongohost3:28018",slaveDelay :7200 ,priority:0},{_id: 3, host: 'mongohost1:28032', arbiterOnly : true},{_id:4, host: 'mongohost2:28032', arbiterOnly : true},{_id: 5, host:'mongohost3:28032', arbiterOnly : true}]};
{
"_id" : "shard2",
"members" : [
{
"_id" : 0,
"host" :"mongohost2:28018"
},
{
"_id" : 1,
"host" :"mongohost1:28018"
},
{
"_id" : 2,
"host" :"mongohost3:28018",
"slaveDelay": 7200,
"priority" :0
},
{
"_id" : 3,
"host" :"mongohost1:28032",
"arbiterOnly": true
},
{
"_id" : 4,
"host" :"mongohost2:28032",
"arbiterOnly": true
},
{
"_id" : 5,
"host" :"mongohost3:28032",
"arbiterOnly": true
}
]
}
> rs.initiate(config);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
>
第三台机器添加分片
[root@mongodb logs]# mongomongohost3:28885/admin
MongoDB shell version: 2.6.10
connecting to: mongohost3:28885/admin
mongos>db.runCommand({"addshard" :"shard1/mongohost1:28017,mongohost2:28017"})
{ "shardAdded" :"shard1", "ok" : 1 }
mongos> db.runCommand({"addshard": "shard2/mongohost2:28018,mongohost1:28018"})
{ "shardAdded" :"shard2", "ok" : 1 }
mongos>
切分数据
db.runCommand({ "enablesharding" : "im_offline_msg"})
db.runCommand({ shardcollection : "step.step",key : {_id: 1} } )
db.runCommand( { "enablesharding": "xx"}) 开启库的分片功能
db.runCommand( { shardcollection :"xx",key : {_id: 1} } )开启表的分片功能,key表示shard key
结果查看
mongos> db.printShardingStatus();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("55ac8d1e55715e4e18194a14")
}
shards:
{ "_id" :"shard1", "host" :"shard1/mongohost1:28017,mongohost2:28017" }
{ "_id" :"shard2", "host" :"shard2/mongohost1:28018,mongohost2:28018" }
databases:
{ "_id" :"admin", "partitioned" : false, "primary" : "config" }
{ "_id" :"im_offline_msg", "partitioned" : true, "primary" : "shard1" }
{ "_id" :"step", "partitioned" : false, "primary" : "shard1" }
mongos>
第一个片
shard1:PRIMARY> rs.status()
{
"set" : "shard1",
"date" : ISODate("2015-07-17T11:11:12Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" :"mongohost1:28017",
"health" : 1,
"state" : 1,
"stateStr" :"PRIMARY",
"uptime" :4498,
"optime" :Timestamp(1437129067, 2418),
"optimeDate": ISODate("2015-07-17T10:31:07Z"),
"electionTime" : Timestamp(1437127220, 1),
"electionDate" : ISODate("2015-07-17T10:00:20Z"),
"self" : true
},
{
"_id" : 1,
"name" :"mongohost2:28017",
"health" : 1,
"state" : 2,
"stateStr" :"SECONDARY",
"uptime" :4262,
"optime" :Timestamp(1437129067, 2418),
"optimeDate": ISODate("2015-07-17T10:31:07Z"),
"lastHeartbeat" : ISODate("2015-07-17T11:11:11Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:11:10Z"),
"pingMs" : 0,
"syncingTo" :"mongohost1:28017"
},
{
"_id" : 2,
"name" :"mongohost3:28017",
"health" : 1,
"state" : 2,
"stateStr" :"SECONDARY",
"uptime" : 4262,
"optime" :Timestamp(1437127210, 1),
"optimeDate": ISODate("2015-07-17T10:00:10Z"),
"lastHeartbeat" : ISODate("2015-07-17T11:11:11Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:11:11Z"),
"pingMs" : 0,
"syncingTo" :"mongohost1:28017"
},
{
"_id" : 3,
"name" :"mongohost1:28031",
"health" : 1,
"state" : 7,
"stateStr" :"ARBITER",
"uptime" :4262,
"lastHeartbeat" : ISODate("2015-07-17T11:11:12Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:11:12Z"),
"pingMs" : 0
},
{
"_id" : 4,
"name" :"mongohost2:28031",
"health" : 1,
"state" : 7,
"stateStr" :"ARBITER",
"uptime" :4262,
"lastHeartbeat" : ISODate("2015-07-17T11:11:11Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:11:11Z"),
"pingMs" : 0
},
{
"_id" : 5,
"name" :"mongohost3:28031",
"health" :1,
"state" : 7,
"stateStr" :"ARBITER",
"uptime" :4260,
"lastHeartbeat" : ISODate("2015-07-17T11:11:11Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:11:11Z"),
"pingMs" : 0
}
],
"ok" : 1
}
shard1:PRIMARY>
第二个片
shard2:SECONDARY> rs.status()
{
"set" : "shard2",
"date" : ISODate("2015-07-17T11:09:51Z"),
"myState" : 2,
"syncingTo" : "mongohost2:28018",
"members" : [
{
"_id" : 0,
"name" :"mongohost2:28018",
"health" : 1,
"state" : 1,
"stateStr" :"PRIMARY",
"uptime" :4074,
"optime" :Timestamp(1437127314, 1),
"optimeDate": ISODate("2015-07-17T10:01:54Z"),
"lastHeartbeat" : ISODate("2015-07-17T11:09:51Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:09:50Z"),
"pingMs" : 0,
"electionTime" : Timestamp(1437127325, 1),
"electionDate" : ISODate("2015-07-17T10:02:05Z")
},
{
"_id" : 1,
"name" :"mongohost1:28018",
"health" : 1,
"state" : 2,
"stateStr" :"SECONDARY",
"uptime" :14970,
"optime" :Timestamp(1437127314, 1),
"optimeDate" :ISODate("2015-07-17T10:01:54Z"),
"self" : true
},
{
"_id" : 2,
"name" :"mongohost3:28018",
"health" : 1,
"state" : 2,
"stateStr" :"SECONDARY",
"uptime" :4074,
"optime" :Timestamp(1437127314, 1),
"optimeDate": ISODate("2015-07-17T10:01:54Z"),
"lastHeartbeat" : ISODate("2015-07-17T11:09:51Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:09:50Z"),
"pingMs" : 0,
"syncingTo" :"mongohost2:28018"
},
{
"_id" : 3,
"name" :"mongohost1:28032",
"health" : 1,
"state" : 7,
"stateStr" :"ARBITER",
"uptime" :4076,
"lastHeartbeat" : ISODate("2015-07-17T11:09:50Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:09:51Z"),
"pingMs" : 0
},
{
"_id" : 4,
"name" :"mongohost2:28032",
"health" : 1,
"state" : 7,
"stateStr" :"ARBITER",
"uptime" :4074,
"lastHeartbeat" : ISODate("2015-07-17T11:09:51Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:09:51Z"),
"pingMs" : 0
},
{
"_id" : 5,
"name" :"mongohost3:28032",
"health" : 1,
"state" : 7,
"stateStr" :"ARBITER",
"uptime" :4074,
"lastHeartbeat" :ISODate("2015-07-17T11:09:51Z"),
"lastHeartbeatRecv" :ISODate("2015-07-17T11:09:51Z"),
"pingMs" : 0
}
],
"ok" : 1
}
shard2:SECONDARY>
优化
优化内存策略
echo 0 > /proc/sys/vm/zone_reclaim_mode
vi /proc/sys/vm/zone_reclaim_mode
sysctl -w vm.zone_reclaim_mode=0
常用命令行
mongod :MonoDB 服务端
mongo :MongoDB 客户端
mongoimport: 数据库导入工具
mongoexport : 数据导出工具
mongodump : 数据库备份工具
mongorestore: 数据库恢复工具
mongofiles : GridFS管理工具,可实现对二进制文件的存取
mongostat : 性能分析工具,类似与vmstat
mongotop :性能分析工具,查看mongodb实例读写时间花费
mongoperf :性能分析工具 ,磁盘性能检查工具
mongos : MongoDB集群工具
转载于:https://blog.51cto.com/hexudong/1677040
Mongodb -(3) replica set+sharding相关推荐
- Mongodb的Replica Sets + Sharding架构
MongoDB的Sharding机制解决了海量存储和动态扩容的问题,但离生产环境的高可靠,高可用还有距离,Sharding在单点出现故障时就无能为力了.但是MongoDB的副本集却可以很轻松的处理单点 ...
- Mongodb安装搭建Replica Set+Sharding集群
2019独角兽企业重金招聘Python工程师标准>>> Mongodb安装搭建Replica Set+Sharding集群 一.简介 Replica Set:复制在为数据提供了冗余同 ...
- MongoDB 维护Replica Set
在每个MongoDB(版本 3.2.9) Instance中,都有一个本地数据库(local),用于存储 Replication 进程的信息和本地数据.local 数据库的特性是:位于local数据库 ...
- 【Mongodb】如何创建mongodb的replica set
Replica sets 在主从复制上做的扩展,增加了故障自动切换和自动修复成员节点.下面从技术上介绍如何搭建mongodb的replica set (个人觉得,搭建mongodb本身没有多少干货,重 ...
- 公司的实战Replica Sets+Sharding方案
公司的实战Replica Sets+Sharding方案 公司mongo集群分片实战 准备九台服务器, 分片1: 172.16.0.124:11731 主 172.16.0.127.11731 备 1 ...
- Mongo之架构部署(Replica Sets+Sharding)
一.环境 要构建一个 MongoDB Sharding Cluster,需要三种角色: •Shard Server: mongod 实例,用于存储实际的数据块. •Config Server: mon ...
- 【Mongodb】 Replica set的主从切换测试
Replica set 为我们提供了自动故障切换功能,这个机制是由mongodb自己来操作的,它根据从库的优先级或者数据新鲜度(也就是最新的从主库同步数据的那个节点)来选择primary,而当以前的p ...
- 【Mongodb】 Replica set的自动故障切换
Replica set 为我们提供了自动故障切换功能,这个机制是由mongodb自己来操作的,它根据从库的优先级或者数据新鲜度(也就是最新的从主库同步数据的那个节点)来选择primary,而当以前的p ...
- MongoDB Replica Set 选举过程
Replica Set 选举过程 心跳检测 假设我们有三个节点的replica sets:X,Y和Z节点.在replica sets结构中,这三个节点每2秒会各自向其它两个节点发送一个心跳检测请求.比 ...
最新文章
- memcached和redis的区别和应用场景
- 【java】兴唐第十五节课
- matlab sperman相关,相关系数
- 一个需要原创精神的年代
- 计算机网络【wireshark抓包分析】
- python3多线程queue_Python多线程(3)——Queue模块
- Linux/unix不同shell环境下数值运算的处理
- MFC小笔记:滑动条与编辑框
- docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群
- python3廖雪峰云-python3基础教程廖雪峰云_Python GUI库大汇总
- make install到指定安装目录
- 可发弹幕php,JavaScript直播评论发弹幕切图功能点集合效果代码
- 有关威纶通weinview触摸屏HMI 定时器的那些事
- Android信鸽推送全解
- phpMyAdmin下载、安装和使用入门教程
- Shiro源码分析(三)——获取Subject
- Scratch软件界面介绍
- CAD图纸如何转换成Word文档呢?
- HDU 6441 Find Integer 【费马大定理】
- 诺兰回归,方舟渡劫——短信登录京东青龙
热门文章
- c语言设计四路彩灯显示系统,四路彩灯控制器设计方案.doc
- ie8不兼容java项目_常见IE8兼容性问题及解决
- 辅助驾驶等级_双AMR电机位置传感器,助力自动驾驶安全出行
- 10万码农五年的C语言笔记!你现在知道别人为什么这么优秀了吗?
- log4j之log4j2.xml使用
- ajax实现上传文件
- (二)双线性插值python实现
- c语言数组两个值交换,如可交换两个数组中的元素?
- python布局管理_Python基础=== Tkinter Grid布局管理器详解
- RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one.