作者简介:
余韬,阿里巴巴技术专家。
10年工作经验,目前就职于阿里巴巴日志服务可观测平台团队,负责iLogtail开源,主要关注大数据分析、数据采集Agent、海量数据接入治理等领域。
曾负责百度统计、百度分析云产品的研发工作。
在IT系统领域,可观测性却是近几年才越来越热的,我觉得和IT系统的发展有一定关系。最初软件系统相对简单,开发工作仅由几个人就能完成,每个人都对整个系统有完整了解。随着业务越来越复杂,涉及到的模块越来越多,很难有一个人了解系统全貌,此时就需要通过将它的可观测性数据展示出来以定位问题。随着软件的复杂性增加,跨团队合作也会越来越多,团队间的沟通或排障也需要提高效率,防止推诿,因此需要拿数据说话,对可观测性数据的需求也越来越突出。软件运行环境也随着系统的基础组件云化趋势,变得越来越复杂。从单机到容器化,再到现在的云原生。越来越多的组件依赖第三方或者云上的云原生接口,使这个系统越来越像一个黑盒,不利于稳定性运行。可观测性数据暴露就是希望将这些黑盒的东西白盒化。通常我们会把可观测性数据分为三类:Log,Traces,Metric。
K8s 具有自动装箱和弹性扩缩容的能力,部署应用只需要进行声明即可实现编排,大大解放了研发人员部署的精力和时间。同时,也因为应用部署效率提高,使得应用的版本迭代变得非常快,应用的混布也会变得频繁,单节点资源利用率大幅提高。为了帮助不同需求的应用进行不同形态的部署K8s提供了非常丰富的控制器并提供扩展能力。有些控制器提供了水平拓展、滚动更新能力,都是非常常见且实用的,这些功能也会使得系统中的容器创建和消亡比较快。
K8s 节点本身就有多种媒介,例如有标准输出、PVC日志、容器日志。同时在 Log/Metric/Traces 上会分别有不同数据输入源:在 Log 方面因为应用混部,同时要收集多种格式日志,像业务应用、MySQL binlog、Nginx Access Log 等数据。在 Metric 方面,通常需要采集 Prometheus 指标。在 Traces 方面,则又有 SkyWalking 等数据需要收集。如此复杂的采集需求使得单节点上采集的客户端需要同时支持采集多种类型的可观测数据才能达到使用要求。这些情形都对端上采集构成了新的挑战。
通常端上的采集器在 K8s 有两种部署模式:一种是 DaemonSet,一种 Sidecar。DaemonSet 是在一个节点上部署一个采集器让它来采集节点上所有容器的日志,Sidecar 模式是在业务容器中同时起一个并行的采集容器并通过共享存储来采集业务容器的日志。DaemonSet 模式有几个明显优点:耦合性比较低,每个应用不需要单独为它修改部署,直接可以进行采集;性价比高,只需要使用一份容器的资源就可以采到整个节点数据,和业务部署数量有解耦。Sidecar 也有它的应用场景,比如日志量特别大的容器,采集需要和其他进行隔离,可以提供比较高的隔离性,同时它的灵活性也有一定好处。
这样的部署方式已经可以满足大规模的应用,但在某些场景下也有些不足:比如用户在 CI/CD 流水线里部署应用的同时希望下发日志配置将日志采集上来,这时候用 ConfigServer 的 API 就需要定制一个组件来通信,不太方便。
如图所示,绿色的是 log-controller,它会实时监听采集的 CRD,CRD 是由 YAML 文件描述,如果 YAML 文件新增、删除或变更,这些事件会触发 log-controller 将配置同步到 ConfigServer 上,在容器中部署的 iLogtail 则从 ConfigServer 拉取采集配置,这样就实现了采集配置的声明式部署。这种方法在某些特殊场景下也不是完全适用,比如说配置特别多,而且 K8s 的 APIServer 存储没有改造,对 APIServer 压力也是个需要考虑的。
我们看右边的图,iLogtail 发现容器的方式和其他开源软件不太一样,不是通过 API Server,它是直接和本地的容器运行时通信来获得容器的运行元信息。这些信息里会有 Overlay 的信息,这就是容器存放容器内文件的数据位置信息,还有 Mount point和对应挂载的路径,我们通过这些信息,通过 DaemonSet 可以直接采集到这些数据,不需要如共享卷的方式来采集数据。但是为了实现这一点,需要对各种运行时进行适配。比如说 Docker 和 Containerd,它们通信的方式就不一样,我们要自动检测,它们的标准输出格式也不一样,它们对容器内文件存放的位置也不一样,这些都需要进行特定的适配。我们适配之后,用户用起来就会比较简单,只需要通过配置容器上的路径就能采集,不需要其他的额外工作。
来看一下我们是怎么做的。Virtual Kubelet 虚拟节点收到新建容器请求,会通过 ECI 创建一个容器,在 ECI 中同时运行业务容器和 iLogtail 容器。iLogtail 容器用户不感知,这种模式称为 hidecar 模式。ECI 中业务容器的信息,包括 Mount Point 和容器内文件在主机上的位置等,都通过静态文件发给 iLogtail,这种情况下 iLogtail 的工作模式和 DaemonSet 时非常像,它会通过静态文件发现容器,同时通过挂载在 iLogtail 容器中的 ECI 根目录去采集 ECI 节点上的业务容器日志。通过这种方式,我们就可以比较平滑地让用户在没有感知情况下只考虑使用 DaemonSet 也能采集 ECI Serverless 的容器日志。为了避免丢失数据,ECI 会保证 iLogtail 收到退出信号晚于业务容器。
首先,iLogtail 的采集性能在各个开源采集器里是比较领先的,极简模式下可以达到440MB/s,然而默认部署通常会限制 iLogtail 资源,可能达不到极限速度,这时候如果产生日志延时,可以从几个方面判断:
目前 iLogtail 的生态在 Log 方面,一直是 iLogtail 的强项,除了支持容器数据采集外,还增加了 Windows Event、eBPF 等一些数据源。在 Metric 方面,有 Telegraf、Prometheus 数据源,OpenTelemetry 数据格式接入也在进行中。Trace 方面主要接入 Skywalking 的数据。输出方面除了支持阿里云的 SLS,也支持了 Kafka 的写入,并且支持格式转换可以被 CK、ES 等直接消费。对 CK 和 ES 的直接写入支持,目前也在规划中。
端上的情况大概是这样,完整的构建采集方案还需要结合服务端整体的能力。除了采集数据 DaemonSet 的 iLogtail,完整的方案还需要部署 Deployment 的 iLogtail 来拿到更详细的集群和容器信息,有了这个数据已经可以构建完整的主机监控。进一步我们可以从云上拿到云资产信息,再进行一次 join 以得到更加完整的 K8s 链路拓扑。对于这些数据,可以对它进行聚合和处理从而得到一些指标数据,可以用来制作仪表盘实现图形化展示。如果结合黄金指标或者应用 SLS 智能巡检服务,则可以得到告警事件。如果对这些事件进行处理,我们就能得到完整的运维闭环。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,