目录

摘要:

raft测试代码:

raft-grpc-example:

编译:

raftadmin:

编译:

快速组建raft集群:

一. 生成需要的文件目录

二. 分别启动一个bootstrap节点和两个常规节点

三. 给bootstrap节点增加follow节点

查看结果:

raftadmin可用命令

查看leader:

查看stats

重选主

nodeB日志:

nodeC日志:

重启nodeA, 查看nodeA加入集群的日志:

查看当前leader:


摘要:

快速搭建raft三节点集群

raft测试代码:

raft-grpc-example:

https://github.com/Jille/raft-grpc-example

编译:

进入根目录

go  mod vendorgo build -o raft-grpc-example .

raftadmin:

GitHub - Jille/raftadmin: gRPC wrapper for Hashicorp's raft.Raft object

编译:

进入根目录

go mod vendorgo build -o raftadmin cmd/raftadmin/raftadmin.go

快速组建raft集群:

一. 生成需要的文件目录

rm /tmp/my-raft-cluster -rf
mkdir /tmp/my-raft-cluster
mkdir /tmp/my-raft-cluster/nodeA
mkdir /tmp/my-raft-cluster/nodeB
mkdir /tmp/my-raft-cluster/nodeC

二. 分别启动一个bootstrap节点和两个常规节点

./raft-grpc-example --raft_bootstrap --raft_id=nodeA --address=localhost:50051 --raft_data_dir /tmp/my-raft-cluster./raft-grpc-example --raft_id=nodeB --address=localhost:50052 --raft_data_dir /tmp/my-raft-cluster./raft-grpc-example --raft_id=nodeC --address=localhost:50053 --raft_data_dir /tmp/my-raft-cluster

三. 给bootstrap节点增加follow节点


# 向nodeA 增加 nodeB./raftadmin localhost:50051 add_voter nodeB localhost:50052 0
# 增加nodeC./raftadmin --leader multi:///localhost:50051,localhost:50052 add_voter nodeC localhost:50053 0

查看结果:

raftadmin可用命令

root@localhost:~/work/github/raftadmin# ./admin --leader
2022/03/01 14:09:03 Usage: raftadmin <host:port> <command> <args...>
Commands: add_nonvoter, add_voter, applied_index, apply_log, await, barrier, demote_voter, forget, get_configuration, last_contact, last_index, leader, leadership_transfer, leadership_transfer_to_server, remove_server, shutdown, snapshot, state, stats, verify_leader

查看leader:

root@localhost:~/work/github/raftadmin# ./admin --leader multi:///localhost:50051,localhost:50052  leader2022/03/01 13:56:01 Invoking Leader()
2022/03/01 13:56:01 Response: address: "localhost:50051"

查看stats

root@localhost:~/work/github/raftadmin# ./admin --leader multi:///localhost:50051,localhost:50052  stats
2022/03/01 14:10:16 Invoking Stats()
2022/03/01 14:10:16 Response: stats: {key: "applied_index"value: "4"
}
stats: {key: "commit_index"value: "4"
}
stats: {key: "fsm_pending"value: "0"
}
stats: {key: "last_contact"value: "0"
}
stats: {key: "last_log_index"value: "4"
}
stats: {key: "last_log_term"value: "2"
}
stats: {key: "last_snapshot_index"value: "0"
}
stats: {key: "last_snapshot_term"value: "0"
}
stats: {key: "latest_configuration"value: "[{Suffrage:Voter ID:nodeA Address:localhost:50051} {Suffrage:Voter ID:nodeB Address:localhost:50052} {Suffrage:Voter ID:nodeC Address:localhost:50053}]"
}
stats: {key: "latest_configuration_index"value: "0"
}
stats: {key: "num_peers"value: "2"
}
stats: {key: "protocol_version"value: "3"
}
stats: {key: "protocol_version_max"value: "3"
}
stats: {key: "protocol_version_min"value: "0"
}
stats: {key: "snapshot_version_max"value: "1"
}
stats: {key: "snapshot_version_min"value: "0"
}
stats: {key: "state"value: "Leader"
}
stats: {key: "term"value: "2"
}
roo

重选主

把当前leader nodeA停掉, 重新选主

杀掉nodeA

nodeB日志:

2022-03-01T13:55:15.684+0800 [INFO]  raft: initial configuration: index=0 servers=[]
2022-03-01T13:55:15.684+0800 [INFO]  raft: entering follower state: follower="Node at localhost:50052 [Follower]" leader=
2022-03-01T13:55:16.944+0800 [WARN]  raft: no known peers, aborting election
2022-03-01T13:55:34.787+0800 [WARN]  raft: failed to get previous log: previous-index=3 last-index=0 error="log not found"
2022-03-01T14:11:28.805+0800 [WARN]  raft: heartbeat timeout reached, starting election: last-leader=localhost:50051
2022-03-01T14:11:28.805+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50052 [Candidate]" term=3
2022-03-01T14:11:28.808+0800 [ERROR] raft: failed to make requestVote RPC: target="{Voter nodeA localhost:50051}" error="rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp [::1]:50051: connect: connection refused""
2022-03-01T14:11:28.809+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:11:28.809+0800 [DEBUG] raft: vote granted: from=nodeB term=3 tally=1
2022-03-01T14:11:29.298+0800 [INFO]  raft: duplicate requestVote for same term: term=3
2022-03-01T14:11:30.024+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:11:30.024+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50052 [Candidate]" term=4
2022-03-01T14:11:30.027+0800 [ERROR] raft: failed to make requestVote RPC: target="{Voter nodeA localhost:50051}" error="rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp [::1]:50051: connect: connection refused""
2022-03-01T14:11:30.028+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:11:30.028+0800 [DEBUG] raft: vote granted: from=nodeB term=4 tally=1
2022-03-01T14:11:30.031+0800 [DEBUG] raft: vote granted: from=nodeC term=4 tally=2
2022-03-01T14:11:30.031+0800 [INFO]  raft: election won: tally=2
2022-03-01T14:11:30.031+0800 [INFO]  raft: entering leader state: leader="Node at localhost:50052 [Leader]"
2022-03-01T14:11:30.031+0800 [INFO]  raft: added peer, starting replication: peer=nodeA
2022-03-01T14:11:30.031+0800 [INFO]  raft: added peer, starting replication: peer=nodeC

nodeC日志:

2022-03-01T13:55:21.716+0800 [INFO]  raft: initial configuration: index=0 servers=[]
2022-03-01T13:55:21.716+0800 [INFO]  raft: entering follower state: follower="Node at localhost:50053 [Follower]" leader=
2022-03-01T13:55:22.892+0800 [WARN]  raft: no known peers, aborting election
2022-03-01T13:55:38.762+0800 [WARN]  raft: failed to get previous log: previous-index=4 last-index=0 error="log not found"
2022-03-01T14:11:28.810+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50052 leader=localhost:50051
2022-03-01T14:11:29.293+0800 [WARN]  raft: heartbeat timeout reached, starting election: last-leader=localhost:50051
2022-03-01T14:11:29.293+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50053 [Candidate]" term=3
2022-03-01T14:11:29.297+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:11:29.298+0800 [DEBUG] raft: vote granted: from=nodeC term=3 tally=1
2022-03-01T14:11:29.298+0800 [ERROR] raft: failed to make requestVote RPC: target="{Voter nodeA localhost:50051}" error="rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp [::1]:50051: connect: connection refused""
2022-03-01T14:11:30.029+0800 [DEBUG] raft: lost leadership because received a requestVote with a newer term
2022-03-01T14:11:30.031+0800 [INFO]  raft: entering follower state: follower="Node at localhost:50053 [Follower]" leader=
2022-03-01T14:12:24.610+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:25.999+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:27.880+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:29.461+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:30.885+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:32.181+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:33.812+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:35.449+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:37.181+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:38.305+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:40.042+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:41.257+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:43.056+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:44.575+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:45.969+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:47.490+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:48.518+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:50.320+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:52.189+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:53.934+0800 [WARN]  raft: rejecting vote request since we have a leader: from=localhost:50051 leader=localhost:50052
2022-03-01T14:12:54.693+0800 [DEBUG] raft: lost leadership because received a requestVote with a newer term

重启nodeA, 查看nodeA加入集群的日志:

root@localhost:~/work/github/raft-grpc-example# ./m --raft_id=nodeA --address=localhost:50051 --raft_data_dir /tmp/my-raft-cluster
2022-03-01T14:12:23.383+0800 [INFO]  raft: initial configuration: index=4 servers="[{Suffrage:Voter ID:nodeA Address:localhost:50051} {Suffrage:Voter ID:nodeB Address:localhost:50052} {Suffrage:Voter ID:nodeC Address:localhost:50053}]"
2022-03-01T14:12:23.384+0800 [INFO]  raft: entering follower state: follower="Node at localhost:50051 [Follower]" leader=
2022-03-01T14:12:24.604+0800 [WARN]  raft: heartbeat timeout reached, starting election: last-leader=
2022-03-01T14:12:24.604+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=3
2022-03-01T14:12:24.608+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:24.608+0800 [DEBUG] raft: vote granted: from=nodeA term=3 tally=1
2022-03-01T14:12:24.610+0800 [DEBUG] raft: newer term discovered, fallback to follower
2022-03-01T14:12:24.611+0800 [INFO]  raft: entering follower state: follower="Node at localhost:50051 [Follower]" leader=
2022-03-01T14:12:25.995+0800 [WARN]  raft: heartbeat timeout reached, starting election: last-leader=
2022-03-01T14:12:25.995+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=5
2022-03-01T14:12:25.999+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:25.999+0800 [DEBUG] raft: vote granted: from=nodeA term=5 tally=1
2022-03-01T14:12:27.876+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:27.876+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=6
2022-03-01T14:12:27.879+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:27.880+0800 [DEBUG] raft: vote granted: from=nodeA term=6 tally=1
2022-03-01T14:12:29.457+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:29.457+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=7
2022-03-01T14:12:29.461+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:29.461+0800 [DEBUG] raft: vote granted: from=nodeA term=7 tally=1
2022-03-01T14:12:30.880+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:30.880+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=8
2022-03-01T14:12:30.884+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:30.884+0800 [DEBUG] raft: vote granted: from=nodeA term=8 tally=1
2022-03-01T14:12:32.176+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:32.176+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=9
2022-03-01T14:12:32.181+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:32.181+0800 [DEBUG] raft: vote granted: from=nodeA term=9 tally=1
2022-03-01T14:12:33.805+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:33.805+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=10
2022-03-01T14:12:33.811+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:33.811+0800 [DEBUG] raft: vote granted: from=nodeA term=10 tally=1
2022-03-01T14:12:35.446+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:35.446+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=11
2022-03-01T14:12:35.448+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:35.448+0800 [DEBUG] raft: vote granted: from=nodeA term=11 tally=1
2022-03-01T14:12:37.177+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:37.177+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=12
2022-03-01T14:12:37.181+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:37.181+0800 [DEBUG] raft: vote granted: from=nodeA term=12 tally=1
2022-03-01T14:12:38.299+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:38.299+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=13
2022-03-01T14:12:38.304+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:38.304+0800 [DEBUG] raft: vote granted: from=nodeA term=13 tally=1
2022-03-01T14:12:40.038+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:40.038+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=14
2022-03-01T14:12:40.042+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:40.042+0800 [DEBUG] raft: vote granted: from=nodeA term=14 tally=1
2022-03-01T14:12:41.253+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:41.254+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=15
2022-03-01T14:12:41.256+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:41.256+0800 [DEBUG] raft: vote granted: from=nodeA term=15 tally=1
2022-03-01T14:12:43.050+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:43.050+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=16
2022-03-01T14:12:43.056+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:43.056+0800 [DEBUG] raft: vote granted: from=nodeA term=16 tally=1
2022-03-01T14:12:44.571+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:44.571+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=17
2022-03-01T14:12:44.575+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:44.575+0800 [DEBUG] raft: vote granted: from=nodeA term=17 tally=1
2022-03-01T14:12:45.958+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:45.959+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=18
2022-03-01T14:12:45.968+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:45.968+0800 [DEBUG] raft: vote granted: from=nodeA term=18 tally=1
2022-03-01T14:12:47.484+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:47.484+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=19
2022-03-01T14:12:47.489+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:47.489+0800 [DEBUG] raft: vote granted: from=nodeA term=19 tally=1
2022-03-01T14:12:48.514+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:48.514+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=20
2022-03-01T14:12:48.517+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:48.517+0800 [DEBUG] raft: vote granted: from=nodeA term=20 tally=1
2022-03-01T14:12:50.317+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:50.317+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=21
2022-03-01T14:12:50.320+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:50.320+0800 [DEBUG] raft: vote granted: from=nodeA term=21 tally=1
2022-03-01T14:12:52.179+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:52.179+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=22
2022-03-01T14:12:52.188+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:52.188+0800 [DEBUG] raft: vote granted: from=nodeA term=22 tally=1
2022-03-01T14:12:53.929+0800 [WARN]  raft: Election timeout reached, restarting election
2022-03-01T14:12:53.929+0800 [INFO]  raft: entering candidate state: node="Node at localhost:50051 [Candidate]" term=23
2022-03-01T14:12:53.933+0800 [DEBUG] raft: votes: needed=2
2022-03-01T14:12:53.933+0800 [DEBUG] raft: vote granted: from=nodeA term=23 tally=1
2022-03-01T14:12:54.690+0800 [DEBUG] raft: lost leadership because received a requestVote with a newer term
2022-03-01T14:12:54.694+0800 [INFO]  raft: entering follower state: follower="Node at localhost:50051 [Follower]" leader=
2022-03-01T14:12:54.695+0800 [WARN]  raft: failed to get previous log: previous-index=5 last-index=4 error="log not found"

查看当前leader:

root@localhost:~/work/github/raftadmin# ./admin --leader multi:///localhost:50051,localhost:50052  leader2022/03/01 14:13:07 Invoking Leader()
2022/03/01 14:13:07 Response: address: "localhost:50052"

2022-03-01 快速搭建raft集群相关推荐

  1. 如何基于Docker快速搭建Elasticsearch集群?

    如何基于Docker快速搭建Elasticsearch集群? Elasticsearch  作为一个搜索引擎,我们对它的基本要求就是存储海量数据并且可以在非常短的时间内查询到我们想要的信息.所以第一步 ...

  2. 在Linux上如何快速搭建MongoDB集群

    搭建MongoDB集群的一个小妙招,教你快速搭建MonggoDB集群. 一.首先确认你的集群信息 三台机器的配置服务(27018)形成复制集,分片1.2.3也在各机器都部署一个实例,它们之间形成复制集 ...

  3. docker-compose快速搭建kafka集群

    文章目录 前言 docker-compose快速搭建kafka集群(较详细) docker-compose快速搭建Zookeeper集群+kafka集群 参考资料 前言 当前是在学习kafka3.0的 ...

  4. docker快速搭建kafka集群

    一.准备工作 1.拉取kafka镜像 docker pull wurstmeister/kafka docker tag docker.io/wurstmeister/kafka kafka dock ...

  5. 使用Kubeadm(1.13+)快速搭建Kubernetes集群

    Kubeadm是管理集群生命周期的重要工具,从创建到配置再到升级,Kubeadm处理现有硬件上的生产集群的引导,并以最佳实践方式配置核心Kubernetes组件,以便为新节点提供安全而简单的连接流程并 ...

  6. 【干货】Dask快速搭建分布式集群(大数据0基础可以理解,并使用!)

    非常开心,解决了很久都没有解决的问题 使用的语言: Python3.5 分布式机器: windows7 注意到,其实,通过这工具搭建分布式不需要管使用的电脑是什么系统. 分布式使用流程 Created ...

  7. Apache Kafka-初体验Kafka(03)-Centos7下搭建kafka集群

    文章目录 概述 部署信息 配置信息 验证 概述 对于kafka来说,一个单独的broker意味着kafka集群中只有一个节点.要想增加kafka集群中的节点数量,只需要多启动几个broker实例即可. ...

  8. 在 Azure 虚拟机上快速搭建 MongoDB 集群

    MongoDB 是目前在 NoSQL 市场上非常受欢迎的一个数据库,本文介绍如何使用 Azure PowerShell 和 Azure CLI 在 Azure 虚拟机上搭建单节点 MongoDB(测试 ...

  9. docker快速搭建zookeeper集群

    一.准备工作 1.拉取zookeeper镜像 docker pull zookeeper docker tag docker.io/zookeeper zookeeper docker rmi doc ...

最新文章

  1. CSS的一个FAQ问题——浮动层覆盖问题!!!
  2. python爬虫正则表达式实例-Python爬虫(十一)_案例:使用正则表达式的爬虫
  3. stm32 sdio acmd41 无响应。一直是返回0x3f。解决方法是清除crc错误中断
  4. python3.6.3安装过程_python3.6.3安装图文教程 TensorFlow安装配置方法
  5. csharp: ODP.NET,System.Data.OracleClient(.net 4.0) and System.Data.OleDb读取Oracle g 11.2.0的区别...
  6. STAR-GCN:用于推荐系统的图卷积神经网络 IJCAI 2019
  7. python学习--关注容易被忽略的知识点--(三)高级特性
  8. C++ 资源管理 —— RAII
  9. MySQL课堂练习 20162315
  10. idea导入项目的问题:nothing found
  11. WORD宏VBA:标题应用样式+图表统一应用格式且居中
  12. nanomsg项目实战
  13. centos 20T硬盘(超过16T)分区和格式化
  14. [柒穆雨] 2020平面设计的发展趋势
  15. 美国大学计算机工程专业排名,2018美国大学计算机工程专业排名_美国大学计算机工程排名...
  16. Java项目:SSM医院病历信息管理系统
  17. 信号与系统_第2章 连续系统的时域分析
  18. python machine learning_Python Machine Learning
  19. android开机图片修改工具栏,如何以编程方式更改android工具栏中的图标...
  20. 软件测试面试题及答案,不给答案的面试题都是耍流氓

热门文章

  1. mineportal新硬件选型,威联通or群晖?
  2. JasperReportsPDF报表生成工具介绍
  3. 最新 2022百威英博AI面试真题题库
  4. scratch优秀案例-中国风-西游记故事系列之孙悟空大战白骨精
  5. 对于BMH算法的理解——文本匹配算法
  6. 机器学习(六)结果分析(过拟合、欠拟合)
  7. 装修小常识(200条)
  8. day17-远程管理SSH服务
  9. 企业微信点餐系统读后感
  10. 记录编译Wien2k_18.2的过程