
写之前这里先打个广告,java 版本的logstash已经开源,git地址 https://github.com/dtstack ;再放个招聘信息 https://m.zhipin.com/weijd/v2/job/de2292afc38d32fe1XV73t25EFU~?date8=20180609&sid=self_jd&from=singlemessage&isappinstalled=0,欢迎对技术有追求的码农。 下面进入正题。 一是提升性能: 先说说性能问题,当时袋鼠云的云日志系统日志接收端是ruby 版本的logstash,存储用elasticsearch,前端的展示没有用原生的kibana,而是自己写的一套前端。本人是负者日志接收端的logstash开发,基于ruby版本的logstash写一些满足公司业务的插件,当时为了提升性能做了各种优 化,一些模块也用java写的,在用ruby调用java,比如ip的解析,但是最终优化的结果是单机4core,4g的虚拟机每小时最多跑800万的数据(我们的场景跟大部分人一样都是订阅kafka的消息,在经过一些filter(瓶颈主要在这里比较耗cpu),在写入elasticsearch)。因为logstash的核心代码是用ruby语言开发,虽然是运行在jruby上,但是由于中间涉及到数据结构的转化,性能是跟用原生的 java语言运行在jvm上肯定是有所差距的。所以当时也是抱着试试的心态,花了2个星期用java重写logstash,并把自己所需要的插件也用java重写,在同样的4core,4g的虚拟机环境下,每小时能跑4000万数据,性能近5倍的提升。 这是一个java logstash 和 ruby logstash(2.3.2版本)做的性能对比 二是保证数据尽量不丢失: ruby 版本的logstash 对保证数据不丢失这块没做太多的设计,举个简单的列子,数据从kafka消费,在output到elasticsearch,一旦elasticsearch集群不可能,ruby logstash会重试几次还不成功就会扔掉继续消费kafka数据,而且重试的动作也是elasticsearch插件自身完成,logstash本生没对数据的不丢失做设计。而java 版本的logstash 的BaseOutput 这个抽象类里面有个failedMsgQueue 这个队列,每个output实例维护一个,output 插件需要自身判断哪些数据失败了,在把失败的数据调用addFailedMsg 这个方法,写入到failedMsgQueue这个队列里,java logstash一旦发现failedMsgQueue有数据就会调用sendFailedMsg这个方法消费failedMsgQueue这里的数据直到没有数据,才会消费input里的数据这个逻辑可以通过consistency 这个属性控制,默认是关闭的。还有一点是input和output插件都提供了release方法,这个主要是为了jvm退出时,要执行的一些动作而设计的,因为大部分的input和output插件在获取和发送的数据都会先放在一个集合里面,在会慢慢消耗集合里面的数据,这样jvm退出时,插件各自就可以实现自己的逻辑保证jvm退出时,集合里面的数据要消费完,才能退出jvm,当然 你要是kill -9 进程那就没法保证了。现在elasticsearch插件我们已经实现了数据不丢失这个逻辑,也在我们的线上稳定的跑了很长一段时间。 注释:有人问jlogstash跟hangout有什么区别,这里就不做说明了,有兴趣的同学可以看看这两个的源码就知道区别了。也希望jlogstash能为一些开发者解决一些问题,也希望有更多的人参与到jlogstash的开发里来。
什么是大数据平台 有三个疑问: 1.使用Cloudera或Hortonworks之类的Hadoop发行版本公司的提供的Hadoop套件,配置些参数,找几台服务器部署起来就算是一套大数据平台吗? 2.数据开发人员平时的工作是不是写些MR或者SQL任务,使用原生的命令行提交任务就可以了吗? 3.平台开发人员日常的工作是不是处理下集群的故障,给业务方扫盲,纠正各种框架组件使用姿势呢? 大数据平台个人理解: 是基于开源或自研组件的基础上创造更多的附件价值,提供给用户一个完整的大数据业务解决方案,而不仅仅是做一个集群的维护者 大数据平台的价值 1.数据开发角度 一.降低数据开发门槛 二.提升数据开发人员效率 2.运维角度 一.降低运维门槛 二.提升运维效率 3.公司角度 一.数据统一管理(OneData理念),降低成本 大数据平台架构选型 离线计算: 1.Spark+SparkSQL2.MR(Hadoop)+HiveSQL 离线数据同步: 1.DataX(Alibaba,开源支持单机版本) FlinkX(Dtstack,开源支持单机,standalone,yarn 模式) Sqoop(只能做Hadoop和关系型数据库之间的数据同步) Kettle 实时计算: 1.Flink2.SparkStreaming Storm JStorm(Alibaba) StreamCQL(华为) 实时数据同步: 1.Flume Logstash(Elastic) JLogstash(Dtstack) 多维分析(即席查询): 1.Kylin SparkSQL+CarbonData Impala+Kudu 或Parquet 机器学习: 1.Spark MLib Flink MLib XGBoost 深度学习: 1.TensorFlow Caffe Keras Keras 资源管理器: 1.Yarn Mesos Kubernetes+Docker 集群管理: 1.Cloudera2.星环 Hortonworks Ambari
什么是大数据平台 有三个疑问: 1.使用Cloudera或Hortonworks之类的Hadoop发行版本公司的提供的Hadoop套件,配置些参数,找几台服务器部署起来就算是一套大数据平台吗? 2.数据开发人员平时的工作是不是写些MR或者SQL任务,使用原生的命令行提交任务就可以了吗? 3.平台开发人员日常的工作是不是处理下集群的故障,给业务方扫盲,纠正各种框架组件使用姿势呢? 大数据平台个人理解: 是基于开源或自研组件的基础上创造更多的附件价值,提供给用户一个完整的大数据业务解决方案,而不仅仅是做一个集群的维护者 大数据平台的价值 1.数据开发角度 一.降低数据开发门槛 二.提升数据开发人员效率 2.运维角度 一.降低运维门槛 二.提升运维效率 3.公司角度 一.数据统一管理(OneData理念),降低成本 大数据平台架构选型 离线计算: 1.Spark+SparkSQL2.MR(Hadoop)+HiveSQL 离线数据同步: 1.DataX(Alibaba,开源支持单机版本) FlinkX(Dtstack,开源支持单机,standalone,yarn 模式) Sqoop(只能做Hadoop和关系型数据库之间的数据同步) Kettle 实时计算: 1.Flink2.SparkStreaming Storm JStorm(Alibaba) StreamCQL(华为) 实时数据同步: 1.Flume Logstash(Elastic) JLogstash(Dtstack) 多维分析(即席查询): 1.Kylin SparkSQL+CarbonData Impala+Kudu 或Parquet 机器学习: 1.Spark MLib Flink MLib XGBoost 深度学习: 1.TensorFlow Caffe Keras Keras 资源管理器: 1.Yarn Mesos Kubernetes+Docker 集群管理: 1.Cloudera2.星环 Hortonworks Ambari
现在最新版本的flink1.6版本现在还不支持直接用SQL来实现流与维表的join。这里打个广告我们团队已经实现了这个功能并且开源 https://github.com/DTStack/flinkStreamSQL 这里先解释下什么是维表;维表是动态表,表里所存储的数据有可能不变,也有可能定时更新,但是更新频率不是很频繁。在业务开发中一般的维表数据存储在关系型数据库如mysql,oracle等,也可能存储在hbase,redis等nosql数据库。 所以要用FlinkSQL实现流与维表的join 分两步;第一是用flink api实现维表的功能:要实现维表功能就要用到 flink Aysnc I/O 这个功能,是由阿里巴巴贡献给apache flink的。具体介绍可以看这篇文章 http://wuchong.me/blog/2017/05/17/flink-internals-async-io/,这里不做介绍。对应到flink 的api就是RichAsyncFunction 这个抽象类,继层这个抽象类实现里面的open(初始化),asyncInvoke(数据异步调用),close(停止的一些操作)方法,最主要的是实现asyncInvoke 里面的方法。流与维表的join会碰到两个问题,一个是性能问题,因为流速要是很快,每一条数据都需要到维表做下join,但是维表的数据是存在第三方存储系统,如果实时访问第三方存储系统,一个是join的性能会差,每次都要走网络io;还有就是对第三方存储系统带来很大的压力,有可能会把第三方存储系统搞挂掉。所以解决的方法就是维表里的数据要缓存,可以全量缓存,这个主要是维表数据不大的情况,还有一个是LRU缓存,维表数据量比较大的情况。第二个问题是流延迟过来的数据这么跟之前的维表数据做关联;这个就涉及到维表数据需要存储快照数据,所以这样的场景用hbase 做维表是比较适合的,因为hbase 是天生支持数据多版本的。 第二是解析流与维表join的sql语法转化成底层的flinkAPI因为flinkSQL已经做了大部分sql场景,我们不可能在去解析sql的所有语法,在把他转化成底层flinkAPI。所以我们做的就是解析sql语法,来找到join表里有没有维表,如果有维表,那我们会把这个join的维表的语句单独拆来,用flink的tableAPI和streamAPi 生成新DataStream,在把这个DataStream与其他的表在做join这样就能用SQL来实现流与维表的join语法了。sql解析的工具就是用apache calcite,flink也是用这个框架做sql解析的。所以所有语法都是可以解析的。
1. FlinkX概览 一.FlinkX是一个基于Flink的异构数据源离线同步工具,用于在多种数据源(MySQL、Oracle、SqlServer、Ftp、Hdfs,HBase、Hive、Elasticsearch等)之间进行高效稳定的数据同步。二.FlinkX简化了数据同步任务的开发过程,用户只需提供一份数据同步任务的配置,FlinkX会将配置转化为Flink任务,并自动提交到Flink集群上执行。三.Flink一个面向分布式数据流处理和批量数据处理的开源计算平台,具有分布式、低延迟、高吞吐和高可靠的特性。 2. FlinkX的设计思路 一.插件式架构 FlinkX采用了一种插件式的架构:不同的源数据库被抽象成不同的Reader插件,不同的目标数据库被抽象成不同的Writer插件;整个数据同步任务共有的处理逻辑被抽象在Template模块中,该模块根据数据同步任务配置加载对应的Reader和Writer插件,组装Flink任务,并提交到Flink集群执行;FlinkX框架可以支持任意数据源类型的数据同步工作。作为一个开放式系统,用户可以根据需要开发新的插件,以接入新的数据库类型。 二. Flink任务的自动组装 Template模块根据同步任务的配置信息加载源数据库和目的数据库对应的Reader插件和Writer插件;Reader插件实现了InputFormat接口,从源数据库中获取DataStream对象;Writer插件实现了OutputFormat接口,将目的数据库与DataStream对象相关联;Template模块通过DataStream对象将Reader和Writer串接在一起,组装成一个Flink任务,并提交到Flink集群上执行。 3. FlinkX的优势 一.便于使用 用户只需要提供一份数据同步配置信息,无需编写程序,FlinkX会配置信息自动转换为Flink任务并提交到Flink集群执行。 二.性能优越 FlinkX会将数据同步任务提交到Flink集群中的执行,使得FlinkX天然具有Flink的性能优势,主要表现为分布式、低延迟、高吞吐和高可靠。 三.多运行模式 同普通的Flink任务一样,FlinkX支持local、standalone和yarn三种运行模式。local模式就是在本地开启一个mini的Flink集群执行Flink任务,这种运行模式的好处是使用方便,不需要预先启动分布式集群,适用于测试和实验环境;缺点是由于单点执行,可靠性差,当数据量大时吞吐量受限; standalone模式是指以独立部署的方式启动一个Flink集群,然后将提交Flink任务到该集群上执行; yarn模式是指在yarn集群中部署Flink集群,然后将Flink任务提交到部署在yarn集群中的Flink集群上执行;standalone模式和yarn模式都是分布式地执行FlinkX,而yarn模式可以利用yarn的资源管理功能,因而成为部署FlinkX应用时的首选。 四.插件式开发 插件式架构,你可以给任何类型的数据源开发Reader和Writer插件。 五.错误控制 错误控制可以在数据同步配置信息中设置错误记录阈值、错误占比阈值,使得数据同步任务在出错时及时停止,避免系统资源的浪费。脏数据管理可以将错误记录、错误原因、错误类型输出到Hive表中,便于日后的排查工作。 六.任务资源限制 每个同步任务都可以做到并发度,内存,网络io的限制,防止单个任务占用过多cpu,内存,网络io资源 4.欢迎试用FlinkX 源代码仓库地址 https://github.com/DTStack/flinkx
用过ruby 版本 的logstash 大家都知道,在input 数据消费进来之后,output数据要是失败了,就会扔掉,这个对数据要求较高的应用中是很难接受的。 举一个列,input kafka,output elasticsearch,在消费kafka数据到内存队列,在output到elasticsearche的时候,elasticsearch不可用,elasticsearc客户端会重试几次之后还是失败就会扔掉,重新消费kafka数据,ruby 版本的logstash 没有提供配置能保证数据不可丢失。 java 版本的logstash 在BaseOutput基类里面定义了一个sendFailedMsg 这个方法,这个方法就是有开发插件的开发人员自己写数据重试的逻辑,并且把失败的数据放在 BlockingQueue<Object> failedMsgQueue这个quene 里面,java logstash会在消费input quene 数据之前,先消费failedMsgQueue里面的数据,直到没有数据才会消费input quene里的数据,默认这个是关闭的,需要consistency这个字段设置为true。 并且,java logstash在应用在正常被kill时会监听input quene 判断里面是否还有数据,如果还有会让里面的数据消费完成,在停掉应用。
具体见下面的github地址 https://github.com/DTStack/jlogstash-performance-testing
为什么要用java重写logstash 写之前这里先打个广告,java 版本的logstash已经开源,git地址 https://github.com/dtstack ;再放个招聘信息 https://m.zhipin.com/weijd/v2/job/de2292afc38d32fe1XV73t25EFU~?date8=20180609&sid=self_jd&from=singlemessage&isappinstalled=0,欢迎对技术有追求的码农。 下面进入正题。 一是提升性能: 先说说性能问题,当时袋鼠云的云日志系统日志接收端是ruby 版本的logstash,存储用elasticsearch,前端的展示没有用原生的kibana,而是自己写的一套前端。本人是负者日志接收端的logstash开发,基于ruby版本的logstash写一些满足公司业务的插件,当时为了提升性能做了各种优 化,一些模块也用java写的,在用ruby调用java,比如ip的解析,但是最终优化的结果是单机4core,4g的虚拟机每小时最多跑800万的数据(我们的场景跟大部分人一样都是订阅kafka的消息,在经过一些filter(瓶颈主要在这里比较耗cpu),在写入elasticsearch)。因为logstash的核心代码是用ruby语言开发,虽然是运行在jruby上,但是由于中间涉及到数据结构的转化,性能是跟用原生的 java语言运行在jvm上肯定是有所差距的。所以当时也是抱着试试的心态,花了2个星期用java重写logstash,并把自己所需要的插件也用java重写,在同样的4core,4g的虚拟机环境下,每小时能跑4000万数据,性能近5倍的提升。 这是一个java logstash 和 ruby logstash(2.3.2版本)做的性能对比 二是保证数据尽量不丢失: ruby 版本的logstash 对保证数据不丢失这块没做太多的设计,举个简单的列子,数据从kafka消费,在output到elasticsearch,一旦elasticsearch集群不可能,ruby logstash会重试几次还不成功就会扔掉继续消费kafka数据,而且重试的动作也是elasticsearch插件自身完成,logstash本生没对数据的不丢失做设计。而java 版本的logstash 的BaseOutput 这个抽象类里面有个failedMsgQueue 这个队列,每个output实例维护一个,output 插件需要自身判断哪些数据失败了,在把失败的数据调用addFailedMsg 这个方法,写入到failedMsgQueue这个队列里,java logstash一旦发现failedMsgQueue有数据就会调用sendFailedMsg这个方法消费failedMsgQueue这里的数据直到没有数据,才会消费input里的数据这个逻辑可以通过consistency 这个属性控制,默认是关闭的。还有一点是input和output插件都提供了release方法,这个主要是为了jvm退出时,要执行的一些动作而设计的,因为大部分的input和output插件在获取和发送的数据都会先放在一个集合里面,在会慢慢消耗集合里面的数据,这样jvm退出时,插件各自就可以实现自己的逻辑保证jvm退出时,集合里面的数据要消费完,才能退出jvm,当然 你要是kill -9 进程那就没法保证了。现在elasticsearch插件我们已经实现了数据不丢失这个逻辑,也在我们的线上稳定的跑了很长一段时间。 注释:有人问jlogstash跟hangout有什么区别,这里就不做说明了,有兴趣的同学可以看看这两个的源码就知道区别了。也希望jlogstash能为一些开发者解决一些问题,也希望有更多的人参与到jlogstash的开发里来。
一.zookeeper下载与安装 1)下载 adeMacBook-Pro:zookeeper_soft apple$ wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 2)解压 tar zxvf zookeeper-3.4.6.tar.gz 3)配置 cd zookeeper-3.4.6cp -rf conf/zoo_sample.cfg conf/zoo.cfg vim zoo.cfg zoo.cfg: # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/Users/apple/Documents/soft/zookeeper_soft/zkdata #这个目录是预先创建的 # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 4)启动zookeeper adeMacBook-Pro:bin apple$ sh zkServer.sh start JMX enabled by default Using config: /Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../conf/zoo.cfg -n Starting zookeeper ... STARTED adeMacBook-Pro:bin apple$ ps ax| grep zookeeper.out 10311 s003 S+ 0:00.01 grep zookeeper.out adeMacBook-Pro:bin apple$ ps ax| grep zookeeper 10307 s003 S 0:00.63 /usr/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../build/classes:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../build/lib/*.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /Users/apple/Documents/soft/zookeeper_soft/zookeeper-3.4.6/bin/../conf/zoo.cfg 二 下载并且安装kafka(预先得安装配置好scala的环境,Mac环境参照:http://www.cnblogs.com/super-d2/p/4534208.html) 1).下载kafka: wget http://apache.fayea.com/kafka/0.8.2.1/kafka_2.10-0.8.2.1.tgz 2) 解压: tar -zxf kafka_2.10-0.8.2.1.tgz 3)启动kafka adeMacBook-Pro:kafka_2.10-0.8.2.1 apple$ sh bin/kafka-server-start.sh config/server.properties 备注:要挂到后台使用: sh bin/kafka-server-start.sh config/server.properties & 4)新建一个TOPIC adeMacBook-Pro:bin apple$ sh kafka-topics.sh --create --topic kafkatopic --replication-factor 1 --partitions 1 --zookeeper localhost:2181 备注:要挂到后台使用: sh kafka-topics.sh --create --topic kafkatopic --replication-factor 1 --partitions 1 --zookeeper localhost:2181 & 5) 把KAFKA的生产者启动起来: adeMacBook-Pro:bin apple$ sh kafka-console-producer.sh --broker-list localhost:9092 --sync --topic kafkatopic 备注:要挂到后台使用: sh kafka-console-producer.sh --broker-list localhost:9092 --sync --topic kafkatopic & 6)另开一个终端,把消费者启动起来: adeMacBook-Pro:bin apple$ sh kafka-console-consumer.sh --zookeeper localhost:2181 --topic kafkatopic --from-beginning 备注:要挂到后台使用: sh kafka-console-consumer.sh --zookeeper localhost:2181 --topic kafkatopic --from-beginning & 7)使用 在发送消息的终端输入aaa,则可以在消费消息的终端显示,如下图所示:
生成密钥对 用密码登录远程主机,将公钥拷贝过去 done 生成密钥对 执行命令 ssh-keygen -t rsa 执行结果如下: charles@mac:~ > ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/Users/charles/.ssh/id_rsa): Created directory ‘/Users/charles/.ssh’. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/charles/.ssh/id_rsa. Your public key has been saved in /Users/charles/.ssh/id_rsa.pub. The key fingerprint is: c8:4b:85:87:90:7c:1a:67:b6:71:f5:51:0c:9d:a2:89 charles@TCMBP.local The key’s randomart image is: +–[ RSA 2048]—-+ | … .. o=.. | | +.*o. …+ | | Bo+o. o.. | | …+E o | | + S | | . . | | . | | | | | +—————–+ 注意:提示enter passphrase的时候,不要输入,因为你本来就想少打一次密码的,这里如果设置了用密码保护私钥,那登录的时候还是要输密码,就白做了。 做完这个步骤后,cd ~/.ssh,你就可以看到你刚才生成的密钥对,id_rsa是私钥,id_rsa.pub是公钥。下一步,就是把公钥拷贝到目标主机上。 将公钥拷贝到目标主机 用ssh登录到目标主机,然后cd ~/.ssh目录,如果目录不存在,那么要自己创建mkdir -p ~/.ssh。你今后要用哪个帐户登录主机,就在哪个帐户的home目录下操作,如果要免登陆root,就要去/root下操作。使用~比较好,不用多想了。 有了.ssh目录后,进去,然后把id_rsa.pub传过去,可以用scp命令,这里要做的一个主要操作,就是将id_rsa.pub,的文件内容,写到一个叫authorized_keys的文件中去,如果目标主机的相应用户名下已经有了.ssh目录和authorized_keys文件,那你操作要小心一点,可能别人也做过免登陆的设置,这个时候你要小心不要把别人的设置给覆盖了。如果没有的话,就创建文件touch ~/.ssh/authorized_keys,然后执行cat id_rsa.pub >> authorized_keys,将你的公钥写入到authorized_keys中,公钥文件.pub里面只有一行信息,上面的命令相当于把那一行信息追加到authorized_keys文件最后一行。 如果.ssh目录是你主机刚刚创建的,那么可能还需要改变一下这个目录的权限,将权限放低,chmod -R 0600 ~/.ssh,到此,所有设置就算做完了,你可以退出登录,在自己的主机上试一下了,现在再敲入ssh命令后,不用密码就可以登录主机了。
安装配置Golang 可以从Golang中国这里下载,下载好后使用sudo tar -xvzf ~/Downloads/go*.linux-amd64.tar.gz -C /usr/local/命令将其解压到/usr/local/位置,然后配置环境变量。 使用命令vim ~/.bashrc打开.bashrc文件,然后在最后追加下面内容: export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin export GOPATH=~/Go 然后使用命令source ~/.bashrc使其生效,需要注意的是,GOPATH这个环境变量指的是之后需要存放源码的目录,我使用的是~/Go目录 使用go version以及go env等命令来查看是否正确安装Go 安装配置LiteIDE 可以从Golang中国这里下载,然后将其解压到某个目录,这里我是解压到了/usr/local/目录,然后在该目录下,就可以看到liteide目录了 然后执行命令gksudo gedit /usr/share/applications/liteide.desktop,如果没安装gksu,首先根据提示安装即可 然后讲下面的内容写到新建的liteide.desktop文件中: [Desktop Entry] Name=liteIDE Encoding=UTF-8 Type=Application Exec=/usr/local/liteide/bin/liteide Terminal=false Icon=/usr/local/liteide/share/liteide/welcome/images/liteide400.png Comment=Integrated Development Environment StartupNotify=true Categories=Development;IDE; Name[en]=liteIDE 然后我们就可以搜索到LiteIDE了,将其固定到桌面,打开之后在选项中修改LiteEnv的linux64以及linux64-local这两个文件,将其中的GOROOT修改为/usr/local/go 这样就完成了LiteIDE的安装配置了
通过openresty和嵌入式的lua脚本,来搭建高并发的日志采集服务器,现在主要采集pc端和app端的日志,数据存储在kafka openresty 服务搭建步骤(mac,linux) wget https://www.openssl.org/source/openssl-1.0.2f.tar.gz tar -zvxf openssl-1.0.2f.tar.gz wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz tar -xvf pcre-8.38.tar.gz wget https://openresty.org/download/ngx_openresty-1.9.7.2.tar.gz tar -zxvf ngx_openresty-1.9.7.2.tar.gz cd ngx_openresty-1.9.7.2/ ./configure --with-openssl=../openssl-1.0.2f \ --with-pcre=../pcre-8.38 make sudo make install openresty 安装kafka插件 #下载lua-resty-kafka: wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip unzip lua-resty-kafka-master.zip -d ~ #拷贝lua-resty-kafka到openrestysudo mkdir /usr/local/openresty/lualib/resty/kafka cp -rf ~/lua-resty-kafka-master/lib/resty /usr/local/openresty/lualib/resty/kafka #通过git下载代码~这个目录下 cd /usr/local/openresty/nginx ln -s ~/logadash/src/udf udf ln -s ~/logadash/conf/mac_nginx.conf nginx.conf
最近要快速搭建日志采集服务端,想到了基于openresty。这里主要介绍下ngx.exit,ngx.eof,ngx.timer.at这三者的区别。 1.ngx.exit 立即中断当前http请求,后续lua代码将不会再执行,底层socket通道还存在,只要没超过保活时间,如果用了proxypass做子请求,不影响。 2.ngx.eof 立即中断当前http请求,后续的lua代码将继续执行,底层socket通道也立即断开,如果用了proxypass做子请求,子请求也会断开。 3.ngx.timer.at 这个是nginx提供的轻线程,主要做后台任务执行用,一般和ngx.exit配合使用。 下面是自己搭建的openresty性能压测的情况 分别对应上面三种写法,压测工具是apachebench,压测环境是4核4g虚拟机 3900/1并发用户数,6000/20000并发用户数) 3600/1并发用户数,9300/20000并发用户数 4700/1并发用户数,9300/20000并发用户数
2020年04月