云原生小白

看到上面蓝色字了么?关注下吧!

Loki在分布式部署的模式下,保存Ingester服务的状态主要有3个渠道,分别是etcd、consul和基于gossip协议的memberlist。不管Loki用的是什么方式,它们最终都是将哈希环以KV的方式保存。再聊Loki之前,先来了解下一致性哈希的基本概念。

一致性哈希[1]是在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法。相较于普通的哈希算法,一致性哈希除了继承数据的离散性、扩展性和容错性之外,还引入了虚拟节点的概念,极大的优化了数据在存储过程的中出现的倾斜问题。另外,遇到需要在不中断业务的情况下扩容节点或处理故障节点时造成的数据哈希变动场景,通常还需要引入数据副本和请求中继的方式来支持服务的热变动。

Loki的分布式架构与Cortex一脉相承,其中对于各组件服务状态和数据的哈希路由均采用了相同的设计。在ring.go中可以看到在Cortex中定义4种类型的哈希环IngesterRingRulerRingDestributorRingCompactorRing。其中最重要的一个环便是IngesterRing

先来看看Loki官方的架构说明里面是怎么描述的吧。

从这里面我们可以了解到几个关键信息:

  • 对日志流进行hash是根据tenant IDLabels这两个字段计算的
  • 每个Ingester服务都会拥有一组32位数字组成的Token注册到哈希环中
  • Ingester状态只有JOINING和ACTIVE状态时,才可以接收日志写请求
  • Ingester状态只有ACTIVE和LEAVING状态时,才可以接收日志读请求
  • 查询hash环上寻址会符合token > 日志流hash key中最小的一个token,并找到预期对应的ingester实例
  • 如果复制因子大于1,则在已有哈希环上token的位置再顺时针寻找下一个不属于当前ingster的实例

根据上述描述,我们大致得到一个类似下面的示意图:

可以看到,当复制因子等于2时,Distributor就会将日志流发给两个ingester服务处理。其中一个ingester故障或者下线时,查询日志时仍然可以从有副本下一个Ingester实例中获取到数据

在真实环境里,我们来看看Loki中关于IngesterRing的核心配置如下:

ingester_config:  lifecycler:    num_tokens:  | default = 128]    ring:      kvstore:   | default = "consul"]      replication_factor:  | default = 3]

这里最重要的便是虚拟节点(num_tokens)复制因子(replication_factor),这两个配置将直接影响日志流经过一致性哈希后的路由。虚拟节点的数量直接影响了一致性哈希的数据离散性。可以简单的概括为num_tokens越多,日志流经过一致性哈希后会分散得更均衡到ingester处理,不过这是建立在牺牲内存消耗和查找时间前提下的结论。

关于一致性哈希均衡性的结论可参考 https://medium.com/@dgryski/consistent-hashing-algorithmic-tradeoffs-ef6b8e2fcae8#890d

此外,复制因子的数量决定了Loki分布式集群对于节点故障的容忍性,以replication_factor=2为例,当日志流经过一致性哈希后会映射至两个ingester实例,那么当集群出现故障时,在挂掉一个ingester实例时,Loki日志流的写入和读取可以从相邻的下一个ingester实例中获取到。如果恰好两个相邻的ingester实例挂掉的话那此时日志流的读写映射到此区域的皆会受到影响。我们知道,ingester在将chunks刷新到存储前,这部分数据都是存在内存的,所以复制因子配置过大,会造成内容冗余,配置过小则又会造成故障时丢失数据的风险。在生产环境中使用时,需根据loki的集群规模找到最佳值。

我们可以在浏览器中访问http:///ring来查看和管理一致性哈希环。

可以看到里面主要存了Ingester的ID、状态、地址、注册时间、更新时间、Token数(虚拟节点)、数据分布情况和每个Ingester的详细Tokens。对所有的tokens做个排序便形成了一致性哈希环。当有新的ingester加入进来的时候,带来的新tokens会填入一致性哈希环,期间涉及到实例间数据迁移的部分仅会影响新token相邻节点之间展开。

另外,我们还可以发现ingester注册进环中的服务名取的是hostname,也就是说如果你的Loki集群主机名有变化的话,ingester会以新的实例名称注册进哈希环。老的失效的ingester仍然会保留在环中影响数据分布。这时我们需要在管理界面中将失效的Ingester实例删除掉,也就是图中的Forget按钮。

如果你的Loki集群是裸金属部署,那你需要保证服务器的HostName

如果你的Loki集群是通过kubernetes部署,那Ingester一定要用StatesfulSet类型

最后,除一致性哈希外,Loki中关于仲裁一致性也会影响集群的可用性。当Distributor的一次请求要经过集群内超过半数的ingester成功相应后才会将本次请求返回给客户端。关于这部分,Loki采用的Dynamo-style[2]方法,这个曾经在Amazon的Dynamo系统中采用过,目前Riak, Cassandra, 和Voldemort这些无主节点备份模型也有参考。这里算是另一个话题了,留作以后再写吧。

参考资料

[1]

一致性哈希: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.147.1879&rep=rep1&type=pdf

[2]

Dynamo-style: https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

你可能还喜欢

点击下方图片即可阅读

Loki告警日志内容的骚方法

如何用Loki来绘制Ingress Nginx监控大屏

关注公众号【云原生小白】,回复「入群」加入Loki学习群

一致 先验分布 后验分布_浅谈Loki分布式架构中的一致性哈希相关推荐

  1. python语法中infile语句_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  2. python查询数据库带逗号_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  3. flink运行原理_浅谈Flink分布式运行时和数据流图的并行化

    本文将以WordCount的案例为主线,主要介绍Flink的设计和运行原理.关于Flink WordCount程序可以参考我之前的文章:读取Kafka实时数据流,实现Flink WordCount.阅 ...

  4. cx_oracle写日志信息_浅谈微服务架构之构建日志收集系统

    任何复杂的应用程序偶尔都会出现错误.在微服务应用程序中,需要跟踪几十甚至几百个服务发生的情况.要获取系统的整体视图,日志记录和监控至关重要.在微服务架构中,一个业务请求会经历多个服务,收集端到端链路上 ...

  5. 谈谈对python的理解_浅谈对python pandas中 inplace 参数的理解

    这篇文章主要介绍了对python pandas中 inplace 参数的理解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 pandas 中 inplace 参数在很多函数中都会有, ...

  6. 综合评价模型的缺点_浅谈交通影响评价中不同交通预测方法的特性

    目前,据小编经验觉得,我国交通影响评价的工作中仍有很多问题未得到很好的解决,主要表现在:交通需求预测模型有待进一步精细.交通的影响程度评价内容与指标不够明确.报告中提出的交通改善措施很难落实到位等方面 ...

  7. CSDR华为云_浅谈华为云Stack中Global、Region、AZ、资源池以及主机组

    对于华为云新同学而言,经常会听到Global.Region.AZ.资源池.主机组,对这些概念,初次接触不怎么清楚相应的区别和规划原则,下面就每个概念做个简单介绍,有什么不当之处,敬请留言. Globa ...

  8. h5 vr效果_浅谈html5在vr中的应用

    使用过HTML5制作动画过程的开发者都知道,HTML5页面给人一种逼真的感觉,同时HTML也是可以制作VR页面,但是需要你熟练HTML5与JavaScript开发过程,所以在有必要的情况下,我们可以用 ...

  9. java javascript数组_浅谈javascript和java中的数组

    javascript中的数组 数组的创建 直接创建方式  var str = ['java', 'js']; 使用new创建方式: var a = new Array(10);  //  定义长度为1 ...

最新文章

  1. 刮刮乐html5效果擦除,利用HTML5的画布Canvas实现刮刮卡效果
  2. FPM傅里叶叠层衍射成像笔记
  3. FreeRTOS 中断优先级嵌套错误引发HardFault异常解决
  4. windows 命令行创建用户
  5. HttpUrlConnection发送url请求(后台springmvc)
  6. 解决UICollectionViewCell/UITableViewCell因重用机制导致的错乱问题
  7. java检测textarea换行_Textarea和Java 换行符
  8. Python 数据结构与算法 —— list与deque(双端队列)
  9. Atitit it 互联网 软件牛人的博客列表
  10. (学习笔记)读取PDF/OFD文件
  11. gif怎么分解成图片呢?
  12. git强制拉取最新代码
  13. 来了!2020云栖大会 蚂蚁金融科技产品能力再升级
  14. win7系统盘瘦身秘诀
  15. VehicleNet: Learning Robust Visual Representation for Vehicle Re-identification(车辆网络:学习用于车辆再识别的鲁棒视觉)
  16. 初中物理浮力教学思考推荐
  17. 手机浏览器显示word文档
  18. python爬虫:获取菜鸟网站上url
  19. ajax 提交间隔,jQuery+Ajax实现限制查询间隔的方法
  20. 企业内部邮件服务器的架构

热门文章

  1. 芯片内亿万的晶体管制程工艺
  2. 三维点云去噪无监督学习:ICCV2019论文分析
  3. 客快物流大数据项目(五):Docker介绍
  4. java 无法取消引用_Java的新手,并出现错误“无法取消引用int” - java
  5. mysql 分号 存储过程_MySql 存储过程
  6. 基于c语言优先级病房呼叫_C语言
  7. androidx FloatingActionButton 中间加载的图片显示黑色
  8. thymeleaf+layui 展示table 报500
  9. 深入浅出的webpack构建工具---DllPlugin DllReferencePlugin提高构建速度(七)
  10. 机器学习入门(01)— 感知机概念、实现、局限性以及多层感知机