热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LearnInfluxdbthehardway(5)ServicesinInfluxdbIII

前言在上篇文章中,我们讲解了Influxdb中的PrecreatorService的工作原理,在这篇文章中,我们会将讲解Snapshott

前言

在上篇文章中,我们讲解了Influxdb中的PrecreatorService的工作原理,在这篇文章中,我们会将讲解SnapshotterService,从这个Service的名字来看是和数据备份相关的,接下来继续进入到Code中。

SnapshotterService 解析

首先我们来看下SnapshotterService的定义

// services/snapshotter/service.go 31行
// Service manages the listener for the snapshot endpoint.
type Service struct {wg sync.WaitGroupNode *influxdb.NodeMetaClient interface {encoding.BinaryMarshalerDatabase(name string) *meta.DatabaseInfo}TSDBStore interface {BackupShard(id uint64, since time.Time, w io.Writer) errorExportShard(id uint64, ExportStart time.Time, ExportEnd time.Time, w io.Writer) errorShard(id uint64) *tsdb.ShardShardRelativePath(id uint64) (string, error)SetShardEnabled(shardID uint64, enabled bool) errorRestoreShard(id uint64, r io.Reader) errorCreateShard(database, retentionPolicy string, shardID uint64, enabled bool) error}Listener net.ListenerLogger *zap.Logger
}

从结构上来看,这个Service的原理已经差不多可以看懂了,MetaClient主要用来查询和db相关的meta,然后针对meta中存储的shard相关信息去操作TSDBStore,然后进行Shard维度的备份恢复操作,此外这个Service还包含了一个Listener,也就是说这个Service会启动一个4层的Server来对外提供调用服务。顺着这个思路,去向下翻看serve的Code。

// services/snapshotter/service.go 124行if RequestType(typ[0]) == RequestShardUpdate {return s.updateShardsLive(conn)}r, bytes, err := s.readRequest(conn)if err != nil {return fmt.Errorf("read request: %s", err)}switch RequestType(typ[0]) {case RequestShardBackup:if err := s.TSDBStore.BackupShard(r.ShardID, r.Since, conn); err != nil {return err}case RequestShardExport:if err := s.TSDBStore.ExportShard(r.ShardID, r.ExportStart, r.ExportEnd, conn); err != nil {return err}case RequestMetastoreBackup:if err := s.writeMetaStore(conn); err != nil {return err}case RequestDatabaseInfo:return s.writeDatabaseInfo(conn, r.BackupDatabase)case RequestRetentionPolicyInfo:return s.writeRetentionPolicyInfo(conn, r.BackupDatabase, r.BackupRetentionPolicy)case RequestMetaStoreUpdate:return s.updateMetaStore(conn, bytes, r.BackupDatabase, r.RestoreDatabase, r.BackupRetentionPolicy, r.RestoreRetentionPolicy)default:return fmt.Errorf("request type unknown: %v", r.Type)}

在Serve中,会根据RequestType的不同,进行不同行为的处理,其中RequestShardUpdate、RequestShardBackup、RequestShardExport是只和Shard有关的操作,因此直接透传给了TSDBStore。而RequestMetastoreBackup、RequestDatabaseInfo、RequestRetentionPolicyInfo涉及到Influxdb中数据库的一些信息查询,因此在Snapshooter中通过调用MetaClient进行了封装。

到此为止,其实这个Service已经不需要过多的赘述其中的实现了,但是问题在于这样的Service看上去很不友好,很难被上层的系统系统调用,在Influxdb中是怎么使用这个Service呢。

回到代码的目录中,果然我们发现了一个client.go的文件,看上去为了调用Snapshotter相关的功能Influxdb还提供了一个客户端SDK,最后在Influxd的backup命令中,印证了我们的分析。

//cmd/influxd/backup/backup.go 342行
// backupRetentionPolicy will request the retention policy information from the server and then backup
// every shard in the retention policy. Each shard will be written to a separate file.
func (cmd *Command) backupRetentionPolicy() error {if cmd.isBackup {cmd.StdoutLogger.Printf("backing up rp=%s since %s", cmd.retentionPolicy, cmd.since.Format(time.RFC3339))} else {cmd.StdoutLogger.Printf("backing up rp=%s with boundaries start=%s, end=%s",cmd.retentionPolicy, cmd.start.Format(time.RFC3339), cmd.end.Format(time.RFC3339))}req := &snapshotter.Request{Type: snapshotter.RequestRetentionPolicyInfo,BackupDatabase: cmd.database,BackupRetentionPolicy: cmd.retentionPolicy,}response, err := cmd.requestInfo(req)if err != nil {return err}return cmd.backupResponsePaths(response)
}

最后

我们再回顾下SnapshotterService,这个Service是负责数据的备份和恢复的,涉及Influxdb数据库级别的部分会通过MetaClient进行操作,涉及Shard的具体存储部分,会透传给TSDBStore,最后建立了一个4层的Server,并提供上层的SDK给Influxd的命令进行调用。在下一篇文章中,我们会分析最重要的HTTPDService。



推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
author-avatar
懿切瀡纟彖_639
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有