一、副本集介绍

  搭建副本集是为了实现mongodb高可用。

  Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。

  仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。

  在MongoDB副本集中,主节点负责处理客户端的读写请求,备份节点则负责映射主节点的数据。

  备份节点的工作原理过程可以大致描述为,备份节点定期轮询主节点上的数据操作,然后对自己的数据副本进行这些操作,从而保证跟主节点的数据同步。至于主节点上的所有 数据库状态改变 的操作,都会存放在一张特定的系统表中。备份节点则是根据这些数据进行自己的数据更新。

  上面提到的 数据库状态改变 的操作,称为oplog(operation log,主节点操作记录)。oplog存储在local数据库的"oplog.rs"表中。副本集中备份节点异步的从主节点同步oplog,然后重新执行它记录的操作,以此达到了数据同步的作用。

Oplog注意点:

  Oplog的大小是固定的,当集合被填满的时候,新的插入的文档会覆盖老的文档。

  Oplog同步数据

  初始化:这个过程发生在当副本集中创建一个新的数据库或其中某个节点刚从宕机中恢复,或者向副本集中添加新的成员的时候,默认的,副本集中的节点会从离它最近的节点复制oplog来同步数据,这个最近的节点可以是primary也可以是拥有最新oplog副本的secondary节点。

二、搭建有仲裁节点的副本集

1.进入到/usr/java中,新建mongodbRepliSet文件夹,然后在 mongodbRepliSet 文件夹中新建 3个节点,先 mkdir  node1。

2.进入到 node1中,新建 data 和 log文件夹,即 mkdir  data  log,然后进入到 data中,mkdir  db。

3.拷贝mongodb的配置文件到 node1中,

 cp /usr/java/mongoNode/mongodb.conf /usr/java/mongodbRepliSet/node1/mongodb.conf

4.修改配置文件,vim  mongodb.conf

dbpath=/usr/java/mongodbRepliSet/node1/data//db
logpath=/usr/java/mongodbRepliSet/node1/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.80.128
port=27017
replSet=JoeSet   # 3个节点的这个配置要一样,表示在一个副本集中

5.拷贝 node1 整个文件夹,名为 node2 和 node3

cp -r node1 node2

cp -r node1 node3

6.修改 node2 和 node3 文件夹中的mongodb.conf,修改 dbpath、logpath 和 port(27018、27019)。

7.配置 临时的环境变量,export  PATH=/usr/java/mongodb/bin:$PATH

8.查看临时的环境变量是否配置成功:echo  $PATH

9.启动3个节点,分别进入 node1 node2和node3中,以配置文件方式启动:mongod --config mongodb.conf

10.客户端连接node1,mongo --host  192.168.80.128  --port  27017

11.上述配置 没有指定哪一个是master、slave、仲裁节点,所以需要执行下 副本集的初始化,执行:

rs.initiate({"_id":"JoeSet",members:[{"_id":1,"host":"192.168.80.128:27017",priority:3},{"_id":2,"host":"192.168.80.128:27018", priority:9},{"_id":3,"host":"192.168.80.128:27019",arbiterOnly:true}]})。

  1. "_id": 副本集的名称
  2. "members": 副本集的服务器列表
  3. "_id": 服务器的唯一ID
  4. "host": 服务器主机
  5. "priority": 是优先级,默认为1,优先级0为被动节点,不能成为活跃节点。优先级不位0则按照有大到小选出活跃节点。
  6. "arbiterOnly": 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。

 执行完 初始化命令后,会变为上图所示。

 注意,可能出现的错误:

> rs.initiate({"_id":"JoeSet",members:[{"_id":1,"host":"192.168.80.128:27017",priority:3},{"_id":2,"host":"192.168.80.128:27018", priority:9},{"_id":4,"host":"192.168.80.128:27019",arbiterOnly:true}]})
{"ok" : 0,"errmsg" : "This node, 192.168.80.128:27019, with _id 4 is not electable under the new configuration version 1 for replica set JoeSet","code" : 93
}

错误原因,是因为客户端连接了 27019,而27019 又是仲裁节点,所以出现了这个错误。解决方法,客户端连接 其他节点,不连接 设置为仲裁的节点。

12.执行:rs.status(),查看状态。

 1 JoeSet:OTHER> rs.status()
 2 {
 3     "set" : "JoeSet",
 4     "date" : ISODate("2017-07-26T22:09:44.940Z"),
 5     "myState" : 2,
 6     "members" : [
 7         {
 8             "_id" : 1,
 9             "name" : "192.168.80.128:27017",
10             "health" : 1,
11             "state" : 2,
12             "stateStr" : "SECONDARY",        # SECONDARY 表示从节点
13             "uptime" : 38,
14             "optime" : Timestamp(1501106974, 1),
15             "optimeDate" : ISODate("2017-07-26T22:09:34Z"),
16             "configVersion" : 1,
17             "self" : true
18         },
19         {
20             "_id" : 2,
21             "name" : "192.168.80.128:27018",
22             "health" : 1,
23             "state" : 1,
24             "stateStr" : "PRIMARY",        # PRIMARY 表示主节点
25             "uptime" : 10,
26             "optime" : Timestamp(1501106974, 1),
27             "optimeDate" : ISODate("2017-07-26T22:09:34Z"),
28             "lastHeartbeat" : ISODate("2017-07-26T22:09:44.560Z"),
29             "lastHeartbeatRecv" : ISODate("2017-07-26T22:09:44.579Z"),
30             "pingMs" : 1,
31             "electionTime" : Timestamp(1501106981, 1),
32             "electionDate" : ISODate("2017-07-26T22:09:41Z"),
33             "configVersion" : 1
34         },
35         {
36             "_id" : 3,
37             "name" : "192.168.80.128:27019",
38             "health" : 1,
39             "state" : 7,
40             "stateStr" : "ARBITER",        # ARBITER 表示仲裁节点
41             "uptime" : 10,
42             "lastHeartbeat" : ISODate("2017-07-26T22:09:44.559Z"),
43             "lastHeartbeatRecv" : ISODate("2017-07-26T22:09:44.585Z"),
44             "pingMs" : 0,
45             "configVersion" : 1
46         }
47     ],
48     "ok" : 1
49 }

13.为了验证副本集搭建成功,我们 在node2(主节点) 中插入几条数据,然后在 node1 (从节点)中查看,因为 上面配置了 node2 为主节点, node1为从节点,node3为仲裁节点。

 1) 在node2中:

JoeSet:PRIMARY> show dbs
local  0.078GB
JoeSet:PRIMARY> use testdb
switched to db testdb
JoeSet:PRIMARY> db.createCollection("testCon")
{ "ok" : 1 }
JoeSet:PRIMARY> show collections
system.indexes
testCon
JoeSet:PRIMARY> for(var i=0; i<3;i++) db.testCon.insert({name:"Joe",index:i})
WriteResult({ "nInserted" : 1 })
JoeSet:PRIMARY> db.testCon.find()
{ "_id" : ObjectId("597a553d7db09ad9f77f1353"), "name" : "Joe", "index" : 0 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1354"), "name" : "Joe", "index" : 1 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1355"), "name" : "Joe", "index" : 2 }

 2) 在node1中:

JoeSet:SECONDARY> show dbs
2017-07-27T14:06:14.672-0700 E QUERY    Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }at Error (<anonymous>)at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)at shellHelper.show (src/mongo/shell/utils.js:630:33)at shellHelper (src/mongo/shell/utils.js:524:36)at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
JoeSet:SECONDARY> rs.slaveOk()
JoeSet:SECONDARY> show dbs
local   0.078GB
testdb  0.078GB
JoeSet:SECONDARY> use testdb
switched to db testdb
JoeSet:SECONDARY> show collections
system.indexes
testCon
JoeSet:SECONDARY> db.testCon.find()
{ "_id" : ObjectId("597a553d7db09ad9f77f1353"), "name" : "Joe", "index" : 0 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1354"), "name" : "Joe", "index" : 1 }
{ "_id" : ObjectId("597a553d7db09ad9f77f1355"), "name" : "Joe", "index" : 2 }

  在node1(从节点)中 可以查看到 node2(主节点)插入的数据,说明 副本集搭建成功。

  注意:从节点中是不允许执行写操作的。

三、模拟主节点故障及恢复

 1) 模拟node2(主节点)挂了,kiil 掉node2(主节点)的进程

 2) 客户端连接 node1(从节点):mongo --host  192.168.80.128  --port  27017

JoeSet:PRIMARY> rs.status()
{"set" : "JoeSet","date" : ISODate("2017-07-27T21:20:45.629Z"),"myState" : 1,"members" : [{"_id" : 1,"name" : "192.168.80.128:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 4209,"optime" : Timestamp(1501189437, 10),"optimeDate" : ISODate("2017-07-27T21:03:57Z"),"electionTime" : Timestamp(1501190187, 1),"electionDate" : ISODate("2017-07-27T21:16:27Z"),"configVersion" : 1,"self" : true},{"_id" : 2,"name" : "192.168.80.128:27018","health" : 0,"state" : 8,"stateStr" : "(not reachable/healthy)","uptime" : 0,"optime" : Timestamp(0, 0),"optimeDate" : ISODate("1970-01-01T00:00:00Z"),"lastHeartbeat" : ISODate("2017-07-27T21:20:43.773Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T21:16:24.292Z"),"pingMs" : 1,"lastHeartbeatMessage" : "Failed attempt to connect to 192.168.80.128:27018; couldn't connect to server 192.168.80.128:27018 (192.168.80.128), connection attempt failed","configVersion" : -1},{"_id" : 3,"name" : "192.168.80.128:27019","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 4191,"lastHeartbeat" : ISODate("2017-07-27T21:20:45.475Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T21:20:44.876Z"),"pingMs" : 0,"configVersion" : 1}],"ok" : 1
} 

  发现原来的从节点(node1)变为了 主节点,而原来的主节点显示的状态是 不可达、不健康的。这对于整个副本集的使用是没有影响的。

 3) 重新启动node2,即 原来的主节点。如果启动node2失败,就删除掉 db文件夹下的mongod.lock文件。

 4) 客户端连接node1,mongo --host  192.168.80.128  --port  27017,发现node2 重新启动后,node1 又变为 从节点,而 node2又变为 原来的主节点,这是因为 仲裁节点 和 设置的优先级的原因。

JoeSet:SECONDARY> rs.status()
{"set" : "JoeSet","date" : ISODate("2017-07-27T21:31:06.197Z"),"myState" : 2,"members" : [{"_id" : 1,"name" : "192.168.80.128:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 4830,"optime" : Timestamp(1501189437, 10),"optimeDate" : ISODate("2017-07-27T21:03:57Z"),"configVersion" : 1,"self" : true},{"_id" : 2,"name" : "192.168.80.128:27018","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 87,"optime" : Timestamp(1501189437, 10),"optimeDate" : ISODate("2017-07-27T21:03:57Z"),"lastHeartbeat" : ISODate("2017-07-27T21:31:05.209Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T21:31:05.506Z"),"pingMs" : 0,"electionTime" : Timestamp(1501190981, 1),"electionDate" : ISODate("2017-07-27T21:29:41Z"),"configVersion" : 1},{"_id" : 3,"name" : "192.168.80.128:27019","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 4811,"lastHeartbeat" : ISODate("2017-07-27T21:31:06.085Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T21:31:05.633Z"),"pingMs" : 0,"configVersion" : 1}],"ok" : 1
}

  当仲裁节点挂掉后,达不到高可用了,即当 主节点挂了后,从节点在没有仲裁节点的情况下,不会切换为 主节点了。所以,推荐使用没有仲裁节点的副本集,如下。

四、搭建没有仲裁节点的副本集,推荐使用

1.复制node1 为 node6、node7、node8:

 cp  -r  node1   node6

 cp  -r  node1   node7

 cp  -r  node1   node8

2.清空node6、node7、node8的db文件夹 和 log 文件夹

rm -rf data/db/*

 rm -rf log/*

3.修改node6、node7、node8 的datapath、logpath和port、replSet

 node6 的port 为 27021,node7 的port 为 27022,node8 的port 为 27023,replSet 为 XbqSet

4.启动三个节点,分别进入 对应的node文件夹中:

 mongod --config mongodb.conf

5.连接node6节点(27021):mongo --host  192.168.80.128  --port  27021

6.执行初始化命令:rs.initiate({"_id":"XbqSet",members:[{"_id":1,"host":"192.168.80.128:27021"},{"_id":2,"host":"192.168.80.128:27022"},{"_id":3,"host":"192.168.80.128:27023" }]})

7.查看状态,发现有一个主节点,两个从节点。

XbqSet:PRIMARY> rs.status()
{"set" : "XbqSet","date" : ISODate("2017-07-27T22:02:28.188Z"),"myState" : 1,"members" : [{"_id" : 1,"name" : "192.168.80.128:27021","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 483,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"electionTime" : Timestamp(1501192876, 1),"electionDate" : ISODate("2017-07-27T22:01:16Z"),"configVersion" : 1,"self" : true},{"_id" : 2,"name" : "192.168.80.128:27022","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 75,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"lastHeartbeat" : ISODate("2017-07-27T22:02:26.973Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T22:02:26.973Z"),"pingMs" : 0,"configVersion" : 1},{"_id" : 3,"name" : "192.168.80.128:27023","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 75,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"lastHeartbeat" : ISODate("2017-07-27T22:02:26.973Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T22:02:26.973Z"),"pingMs" : 0,"configVersion" : 1}],"ok" : 1
}

8.kill 掉node6,即端口 27021

9.然后连接到node7上:mongo --host  192.168.80.128  --port  27022,查看状态,发现node7为从节点,node8为主节点了,原来的node6 不可达、不健康的。

XbqSet:SECONDARY> rs.status()
{"set" : "XbqSet","date" : ISODate("2017-07-27T22:08:24.894Z"),"myState" : 2,"members" : [{"_id" : 1,"name" : "192.168.80.128:27021","health" : 0,"state" : 8,"stateStr" : "(not reachable/healthy)","uptime" : 0,"optime" : Timestamp(0, 0),"optimeDate" : ISODate("1970-01-01T00:00:00Z"),"lastHeartbeat" : ISODate("2017-07-27T22:08:23.748Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T22:07:43.464Z"),"pingMs" : 0,"lastHeartbeatMessage" : "Failed attempt to connect to 192.168.80.128:27021; couldn't connect to server 192.168.80.128:27021 (192.168.80.128), connection attempt failed","configVersion" : -1},{"_id" : 2,"name" : "192.168.80.128:27022","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 833,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"configVersion" : 1,"self" : true},{"_id" : 3,"name" : "192.168.80.128:27023","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 431,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"lastHeartbeat" : ISODate("2017-07-27T22:08:23.409Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T22:08:23.521Z"),"pingMs" : 0,"electionTime" : Timestamp(1501193266, 1),"electionDate" : ISODate("2017-07-27T22:07:46Z"),"configVersion" : 1}],"ok" : 1
}

10.重新启动node6:mongod --config mongodb.conf

11.继续连接node7:mongo --host  192.168.80.128  --port  27022,查看状态,原来的node6 变为了 从节点。

XbqSet:SECONDARY> rs.status()
{"set" : "XbqSet","date" : ISODate("2017-07-27T22:12:41.275Z"),"myState" : 2,"members" : [{"_id" : 1,"name" : "192.168.80.128:27021","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 54,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"lastHeartbeat" : ISODate("2017-07-27T22:12:40.382Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T22:12:41.213Z"),"pingMs" : 0,"configVersion" : 1},{"_id" : 2,"name" : "192.168.80.128:27022","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1090,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"configVersion" : 1,"self" : true},{"_id" : 3,"name" : "192.168.80.128:27023","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 688,"optime" : Timestamp(1501192872, 1),"optimeDate" : ISODate("2017-07-27T22:01:12Z"),"lastHeartbeat" : ISODate("2017-07-27T22:12:39.673Z"),"lastHeartbeatRecv" : ISODate("2017-07-27T22:12:39.820Z"),"pingMs" : 0,"electionTime" : Timestamp(1501193266, 1),"electionDate" : ISODate("2017-07-27T22:07:46Z"),"configVersion" : 1}],"ok" : 1
}

五、增加、删除节点

1.cp -r  node8  node10,修改node10的datapath、logpath的port,并将port 改为 27024,启动 node10。

2.进入到主节点中,mongo --host  192.168.80.128  --port  27023,一定要在主节点中进行操作。

3.增加节点:rs.add(“192.168.80.128:27024”)

XbqSet:PRIMARY> rs.add("192.168.80.128:27024")
{ "ok" : 1 }

4.查看状态,rs.status(),发现新增加的节点 为从节点,即 SECONDARY。

XbqSet:PRIMARY> rs.status()
{"set" : "XbqSet","date" : ISODate("2017-07-29T14:31:44.872Z"),"myState" : 1,"members" : [{"_id" : 1,"name" : "192.168.80.128:27021","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 630,"optime" : Timestamp(1501338697, 1),"optimeDate" : ISODate("2017-07-29T14:31:37Z"),"lastHeartbeat" : ISODate("2017-07-29T14:31:43.555Z"),"lastHeartbeatRecv" : ISODate("2017-07-29T14:31:43.457Z"),"pingMs" : 0,"configVersion" : 2},{"_id" : 2,"name" : "192.168.80.128:27022","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1854,"optime" : Timestamp(1501338697, 1),"optimeDate" : ISODate("2017-07-29T14:31:37Z"),"lastHeartbeat" : ISODate("2017-07-29T14:31:43.555Z"),"lastHeartbeatRecv" : ISODate("2017-07-29T14:31:43.186Z"),"pingMs" : 0,"configVersion" : 2},{"_id" : 3,"name" : "192.168.80.128:27023","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1953,"optime" : Timestamp(1501338697, 1),"optimeDate" : ISODate("2017-07-29T14:31:37Z"),"electionTime" : Timestamp(1501338022, 1),"electionDate" : ISODate("2017-07-29T14:20:22Z"),"configVersion" : 2,"self" : true},{"_id" : 4,"name" : "192.168.80.128:27024","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 7,"optime" : Timestamp(1501338697, 1),"optimeDate" : ISODate("2017-07-29T14:31:37Z"),"lastHeartbeat" : ISODate("2017-07-29T14:31:43.566Z"),"lastHeartbeatRecv" : ISODate("2017-07-29T14:31:43.579Z"),"pingMs" : 6,"configVersion" : 2}],"ok" : 1
}

5.删除节点:rs.remove(hostportstr)

XbqSet:PRIMARY> rs.remove("192.168.80.128:27024")
{ "ok" : 1 }

查看状态,发现 端口为27024的节点 没有了。

MongoDB(五)-- 副本集(replica Set)相关推荐

  1. MongoDB的副本集

    文章目录 1.副本集-Replica Sets 2.副本集的三个角色 3.副本集架构目标 4.故障测试 1.副本集-Replica Sets MongoDB中的副本集(Replica Set)是一组维 ...

  2. SpringBoot整合MongoDB以及副本集、分片集群的搭建

    整合springboot应用 说明: 这里主要以 springboot 应用为基础应用进行整合开发. Spring Data : Spring 数据框架 JPA .Redis.Elasticsearc ...

  3. MongoDB之副本集

    MongoDB之副本集 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...

  4. MongoDB配置副本集(含Arbiter)

    MongoDB配置副本集(含Arbiter) 集群模式为:一主一副一仲裁 安装依赖 yum install net-snmp lsof -yyum install net-snmp -y 配置数据节点 ...

  5. MongoDB 搭建副本集

    副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...

  6. mongodb系列~mongodb的副本集搭建和原理

    一 简介: mongodb副本集 二 复制方式: 1 全量复制 2 增量复制 三 同步检测过程:     一 正常情况下:        1 master执行语句,并将所有的修改数据库的操作以日志Op ...

  7. MongoDB之副本集配置

    MongoDB主从复制 主从复制是 MongoDB 最早使用的复制方式, 该复制方式易于配置,并且可以支持任意数量的从节点服务器,与使用单节点模式相比有如下优点: 在从服务器上存储数据副本,提高了数据 ...

  8. MongoDB之副本集创建

    目录 一 复制 1 复制简介 2 建立副本集 3 网络注意事项 4 安全注意事项 5 观察副本集 6 更改副本集操作 7 如何设计副本集 8 如何进行选举 9 成员变量配置 10 创建索引 二 同步 ...

  9. Golang + MongoDB ReplSet副本集

    本文介绍MongoDB副本集,暂且按照3个节点来配置:A(primary).B(secondary).C(arbiter) 1. 在集群每个节点上安装一份MongoDB: 2. 配置副本集: 3. 配 ...

  10. MongoDB部署副本集

    本页包含内容 概览 系统需求 部署一个基于Key文件实现访问控制的副本集 x.509 内部身份验证 概述 首发于sf.gg. 原文翻译自MongoDB官方文档.我一直认为,与其从网上随便扒一些教程,不 ...

最新文章

  1. 华为又牵手名校,这次是他!
  2. BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】
  3. MongoDB集群之分片技术应用 —— 学习笔记
  4. ABAP 屏幕上动态修改按钮的图标
  5. Kubernetes用户指南(二)--部署组合型的应用、连接应用到网络中
  6. 4.1 卷积神经网络调参-adagrad_adam
  7. 如何把Java的double类型变量保留两位小数
  8. 异常处理汇总-数据库系列
  9. 计算机考研复试面试常问问题 软件工程篇
  10. 大数据学习开篇:了解大数据导论、清楚大数据应用领域和前景
  11. 南航计算机学院考博难么,考研专硕真的不能考博吗?看看过来人是咋说的
  12. 肯德尔相关性分析_肯德尔的Tau机器学习相关性
  13. 8大基本数据类型各占多少字节和一些单位常识
  14. 数据压缩实验八:MPEG音频压缩编码
  15. IOS AutoFill Extension 使用
  16. 如何快速提升网站排名?
  17. 安装包升级—如何制作升级包
  18. 2021-10-22 KiKi定义电子日历类
  19. channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no
  20. 春天猫rtsy_您最近见过春天吗?

热门文章

  1. [Hibernate]关于ID的一个容易混淆的地方
  2. (转载)SQL Server2008附加数据库之后显示为只读时解决方法
  3. JS面向对象的程序设计之创建对象_工厂模式,构造函数模式,原型模式-1
  4. react-native ListView 封装 实现 下拉刷新/上拉加载更多
  5. RabbitMQ详解(一)
  6. .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控
  7. Sqli-labs less 40
  8. 六安瓜片在51CTO【礼树迎蛇 红满社区】
  9. KSQL中Update多表级联更新的语法
  10. 类的初始化列表_【Flutter 111】Flutter手把手教程Dart语言——类、类的的成员变量和方法、类的构造函数...