ES日志存储以及备份压缩到COS

这篇具有很好参考价值的文章主要介绍了ES日志存储以及备份压缩到COS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导语

为了满足用户日益增长的日志存储大小,不影响用户的写入和查询性能。满足不同用户写入流量。同时用户日志长期保存,日志存储比较占用空间和成本。ES集群规格配置高,消耗资源和成本。我们基于Go语言设计了一个多用户多ES集群,日志备份到cos节省成本的方案。本篇实践基于Go语言编程。

索引设计

为了防止单个索引不断增加。影响ES集群查询写入性能,ES 集群的索引设计主要采取如下方式:

1. 租户分离:将索引按照租户进行分离,避免不同租户之间的数据混淆,提高 ES 集群的数据安全性和隔离性。
2. 按月分割:将索引按照每个月进行分割,避免单个索引过大,提高 ES 集群的查询性能。
3. 按大小固定rollover:将索引按照固定大小进行rollover,自动分索引,避免单个索引过大,进行索引管理,提升集群性能,便于集群运维。

ES集群设计

为了避免 ES 集群出现单点问题,以及配置不断增加带来的运维风险, ES 集群设计时主要通过将不同规格的用户日志写入不同配置的ES集群,并且使用自动扩容技术来实现集群的可扩展性。

具体来说,可以将用户日志按照不同的规格(例如不同的数据量、访问频率等)进行分类,然后将不同规格的用户日志写入不同配置的ES集群中。例如,可以使用较小的ES集群来处理低频访问的用户日志,而使用较大的ES集群来处理高频访问的用户日志。

ES数据备份到COS

创建备份流程

在 ES 备份流程中,为了保证备份的正确性和完整性,可以按照如下步骤执行:

  • 创建一个仓库来存储备份数据。

  • 创建一个快照任务,将ES中的数据备份到指定的仓库中。在创建快照任务时,需要指定备份的索引、仓库、快照名称等参数,并设置备份的间隔时间和保留时间等策略。

  • 查询快照任务是否完成。ES提供了API接口来查询快照的状态和进度,可以根据查询结果来判断备份是否已经完成。

  • 调用 COS 提供的压缩函数对备份数据进行压缩,以减小备份数据所占用的存储空间。

    通过备份和压缩到 COS  可以将 ES 存储的数据缩小到 1/4 的大小,并且通过 COS 的海量分布式存储服务,可以提供低成本、弹性的云存储服务。

    各项步骤对应的代码逻辑如下:

1.创建仓库


func CreateRepository(Repository string, cosappid uint64, appId uint64, accessKeyId string, AccessKeySecret string, buckets string, region string) error {
  service := Client.SnapshotCreateRepository(Repository)
  service = service.Type("cos").Settings(map[string]interface{}{
    "app_id":            strconv.FormatUint(cosappid, 10),
    "access_key_id":     accessKeyId,
    "access_key_secret": AccessKeySecret,
    "bucket":            buckets,
    "region":            region,
    "compress":          true,
    "chunk_size":        "500mb",
    "base_path":         "backup/" + strconv.FormatUint(appId, 10) + "/" + Repository,
  })
  if err := service.Validate(); err != nil {
    logger.Errorf("SnapshotCreateRepository failed,app_id=%v,Repository=%s ", appId, Repository)
    return err
  }
  _, err := service.Do(context.Background())
  if err != nil {
    logger.Errorf("SnapshotGetRepository do failed,app_id=%v,Repository=%s ", appId, Repository)
  }
  return nil
}

2.创建快照


func SnapshotCreate(Repository string, Snapshot string, appId uint64, indexname string) error {
  type IndicesSetting struct {
    Indices string `json:"indices"`
  }
  e1 := IndicesSetting{indexname}
  _, err := Client.SnapshotCreate(Repository, Snapshot).WaitForCompletion(false).BodyJson(e1).Pretty(true).Do(context.Background())
  if err != nil {
    logger.Errorf("SnapshotCreate failed,app_id=%v,Repository=%s Snapshot=%s ", appId, Repository, Snapshot)
    return err
  }
  return nil
}

3.查询快照状态

func SnapshotGet(Repository string, Snapshot string, appId uint64) (*elastic.SnapshotGetResponse, error) {
  service, err := Client.SnapshotGet(Repository).
    Snapshot(Snapshot).
    IgnoreUnavailable(true).
    Verbose(true).Pretty(true).Do(context.Background())
  if err != nil {
    logger.Errorf("SnapshotGet failed,app_id=%v,Repository=%s Snapshot=%s ", appId, Repository, Snapshot)
    return nil, err
  } /*
    判断任务是否完成
    if service.Snapshots[0].State != "true" {

    }*/
  return service, nil
}

4.创建压缩任务

压缩任务是腾讯云对象存储 COS 提供的压缩API,需要先创建好压缩函数:
创建压缩函数参考如下:

https://cloud.tencent.com/document/product/436/58578

首先获取压缩文件,然后调用压缩函数进行压缩。获取压缩文件代码逻辑如下:

var coslist []string
  coslist, err = ext.GetCosDirCosKeyList(backupcosfile, cosClient)
  if err != nil {
    logger.Errorx("GetCosDirCosKeyList error", err)
    return err
  }
  scfClient, err := ext.GetScfClient(config.One.Backup.Region, true)
  if err != nil {
    logger.Errorx("GetScfClient error", err)
    return err
  }
  var invokeRequestId string
  invokeRequestId, err = ext.ScfCompression(scfClient, coslist, backupcosfilezip, config.One.Backup.ZipFunctionName)
  if err != nil {
    logger.Errorx("GetScfClient error", err)
    return err
  }

压缩函数模版如下:

func ScfCompression(scfCleint *scf.Client, cosKeyList []string, compressKey string, functionname string) (functionRequestId string, err error) {
  request := scf.NewInvokeRequest()

  request.FunctionName = common.StringPtr(functionname)
  scfSourceList := make([]ScfCompressionSource, 0, 1)
  for _, cosKey := range cosKeyList {
    scfSource := ScfCompressionSource{
      Url: fmt.Sprintf("https://%s.cos-internal.%s.tencentcos.cn/%s", config.One.Cos.GuangzhouCosBucket, config.One.Cos.CosRegion, cosKey),
    }
    scfSourceList = append(scfSourceList, scfSource)
  }
  scfClientContext := ScfCompressionClientContext{
    Bucket:     config.One.Cos.GuangzhouCosBucket,
    Region:     config.One.Cos.CosRegion,
    Key:        compressKey,
    Flatten:    false,
    SourceList: scfSourceList,
  }
  clientContext, err := json.Marshal(scfClientContext)
  if err != nil {
    logger.Errorx("ScfCompression Marshal", err)
    return "", err
  }
  request.ClientContext = common.StringPtr(string(clientContext))
  //fmt.Println(string(clientContext))

  response, err := scfCleint.Invoke(request)
  if _, ok := err.(*tencentError.TencentCloudSDKError); ok {
    logger.Errorx("An API error has returned:", err)
    return "", err
  }
  if err != nil {
    logger.Errorx("scfCleint.Invoke", err)
    return "", err
  }
  logger.Debugf("%s", response.ToJsonString())
  return *response.Response.Result.FunctionRequestId, nil
}

COS数据恢复到ES

创建恢复流程

恢复流程是备份流程的逆向流程,主要包括如下步骤:

  • 创建COS解压缩函数

  • 创建恢复任务

  • 查询恢复任务是否完成

  • 完成恢复

    1. COS 解压缩任务

解压缩任务是腾讯云对象存储 COS 提供的解压缩函数模板,需要先创建好解压缩函数:
创建解压函数参考如下:

https://cloud.tencent.com/document/product/436/67101

解压缩函数模板如下:


func ScfDecompression(scfCleint *scf.Client, compressKey string, cosTargetPrefix string, functionname string) (functionRequestId string, err error) {
  logger.Debug("ScfDecompression" + compressKey)
  request := scf.NewInvokeRequest()

  request.FunctionName = common.StringPtr(functionname)
  //key := fmt.Sprintf("https://%s.cos-internal.ap-guangzhou.myqcloud.com/%s", config.One.Cos.GuangzhouCosBucket, compressKey)
  scfClientContext := ScfDecompressionClientContext{
    Bucket:       config.One.Cos.GuangzhouCosBucket,
    Region:       config.One.Cos.CosRegion,
    Key:          compressKey,
    TargetBucket: config.One.Cos.GuangzhouCosBucket,
    TargetRegion: config.One.Cos.CosRegion,
    TargetPrefix: cosTargetPrefix,
  }
  clientContext, err := json.Marshal(scfClientContext)
  if err != nil {
    logger.Errorx("ScfCompression Marshal", err)
    return "", err
  }
  request.ClientContext = common.StringPtr(string(clientContext))
  //fmt.Println(string(clientContext))

  response, err := scfCleint.Invoke(request)
  if _, ok := err.(*tencentError.TencentCloudSDKError); ok {
    logger.Errorx("An API error has returned:", err)
    return "", err
  }
  if err != nil {
    logger.Errorx("scfCleint.Invoke", err)
    return "", err
  }
  logger.Debugf("%s", response.ToJsonString())
  return *response.Response.Result.FunctionRequestId, nil
}

2. 完成解压缩后,创建恢复任务文章来源地址https://www.toymoban.com/news/detail-499174.html

func SnapshotRestore(Repository string, Snapshot string, appId uint64, oldIndexName string, newIndexName string) error {
  _, err := Client.SnapshotRestore(Repository, Snapshot).RenamePattern(oldIndexName).
    RenameReplacement(newIndexName).Indices(oldIndexName).WaitForCompletion(false).Pretty(true).Do(context.Background())
  if err != nil {
    logger.Errorf("SnapshotRestore failed,app_id=%v,Repository=%s Snapshot=%s ", appId, Repository, Snapshot)
    return err
  }
  return nil
}

到了这里,关于ES日志存储以及备份压缩到COS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。

    小屌丝 :鱼哥, 求助~ 求助~ 求助~ 小鱼 :你这是告诉我,重要的事情 说三遍吗? 小屌丝 :你可以这么理解。 小鱼 :好吧… 什么事情,这么慌慌张张。 小屌丝 :我的动图太大了, 无法上传到 C站。 小鱼 :呦呵… 你也开始写博文了? 小屌丝 :向鱼哥看齐。 小鱼 :没毛

    2024年02月06日
    浏览(53)
  • 腾讯云COS存储是什么_腾讯云COS有什么用?

    由于这是给新手写的东西,就尽量整得简单易懂些吧。 作为国内第二大的云服务厂商,安全性,可靠性这些东西就不用过多做介绍了(这里并非说他绝对安全,而是比那些小平台的安全性高N个级别) 腾讯云COS与隔壁阿里云的OSS都是提供对象存储的服务,(即文件存储)。比

    2024年02月11日
    浏览(36)
  • 腾讯云存储COS

    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种

    2024年02月12日
    浏览(47)
  • springboot集成COS对象存储

    新建密钥(后面配置要用到) 此处使用工具类进行基本属性配置,也可选择在yml中配置

    2024年01月22日
    浏览(60)
  • 微信小程序 ,[JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理。

    导入全部图表的echarts.js非常大,如果你的项目较大可能会导致项目上传失败, 在你把整个echarts.js导入项目时开发者工具也会有如下提示: [JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理。ec-canvas/echarts.js 我们可以通过图表在线定制来替换 echarts.js 文

    2024年02月13日
    浏览(45)
  • 上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

    1、首先登录腾讯云官网控制台 进入对象存储页面 2、找到跨越访问CIRS设置 配置规则  点击添加规则  填写信息  3、书写代码 这里用VUE3书写 第一种用按钮出发事件形式 4、测试 点击选择文件 选择图片  等待结果   第二种用el-upload 也可以把el-upload嵌套button包装成这种形式

    2024年02月15日
    浏览(73)
  • swiftui接入腾讯云对象存储cos

    ​个人来说玩玩,还是用swiftui比较好,毕竟写界面的速度快很多,而且还比较直观。 有部分逻辑需要接入图片上传,因此接入了一下腾讯云对象存储cos。 官网上只有swift的教程,没有swiftui的。记录一下swiftui的接入过程。 一般来说swiftui的app部分是这样的。不过按照教程直接

    2024年02月13日
    浏览(49)
  • springboot快速整合腾讯云COS对象存储

    1、导入相关依赖 2、编写配置类,获取配置信息 创建配置类主要需要以下信息 腾讯云账号秘钥 和 密码秘钥: 用于创建COSClient链接对象,识别用户身份信息 存储桶区域 :需要设置客户端所属区域Region 存储桶名称 :创建请求时,需要告知上传到哪个存储桶下 存储桶访问路径

    2024年02月15日
    浏览(52)
  • 什么是对象存储COS?它又有哪些优势?

    对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据。腾讯云 COS 使所有用户都能使用具备高扩展性、低成本、可靠和安全的数据存储服务。 COS 通过控制台、API、SDK 和工具等多样化方式简单、快速地接入

    2024年01月16日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包