开源软件

elasticsearch使用索引模板和别名高效地处理日志类索引

Oct 27, 2016 | | Say something

使用elasticsearch存储日志在互联网企业是一个很常见的应用。虽然elastic公司提供成熟的logstash,自己实现也不难。 如果将所有的文档存放在一个索引中,那么清除陈旧的文档时很耗资源,需要先查询出待删除的ID,然后调用删除命令,其实在底层,elasticsearch根本没有释放被删除的这些文档占用的磁盘资源,只是将其标记为已删除,只有等到下次merge的时候才会真正的释放占用的磁盘资源,众所周知,索引merge是一个巨耗资源的操作。 思路如下:每月1号凌晨定时创建索引,然后将logs_current别名指向新的索引,logs_current用于新增和更新索引,将last_3_months指向最近三个月的索引,用于查询。这时就可以释放掉陈旧索引所占用的资源了。而且很高效。 1、创建索引模板 { “template” : “logs_*”, “mappings” : { “logs_type” : { “properties” : { “id” : { “type” : “string” }, “content” : { “type” : “string” }, “timestamp” : { “type” : “string”, “index” : “not_analyzed” } } } } } 最好将其存储为一个文件。便于编辑,假设命名为logs_template.json 然后执行如下命令将模板添加到elasticsearch curl -XPUT localhost:9200/_template/logs_template -d @~/logs_template.json 2、定时任务中创建新的索引,更新别名的指向,删除陈旧的索引 在定时任务脚本中,使用如下的shell命令查看待操作的索引是否存在 CURRENT_MONTH_EXISTS=$(curl […more]

elasticSearch插入Date类型数据时报Invalid format

Oct 24, 2016 | | Say something

我使用的elasticSearch Server版本为2.3.3,java客户端为2.2.0, entity的注解如下。 @Field(type=FieldType.Date, format=DateFormat.date_optional_time,index= FieldIndex.not_analyzed) private Date createTime; 报如下异常。 MapperParsingException[failed to parse [createTime]]; nested: IllegalArgumentException[Invalid format: “1477322607562” is malformed at “7562”]; “createTime” : { “type” : “date”, “format” : “date_optional_time” } 谷歌后发现,是jackson库在转换为json的时候,将Date类型转为为了long型的字符串表示,而我们定义的是date_optional_time格式的字符串,所以解析错误,具体的解决办法为: 1、去掉注解中的format=DateFormat.date_optional_time 让其使用默认的格式,也就是’strict_date_optional_time||epoch_millis’,既能接受date_optional_time格式的,也能接受epoch_millis格式。 @Field(type=FieldType.Date, index= FieldIndex.not_analyzed) private Date createTime; “createTime” : { “type” : “date”, “format” : “strict_date_optional_time||epoch_millis” }, 2、添加@JsonFormat注解 @Field(type=FieldType.Date, format=DateFormat.date_optional_time, index= […more]

使用zkCli.cmd对Zookeeper进行ACL控制

Apr 12, 2016 | | Say something

zkCli提供如下操作ACL的方法 create [-s] [-e] path data acl 创建节点时设置权限 setAcl path acl 对已经存在的节点设置权限 getAcl path 查询已有节点的权限 addauth scheme auth 对当前连接添加凭证 使用zkCli时,ACL的格式为schema:certificate:privileges 采用ip认证,那么ACL就为ip:192.168.1.110:cdwra cdwra分别表示create, delete,write,read, admin 遗憾的是,zookeeper-3.4.6版本是不支持ip:192.168.1.0/24:cdwra这种子网模式的 采用digest认证,那么ACL为digest:root:qiTlqPLK7XM2ht3HMn02qRpkKIE=:cdwra 遗憾的是,这个地方需要经过编码的密码 ,可是使用org.apache.zookeeper.server.auth.DigestAuthenticationProvider的main方法产生。 添加认证信息时,IP认证对客户端是透明的,digest认证,执行addauth digest username:password 对当前的session添加凭证

Redis入门

Dec 10, 2015 | | Say something

Redis支持5种数据类型,分别是String, List, Set, Map, Sorted Set。String类型和memcached的String类似,但是提供了更多的操作,比如增加1,一个map可以存储关系型数据库的一行记录,其实更类似mongodb的document。list能存放重复的元素,而Set不能存放重复的元素。Sorted Set是一种特殊的map,value存放score,key按照score的顺序排列。据我了解是升序的,要取得top 5,需要执行: zrange score -5 -1 WITHSCORES, 除了set命令支持直接指定expire值,其他的命令需要单独调用”expire key secendsToLive” redis支持两种事务日志,隔段时间dump一次内存的内容,产生snapshot文件, 或者append-only-file, 类似关系型数据的redo log, 记录操作数据的每个指令,append-only-file是replication的基础。 redis支持所谓的乐观锁,先不锁数据,如果别的进程改变了数据,那么当前的操作以失败结束。当调用MULTI命令后,redis客户端将后续的命令缓存在客户端,等待EXEC指令后一起执行这些命令,然后一起返回执行的结果。这就是redis事务的奥秘, redis客户端通过hash将数据存放在不同的redis服务器来支持分片 对于redis-cli客户端,可以通过help @server, help @string 来获取一个组的相关操作指令

zookeeper基本概念

Oct 27, 2015 | | Say something

leader选举 一个server启动后,会向集群中的其他server发送一个选举它自己为leader的通知,如果集群中已经有leader,那么其他server会告诉它应该follow现有的leader,如果没有leader,会按照epoch,zxid, sid来选举一个leader,当然采用过半原则。 zab协议: 当集群中的某个server收到写操作时,会将这个操作forward给leader,leader会先发送一个写数据的提议(proposal),如果有过半的服务器应答了这个提议,那么就发送一个提交(commit)指令,来真正地持久化这个事务。 session管理: zookeeper采用bucket策略来管理session,使用如下的策略(expirationTime / expirationInterval + 1) * expirationInterval, 将一个时间段内过期的session放入一个bucket中,这样可以一次清理一个时间段内的session,减少清理session的额外开销 数据与存储: 当有写操作时,zookeeper会写事务日志(log.400000001,这种文件),在一定的时间间隔后,还会将内存的数据dump到磁盘,产生(snapshot.10000c85d文件),当一个新的server加入集群的时候,如果它的事务记录不是落后leader太大,那么就执行DIFF同步,只同步缺少的事务日志记录,如果落后太多,那么就使用SNAP模式,先同步一个最新的snapshot,然后再应用事务日志。 Observer 不参与提议的讨论,只学习提议的结果,通过INFORM消息同步数据,follower需要先应答leader的提议(proposal)然后处理leader发送的commit两个指令同步数据

Jmeter的吞吐量很低

Aug 18, 2015 | | Say something

最近在玩Jmeter的时候发现测试的吞吐量一直很低,开始一直怀疑是tomcat配置问题,弄了一大半天才发现,使用GUI压力测试时,JMeter一直在GC,改成非GUI模式吞吐量就上去了,由于服务器和JMeter运行在同一个机子上,测试的吞吐量大概在500-1200/s。但是当执行的次数比较多的时候,后面失败的次数越来越多。 jmeter-n.cmd 是windows平台的非GUI的测试入口,跟上.JMX的测试用例配置文件就OK了。 jmeter-n.cmd ../my_test_case/test.jmx 以下是测试结果输出: Creating summariser <summary> Created the tree successfully using test.jmx Starting the test @ Wed Aug 19 13:54:25 CST 2015 (1439963665073) Waiting for possible shutdown message on port 4445 summary +6660 in 5s = 1363.1/s Avg: 17 Min: 1 Max:1627 Err: 0 (0.00%) Active: 75 Started: 200 Finished: 125 summary […more]

JMeter整合InfluxDB,Grafana让测试结果实时显示

Aug 17, 2015 | | Say something

软件版本: apache-jmeter-2.13.tgz grafana-2.1.1-1.x86_64.rpm influxdb-0.8.8-1.x86_64.rpm 虽然官方不在支持influxdb-0.8.8版本了,但是jmeter的文档用的这个版本,所以我也用了这个版本 【重要体会】,玩弄一个新的软件,最好将其日志调整的越丰富越好,这样可以发现很多问题 安装步骤: 安装influxdb wget https://s3.amazonaws.com/influxdb/influxdb-0.8.8-1.x86_64.rpm yum localinstall influxdb-0.8.8-1.x86_64.rpm 修改/opt/influxdb/current/config.toml [input_plugins.graphite] enabled = true address = “192.168.14.135” # If not set, is actually set to bind-address. port = 2003 database = “jmeter” 然后执行./influxdb -config=config.toml 启动服务器 浏览器执行http://192.168.14.135:8083/ 用户名和密码root:root就可以进入influxdb管理界面,创建Jmeter数据库 安装grafana wget https://grafanarel.s3.amazonaws.com/builds/grafana-2.1.1-1.x86_64.rpm yum localinstall grafana-2.1.1-1.x86_64.rpm systemctl start grafana-server 浏览器指向http://192.168.14.135:3000/ , 默认用户名和密码是admin:admin 按照官方步骤创建一个数据源 创建一个dashboard, […more]