braft架构
braft分为几个板块,我根据自己的理解进行了概述:
ballot:
ballot,ballot_box
选票类,raft的选举leader步骤
cli:
cli,cli_service
客户端,cli用来修改或者获取复制状态机组节点状态,cli_service继承cli
closure:
closure_helper,closure_queue
返回时的信息和报告内容
configuration:
configuration,configuration_manager
配置信息类,peerid类,nodeid类
configuration_manager用来记录和管理configuration条目历史变更
file:
file_reader:读取文件内容
file_service:为状态机增加或者移除一个file_reader
file_system_adaptor:文件系统适配
protobuf_file:
remote_file_copier:远程文件复制,存储使用快照
fsm_caller:
复制状态机,发生事件时的操作
fsync:
参数选择内存数据落到磁盘的方式,直接调用mingw函数
lease:
作为leader节点和follower节点的状态
log:
log:日志类,log定义和LogStorage定义
log_entry:每条日志条目
log_manager:用于管理日志条目
memory_log:日志条目索引相关操作
node:
node:节点类,每一个node是一个复制状态机的节点实例
node_manager:node节点管理
raft(核心):
raft:定义task,状态机操作,节点参数,状态机参数等
raft_meta:
raft_service
repeated_timer_task:
重复任务计时器
replicator:
leader,follower之间的信息复制
route_table:
一张通信表,存多个复制组,可获取每个复制组leader,更新组配置,等
snapshot:
snapshot:快照类,
snapshot_executor:快照执行操作
snapshot_throttle:大容量磁盘读/写
storage:
存储类,包含元数据存储,log存储,快照存储,稳定存储等
util:
放一些常用的公用方法
之后对我认为比较重要的,或者官方文档中出现的头文件进行注释翻译
configuration.h
变量名 | 类型 | 说明 |
---|---|---|
GroupId | typedef std::string |
raft组名 |
VersionedGroupId |
typedef std::string |
GroupId加个版本号 {group_id}_{index} |
=======struct PeerId:=======
butil::EndPoint addr;//就是ip+port
int idx;//idx算是下标号,默认0
除了构造函数外,
reset():初始化值为0
is_empty():都为0时认为是空的
parse():解析字符串并赋值
to_string():将值转成字符串,ip:port:idx
<,==,!=,<<操作符被重载
=======struct NodeId:=======
GroupId group_id;//存组名
PeerId peer_id;//存一个peerid
有一个两值都传的构造函数
to_string():将值转成字符串,group_id:ip:port:idx
<,==,!=,<<操作符被重载
=======class Configuration:=======
std::set<PeerId> _peers;//是一个peers集合
typedef std::set<PeerId>::const_iterator const_iterator;//一个循环集合的迭代器
两个构造函数,可以用vector和set来构造
重载了=符号(赋值)
void reset():清空集合
bool empty():是否为空
size_t size() :返回大小
const_iterator begin() / end():返回迭代器头部 / 迭代器尾部
void list_peers(std::set<PeerId>* peers) / list_peers(std::vector<PeerId>* peers):使用参数替换掉当前集合
void append_peers(std::set<PeerId>* peers):将一系列集合插入到当前集合
bool add_peer(const PeerId& peer):插入一个新节点并判断是否插入成功(是否为新peer)
bool remove_peer(const PeerId& peer):移除节点,并判断是否移除
bool contains(const PeerId& peer_id) /contains(const std::vector<PeerId>& peers):判断是否存在这些peer
bool equals(const std::vector<PeerId>& peers) / equals(const Configuration& rhs): 判断是否和参数匹配
void diffs(const Configuration& rhs,
Configuration* included,
Configuration* excluded):得到当前值和rhs的不同,included为this-rhs,excluded为rhs-this
int parse_from(butil::StringPiece conf):从字符串解析并赋值(peerid之间用,隔开)
重载了<<输出符号,输出peerid,用逗号隔开
raft.h
#ifndef BRAFT_RAFT_H
#define BRAFT_RAFT_H
//一堆头文件
#include <string>
#include <butil/logging.h>
#include <butil/iobuf.h>
#include <butil/status.h>
#include <brpc/callback.h>
#include "braft/configuration.h"
#include "braft/enum.pb.h"
#include "braft/errno.pb.h"
template <typename T> class scoped_refptr;//一个模板类scoped_refptr
namespace brpc {
class Server;
} // namespace brpc
namespace braft {
//给出这些类的声明,定义在其他c文件中
class SnapshotWriter;//快照写
class SnapshotReader;//快照读
class SnapshotHook;//
class LeaderChangeContext;//leader变更信息
class FileSystemAdaptor;//文件适配器
class SnapshotThrottle;//快照大磁盘
class LogStorage;//log存储
//给出一个默认值,会用来做初始化
const PeerId ANY_PEER(butil::EndPoint(butil::IP_ANY, 0), 0);
// 特定于raft的closure(返回报告),包含一个butil :: Status以报告操作是否成功。
class Closure : public google::protobuf::Closure {
public://两个获取status值的函数
butil::Status& status() { return _st; }
const butil::Status& status() const { return _st; }
private:
butil::Status _st;//status
};
// 描述一个特定的错误
class Error {
public:
//构造函数
Error() : _type(ERROR_TYPE_NONE) {}
Error(const Error& e) : _type(e._type), _st(e._st) {}
//返回值
ErrorType type() const { return _type; }
const butil::Status& status() const { return _st; }
butil::Status& status() { return _st; }
//设置error类型
void set_type(ErrorType type) { _type = type; }
//重载赋值号
Error& operator=(const Error& rhs) {
_type = rhs._type;
_st = rhs._st;
return *this;
}
private:
// 需要赋值
ErrorType _type;
butil::Status _st;
};
//将error类型转为字符串
inline const char* errortype2str(ErrorType t) {
switch (t) {
case ERROR_TYPE_NONE:
return "None";
case ERROR_TYPE_LOG:
return "LogError";
case ERROR_TYPE_STABLE:
return "StableError";
case ERROR_TYPE_SNAPSHOT:
return "SnapshotError";
case ERROR_TYPE_STATE_MACHINE:
return "StateMachineError";
}
return "Unknown";
}
//重载输出符号
inline std::ostream& operator<<(std::ostream& os, const Error& e) {
os << "{type=" << errortype2str(e.type())
<< ", error_code=" << e.status().error_code()
<< ", error_text=`" << e.status().error_cstr()
<< "'}";
return os;
}
// libraft的基本消息结构
struct Task {//任务
Task() : data(NULL), done(NULL), expected_term(-1) {}//构造函数
// 数据应用于状态机
butil::IOBuf* data;
// 当数据应用于状态机或发生错误时继续。
Closure* done;
// 如果expected_term与当前值不匹配,则拒绝此任务
// 此节点,如果值不为-1
// 默认值:-1
int64_t expected_term;
};
class IteratorImpl;//类声明
// Iterator over a batch of committed tasks
//
// Example:
// void YouStateMachine::on_apply(braft::Iterator& iter) {
// for (; iter.valid(); iter.next()) {
// brpc::ClosureGuard done_guard(iter.done());
// process(iter.data());
// }
// }
class Iterator {
DISALLOW_COPY_AND_ASSIGN(Iterator);//关闭隐式调用构造函数
public:
// 移至下一个任务。
void next();