【问题标题】:Multiple replicas accessing a cache in kubernetes多个副本访问 Kubernetes 中的缓存
【发布时间】:2019-11-12 11:25:18
【问题描述】:

Prometheus 日志记录的一个统计数据是服务调用的持续时间,但我想测量同一服务的多次调用的时间。

所以我想创建一个字符串到 time.Time 的映射

type SomeService struct {
    durations map[string]time.Time
}

在第一次进入时,当前时间被存储为该帐户 ID

durations[GetId()] = time.Now()

然后最后……在另一个调用中……存储总时间。

startTime := c.durations[id]
duration, _ := c.durationStat.GetMetricWith(prometheus.Labels{"type": duration})
duration.Set(time.Now().Sub(startTime).Seconds())
delete(c.durations, id)

这适用于只有一个副本但它在 Kubernetes 集群中发生故障的情况,对吗?下一个呼叫可能来自另一个端点?如何在微服务中缓存值,以便每个副本都可以访问它们?

【问题讨论】:

  • 能否请您也添加为您的实施发生的错误?
  • 听说不能这样缓存,没有错误
  • 只是在寻找一种如何轻松做到的好方法
  • 我不确定您在此处缓存了什么,因为这是我第一次看到有人将 Prometheus 用于收集指标以外的其他用途。处理多个实例之间的缓存的一般问题是数据一致性,因为同一缓存键的数据可以在不同实例之间重写。
  • “下一个呼叫可能来自另一个端点”是否意味着您对“开始服务呼叫”和“结束服务呼叫”有单独的单独请求?或者只是你可能会得到不同的副本处理不同的“服务调用”(每个包括“开始服务调用”、有用的工作和“结束服务调用”)?

标签: go kubernetes microservices prometheus


【解决方案1】:

终于找到了:

https://kubernetes.io/docs/concepts/services-networking/service

您可以将服务配置为始终使用相同的 IP 地址 通过将 service.spec.sessionAffinity 设置为“ClientIP”来相同的 pod 默认为“无”

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  sessionAffinity: ClientIP
  selector:
    app: MyApp

这样您就可以安全地将简单值缓存在内存中!

【讨论】:

  • 是否需要跨多个 API 请求跟踪这些时间?如果是,那么 sessionAffinity 只会有很大帮助。 Pod 来来去去(尤其是在放大和缩小很多时),并且不能保证记录开始时间的 pod 在生命周期的后期仍然存在。
猜你喜欢
  • 2018-02-21
  • 2017-10-08
  • 1970-01-01
  • 2018-07-05
  • 2019-09-10
  • 2019-01-07
  • 2017-06-22
  • 1970-01-01
  • 2019-04-14
相关资源
最近更新 更多