集群的模块介绍:

从MongoDB官方给的集群架构了解,整个集群主要有4个模块:Config Server、mongs、 shard、replica set:

Config Server:用来存放集群的元数据,也就是存放所有分片的的配置数据,mongos第一次启动就需要连接configServer读取相关数据,当configServer有数据进行更新时,也会主动推送消息到所有的mongos上,在3.0.7版本中,官方是建议配置3份的Config Server,以便挂掉两台时,业务还能够正常运转。

mongs:Mongodb集群的的请求入口,能否自动实现数据的分布式分发,生产环境中建议部署在应用服务器上。

shard:分片就比如是将一张大表分散在几个不同的shard中,实现数据分布式存储。

replica set:主要是对每个分片进行冗余,生产环境中,一般将将副本集配置在三个节点上,两份副本、一份仲裁。

环境规划:

端口及安装路径规划:

用途

IP

端口

备注

安装路径

ConfigeServer

172.16.16.120

30001

/db/configS

172.16.16.121

30001

/db/configS

172.16.16.122

30001

/db/configS

share1

172.16.16.124

40001

Shard1主节点

/db/shard1

172.16.16.125

40001

Shard1副本节点

/db/shard1

172.16.16.126

40001

Shard1仲裁节点

/db/shard1

share2

172.16.16.125

40002

Shard2主节点

/db/shard2

172.16.16.126

40002

Shard2副本节点

/db/shard2

172.16.16.131

40002

Shard2仲裁节点

/db/shard2

share3

172.16.16.126

40003

Shard3主节点

/db/shard3

172.16.16.131

40003

Shard3副本节点

/db/shard3

172.16.16.124

40003

Shard3仲裁节点

/db/shard3

share4

172.16.16.121

40004

Shard4主节点

/db/shard4

172.16.16.124

40004

Shard4副本节点

/db/shard4

172.16.16.125

40004

Shard4仲裁节点

/db/shard4

mongos

172.16.16.124

50001

生产环境中一般直接部署在应用端

/db/mongos

172.16.16.125

50001

/db/mongos

172.16.16.126

50001

/db/mongos

172.16.16.131

50001

/db/mongos

opt]# tar zxvf mongodb-linux-x86_64-rhel55-3.0.7.gz

opt]#mv mongodb-linux-x86_64-rhel55-3.0.7 /usr/local/mongodb

opt]# useradd mongo

opt]#passwdmongo

Changing passwordforuser mongo.

New UNIX password:

BAD PASSWORD: it is too simplistic/systematic

Retype new UNIX password:passwd: all authentication tokens updated successfully.

opt]#chown -R mongo:mongo /usr/local/mongodb/opt]#chown -R mongo:mongo /db

创建相关模块存放路径:

创建configeServer目录(172.16.16.120/121/122):

#mkdir -p /db/configS/data & mkdir -p /db/configS/log (存放ConfigServer的数据、日志)

创建shard1目录(172.16.16.124/125/126):

#mkdir -p /db/shard1/data & mkdir -p /db/shard1/log (存放shard1的数据、日志)

创建shard2目录(172.16.16.125/126/131 ):

#mkdir -p /db/shard2/data & mkdir -p /db/shard2/log (存放shard2的数据、日志)

创建shard3目录(172.16.16.126/131/124 ):

#mkdir -p /db/shard3/data & mkdir -p /db/shard3/log (存放shard3的数据、日志)

创建shard4目录(172.16.16.131/124/125 ):

#mkdir -p /db/shard4/data & mkdir -p /db/shard4/log (存放shard4的数据、日志)

创建mongos目录(172.16.16.124/125/126/131)

#mkdir -p /db/mongos/log (由于mongos只做路由使用,不存数据,所以只需要建立log目录)

模块配置及启动:

configServer(172.16.16.120/121/122)配置及服务启动:

编写 /usr/local/mongodb/conf/configServer.conf,将参数都放在该文件中:

#vim /usr/local/mongodb/conf/configServer.conf

#!/bin/bash

systemLog:

destination:filepath:"/db/configS/log/configServer.log"#日志存储位置

logAppend:truestorage:

journal: #journal配置

enabled:truedbPath:"/db/configS/data"#数据文件存储位置

directoryPerDB:true#是否一个库一个文件夹

engine: wiredTiger #数据引擎

wiredTiger: #WT引擎配置

engineConfig:

cacheSizeGB:6#设置为6G,默认为物理内存的一半

directoryForIndexes:true#是否将索引也按数据库名单独存储

journalCompressor: zlib

collectionConfig: #表压缩配置

blockCompressor: zlib

indexConfig: #索引配置

prefixCompression:truenet: #端口配置

port:30001 #另外两台需要分别修改为30002、30003processManagement: #配置启动管理方式

fork:truesharding: #分片配置

clusterRole: configsvr #分片角色

启动configServer:

conf]$/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/configServer.conf

mongos(172.16.16.124/125/126/131)配置及服务启动:

编写mongos.conf,将参数都放在该文件中(4台配置文件都一样):

#vim /usr/local/mongodb/conf/mongos.conf

#!/bin/bash

systemLog:

destination:filepath:"/db/mongos/log/mongos.log"logAppend:truenet:

port:50001sharding:

configDB:172.16.16.120:30001,172.16.16.121:30001,172.16.16.122:30001processManagement:

fork:true

启动mongos:应保证集群中设备的时间都是一样的,否则启动mongos会报错,若不相同,可先搭建一套NTP服务器

conf]$ /usr/local/mongodb/bin/mongos -f /usr/local/mongodb/conf/mongos.conf

shard1分片+副本集配置及服务启动(172.16.16.124/125/126):

#vim /usr/local/mongodb/conf/shard1.conf

#!/bin/bash

systemLog:

destination:filepath:"/db/shard1/log/shard1.log"#日志存储位置

logAppend:truestorage:

journal: #journal配置

enabled:truedbPath:"/db/shard1/data"#数据文件存储位置

directoryPerDB:true#是否一个库一个文件夹

engine: wiredTiger #数据引擎

wiredTiger: #WT引擎配置

engineConfig:

cacheSizeGB:6#设置为6G,默认为物理内存的一半

directoryForIndexes:true#是否将索引也按数据库名单独存储

journalCompressor: zlib

collectionConfig: #表压缩配置

blockCompressor: zlib

indexConfig: #索引配置

prefixCompression:truenet: #端口配置

port:40001processManagement: #配置启动管理方式

fork:truesharding: #分片配置

clusterRole: shardsvr

replication:

replSetName: shard1 #配置副本集名称

启动shard1 mongod:

conf]$/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard1.conf

shard2分片+副本集配置及服务启动(172.16.16.125/126/131 ):

#vim /usr/local/mongodb/conf/shard2.conf

#!/bin/bash

systemLog:

destination: file

path:"/db/shard2/log/shard2.log"#日志存储位置

logAppend:truestorage:

journal: #journal配置

enabled:truedbPath:"/db/shard2/data"#数据文件存储位置

directoryPerDB:true#是否一个库一个文件夹

engine: wiredTiger #数据引擎

wiredTiger: #WT引擎配置

engineConfig:

cacheSizeGB:6#设置为6G,默认为物理内存的一半

directoryForIndexes:true#是否将索引也按数据库名单独存储

journalCompressor: zlib

collectionConfig: #表压缩配置

blockCompressor: zlib

indexConfig: #索引配置

prefixCompression:truenet: #端口配置

port:40002processManagement: #配置启动管理方式

fork:truesharding: #分片配置

clusterRole: shardsvr

replication:

#oplogSizeMB:

replSetName: shard2 #配置副本集名称

启动shard2 mongod:

conf]$ /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard2.conf

shard3分片+副本集配置及服务启动(172.16.16.126/131/124 ):

#vim /usr/local/mongodb/conf/shard3.conf

#!/bin/bash

systemLog:

destination: file

path:"/db/shard3/log/shard3.log"#日志存储位置

logAppend:truestorage:

journal: #journal配置

enabled:truedbPath:"/db/shard3/data"#数据文件存储位置

directoryPerDB:true#是否一个库一个文件夹

engine: wiredTiger #数据引擎

wiredTiger: #WT引擎配置

engineConfig:

cacheSizeGB:6#设置为6G,默认为物理内存的一半

directoryForIndexes:true#是否将索引也按数据库名单独存储

journalCompressor: zlib

collectionConfig: #表压缩配置

blockCompressor: zlib

indexConfig: #索引配置

prefixCompression:truenet: #端口配置

port:40003processManagement: #配置启动管理方式

fork:truesharding: #分片配置

clusterRole: shardsvr

replication:

#oplogSizeMB:

replSetName: shard3 #配置副本集名称

启动shara3 mongod:

conf]$ /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard3.conf

shard4分片+副本集配置及服务启动(172.16.16.131/124/125 ):

#vim /usr/local/mongodb/conf/shard4.conf

#!/bin/bash

systemLog:

destination:filepath:"/db/shard4/log/shard4.log"#日志存储位置

logAppend:truestorage:

journal: #journal配置

enabled:truedbPath:"/db/shard4/data"#数据文件存储位置

directoryPerDB:true#是否一个库一个文件夹

engine: wiredTiger #数据引擎

wiredTiger: #WT引擎配置

engineConfig:

cacheSizeGB:6#设置为6G,默认为物理内存的一半

directoryForIndexes:true#是否将索引也按数据库名单独存储

journalCompressor: zlib

collectionConfig: #表压缩配置

blockCompressor: zlib

indexConfig: #索引配置

prefixCompression:truenet: #端口配置

port:40004processManagement: #配置启动管理方式

fork:truesharding: #分片配置

clusterRole: shardsvr

replication:

#oplogSizeMB:

replSetName: shard4 #复制集名

启动shara4 mongod:

conf]$ /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard4.conf

集群配置:

副本集配置(在每个 shard的主节点上进行配置及初始化,否则会初始化失败 ):

shard1的副本集配置(主节点、副本节点、仲裁节点):

bin]$ ./mongo 172.16.16.124:40001MongoDB shell version:3.0.7connecting to:172.16.16.124:40001/test>use admin

switched to db admin> config = { _id:"shard1", members:[

{_id:0,host:"172.16.16.124:40001"},

{_id:1,host:"172.16.16.125:40001"},

{_id:2,host:"172.16.16.126:40001",arbiterOnly:true}]

}

#以下为输出

{"_id" : "shard1","members": [

{"_id" : 0,"host" : "172.16.16.124:40001"},

{"_id" : 1,"host" : "172.16.16.125:40001"},

{"_id" : 2,"host" : "172.16.16.126:40001","arbiterOnly" : true}

]

}>rs.initiate(config); #初始化配置

{"ok" : 1}

shard2的副本集配置(主节点、副本节点、仲裁节点):

bin]$ ./mongo 172.16.16.125:40002MongoDB shell version:3.0.7connecting to:172.16.16.125:40002/test>use admin

switched to db admin> config = { _id:"shard2", members:[

{_id:0,host:"172.16.16.125:40002"},

{_id:1,host:"172.16.16.126:40002"},

{_id:2,host:"172.16.16.131:40002",arbiterOnly:true}]

}

#以下为输出

{"_id" : "shard2","members": [

{"_id" : 0,"host" : "172.16.16.125:40002"},

{"_id" : 1,"host" : "172.16.16.126:40002"},

{"_id" : 2,"host" : "172.16.16.131:40002","arbiterOnly" : true}

]

}>rs.initiate(config); #初始化配置

{"ok" : 1 }

shard3的副本集配置(主节点、副本节点、仲裁节点):

bin]$ ./mongo 172.16.16.126:40003MongoDB shell version:3.0.7connecting to:172.16.16.126:40003/test>use admin

switched to db admin> config = { _id:"shard3", members:[

{_id:0,host:"172.16.16.126:40003"},

{_id:1,host:"172.16.16.131:40003"},

{_id:2,host:"172.16.16.124:40003",arbiterOnly:true}]

}

#以下为输出

{"_id" : "shard3","members": [

{"_id" : 0,"host" : "172.16.16.126:40003"},

{"_id" : 1,"host" : "172.16.16.131:40003"},

{"_id" : 2,"host" : "172.16.16.124:40003","arbiterOnly" : true}

]

}>rs.initiate(config); #初始化配置

{"ok" : 1}

shard4的副本集配置(主节点、副本节点、仲裁节点):

bin]$ ./mongo 172.16.16.131:40004MongoDB shell version:3.0.7connecting to:172.16.16.131:40004/test>use admin

switched to db admin> config = { _id:"shard4", members:[

{_id:0,host:"172.16.16.131:40004"},

{_id:1,host:"172.16.16.124:40004"},

{_id:2,host:"172.16.16.125:40004",arbiterOnly:true}]

}

#以下为输出

{"_id" : "shard4","members": [

{"_id" : 0,"host" : "172.16.16.131:40004"},

{"_id" : 1,"host" : "172.16.16.124:40004"},

{"_id" : 2,"host" : "172.16.16.125:40004","arbiterOnly" : true}

]

}>rs.initiate(config); #初始化配置

{"ok" : 1}

分片配置

bin]$ ./mongo 172.16.16.124:50001mongos>use admin

switched to db admin

mongos> db.runCommand({addshard:"shard1/172.16.16.124:40001,172.16.16.125:40001,172.16.16.126:40001"});

{"shardAdded" : "shard1", "ok" : 1}

mongos>db.runCommand({addshard:"shard2/172.16.16.125:40002,172.16.16.126:40002,172.16.16.131:40002"});

{"shardAdded" : "shard2", "ok" : 1}

mongos>db.runCommand({addshard:"shard3/172.16.16.126:40003,172.16.16.131:40003,172.16.16.124:40003"});

{"shardAdded" : "shard3", "ok" : 1}

mongos>db.runCommand({addshard:"shard4/172.16.16.131:40004,172.16.16.124:40004,172.16.16.125:40004"});

{"shardAdded" : "shard4", "ok" : 1 }

查看配置是否生效(仲裁不被列出 ):

mongos> db.runCommand( { listshards : 1} );

{"shards": [

{"_id" : "shard1","host" : "shard1/172.16.16.124:40001,172.16.16.125:40001"},

{"_id" : "shard2","host" : "shard2/172.16.16.125:40002,172.16.16.126:40002"},

{"_id" : "shard3","host" : "shard3/172.16.16.126:40003,172.16.16.131:40003"},

{"_id" : "shard4","host" : "shard4/172.16.16.124:40004,172.16.16.131:40004"}

],"ok" : 1}

以上就完成了MongoDB shard+replica模式的集群搭建,接下来做业务测试。

集群测试

默认情况下,库和集合没有自动分片的,若有数据写入,只会往一个shard中存储,做个测试验证:

bin]$ ./mongo 172.16.16.131:50001MongoDB shell version:3.0.7connecting to:172.16.16.131:50001/test

mongos>use ljaidb

switched to db ljaidb

mongos> for (var i=1;i<=10000;i++) db.ljaitable.save({"name":"ljai","age":27,"addr":"fuzhou"})

WriteResult({"nInserted" : 1})

mongos>db.ljaitable.stats()

{"sharded" : false,"primary" : "shard1","ns" : "ljaidb.ljaitable","count" : 10000,"size" : 670000,"avgObjSize" : 67,"storageSize" : 49152,"capped" : false,"wiredTiger": {"metadata": {"formatVersion" : 1}

mongos>db.printShardingStatus()--- Sharding Status ---sharding version: {"_id" : 1,"minCompatibleVersion" : 5,"currentVersion" : 6,"clusterId" : ObjectId("5625fc29e3c17fdff8517b73")

}

shards:

{"_id" : "shard1", "host" : "shard1/172.16.16.124:40001,172.16.16.125:40001"}

{"_id" : "shard2", "host" : "shard2/172.16.16.125:40002,172.16.16.126:40002"}

{"_id" : "shard3", "host" : "shard3/172.16.16.126:40003,172.16.16.131:40003"}

{"_id" : "shard4", "host" : "shard4/172.16.16.124:40004,172.16.16.131:40004"}

balancer:

Currently enabled: yes

Currently running: yes

Balancer lock taken at Tue Oct20 2015 21:01:26 GMT+0800 (CST) by DataServer-04:50001:1445330413:1804289383:Balancer:846930886Failed balancer roundsin last 5 attempts: 0Migration Resultsfor the last 24hours:

No recent migrations

databases:

{"_id" : "admin", "partitioned" : false, "primary" : "config"}

{"_id" : "test", "partitioned" : false, "primary" : "shard1"}

{"_id" : "ljaidb", "partitioned" : false, "primary" : "shard1" }

可以看出ljaidb库并没有分片,且数据都在shard1上,登录其他shard1上查看:

bin]$./mongo 172.16.16.124:40001MongoDB shell version:3.0.7connecting to:172.16.16.124:40001/test

shard1:PRIMARY>show dbs

ljaidb0.000GB

local0.000GB

shard1:PRIMARY>use ljaidb

switched to db ljaidb

shard1:PRIMARY>show tables

ljaitable

shard1:PRIMARY> db.ljaitable.find().count()10000

验证shard2、shard3、shard4上都没有ljaidb这个库:

bin]$ ./mongo 172.16.16.125:40002MongoDB shell version:3.0.7connecting to:172.16.16.125:40002/test

shard2:PRIMARY>show dbs

local0.000GB

指定数据库和集合进行分片:

为了让某个数据库与集合自动分片生效,对数据库(lymdb)及数据库(lymtable)中的表进行分片配置:

bin]$./mongo 172.16.16.124:50001MongoDB shell version:3.0.7connecting to:172.16.16.124:50001/test

mongos>use admin

switched to db admin

mongos> db.runCommand( { enablesharding :"lymdb"});

{"ok" : 1}

mongos> db.runCommand( { shardcollection : "lymdb.lymtable",key : {_id: 1} } )

{"collectionsharded" : "lymdb.lymtable", "ok" : 1}

通过java或者python驱动,连接mongo集群测试:

java连接代码:

1 importjava.util.ArrayList;2 importjava.util.List;3

4 importcom.mongodb.BasicDBObject;5 importcom.mongodb.DB;6 importcom.mongodb.DBCollection;7 importcom.mongodb.DBObject;8 importcom.mongodb.MongoClient;9 importcom.mongodb.ServerAddress;10

11 public classTestMongoDBShards {12

13 public static voidmain(String[] args) {14 try{15 List addresses = new ArrayList();16 ServerAddress address1 = new ServerAddress("172.16.16.124" , 50001);17 ServerAddress address2 = new ServerAddress("172.16.16.125" , 50001);18 ServerAddress address3 = new ServerAddress("172.16.16.126" , 50001);19 ServerAddress address4 = new ServerAddress("172.16.16.131" , 50001);20 addresses.add(address1);21 addresses.add(address2);22 addresses.add(address3);23

24 MongoClient client = newMongoClient(addresses);25 DB db = client.getDB( "lymdb");26 DBCollection coll = db.getCollection( "lymtable");27

28 //BasicDBObject object = new BasicDBObject();29 //object.append( "id" , 1);30

31 //DBObject dbObject = coll.findOne(object);

32

33 for(int i=1;i<=1000000;i++) {34 DBObject saveData=newBasicDBObject();35 saveData.put("id", i);36 saveData.put("userName", "baiwan" +i);37 saveData.put("age", "26");38 saveData.put("gender", "m");39

40

41 coll.save(saveData);42 }43

44

45

46

47 //System. out .println(dbObject);

48

49 } catch(Exception e) {50 e.printStackTrace();51 }52 //TODO Auto-generated method stub

53

54 }55

56 }

python连接代码:

1 #encoding=UTF-8

2 importdatetime3

4 ISOTIMEFORMAT = '%Y-%m-%d %X'

5

6 from pymongo importMongoClient7 conn = MongoClient("172.16.16.124",50001)8 db =conn.funodb9 defdateDiffInSeconds(date1,date2):10 timedelta = date2 -date111 return timedelta.days*24*3600 +timedelta.seconds12 db.funotable.drop()13 date1 =datetime.datetime.now()14 for i in range(0,1000000): db.funotable.insert({"name":"ljai","age":i,"addr":"fuzhou"})15 c =db.funotable.find().count()16 print("count is",c)17 date2 =datetime.datetime.now()18 print(date1)19 print(date2)20 print("消耗:",dateDiffInSeconds(date1,date2),"seconds")21 conn.close()

测试是否自动分片:

mongos>db.lymtable.getShardDistribution()

Shard shard1 at shard1/172.16.16.124:40001,172.16.16.125:40001data :96.46MiB docs : 1216064 chunks : 4estimated data per chunk :24.11MiB

estimated docs per chunk :304016Shard shard2 at shard2/172.16.16.125:40002,172.16.16.126:40002data :44.9MiB docs : 565289 chunks : 4estimated data per chunk :11.22MiB

estimated docs per chunk :141322Shard shard3 at shard3/172.16.16.126:40003,172.16.16.131:40003data :99.39MiB docs : 1259979 chunks : 4estimated data per chunk :24.84MiB

estimated docs per chunk :314994Shard shard4 at shard4/172.16.16.124:40004,172.16.16.131:40004data :76.46MiB docs : 958668 chunks : 4estimated data per chunk :19.11MiB

estimated docs per chunk :239667Totals

data :317.22MiB docs : 4000000 chunks : 16Shard shard1 contains30.4% data, 30.4% docs incluster, avg obj size on shard : 83B

Shard shard2 contains14.15% data, 14.13% docs incluster, avg obj size on shard : 83B

Shard shard3 contains31.33% data, 31.49% docs incluster, avg obj size on shard : 82B

Shard shard4 contains24.1% data, 23.96% docs in cluster, avg obj size on shard : 83B

可以看出,插入400万条数据,都有分布各个shard上,但是不够均匀,需要进一步研究分片的配置。

mongodb 集群shard_MongoDBV3.0.7版本(shard+replica)集群的搭建及验证相关推荐

  1. Linux(CentOS7)治理组件nacos(2.0.3版本)单机/集群安装部署详细图解

    一.演示环境说明 三台Linux服务器, IP1:192.168.65.200:IP2:192.168.65.201:IP3:192.168.65.202, MySql_V5.7.24:192.168 ...

  2. 【转】MongoDB 3.0 正式版本即将发布,强力推荐

    MongoDB 今天宣布3.0 正式版本即将发布.这标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大.灵活而且易于管理的数据库管理系统. MongoDB 3.0 在性能和伸缩性方面都有 ...

  3. 微信投屏服务器出错,微信发布7.0.21版本,修复异常问题,增加超实用新功能

    原标题:微信发布7.0.21版本,修复异常问题,增加超实用新功能 iOS微信又更新了,今天发布v7.0.21版本,距离上次更新才两个礼拜的时间.以往微信的更新频率是比较慢的,这次之所以如此之快地发布新 ...

  4. 最新通知!ComingChat V0.0.6版本上线!

    2012年就出现却在2021年突然炒热的NFT,一个夏天就成为了币圈的香饽饽,收获了数以万计的追随者.互联网时代下,人们接受新鲜事物的能力越发强大.ComingChat 随着Web3.0和元宇宙概念的 ...

  5. centos7 redis5.0以后版本 集群部署示例

    简言 1. redis5.0版本以前的集群部署是使用ruby脚本完成的,略为复杂,具体示例见笔者的这篇博客,https://blog.csdn.net/yzf279533105/article/det ...

  6. ubuntu16 redis5.0以后版本集群部署示例

    简言 1. redis5.0版本以前的集群部署是使用ruby脚本完成的,略为复杂,具体示例见笔者的这篇博客,https://blog.csdn.net/yzf279533105/article/det ...

  7. ubuntu16 redis5.0以前版本集群部署示例

    简言 1. redis5.0版本以前集群的部署是使用ruby脚本完成的,ruby脚本的安装少略麻烦(主要原因是系统自动安装的版本太低,无法部署集群,必须手动安装) 2. redis5.0版本以后把集群 ...

  8. centos7 redis5.0以前版本 集群部署示例 - 第一篇

    简言 1. redis5.0版本以前的集群部署是使用ruby脚本完成的,ruby脚本的安装少略麻烦(主要原因是系统自动安装的版本太低,无法部署集群,必须手动安装) 2. redis5.0版本以后的集群 ...

  9. aix7.1.4上安装12.1.0.2版本RAC集群时遇到的bug无法创建mgmt库

    1.具体故障表现: 在AIX 7100-04-03-1642版本操作系统上安装ORACLE 12.1.0.2版本GRID集群软件时,运行root.sh脚本正常构建集群: 之后图形界面脚本之后的操作,在 ...

最新文章

  1. Embedding Lua, in Scala, using Java(转)
  2. Python3搭建Django框架浅析
  3. linux device注册
  4. .net面试题大全,绝大部分面试题(有答案)
  5. 阿里云E-MapReduce 创建执行计划
  6. Coursera自动驾驶课程第7讲:Vehicle Lateral Control
  7. python 正则表达式匹配的位置_python正则表达式匹配 模式匹配
  8. 树莓派(Raspberry Pi)搭建简单的lamp服务
  9. mysql 事件状态enable_mysql事件 - wayhk的个人页面 - OSCHINA - 中文开源技术交流社区...
  10. LintCode Memcache
  11. 吴伯凡-认知方法论-认知的升级=工具的进化
  12. STM32F407单片机移植ADS1115驱动程序
  13. amr文件怎么转换成mp3
  14. mac下后端开发常用软件
  15. Comic Life 3 for Mac(漫画创作软件)内附安装教程需要 macOS 11.x系统
  16. 在UE4中完美导入MMD的动作,表情;基本导入镜头,材质---最详细教程
  17. 桥梁防撞智能预警系统方案
  18. solidity的投票示例代码
  19. 如何选择合适的进销存管理软件?这几点你需要知道
  20. 计算机图形学中的四元数(Quaternions)

热门文章

  1. 洪柱森老师介绍--沪师经纪-刘建
  2. 支付狙击战落败,教育分期问题缠身,度小满“困局”何解?
  3. 电机驱动电路之H桥基本知识---Trinamic电机驱动芯片
  4. 六轴加速陀螺仪MPU6500/MPU6050使用及DMP库移植,含记步器功能
  5. zxing换行_为什么我的word里的横线上写完一行字不能自动换行,?
  6. Python基础:第019课——窗口缩放事件、最小化状态及处理
  7. 一个癌症病人的美国求医经历:活人死人如果都得不到尊重,病人也很难被尊重
  8. [openwrt]coredump设置
  9. redis常用命令getex_Redis常用命令整理
  10. 详细讲解MySQL索引与联合索引