viva
  • 主页
  • 开发
    • IDE环境
      • Vim
      • VSCode
        • code-server
        • theia
    • Golang手册
    • Ansible
    • SaltStack
      • salt-api
    • Python
      • Q&A
      • Hello,world!
      • 类型
        • 数字
        • 字符串
        • 列表
        • 元组
        • 集合
        • 字典
      • 语法
        • 流程控制
        • 循环
      • 工具
        • pip
        • pyenv
        • selenium
      • 示例
    • Shell
    • Vue
      • ant-design
      • vue-material
    • Java
  • 随笔
    • WSL2
    • Git
    • Markdown
      • mermaid
    • Linux
      • 时钟同步
      • 账号
      • 文件
      • SSH
      • systemd
      • TLS加密
        • Openssl
      • 存储
        • rsync
        • NFS
      • 路由
      • 日志采集
        • Journalctl
        • Fluentd
          • 根据字段匹配对日志进行结构化
        • Logstash
    • 虚拟化
      • Hyper-V
      • PXE
    • 命令行工具
      • zsh
    • Nexus3
    • 堡垒机
      • JumpServer
    • 测试工具
      • ioping
      • apache bench
      • dd
      • postman
    • 开源项目管理
      • Github
    • 软件包管理
    • 网络镜像源
    • 网关
      • Nginx
  • 存储
    • Ceph
      • 安装
      • 故障处理
    • Etcd
    • Mysql
  • 网络
    • Overlay网络
    • IPVS
    • 网络工具
      • tshark
      • tcpdump
    • 防火墙
      • nftables
      • firewalld
      • iptables
    • 域名解析
      • dig
      • nslookup
      • dnsmasq
    • 代理
      • Clash
      • Redsocks
      • Redsocks2
      • COW
      • Proxfier
  • 云原生
    • 容器
      • Docker
        • Dockerfile
        • docker-compose
      • Podman
      • 原理
        • Chroot
        • Namespace
        • Cgroup
    • 镜像仓库
      • Harbor
    • Kubernetes
      • 部署
        • Kind
        • Minikube
        • kubespray
      • CNI
        • Flannel
        • OVS
        • Calico
      • Operator
        • OperatorSDK
      • StorageClass
      • Q&A
    • Openshift
      • 集群部署
      • 快速使用
    • Prometheus
      • prometheus-operator
      • kube-prometheus
      • Thanos
        • 组件
          • Bucket
          • Check
          • Compact
          • Querier
          • Receiver
          • Ruler
          • Sidecar
          • Store
        • 参考资料
      • Cortex
        • 组件
          • Alertmanager
          • Config
          • Distributor
          • Ingester
          • Querier
          • Query Frontend
          • Ruler
        • 参考资料
      • Thanos与Cortex方案对比
      • 参考资料
      • Q&A
    • Skywalking
    • Rook
    • Helm
    • Istio
    • 应用部署
      • Nexus
      • RabbitMQ
    • 参考资料
  • DevOps
    • 开源DevOps平台
    • CICD
      • Jenkins
    • 参考资料
  • 机器学习
    • Kubeflow
      • 示例
由 GitBook 提供支持
在本页
  • 高可用追踪器
  • 哈希计算
  • 仲裁一致性
  1. 云原生
  2. Prometheus
  3. Cortex
  4. 组件

Distributor

Distributor接收来自prometheus的remote write API写入数据。首先会检查指标数据的正确性以及是否在特定租户限制的范围内,如果不在特定租户限制范围内会使用默认租户。最后把数据分多个批次并行发给Ingester。

验证指标正确性的范围包括:

  • 指标的标签名称格式是否正确。

  • 指标的标签数量是否在配置的最大数量限制内。

  • 指标的标签名称和值是否在配置的最大长度限制内。

  • 指标的时间戳是否在配置的限制时间范围内。

Distributor服务本身是无状态的可以按需进行水平拓展。

高可用追踪器

当通过启动参数-ha-tracker开启High Availability Tracker(HA Tracker)特性后。Distributor会对来自冗余副本的Promtheus的指标进行去重,这使得prometheus可以配置多个副本实例以实现高可用,并且写入数据时在Distributor上进行去重。

HA Tracker根据prometheus上配置的集群标签和副本标签进行去重,其中集群标签与租户一一对应,一个集群中包含着多个prometheus冗余副本,副本标签表示一个prometheus集群中每个冗余副本的编号。当判断到写入的指标不是来自于一个集群中的主要副本时,写入的内容会被丢弃掉。

如何协调prometheus的主要副本需要依赖于键值存储数据库。Distributor只会接收来自于与主要副本的写入数据。当写入的指标仅携带了集群和副本标签中的一个或者不携带时,Distributor会默认接收并且不做任何去重处理。

目前支持的键值存储数据库有:Consul和Etcd。

哈希计算

Distributor通过一致性哈希判断写入指标的对应到哪个ingester实例上,有两种哈希计算策略:

  • 将指标名称和租户ID计算哈希(默认)

  • 将指标名称,指标标签和租户ID计算哈希(需要启用参数-distributor.shard-by-all-labels=true)

这种方式使得写入数据可以在多个ingestor上达到均衡,而在读取的时候querier需要与所有ingester通讯因为不同标签的指标会分布在不同的ingestor上。

每个ingestor在启动后会生成一个随机的无符号32整型值作为自身的token,并在键值存储中进行服务自注册。所有的token会根据大小从小打到大排序并首尾相连形成一个闭环,称为哈希环。每个ingestor会以自身token值到前一个token值的这段区间作为自身所负责的哈希范围。Distributor将指标写入到对应的ingestor实例上。

例子: 有三个ingester实例,token值分别为0,25,50。哈希值为1-25的指标会落在token值为25的ingester上,哈希值为26-50的指标会落在token值为50的ingester上,其余的会落在token值为0的ingester上。

目前哈希环所支持的键值存储数据库有:console,etcd和gossip memberlist(实验性)。

仲裁一致性

上一页Config下一页Ingester

最后更新于5年前

Cortex使用确保读和写的仲裁一致性,Distributor只会在超过半数需要写入数据的ingester完成写入响应后才会响应写入成功到prometheus。

Dynamo-style