CAT环境部署
一、CAT介绍
这段介绍照搬自美团点评分享:https://tech.meituan.com/CAT_in_Depth_Java_Application_Monitoring.html
1.1 简介
CAT(Central Application Tracking)是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,基本接入了点评所有核心应用。CAT已经在中间件框架(MVC框架、RPC框架、数据库框架、缓存框架等)中得到广泛应用,为点评各业务线提供系统的性能指标、健康状况、基础告警等。
CAT很大的优势是它是一个实时系统,从数据生成到服务端处理结束是毫秒级别;第二个优势,数据是接近全量统计。
CAT是基于纯Java开发的分布式实时监控系统。开源代码托管在GitHub(搜索CAT即可),作者是吴其敏和尤勇。
1.2 整体设计
CAT架构设计:
#此图来源于:http://blog.csdn.net/tankun940507994/article/details/56672385
追求简单、去中心化、分工协作,两层结构,除了依赖外部存储如HDFS和MySQL外,不依赖其他系统,CAT内部全面采用组件化设计和实现。CAT每天消息量巨大,一台机器是不能处理全部流量,必须分片处理,均衡负载。
业务应用目前使用CAT API进行埋点,后台异步线程采用TCP长连接方式,将消息源源不断地传输到后台服务器;CAT具有fail-over(故障切换)机制,在后台服务器不可用时会自动切换到另一台可用服务器。CAT目前使用native协议做序列化和反序列化,将来会考虑支持更多协议,比如thrift。
消息被送到后台,经反序列化后会被放入队列,实时消费调度器会将消息分发到所有消费者内部队列,每个消费者只需处理自己的消费队列,各消费者之间彼此相对独立,如果消费速度太慢,导致消费队列满,则新来的消息会被丢弃。典型消费者都采用实时增量计算的方式,流式处理消息,产生的报表会在当前小时结束后保存到中央数据库中。
日报表采用后台作业的形式,由24个小时报表合并得到。周报表则由7个日报表合并得到,以此类推。
CAT控制台,即UI层,负责接收用户请求,从后台存储中将报表信息取出显示。对于实时报表,直接通过HTTP请求分发到相应消费机,待结果返回后聚合展示;历史报表则直接取数据库并展示。
所有原始消息会先存储在本地文件系统,然后上传到HDFS中保存;而对于报表,因其远比原始日志小,则以K/V的方式保存在MySQL中。
消息处理:
消息处理分五个阶段:收集、传输、分析、存储和展示。
收集阶段:负责业务应用日志的埋点和采集。CAT目前提供多种语言的客户端供业务应用程序调用,埋点结果以消息树的形式存入传输队列。如果队列满,则会自动丢弃当前消息。
传输阶段:CAT客户端负责将客户端消息传输到后端,CAT消费机负责接收消息。传输前CAT客户端会与CAT消费机建立TCP长连接,不断地从客户端队列中取出消息树,序列化后写入网络;CAT消费机则不断地从网络中取出数据,反序列化后放入消费队列。
分析阶段:负责报表生成。实时消费调度器会将消费队列消息取出,分发给每个消费者内部队列;报表分析器只会从自己的报表队列中取出消息树,逐个消费,更新报表模型。CAT以小时为单位形成报表,原始日志转储(raw log dump)是一个特殊的分析器,它不生产报表,而是将消息存入本地文件系统。
存储阶段:负责报表和原始日志的存储,目前报表会存在MySQL中,原始日志压缩后存在HDFS中长久保存。保留时长取决于存储容量的大小,一般报表会保存3个月以上,原始日志保存一个月。
展示阶段:负责数据的可视化。作为用户服务入口,负责报表和原始日志的输出显示。对于实时报表请求,会向各个消费机分发请求,并将结果聚合后输出HTML,在浏览器展示;历史报表会直接取自数据库。XML数据输出是另一种内置的数据展示方式,方便基于CAT开放外围工具。
整体设计介绍:
监控整体要求就是快速发现故障、快速定位故障以及辅助进行程序性能优化。为了做到这些,一般对监控系统的一些非功能做了如下的要求:
实时处理:信息的价值会随时间锐减,尤其是事故处理过程中。 全量数据:最开始的设计目标就是全量采集,全量的好处有很多。 高可用:所有应用都倒下了,需要监控还站着,并告诉工程师发生了什么,做到故障还原和问题定位。 故障容忍:CAT本身故障不应该影响业务正常运转,CAT挂了,应用不该受影响,只是监控能力暂时减弱。 高吞吐:要想还原真相,需要全方位地监控和度量,必须要有超强的处理吞吐能力。 可扩展:支持分布式、跨IDC部署,横向扩展的监控系统。 不保证可靠:允许消息丢失,这是一个很重要的trade-off,目前CAT服务端可以做到4个9的可靠性,可靠系统和不可靠性系统的设计差别非常大。
CAT从开发至今,一直秉承着简单的架构就是最好的架构原则,主要分为三个模块:CAT-client、CAT-consumer、CAT-home。
Cat-client 提供给业务以及中间层埋点的底层SDK。 Cat-consumer 用于实时分析从客户端提供的数据。 Cat-home 作为用户给用户提供展示的控制端。
在实际开发和部署中,Cat-consumer和Cat-home是部署在一个JVM内部,每个CAT服务端都可以作为consumer也可以作为home,这样既能减少整个层级结构,也可以增加系统稳定性。
上图是CAT目前多机房的整体结构图,图中可见:
路由中心是根据应用所在机房信息来决定客户端上报的CAT服务端地址。 每个机房内部都有独立的原始信息存储集群HDFS。 CAT-home可以部署在一个机房也可以部署在多个机房,在最后做展示的时候,home会从consumer中进行跨机房的调用,将所有的数据合并展示给用户。 实际过程中,consumer、home以及路由中心都是部署在一起的,每个服务端节点都可以充当任何一个角色。
1.3 客户端设计
客户端设计是CAT系统设计中最为核心的一个环节,客户端要求是做到API简单、高可靠性能,无论在任何场景下都不能影响客户端业务性能,监控只是公司核心业务流程一个旁路环节。CAT核心客户端是Java,也支持Net客户端。
设计架构
CAT客户端在收集端数据方面使用ThreadLocal(线程局部变量),是线程本地变量,也可以称之为线程本地存储。其实ThreadLocal的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,属于Java中一种较为特殊的线程绑定机制,每一个线程都可以独立地改变自己的副本,不会和其它线程的副本冲突。
在监控场景下,为用户提供服务都是Web容器,比如tomcat或者Jetty,后端的RPC服务端比如Dubbo或者Pigeon,也都是基于线程池来实现的。业务方在处理业务逻辑时基本都是在一个线程内部调用后端服务、数据库、缓存等,将这些数据拿回来再进行业务逻辑封装,最后将结果展示给用户。所以将所有的监控请求作为一个监控上下文存入线程变量就非常合适。
如上图所示,业务执行业务逻辑的时候,就会把此次请求对应的监控存放于线程上下文中,存于上下文的其实是一个监控树的结构。在最后业务线程执行结束时,将监控对象存入一个异步内存队列中,CAT有个消费线程将队列内的数据异步发送到服务端。
API设计
监控API定义往往取决于对监控或者性能分析这个领域的理解,监控和性能分析所针对的场景有如下几种:
一段代码的执行时间,一段代码可以是URL执行耗时,也可以是SQL的执行耗时。 一段代码的执行次数,比如Java抛出异常记录次数,或者一段逻辑的执行次数。 定期执行某段代码,比如定期上报一些核心指标:JVM内存、GC等指标。 关键的业务监控指标,比如监控订单数、交易额、支付成功率等。
在上述领域模型的基础上,CAT设计自己核心的几个监控对象:Transaction、Event、Heartbeat、Metric。
序列化和通信
序列化和通信是整个客户端包括服务端性能里面很关键的一个环节。
CAT序列化协议是自定义序列化协议,自定义序列化协议相比通用序列化协议要高效很多,这个在大规模数据实时处理场景下还是非常有必要的。 CAT通信是基于Netty来实现的NIO的数据传输,Netty是一个非常好的NIO开发框架,在这边就不详细介绍了。
客户端埋点
日志埋点是监控活动的最重要环节之一,日志质量决定着监控质量和效率。当前CAT的埋点目标是以问题为中心,像程序抛出exception就是典型问题。对问题的定义是:不符合预期的就可以算问题,比如请求未完成、响应时间快了慢了、请求TPS多了少了、时间分布不均匀等等。
在互联网环境中,最突出的问题场景,突出的理解是:跨越边界的行为。包括但不限于:
HTTP/REST、RPC/SOA、MQ、Job、Cache、DAL; 搜索/查询引擎、业务应用、外包系统、遗留系统; 第三方网关/银行, 合作伙伴/供应商之间; 各类业务指标,如用户登录、订单数、支付状态、销售额。
1.4 服务端设计
服务端主要的问题是大数据的实时处理。
架构设计
单机的consumer中大概的结构如下:
如上图,CAT服务端在整个实时处理中,基本上实现了全异步化处理。
消息接受是基于Netty的NIO实现。 消息接受到服务端就存放内存队列,然后程序开启一个线程会消费这个消息做消息分发。 每个消息都会有一批线程并发消费各自队列的数据,以做到消息处理的隔离。 消息存储是先存入本地磁盘,然后异步上传到HDFS文件,这也避免了强依赖HDFS。
当某个报表处理器处理来不及时候,比如Transaction报表处理比较慢,可以通过配置支持开启多个Transaction处理线程,并发消费消息。
实时分析
CAT服务端实时报表分析是整个监控系统的核心,CAT重客户端采集的是是原始的logview,目前一天大约有1000亿的消息,这些原始的消息太多了,所以需要在这些消息基础上实现丰富报表,来支持业务问题及性能分析的需要。
CAT是根据日志消息的特点(比如只读特性)和问题场景,量身定做的,它将所有的报表按消息的创建时间,一小时为单位分片,那么每小时就产生一个报表。当前小时报表的所有计算都是基于内存的,用户每次请求即时报表得到的都是最新的实时结果。对于历史报表,因为它是不变的,所以实时不实时也就无所谓了。
CAT基本上所有的报表模型都可以增量计算,它可以分为:计数、计时和关系处理三种。计数又可以分为两类:算术计数和集合计数。典型的算术计数如:总个数(count)、总和(sum)、均值(avg)、最大/最小(max/min)、吞吐(tps)和标准差(std)等,其他都比较直观,标准差稍微复杂一点,大家自己可以推演一下怎么做增量计算。那集合运算,比如95线(表示95%请求的完成时间)、999线(表示99.9%请求的完成时间),则稍微复杂一些,系统开销也更大一点。
报表建模
CAT每个报表往往有多个维度,以transaction报表为例,它有5个维度,分别是应用、机器、Type、Name和分钟级分布情况。如果全维度建模,虽然灵活,但开销将会非常之大。CAT选择固定维度建模,可以理解成将这5个维度组织成深度为5的树,访问时总是从根开始,逐层往下进行。
CAT服务端为每个报表单独分配一个线程,所以不会有锁的问题,所有报表模型都是非线程安全的,其数据是可变的。这样带来的好处是简单且低开销。
CAT报表建模是使用自研的Maven Plugin自动生成的。所有报表是可合并和裁剪的,可以轻易地将2个或多个报表合并成一个报表。在报表处理代码中,CAT大量使用访问者模式(visitor pattern)。
性能分析报表
Transaction #适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。 Event #用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小。 Heartbeat #表示程序内定期产生的统计信息, 如CPU%, MEM%, 连接池状态, 系统负载等。 Metric #用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟。 Trace #用于记录基本的trace信息,类似于log4j的info信息,这些信息仅用于查看一些相关信息
存储设计:
CAT系统的存储主要有两块:
CAT的报表的存储。 CAT原始logview的存储。
报表是根据logview实时运算出来的给业务分析用的报表,默认报表有小时模式、天模式、周模式以及月模式。CAT实时处理报表都是产生小时级别统计,小时级报表中会带有最低分钟级别粒度的统计。天、周、月等报表都是在小时级别报表合并的结果报表。
原始logview存储一天大约100TB的数据量,因为数据量比较大所以存储必须要要压缩,本身原始logview需要根据Message-ID读取,所以存储整体要求就是批量压缩以及随机读。在当时场景下,并没有特别合适成熟的系统以支持这样的特性,所以我们开发了一种基于文件的存储以支持CAT的场景,在存储上一直是最难的问题,我们一直在这块持续的改进和优化。
消息ID的设计:
CAT每个消息都有一个唯一的ID,这个ID在客户端生成,后续都通过这个ID在进行消息内容的查找。典型的RPC消息串起来的问题,比如A调用B的时候,在A这端生成一个Message-ID,在A调用B的过程中,将Message-ID作为调用传递到B端,在B执行过程中,B用context传递的Message-ID作为当前监控消息的Message-ID。
CAT消息的Message-ID格式ShopWeb-0a010680-375030-2,CAT消息一共分为四段:
第一段是应用名shop-web。 第二段是当前这台机器的IP的16进制格式,01010680表示10.1.6.108。 第三段的375030,是系统当前时间除以小时得到的整点数。 第四段的2,是表示当前这个客户端在当前小时的顺序递增号。
存储数据的设计:
消息存储是CAT最有挑战的部分。关键问题是消息数量多且大。CAT服务端基于此流量做实时计算,还需要将这些数据压缩后写入磁盘。
整体存储结构如下图:
CAT在写数据一份是Index文件,一份是Data文件.
Data文件是分段GZIP压缩,每个分段大小小于64K,这样可以用16bits可以表示一个最大分段地址。 一个Message-ID都用需要48bits的大小来存索引,索引根据Message-ID的第四段来确定索引的位置, 比如消息Message-ID为ShopWeb-0a010680-375030-2,这条消息ID对应的索引位置为2*48bits的位置。 48bits前面32bits存数据文件的块偏移地址,后面16bits存数据文件解压之后的块内地址偏移。 CAT读取消息的时候,首先根据Message-ID的前面三段确定唯一的索引文件,在根据Message-ID第四段确定此Message-ID索引位置, 根据索引文件的48bits读取数据文件的内容,然后将数据文件进行GZIP解压,在根据块内便宜地址读取出真正的消息内容。
服务端设计总结:
CAT在分布式实时方面,主要归结于以下几点因素:
去中心化,数据分区处理。 基于日志只读特性,以一个小时为时间窗口,实时报表基于内存建模和分析,历史报表通过聚合完成。 基于内存队列,全面异步化、单线程化、无锁设计。 全局消息ID,数据本地化生产,集中式存储。 组件化、服务化理念。
二、CAT环境的单机部署
https://github.com/dianping/cat #CAT的下载地址以及部署介绍地址
2.1 环境要求
Linux 2.6以及之上(2.6内核才可以支持epoll),Mac以及Windows环境可以作为开发环境 Java 6,7,8 Maven 3.2.3+ MySQL 5.6
2.2 Cat单机安装
mvn的安装(JDK的安装就不演示了记得装JDK):
# wget mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
# tar zxf apache-maven-3.5.2-bin.tar.gz
# cp -rf apache-maven-3.5.2 /usr/local/
# ln -s /usr/local/apache-maven-3.5.2 /usr/local/apache-maven
# vim /etc/profile
##########maven################# export MAVEN_HOME=/usr/local/apache-maven export PATH=$PATH:$MAVEN_HOME/bin
# source /etc/profile
# mvn --version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00) Maven home: /usr/local/apache-maven Java version: 1.8.0_74, vendor: Oracle Corporation Java home: /usr/java/jdk1.8.0_74/jre Default locale: zh_CN, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-327.el7.x86_64", arch: "amd64", family: "unix"
CAT的安装:
# vim /usr/local/apache-maven/conf/settings.xml #直接使用阿里云的mvn源
<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
# mkdir /data/appdatas/cat -p #这两个目录很重要一定要事先存在并有读写权限,会在这两个目录下创建一些东西
# mkdir /data/applogs/cat -p
#cd ~
# wget https://github.com/dianping/cat/archive/master.zip
# unzip master.zip
# cd cat-master/
# mvn clean install -DskipTests #在CAT目录下,用maven构建项目
#如果下载有问题,可以尝试翻墙后下载,可以 git clone git@github.com:dianping/cat.git mvn-repo 下载到本地,这个分支是cat编译需要的依赖的一些jar ,将这些jar放入本地的maven仓库文件夹中。
#一路INFO没有报错,这是最后的效果图。
mysql授权:
# mysql -uroot -p #给权限因为要建库建表
MariaDB [(none)]> grant all privileges on *.* to cat@"192.168.14.%" identified by '123456'; MariaDB [(none)]> flush privileges;
CAT的配置:
#mvn cat:install #配置CAT, 此步骤是配置一些cat启动需要的基本数据库配置
#上面标红的三个地方就是要输入的,就是要连接的mysql以及账号和密码
[INFO] Database(cat) is created successfully [INFO] Creating tables ... [INFO] Tables are created successfully [INFO] Generating the configuration files to /data/appdatas/cat ... [INFO] Configuration files are generated successfully [INFO] Preparing Cat environment ... DONE [INFO] Use following command line to start local Cat server: [INFO] cd cat-home; mvn jetty:run [INFO] Please open http://localhost:2281/cat in your browser [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] parent ............................................. SUCCESS [ 24.889 s] [INFO] cat-client ......................................... SKIPPED [INFO] cat-core ........................................... SKIPPED [INFO] cat-hadoop ......................................... SKIPPED [INFO] cat-consumer ....................................... SKIPPED [INFO] cat-home ........................................... SKIPPED [INFO] cat-maven-plugin ................................... SKIPPED [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 25.249 s [INFO] Finished at: 2018-02-08T22:35:11+08:00 [INFO] Final Memory: 12M/217M [INFO] ------------------------------------------------------------------------
#上面是最后的执行过程。
CAT的启动:
# cd /root/cat-master/cat-home/
# mvn jetty:run #启动服务,当然后台运行的话#nohup mvn jetty:run &
[INFO] Started SelectChannelConnector@0.0.0.0:2281 [INFO] Started Jetty Server [INFO] Starting scanner at interval of 10 seconds. [02-08 22:42:00.509] [INFO] [Worker] Starting thread(Cat-ModelService-0) ... [INFO] Working directory is /root/cat-master/cat-home [INFO] War root is /root/cat-master/cat-home/src/main/webapp [02-08 22:42:51.860] [INFO] [TcpSocketSender] success when init CAT server, new active holderactive future :/127.0.0.1:2280 index:0 ip:127.0.0.1 server config:127.0.0.1:2280; [02-08 22:43:00.505] [INFO] [Worker] Starting thread(Cat-ModelService-1) ...
#上面是最后的提示消息,可以看到监听在了2281端口。
#通过端口查看可以看到这种方式会启动一个2280端口的。
打开浏览器:http://192.168.14.50:2281/cat
#出现上图说明我们的单机配置成功了。
CAT目录下子目录的作用:
# ls -l /root/cat-master/
cat-client #客户端组件,负责与服务端进行连接通信 cat-consumer #消费处理组件,负责实际的监控数据分析,处理工作 cat-core #核心处理组件,负责具体的与客户端通信服务,解析数据、输出报告 cat-hadoop #HDFS存储组件 cat-home #务端组件,负责收集监控信息,分析处理生成报告、作出警告 cat-maven-plugin cat-script script
三、生产环境的部署
#把上面的环境部署出来后,就可以看各种文档了。
3.1 运行环境
现在我们搞三台机器当CAT服务器:192.168.14.71,192.168.14.72,192.168.14.73
现在我们用192.168.14.71当Mysql服务器
3.2 192.168.14.71上面的操作
#wget https://github.com/dianping/cat/archive/master.zip
#unzip master.zip
# mysql -uroot -p #给权限因为要建库建表
MariaDB [(none)]> create database cat; MariaDB [(none)]> grant all privileges on *.* to cat@"192.168.14.%" identified by '123456'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> exit
# cd cat-master/
# mysql -uroot -p cat <script/Cat.sql #将数据库表结构已经导入到cat库。
3.3 Cat服务器的安装
#随便找一台,安装完把目录发送到另外两台机器便可。
#Maven怎么安装就不记录了上面已经记录了。
tomcat安装:
# wget http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.7/bin/apache-tomcat-9.0.7.tar.gz
# tar zxf apache-tomcat-9.0.7.tar.gz
# cp -rf apache-tomcat-9.0.7 /usr/local/tomcat
#确保所有cat客户端以及服务器对于/data目录具有读写权限
#在所有cat服务器上安装tomcat,启动端口默认设定为8080。
cat与tomcat结合:
#wget https://github.com/dianping/cat/archive/master.zip
#unzip master.zip
# mvn clean install -DskipTests #进行相关包的构建命令,一般是不会报错的。此处如果编译不成功,不能下载相关jar包,则可以手动下载,包在cat的mvn-repo分支下(https://github.com/dianping/cat/tree/mvn-repo) ,下载后拷贝到本地的maven仓库下
#这里是如果mvn clean install -DskipTests 执行失败将进行的操作 git checkout mvn-repo cp -R * ~/.m2/repository
#上面是执行成功后的界面。
# cp cat-home/target/cat-alpha-2.0.0.war /usr/local/tomcat/webapps/cat.war #将构建成功后的war包拷贝到tomcat下
# /usr/local/tomcat/bin/startup.sh #启动tomcat
#web页面访问以下:http://192.168.14.71:8080/cat #测试一下
#需要用户名密码登陆,如果配置ldap即可直接登陆,或者用默认账号catadmin/catadmin登陆。
# ls -l /usr/local/tomcat/webapps/
total 54024 drwxr-x---. 3 root root 4096 Apr 21 12:04 ROOT drwxr-x---. 11 root root 4096 Apr 21 12:06 cat #可以看到多了一个cat目录 -rw-r--r--. 1 root root 55289145 Apr 21 12:04 cat.war
3.4 修改服务配置(192.168.14.71上面的操作):
# mkdir /data/appdatas/cat/ -p #如果没有则新建此目录,确保这个目录有读写权限
# cd /data/appdatas/cat/
# cp /opt/cat-master/script/*.xml . #将cat源码下script目录下的三个配置文件(client.xml、server.xml、datasources.xml)拷贝过来
配置所有客户端和服务端的client.xml:
# vim /data/appdatas/cat/client.xml
<?xml version="1.0" encoding="utf-8"?> <config mode="client" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd"> <servers> <server ip="192.168.14.71" port="2280" http-port="8080" /> <server ip="192.168.14.72" port="2280" http-port="8080" /> <server ip="192.168.14.73" port="2280" http-port="8080" /> </servers> </config>
配置说明:
mode #定义配置模式,固定值为client;–暂未使用 servers #定义多个服务端信息; server #定义某个服务端信息; ip #配置服务端(cat-home)对外IP地址 port #配置服务端(cat-home)对外TCP协议开启端口,固定值为2280; http-port #配置服务端(cat-home)对外HTTP协议开启端口, 如:tomcat默认是8080端口,若未指定,默认为8080
配置服务端的datasources.xml:
#vim /data/appdatas/cat/datasources.xml
<?xml version="1.0" encoding="utf-8"?> <data-sources> <data-source id="cat"> <maximum-pool-size>3</maximum-pool-size> <connection-timeout>1s</connection-timeout> <idle-timeout>10m</idle-timeout> <statement-cache-size>1000</statement-cache-size> <properties> <driver>com.mysql.jdbc.Driver</driver> <url><![CDATA[jdbc:mysql://192.168.14.71:3306/cat]]></url> <user>cat</user> <password>123456</password> <connectionProperties><![CDATA[useUnicode=true&autoReconnect=true]]></connectionProperties> </properties> </data-source> <data-source id="app"> <maximum-pool-size>3</maximum-pool-size> <connection-timeout>1s</connection-timeout> <idle-timeout>10m</idle-timeout> <statement-cache-size>1000</statement-cache-size> <properties> <driver>com.mysql.jdbc.Driver</driver> <url><![CDATA[jdbc:mysql://192.168.14.71:3306/cat]]></url> <user>cat</user> <password>123456</password> <connectionProperties><![CDATA[useUnicode=true&autoReconnect=true]]></connectionProperties> </properties> </data-source> </data-sources>
配置说明:
主要修改项为:url(数据库连接地址)、user(数据库用户名)、password(数据用户登录密码)
配置服务端的server.xml:
# vi /data/appdatas/cat/server.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Configuration for development environment--> <config local-mode="false" hdfs-machine="false" job-machine="true" alert-machine="true"> <storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="7" local-logivew -storage-time="7"> <hdfs id="logview" max-size="128M" server-uri="hdfs://192.168.14.49:9000/user/cat" base-dir="logview"/> <hdfs id="dump" max-size="128M" server-uri="hdfs://192.168.14.49:9000/user/cat" base-dir="dump"/> <hdfs id="remote" max-size="128M" server-uri="hdfs://192.168.14.49:9000/user/cat" base-dir="remote"/> </storage> <console default-domain="Cat" show-cat-domain="true"> <remote-servers>192.168.14.71:8080,192.168.14.72:8080,192.168.14.73:8080</remote-servers> </console> <ldap ldapUrl="ldap://192.168.50.11:389/DC=dianpingoa,DC=com"/> </config>
配置说明:
local-mode #定义服务是否为本地模式(开发模式),在生产环境时,设置为false,启动远程监听模式。默认为 false; hdfs-machine #定义是否启用HDFS存储方式,默认为 false; job-machine #定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false; alert-machine #定义当前服务是否为报警机(开启各类报警监听,只需要一台服务机开启此功能),默认为 false; storage #定义数据存储配置信息 local-report-storage-time #定义本地报告存放时长,单位为(天) local-logivew-storage-time #定义本地日志存放时长,单位为(天) local-base-dir #定义本地数据存储目录 hdfs #定义HDFS配置信息,便于直接登录系统 server-uri #定义HDFS服务地址 console #定义服务控制台信息 remote-servers #定义HTTP服务列表,(远程监听端同步更新服务端信息即取此值) ldap #定义LDAP配置信息 ldapUrl #定义LDAP服务地址
3.5 修改路由配置
http://192.168.14.71:8080/cat/s/config?op=routerConfigUpdate #可以直接通过这个链接到登录界面
#需要用户名密码登陆,如果配置ldap即可直接登陆,或者用默认账号catadmin/catadmin登陆。
#上面一步操作很关键,如果没有这步操作对应节点的服务器是没有2280端口的。
#输入的内容为:
<?xml version="1.0" encoding="utf-8"?> <router-config backup-server="192.168.14.71" backup-server-port="2280"> <default-server id="192.168.14.72" weight="1.0" port="2280" enable="true"/> <default-server id="192.168.14.73" weight="1.0" port="2280" enable="true"/> </router-config>
配置说明:
把backup-server设置为当前服务器对外IP地址,端口固定为2280; default-server定义可跳转的路由地址,可以设置多个。default-server的id属性配置可路由的cat-home服务IP地址,端口固定为2280;若需要禁用路由地址,可把enable设置为false。
#可以将192.168.14.71部署为提供内部访问,并设置job-machine=true,alert-machine=true,让这台机器进行后续job以及告警处理,这些都可能影响到consumer性能。将192.168.14.72,192.168.14.73处理全部监控请求,如果后续需要扩容,可以直接添加default-server的节点。
#注意如果要扩容,新添加了一个default-server节点,如果那个节点之前已经启动了服务需要重启下服务。
3.6 启动相关服务
复制目录到相关服务器:
#在72和73上面都创建目录:
#mkdir /data/appdatas/cat/ -p
#/data/appdatas/cat/目录中client.xml、server.xml、datasources.xml三个配置文件到72、73两机器相同目录中
#把tomcat目录拷贝到72、73机器上面去
修改server.xml配置文件:
# vim /data/appdatas/cat/server.xml
<config local-mode="false" hdfs-machine="false" job-machine="false" alert-machine="false">
#修改server.xml配置中的 job-machine 和 alert-machine属性,都设置为false,禁用生成报告和报警功能,只开启监听功能。
启动服务:
# /usr/local/tomcat/bin/catalina.sh start #这就是启动服务的命令,当然后面跟stop就是关闭服务了。
查看下端口连接情况:
192.168.14.71:
# lsof -i :2280
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 3161 root 232u IPv6 36541 0t0 TCP *:lnvpoller (LISTEN) java 3161 root 236u IPv6 36550 0t0 TCP localhost:48738->localhost:lnvpoller (ESTABLISHED) java 3161 root 237u IPv6 34980 0t0 TCP localhost:lnvpoller->localhost:48738 (ESTABLISHED)
192.168.14.72:
# lsof -i :2280
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 8381 root 74u IPv6 34548 0t0 TCP 192.168.14.72:lnvpoller->192.168.14.73:49982 (ESTABLISHED) java 8381 root 79u IPv6 34567 0t0 TCP 192.168.14.72:lnvpoller->192.168.14.73:49991 (ESTABLISHED) java 8381 root 81u IPv6 31335 0t0 TCP 192.168.14.72:52309->192.168.14.72:lnvpoller (ESTABLISHED) java 8381 root 82u IPv6 34588 0t0 TCP 192.168.14.72:lnvpoller->192.168.14.72:52309 (ESTABLISHED) java 8381 root 232u IPv6 34237 0t0 TCP *:lnvpoller (LISTEN)
192.168.14.73:
# lsof -i :2280
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 8410 root 232u IPv6 37049 0t0 TCP *:lnvpoller (LISTEN) java 8410 root 237u IPv6 37060 0t0 TCP 192.168.14.73:49982->192.168.14.72:lnvpoller (ESTABLISHED) java 8579 root 236u IPv6 35245 0t0 TCP 192.168.14.73:49991->192.168.14.72:lnvpoller (ESTABLISHED)