配置mongodb分片群集(sharding cluster)

Sharding cluster介绍

这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。

要构建一个 MongoDB Sharding Cluster,需要三种角色:

Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障

Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。

Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

Sharding架构图:

host    ip        端口信息
-------------------------------------------------
mds1    192.168.20.11    mongod shard11:28011
                                            mongod shard12:28012
                                            mongod config1:28010
                                            mongs1:28000

mds2    192.168.20.13    mongod shard12:28013
                                             mongod shard22:28014
                                             mongod config2:28010
                                            mongs2:28000

mds3    192.168.20.15    mongod shard13:28015
                                             mongod shard23:28016
                                             mongod config3:28010
                                             mongs3:28000

一、LINUX 环境准备工作

1.1 先配置ULIMIT

修改文件:
/etc/security/limits.conf

比如添加以下内容:
mongo                soft    nproc   30000
mongo                hard    nproc   65536
mongo                soft    nofile  30000
mongo                hard    nofile  65536

(这个在配置MONGODB 最大连接数是有用,因为MONGODB 默认的最大连接数为819,还要减掉各节点间的config等服务器的连接,如果你是在生产环境下,

相信一会儿就不够,并且mongo 安装用户如果不是root,比如我的mongo,也会报错,linux 默认一个非root 用户只能打开1024个文件。

)

软件准备
1. 创建用户

useradd mongo

2. 安装monodb软件
su – mongo
tar zxvf mongodb-linux-x86_64-2.6.4.tar

3. 创建数据目录
根据本例sharding架构图所示,在各台sever上创建shard数据文件目录
mds1:
su – mono
mkdir -p /home/mongodb/mongodb2.6.4/logs
mkdir -p /home/mongodb/mongodb2.6.4/config

mkdir -p /opt/mongodb/data/shard11
mkdir -p /opt/mongodb/data/shard21
mds2:
su – mono
mkdir -p /home/mongodb/mongodb2.6.4/logs
mkdir -p /home/mongodb/mongodb2.6.4/config
mkdir -p /opt/mongodb/data/shard12
mkdir -p /opt/mongodb/data/shard22

mds3:
su – mono
mkdir -p /home/mongodb/mongodb2.6.4/logs
mkdir -p /home/mongodb/mongodb2.6.4/config
mkdir -p /opt/mongodb/data/shard13
mkdir -p /opt/mongodb/data/shard23

配置REPLICAT SETS

1.配置SHARD1 所在的REPLICA SETS

(在实际配置中,我都使用了建立一个sh 文件,并对应--config 文件运行的方式,这样方便以后每次执行而不会出错)。

mds1

vi mongod_shard11_start.sh

/home/mongo/mongodb2.6.4/bin/mongod --shardsvr --replSet shard1 --port 28011 --dbpath /opt/mongodb/data/shard11 --oplogSize 1000 --logpath /home/mongo/mongodb2.6.4/logs/shard11.log --logappend  --maxConn 30000 --fork

mds2

vi mongod_shard12_start.sh

/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard1 –port 28013 –dbpath /opt/mongodb/data/shard12 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard12.log –logappend --maxConn 30000 –fork

mds3

vi mongod_shard13_start.sh

/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard1 –port 28015 –dbpath /opt/mongodb/data/shard13 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard13.log  –logappend --maxConn 30000 –fork

并启动 对应的

mongod_shard11_start.sh
mongod_shard12_start.sh
mongod_shard13_start.sh

初始化replica set shard1
用mongo 连接其中一个节点: 比如:shard11 执行以下:

> config = {_id: 'shard1', members: [
                           {_id: 0, host:'198.168.20.11:28011'},
                           {_id: 1, host:'198.168.20.13:28013'},
                           {_id: 2, host:'198.168.20.15:28015'}]
            }
 
> rs.initiate(config);
此步的具体操作如下:
    mongo -port 28011
    config = {_id: 'shard1', members: [
                   {_id: 0, host:'198.168.20.11:28011'},
                   {_id: 1, host:'198.168.20.13:28013'},
                   {_id: 2, host:'198.168.20.15:28015'}]
            }
    > rs.initiate(config)
    {
        "ok" : 0,
        "errmsg" : "couldn't initiate : can't find self in the replset config my port: 28011"
    }
    > cfg={_id:"shard1",members:[{_id:0,host:"192.168.20.11:28011"},
    ... {_id:1,host:"192.168.20.13:28013"}]}
    {
        "_id" : "shard1",
        "members" : [
            {
                "_id" : 0,
                "host" : "192.168.20.11:28011"
            },
            {
                "_id" : 1,
                "host" : "192.168.20.13:28013"
            }
        ]
    }
    > rs.initiate(cfg)
    {
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
    }
    shard1:OTHER> rs.status()
    {
        "set" : "shard1",
        "date" : ISODate("2014-11-09T08:57:38Z"),
        "myState" : 1,
        "members" : [
            {
                "_id" : 0,
                "name" : "192.168.20.11:28011",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 2710,
                "optime" : Timestamp(1415523264, 1),
                "optimeDate" : ISODate("2014-11-09T08:54:24Z"),
                "electionTime" : Timestamp(1415523272, 1),
                "electionDate" : ISODate("2014-11-09T08:54:32Z"),
                "self" : true
            },
            {
                "_id" : 1,
                "name" : "192.168.20.13:28013",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 194,
                "optime" : Timestamp(1415523264, 1),
                "optimeDate" : ISODate("2014-11-09T08:54:24Z"),
                "lastHeartbeat" : ISODate("2014-11-09T08:57:36Z"),
                "lastHeartbeatRecv" : ISODate("2014-11-09T08:57:36Z"),
                "pingMs" : 0,
                "syncingTo" : "192.168.20.11:28011"
            }
        ],
        "ok" : 1
    }
    shard1:PRIMARY> rs.add({_id:2,host:"192.168.20.15:28015"})
    { "ok" : 1 }
    shard1:PRIMARY> rs.status()
    {
        "set" : "shard1",
        "date" : ISODate("2014-11-09T08:58:44Z"),
        "myState" : 1,
        "members" : [
            {
                "_id" : 0,
                "name" : "192.168.20.11:28011",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 2776,
                "optime" : Timestamp(1415523521, 1),
                "optimeDate" : ISODate("2014-11-09T08:58:41Z"),
                "electionTime" : Timestamp(1415523272, 1),
                "electionDate" : ISODate("2014-11-09T08:54:32Z"),
                "self" : true
            },
            {
                "_id" : 1,
                "name" : "192.168.20.13:28013",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 260,
                "optime" : Timestamp(1415523521, 1),
                "optimeDate" : ISODate("2014-11-09T08:58:41Z"),
                "lastHeartbeat" : ISODate("2014-11-09T08:58:44Z"),
                "lastHeartbeatRecv" : ISODate("2014-11-09T08:58:44Z"),
                "pingMs" : 0,
                "syncingTo" : "192.168.20.11:28011"
            },
            {
                "_id" : 2,
                "name" : "192.168.20.15:28015",
                "health" : 1,
                "state" : 5,
                "stateStr" : "STARTUP2",
                "uptime" : 3,
                "optime" : Timestamp(0, 0),
                "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                "lastHeartbeat" : ISODate("2014-11-09T08:58:43Z"),
                "lastHeartbeatRecv" : ISODate("2014-11-09T08:58:43Z"),
                "pingMs" : 0
            }
        ],
        "ok" : 1
    }
    shard1:PRIMARY>

配置SHARD2

mds1

vi shard21_start.sh

/home/mongo/mongodb2.6.4/bin/mongod --shardsvr --replSet shard2 –port 28012 –dbpath /opt/mongodb/data/shard21 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard21.log –logappend –fork

mds2

vi mongod_shard22_start.sh

/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard2 –port 28014 –dbpath /opt/mongodb/data/shard22 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard22.log –logappend –fork

mds3

vi mongod_shard23_start.sh

/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard2 –port 28016 –dbpath /opt/mongodb/data/shard23 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard23.log –logappend –fork

运行以上sh

初始化replica set shard2
用mongo 连接其中一个节点: 比如:shard21 执行以下:

> config = {_id: ’shard2′, members: [
                           {_id: 0, host: '198.168.20.11:28012'},
                           {_id: 1, host: '198.168.20.13:28014'},
                           {_id: 2, host: '198.168.20.15:28016'}]
            }
 
> rs.initiate(config);

> cfg={_id:"shard2",members:[{_id:0,host:"192.168.20.11:28012"},
... {_id:1,host:"192.168.20.13:28014"},
... {_id:2,host:"192.168.20.15:28016"}]}
{
    "_id" : "shard2",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.20.11:28012"
        },
        {
            "_id" : 1,
            "host" : "192.168.20.13:28014"
        },
        {
            "_id" : 2,
            "host" : "192.168.20.15:28016"
        }
    ]
}
> rs.initiate(cfg)
{
    "info" : "Config now saved locally.  Should come online in about a minute.",
    "ok" : 1
}
shard2:OTHER> rs.status()
{
    "set" : "shard2",
    "date" : ISODate("2014-11-09T09:05:12Z"),
    "myState" : 2,
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.20.11:28012",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1431,
            "optime" : Timestamp(1415523903, 1),
            "optimeDate" : ISODate("2014-11-09T09:05:03Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.20.13:28014",
            "health" : 1,
            "state" : 5,
            "stateStr" : "STARTUP2",
            "uptime" : 9,
            "optime" : Timestamp(0, 0),
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2014-11-09T09:05:11Z"),
            "lastHeartbeatRecv" : ISODate("2014-11-09T09:05:11Z"),
            "pingMs" : 0
        },
        {
            "_id" : 2,
            "name" : "192.168.20.15:28016",
            "health" : 1,
            "state" : 5,
            "stateStr" : "STARTUP2",
            "uptime" : 7,
            "optime" : Timestamp(0, 0),
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2014-11-09T09:05:11Z"),
            "lastHeartbeatRecv" : ISODate("2014-11-09T09:05:11Z"),
            "pingMs" : 0
        }
    ],
    "ok" : 1
}
shard2:SECONDARY>

配置三台config server
 
mds1:

./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork   
 
 #config server也需要dbpath
 
 mds2:

./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork
 
mds3:

./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork

配置mongs
 
在server1,server2,server3上分别执行:
 ./mongos –configdb 192.168.20.11:28010,192.168.20.13:28010,192.168.20.15:28010 –port 28000 –chunkSize 128 –logpath /home/mongo/mongodb2.6.4/logs/mongos.log –logappend –fork

#mongs不需要dbpath

开始运行出现以下问题:
    about to fork child process, waiting until server is ready for connections.
    forked process: 5969

日志显示:

waited 209s for distributed lock configUpgrade for upgrading config database to new format v5

后各节点设置时间同步后,问题解决。

配置集群

连接到其中一个mongos进程,并切换到admin数据库做以下配置
     1. 连接到mongs,并切换到admin
     ./mongo 192.168.20.11:28000/admin
     >db
     Admin
     2. 加入shards
     命令格式:
        replicaSetName/[:port] [,serverhostname2[:port],…]
    
    执行如下:

>db.runCommand({addshard:"shard1/192.168.20.11:28011,192.168.20.13:28011,192.168.20.15:28011"});
     >db.runCommand({addshard:"shard2/192.168.20.11:28012,192.168.20.13:28012,192.168.20.15:28012"});
     >db.runCommand({addshard:"shard3/192.168.20.11:28013,192.168.20.13:28013,192.168.20.15:28013"});

3. 可选参数
     Name:用于指定每个shard的名字,不指定的话系统将自动分配
     maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes
    
    修改maxsize:

use config
    db.shards.update({_id:"s1"},{$set:{maxSize:2000000}})

4. Listing shards
     >db.runCommand( { listshards : 1 } )
     如果列出了以上二个你加的shards,表示shards已经配置成功
    mongos> db.runCommand( { listshards : 1 } )
    {
        "shards" : [
            {
                "_id" : "s1",
                "host" : "shard1/192.168.20.11:28011,192.168.20.13:28013,192.168.20.15:28015"
            },
            {
                "_id" : "s2",
                "host" : "shard2/192.168.20.11:28012,192.168.20.13:28014,192.168.20.15:28016"
            }
        ],
        "ok" : 1
    }

mongos> use config
    mongos> db.shards.find()
    { "_id" : "s1", "host" : "shard1/192.168.20.11:28011,192.168.20.13:28013,192.168.20.15:28015", "maxSize" : 2000000 }
    { "_id" : "s2", "host" : "shard2/192.168.20.11:28012,192.168.20.13:28014,192.168.20.15:28016", "maxSize" : 2000000 }

5. 激活数据库分片
     命令:

> db.runCommand( { enablesharding :"database_name"} );
     通 过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection 将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对 collection作些操作

用客户端连接Mongos

Mongo --port 50000

>sh.enableSharding("database name")

或者

>db.runCommand( { enableSharding: <database> } )

这样即可。

如果你想对一个大的collection进行sharding可以执行如下命令

sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )
    示例:
    mongos> use admin
    switched to db admin
    mongos> db.runCommand({enablesharding:"test"})
    { "ok" : 1 }
    mongos> use admin
    switched to db admin
    mongos> db.runCommand({shardcollection:"test.test",key:{_id:1}})
    { "collectionsharded" : "test.test", "ok" : 1 }
    mongos>

mongos>for (var i =2; i <= 1200000; i++) db.user.save({_id:i,name:"teststaasdasdfasdfsa name",address:"adresss adfasdfasdfasdfasdfasdf",country:"china",province:"shanghai",city:"minhang"});
    mongos>db.test.stats()

数据迁移:

---------------------------------------------------------------------------------------------------------------------------------

准备工作:在导入数据前,先配置好要分片的数据库及表。
    不然导入完成后,发现数据库,表没有同步到另外一个集群。

我这里做了从原单机数据库数据导出后,再分片集群库中导入操作。
    
    当设置了要分片的库,及表后,系统会自动帮你添加库及表。
    设置完成后,就可以导入数据了。

use admin
    db.runCommand({enablesharding:"ip"})
    db.runCommand({shardcollection:"ip.ipaddress",key:{ip1:1}})

./mongorestore -h 192.168.20.11 --port 28000 -d ip /opt/backup/ip20141109/ip

./mongorestore -h 192.168.20.11 --port 28000 -d dmp /opt/backup/dmp/dmp

参考:http://www.open-open.com/lib/view/open1329745095312.html

======================================================

测试后感觉这种架构不太适合我,只有两个分片,而却有3个节点的集群,磁盘空间的使用率不高。后决定修改架构:

集群调整

3台服务器,做成3个分片,每个分片有一个集群,

集群中有2台数据存储服务器+1台仲裁服务器

把仲裁服务器分别放在3台服务器中

host    ip        端口信息            arbiterOnly    
--------------------------------------------------------------------
mds1    192.168.20.11    mongod shard1:28011    
            mongod shard2:28012
            mongod shard3:28013 ------------ True

mongod config1:28010
            mongs1:28000

mds2    192.168.20.13    mongod shard1:28011
            mongod shard2:28012 ------------ True
            mongod shard3:28013
            
            mongod config2:28010
            mongs2:28000

mds3    192.168.20.15    mongod shard1:28011 ------------ True
            mongod shard2:28012
            mongod shard2:28013

mongod config3:28010
            mongs3:28000

对应的数据保存目录各为:

/opt/mongodb/data/shard1
/opt/mongodb/data/shard2
/opt/mongodb/data/shard3

集群配置:

shard1

> config = {_id: 'shard1', members: [
                           {_id: 0, host:'192.168.20.11:28011'},
                           {_id: 1, host:'192.168.20.13:28011'},
                           {_id: 2, host:'192.168.20.15:28011',"arbiterOnly":true}]
            }
 
> rs.initiate(config);

shard2

> config = {_id: 'shard2', members: [
                           {_id: 0, host:'192.168.20.11:28012'},
                           {_id: 1, host:'192.168.20.13:28012',"arbiterOnly":true},
                           {_id: 2, host:'192.168.20.15:28012'}]
            }
 
> rs.initiate(config);

rs.addArb("192.168.20.13:28012");
rs.add({_id: 1, host:'192.168.20.13:28012',"arbiterOnly":true})
rs.add({_id: 2, host:'192.168.20.15:28012'})

shard3

> cfg = {_id: 'shard3', members: [
                           {_id: 0, host:'192.168.20.13:28013'},
                           {_id: 1, host:'192.168.20.15:28013'},
               {_id: 2, host:'192.168.20.11:28013',"arbiterOnly":true}
               ]
            }
 
> rs.initiate(cfg);

修改优先权:

MongoDB replica sets中通过设置priority的值来决定优先权的大小,这个值的范围是0--100,值越大,优先权越高。
如果值是0,那么不能成为primay。

cfg = rs.conf()
    cfg.members[0].priority = 1
    cfg.members[1].priority = 2
    cfg.members[2].priority = 3
    rs.reconfig(cfg)

说明:cfg.members[0].priority =
括号中的数字是执行rs.conf()得出的节点顺序,第一个节点在这里写0,第二个节点写1,依次类推。

config server 配置:
 
配置服务器的dbpath 放在软件安装目录(SSD硬盘)

mds1:

./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork   
 
 #config server也需要dbpath
 
 mds2:

./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork
 
mds3:

./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork

配置mongs
 
在server1,server2,server3上分别执行:
 ./mongos –configdb 192.168.20.11:28010,192.168.20.13:28010,192.168.20.15:28010 –port 28000 –chunkSize 96 –logpath /home/mongo/mongodb2.6.4/logs/mongos.log –logappend –fork

分片配置:

>db.runCommand({addshard:"shard1/192.168.20.11:28011,192.168.20.13:28011,192.168.20.15:28011"});
     >db.runCommand({addshard:"shard2/192.168.20.11:28012,192.168.20.13:28012,192.168.20.15:28012"});
     >db.runCommand({addshard:"shard3/192.168.20.11:28013,192.168.20.13:28013,192.168.20.15:28013"});

mongodb 分片群集配置 及数据迁移相关推荐

  1. Linux服务器的配置和数据迁移方案

    问题   将Linux功能服务器的配置和数据迁移到新服务器中 解决方案   迁移一台主控+功能的Linux服务器方法 要求1:新旧服务器安装了同一版本的Prim@Hosting(最完善的虚拟主机管理系 ...

  2. 拆分命令_在MongoDB分片集群中拆分数据块chunks

    MongoDB Manual (Version 4.2)> Sharding > Data Partitioning with Chunks > Split Chunks in a ...

  3. mongodb分片概念和原理-实战分片集群

    一.分片 分片是一种跨多台机器分发数据的方法.MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署. 问题: 具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量.例如 ...

  4. MongoDB 分片的原理、搭建、应用

    一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...

  5. MongoDB——MongoDB分片集群(Sharded Cluster)两种搭建方式

    MongoDB分片集群(Sharded Cluster)两种搭建方式 MongoDB分片的概念 分片集群包含的组件 分片集群架构目标 MongoDB分片集群搭建 第一套副本集 第二套副本集 配置节点副 ...

  6. “芒果数据库”————mongodb分片全集和管理

    目录 一.mongodb分片群集 二.分片管理 一.mongodb分片群集 cd /opt tar zxvf mongodb-linux-x86_64-3.2.1.tgz #将包拖入至/opt下 mv ...

  7. TiDB和MongoDB分片集群架构比较

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近阅读了TiDB源码的说明文档,跟MongoDB的分片集群做了下简单对比. 首先展示TiDB的整体架构 M ...

  8. MongoDB 分片的原理、搭建、应用 (转)

    一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...

  9. 【转】MongoDB 分片的原理、搭建、应用

    一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...

最新文章

  1. 02-基于注解的入门案例
  2. 有关Vs2008 由代码转化到设计器时死掉问题
  3. java基础(一)-面向对象思想
  4. 关于Android中获取Intent里的数据
  5. Kubernetes常见操作
  6. [转载] 50个数据可视化最有价值的图表(附完整Python代码,建议收藏)
  7. NetSpeedMonitor:在任务栏中监视网络下载、上传情况
  8. python程序设计基础与应用课后答案_智慧职教Python程序设计基础作业课后答案
  9. mysql两张大表关联查询_关于mysql当中给数据量特别大的两个表做关联查询的时候解决查询速度很慢的解决方法...
  10. java swing tooltips_【Unity笔记】提示框ToolTips大小自适应,及其闪烁的问题
  11. Few-Shot Object Detection with Fully Cross-Transformer论文精读
  12. order by 按照指定顺序排序或自定义顺序排序
  13. python matplotlib 设置画布大小
  14. 你都是会点啥技术(四)--- Java
  15. 形容长得丑的30句经典句子
  16. 学生个人网页制作html代码(源码)
  17. 如何建设私有云原生 Serverless 平台
  18. 如何将SpringBoot项目部署到阿里云Linux服务器中
  19. 如何创造千万GMV?教科书级的方法论在这
  20. # [读书笔记1]:工业互联网边缘计算在离散制造业应用展望

热门文章

  1. python多线程不能利用多核cpu,但有时候多线程确实比单线程快。
  2. 设计模式——设计模式之禅day1
  3. Oracle数据库与Access互导实例
  4. 如何使用Dev C++调试(debug)c程序
  5. (53)zabbix模板
  6. P3119 [USACO15JAN]草鉴定Grass Cownoisseur
  7. Hibernate5环境搭建
  8. 高并发,分布式系统要点
  9. C++开发人脸性别识别教程(7)——搭建MFC框架之界面绘制
  10. python中的enumerate函数