MetaServer之什么是SOFARegistry

  

本篇文章为大家展示了MetaServer 之什么是SOFARegistry,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

功能介绍

MetaServer 作为 SOFARegistry 的元数据中心,其核心功能可以概括为集群成员管理。分布式系统中,如何知道集群中有哪些节点列表,如何处理集群扩所容,如何处理集群节点异常,都是不得不考虑的问题。MetaServer 的存在就是解决这些问题,其在 SOFARegistry 中位置如图所示:

MetaServer 通过 SOFAJRaft 保证高可用和一致性,类似于注册中心,管理着集群内部的成员列表:

  • 节点列表的注册与存储

  • 节点列表的变更通知

  • 节点健康监测

内部架构

内部架构如下图所示:

MetaServer 之什么是SOFARegistry

MetaServer 基于 Bolt, 通过 TCP 私有协议的形式对外提供服务,包括 DataServer, SessionServer 等,处理节点的注册,续约和列表查询等请求。

同时也基于 Http 协议提供控制接口,比如可以控制 session 节点是否开启变更通知, 健康检查接口等。

成员列表数据存储在 Repository 中,Repository 被一致性协议层进行包装,作为 SOFAJRaft 的状态机实现,所有对 Repository 的操作都会同步到其他节点, 通过Rgistry来操作存储层。

MetaServer 使用 Raft 协议保证数据一致性, 同时也会保持与注册的节点的心跳,对于心跳超时没有续约的节点进行驱逐,来保证数据的有效性。

在可用性方面,只要未超过半数节点挂掉,集群都可以正常对外提供服务, 半数以上挂掉,Raft 协议无法选主和日志复制,因此无法保证注册的成员数据的一致性和有效性。整个集群不可用 不会影响 Data 和 Session 节点的正常功能,只是无法感知节点列表变化。

源码分析

服务启动

MetaServer 在启动时,会启动三个 Bolt Server,并且注册 Processor Handler,处理对应的请求, 如下图所示:

MetaServer 之什么是SOFARegistry

  • DataServer:处理 DataNode 相关的请求;

  • SessionServer:处理 SessionNode 相关的请求;

  • MetaServer:处理MetaNode相关的请求;

然后启动 HttpServer, 用于处理 Admin 请求,提供推送开关,集群数据查询等 Http 接口。

最后启动 Raft 服务, 每个节点同时作为 RaftClient 和 RaftServer, 用于集群间的变更和数据同步。

各个 Server 的默认端口分别为:

meta.server.sessionServerPort=9610
  meta.server.dataServerPort=9611
  meta.server.metaServerPort=9612
  meta.server.raftServerPort=9614
  meta.server。httpServerPort=9615 

节点注册

由上节可知,DataServer和SessionServer都有处理节点注册请求的处理程序。注册行为由注册完成。注册接口实现为:

 @Override
  ,,,public  NodeChangeResult 注册(Node 节点),{
  ,,,,,,,StoreService  StoreService =,,,,,,,,,, ServiceFactory.getStoreService (node.getNodeType ());
  ,,,,,,,return  storeService.addNode(节点);
  ,,,}

Regitsry根据不同的节点类型,获取对应的<代码> StoreService> DataNode> DataStoreService> StoreService> ,中,具体实现为:

//,存储节点信息
  dataRepositoryService.put (ipAddress, new  RenewDecorate (dataNode, RenewDecorate.DEFAULT_DURATION_SECS));//?/,存储变更事件
  dataConfirmStatusService.putConfirmNode (dataNode, DataOperator.ADD); 

调用<代码> RepositoryService #把,接口存储后,同时会存储一个变更事件到队列中,主要用于数据推送,消费处理。

节点数据的存储,其本质上是存储在内存的哈希表中,其存储结构为:

//, RepositoryService 底层存储
  Map<字符串/*数据中心*/,,NodeRepository>,注册表;//,NodeRepository 底层存储
  Map<字符串/* ipAddress */,, RenewDecorate祝辞,nodeMap; 

将<代码> RenewDecorate>

节点移除的逻辑类似,将节点信息从该地图中删除,也会存储一个变更事件到队列。

MetaServer之什么是SOFARegistry