Storj测试网络CaptPlanet简介
CaptPlanet是Storj项目代码提供的一个测试存储网络的测试工具,启动代码在目录cmd\captplanet下,CaptPlanet启动后构建了一个Storj测试网络,主要包括3个部分内容:一个Satellite节点,若干个Storage节点(默认10个),还有一个Uplink节点提供Web端控制界面,其中Uplink服务其实是一个Minio Gateway服务。
Minio是一个私有云存储(Private Cloud Storage)的对象存储解决方案,从Storj的代码中可以看出与Minio很多交叉痕迹,Storj的命令行工具uplink也是直接套用了minio的命令行工具封装出来的。
CaptPlanet启动流程分析
CaptPlanet测试网络由命令captplanet run
启动,启动过程中只是简单地开启了三种节点服务,分别为Satellite节点服务,若干个Storage节点服务和一个Uplink服务,三种节点对应的结构体分别为Satellite,StorageNode,miniogw.Config
(详细结构体定义参见后文)
IdentityConfig
结构体封装了节点的身份认证信息,三种节点结构体中都可以看到封装有IdentityConfig
来代表节点的身份认证信息。
type IdentityConfig struct {
CertPath string
KeyPath string
Server ServerConfig
//Load()
//Save()
//Run()
}
节点服务的启动流程是分别调用三个节点结构体IdentityConfig
中的Run()
函数,并将节点提供的相应服务能力作为Responsibility
传给Run()
函数,Responsibility
接口是节点服务能力的抽象(见图1);之后在Run()函数中会为每个节点创建一个相应的Provider
结构体,代表节点作为服务提供商,每个Provider
都关联一个gRPC服务,而Provider
的服务能力以Responsibility
数组呈现。
type Provider struct {
lis net.Listener
grpc *grpc.Server
next []Responsibility
identity *FullIdentity
}
Satellite节点服务
// Satellite is for configuring client
type Satellite struct {
Identity provider.IdentityConfig
Kademlia kademlia.Config
PointerDB pointerdb.Config
Overlay overlay.Config
Inspector inspector.Config
Checker checker.Config
Repairer repairer.Config
Audit audit.Config
StatDB statdb.Config
BwAgreement bwagreement.Config
Web satelliteweb.Config
Database string `help:"satellite database connection string" default:"sqlite3://$CONFDIR/master.db"`
Tally tally.Config
}
创建Satellite
的Provider
过程中,会调用Provider
的各个Responsibility
的Run()
来实际加载各种具体的服务能力,大部分服务能力是以gRPC服务的方式来呈现(注册各种gRPC服务,定义在pkg/pb目录下的各个.proto文件中):
- Kademlia成员加载的gRPC服务(定义在overlay.proto)
service Nodes {
rpc Query(QueryRequest) returns (QueryResponse);
rpc Ping(PingRequest) returns (PingResponse);
}
// 详细Message类型请查看overlay.proto文件
- PointerDB成员加载的gRPC服务(定义在pointerdb.proto)
// PointerDB defines the interface for interacting with the network state persistence layer
service PointerDB {
// Put formats and hands off a file path to be saved to boltdb
rpc Put(PutRequest) returns (PutResponse);
// Get formats and hands off a file path to get a small value from boltdb
rpc Get(GetRequest) returns (GetResponse);
// List calls the bolt client's List function and returns all file paths
rpc List(ListRequest) returns (ListResponse);
// Delete formats and hands off a file path to delete from boltdb
rpc Delete(DeleteRequest) returns (DeleteResponse);
// PayerBandwidthAllocation returns signed payer bandwidth allocation struct
rpc PayerBandwidthAllocation(PayerBandwidthAllocationRequest) returns (PayerBandwidthAllocationResponse);
}
// 详细Message类型请查看pointerdb.proto文件
- Overlay成员加载的gRPC服务(定义在overlay.proto)
// Overlay defines the interface for communication with the overlay network
service Overlay {
// Lookup finds a nodes address from the network
rpc Lookup(LookupRequest) returns (LookupResponse);
// BulkLookup finds nodes addresses from the network
rpc BulkLookup(LookupRequests) returns (LookupResponses);
// FindStorageNodes finds a list of nodes in the network that meet the specified request parameters
rpc FindStorageNodes(FindStorageNodesRequest) returns (FindStorageNodesResponse);
}
// 详细Message类型请查看overlay.proto文件
- Inspector成员加载的gRPC服务(定义在inspector.proto)
service Inspector {
// Kad/Overlay commands:
// CountNodes returns the number of nodes in the cache and in the routing table
rpc CountNodes(CountNodesRequest) returns (CountNodesResponse);
// GetBuckets returns the k buckets from a Kademlia instance
rpc GetBuckets(GetBucketsRequest) returns (GetBucketsResponse);
// GetBucket returns the details of a single k bucket from the kademlia instance
rpc GetBucket(GetBucketRequest) returns (GetBucketResponse);
// PingNodes sends a PING RPC to a node and returns it's availability
rpc PingNode(PingNodeRequest) returns (PingNodeResponse);
// LookupNode triggers a Kademlia FindNode and returns the response
rpc LookupNode(LookupNodeRequest) returns (LookupNodeResponse);
// StatDB commands:
// GetStats returns the stats for a particular node ID
rpc GetStats(GetStatsRequest) returns (GetStatsResponse);
// CreateStats creates a node with specified stats
rpc CreateStats(CreateStatsRequest) returns (CreateStatsResponse);
}
// 详细Message类型请查看inspector.proto文件
- Checker成员在后台启动一个数据正确性检查服务
- Repairer成员在后台启动一个数据修复服务
- Audit成员在后台启动一个数据审计服务,负责对Storage节点进行审计
- StatDB成员创建一个StatDB实例
- BwAgreement成员加载的gRPC服务(定义在bandwidth.proto)
service Bandwidth {
rpc BandwidthAgreements(piecestoreroutes.RenterBandwidthAllocation) returns (AgreementsSummary) {}
}
// 详细Message类型请查看bandwidth.proto文件
- Web成员创建一个satellitedb实例,并且加载一个Http服务端
- Tally成员在后台启动一个计费服务,对存储服务的费用进行计算
Storage节点服务
// StorageNode is for configuring storage nodes
type StorageNode struct {
Identity provider.IdentityConfig
Kademlia kademlia.Config
Storage psserver.Config
}
创建StorageNode
的流程与Satellite
一致,只是StorageNode
加载的具体Responsibility
是与StorageNode
相关的:
- Kademlia成员加载的gRPC服务(定义在overlay.proto)
service Nodes {
rpc Query(QueryRequest) returns (QueryResponse);
rpc Ping(PingRequest) returns (PingResponse);
}
// 详细Message类型请查看overlay.proto文件
- Storage成员加载的gRPC服务(定义在piecestore.proto)
service PieceStoreRoutes {
rpc Piece(PieceId) returns (PieceSummary) {}
rpc Retrieve(stream PieceRetrieval) returns (stream PieceRetrievalStream) {}
rpc Store(stream PieceStore) returns (PieceStoreSummary) {}
rpc Delete(PieceDelete) returns (PieceDeleteSummary) {}
rpc Stats(StatsReq) returns (StatSummary) {}
}
// 详细Message类型请查看piecestore.proto文件
Uplink节点服务
Uplink节点结构体为miniogw包中的Config结构
type Config struct {
Identity provider.IdentityConfig
Minio MinioConfig
Client ClientConfig
RS RSConfig
Enc EncryptionConfig
Node NodeSelectionConfig
}
创建Uplink
的流程与其它两个节点基本一致,在这里Uplink其实是一个Minio Gateway服务,提供客户端对存储的Web端控制界面。