原文:Uber分布式追踪系统Jaeger[PHPHproseGo]介绍及案例前言随着公司的发展,业务不断增加,模块也越来越多不断分裂,系统间的业务调用变得更加复杂,给线上故障定位带来很大难度。整个调用链是不透明的,仿佛给系统蒙上了一层黑色的面纱。当线上出现故障时,整个技术部门都会陷入痛苦的漩涡。这时,分布式跟踪系统应运而生,就像掀开黑色的面纱,让阳光照进黑暗。分布式系统调用过程opentracing协议opentracing是一套分布式跟踪协议,与平台和语言无关,有统一的接口,方便不同分布式跟踪系统的开发和接入。简单理解opentracing一个完整的opentracing调用链包括Trace+span+Infinitus分类Trace:跟踪对象,一个Trace代表一个服务或进程在系统中的执行过程,如:test.com、redis、mysql等执行过程。一个Trace由多个Span组成:它记录了Trace执行过程中的信息,如:查询sql、请求的HTTP地址、RPC调用、开始、结束、间隔时间等Infinitus分类:Infinitus分类用于服务之间,并将HTTP头或请求地址传递到最底层,从而链接整个调用链。相关文档官方文档OpenTracingSemanticSpecification(ChineseVersion)OpenTracingSemanticConventionsopentracingDocumentChineseVersion(translation)WuSheng分布式追踪系统JaegerJaeger是Uber开发的分布式追踪系统,已经被Uber大规模使用。并于2017-9-13加入CNCF开源组织。使用Jaeger可以非常直观的展示整个分布式系统的调用链,从而很好的发现问题并解决:分布式环境下的信息传播分布式事务监控展示跨进程调用链性能优化定位问题特征使用udp传输数据与HTTP相比,优势在于无需担心Jaeger服务宕机或网络传输问题影响正常业务。缺点是丢包,影响整个调用链。数据通过Thrift序列化。Thrift/bytejson/byte与json相比,19872396接口节省了1.5倍左右,212122916接口节省了1.4倍左右,31283018893接口节省了40%左右,41715822465接口节省了24%左右,51102514282接口节省了23%左右。可以看出那thrift相比json减少了很多空间。我们采集公司的接口数据大小集中在10~20k,所以使用thrift会更有优势。收购策略Jaeger官方提供了多种收购策略。用户可以根据需要选择使用ConstSampler。ProbabilisticSampler用于全量采集。概率集合。默认值为RateLimitingSampler。动态收集策略,根据当前系统访问量调整收集策略。客户端GoJavanodepythonphp官方提供了go、java、node、python客户端。其他客户端还是开放的,php客户端是为个人开发的[欢迎star]部署快Deployment------AllinoneDockerimageall-in-one是Uber官方打包的镜像,可以直接部署,但是只能在测试环境下使用,不能在线使用,因为它把数据放入outofmemory。dockerrun-d-eCOLLECTOR_ZIPKIN_HTTP_PORT=9411-p5775:5775/udp-p6831:6831/udp-p6832:6832/udp\-p5778:5778-p16686:16686-p14268:14268-p9411:9411jaallegertracone:latest://localhost:16686,可以在浏览器查看Jaeger后台官方提供的使用示例,需要go环境gogetgithub.com/uber/jaegercd$GOPATH/src/github.com/uber/jaegermakeinstall_examplescdexamples/hotrodgorun./main.goallhttp://localhost:8080打开浏览器查看cassandra+docker部署,单机模式dockerrun-itd\--name=cassandra-p9042:9042\-v/data/cassandra:/var/lib/cassandra\cassandra进入容器创建表空间。根据官方脚本,编译了一个建表语句jaeger_tables,进入cassandra,执行语句创建需要的表。keyspaces:jaeger_v1_dc运行jaeger-querydockerrun-itd--network=bridge\--name=jaeger-query\-p16686:16686\jaegertracing/jaeger-query\/go/bin/query-linux\--span-storage。type=cassandra\--cassandra.keyspace=jaeger_v1_dc\--cassandra.servers={{cassandra}}:9042\--query.static-files=/go/jaeger-ui/运行jaeger-collectordockerrun-itd--network=bridge\--name=jaeger-collector\-p14267:14267\-p14268:14268\-p9411:9411\jaegertracing/jaeger-collector\/go/bin/collector-linux\--span-storage.type=cassandra\--cassandra.keyspace=jaeger_v1_dc\--cassandra.servers={{cassandra}}:9042运行jaeger-agentdockerrun\-itd--network=bridge\--name=jaeger-agent\-p5775:5775/udp\-p6831:6831/udp\-p6832:6832/udp\-p5778:5778/tcp\jaegertracing/jaeger-agent\/go/bin/agent-linux--collector.host-port={{jaeger-collector}}:14267跨语言调用例phpHproseGo【beego】beegoinstallbeegogogetgithub.com/astaxie/beegoDownloadtrace_examplegitclonegit@github.com:jukylin/trace_example.gitcdtrace_examplebeeruntrace_examplePHPinstalljaeger-phprunHprose.phpcdvendor/jukylin/jaeger-php/examplephpHprose.phpTraceResultViewPSUber的分布式追踪技术再次完善Jaeger还在开发中,官方希望在社区的支持下,Jaeger和Jaeger-php在公司的测试环境中运行了一个多月,于2017-10-18发布。选择一个好的收集策略,日志数据就会爆发式增长。
