elasticsearch数据长期保存的方案

Elasticsearch的数据就存储在硬盘中。当我们的访问日志非常大时,kabana绘制图形的时候会非常缓慢。而且硬盘空间有限,不可能保存所有的日志文件。如果我们想获取站点每天的重要数据信息,比如每天的访问量并希望能图像化的形式显示该如何做呢?

一、具体操作方法

获取数据之前你要知道你想要什么样的数据。比如我想获取每小时网站访问的PV,在kibana中肯定能获取到

这是在kibana中查询的每小时的pv,然后我们把他的查询json复制出来

把上述json粘贴到test文件中 然后使用如下语句即可查询上图显示的查询结果

curl -POST ‘http://192.168.10.49:9200/_search‘ -d ‘@test‘

{"took":940,"timed_out":false,"_shards":{"total":211,"successful":211,"failed":0},"hits"......

然后把返回的结果中的数据获取存入data数组中,这是你可以存入数据库也可以转换成json直接插入es

这种方法主要是通过elasticsearch的查询语句把数据查询出来在传参给其他地方。你输入固定的查询json它返回的json数据也是固定格式的,这样很方面就能从中挖掘出我们想要的数据!

二、php代码实现上述操作

class.php


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<?php
#从ES中导出数据
#两个参数:
#url为从ES导出数据的访问路径,不同的数据路径不一样
#post_data为json格式,是request body。
 function export($url,$post_data){
        $ch = curl_init ();
        curl_setopt ( $ch, CURLOPT_URL, $url );
        curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST,"POST");
        curl_setopt ( $ch, CURLOPT_HEADER, 0 );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data);
        $arr=curl_exec($ch);
        curl_close($ch);
        return json_decode($arr,‘assoc‘);;
}
#把数组数据导入ES
#两个参数:
#$url为导入数据的具体位置 如:http://IP:9200/索引/类型/ID(ID最好根据时间确定,需要唯一ID) 
#post_data 导入ES的数据数组
function import($url,$post_data)
 {
  $json=json_encode($post_data);
    $ci = curl_init();
    curl_setopt($ci, CURLOPT_PORT, 9200);
    curl_setopt($ci, CURLOPT_TIMEOUT, 2000);
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ci, CURLOPT_FORBID_REUSE, 0);
    curl_setopt($ci, CURLOPT_CUSTOMREQUEST, ‘PUT‘);
    curl_setopt($ci, CURLOPT_URL, $url);
    curl_setopt($ci, CURLOPT_POSTFIELDS, $json);
    $response = curl_exec($ci);
    unset($post_data);//销毁数组    
    unset($json);//销毁数据    
    curl_close($ci);
 }
 ?>

vim access_info.php


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?php
include("class.php");
#导出数据的ES路径
$url="http://192.168.10.49:9200/_search";
#查询数据的开始时间
$begin=date("Y-m-d",strtotime("-16 day"));
#开始时间的格式转换
$start_time=strtotime($begin." 00:00:00");
#查询数据的结束时间及当时时间,并转换时间格式
$end_time=strtotime(date("Y-m-d H:i:s",time()));
#对查询json中开始及结束时间的替换,json是在./lib/下的同名txt文件
$post_data=str_replace(‘end_time‘,$end_time,str_replace(‘start_time‘,$start_time,file_get_contents(‘lib/‘.str_replace(‘.php‘,‘.txt‘,basename($_SERVER[‘PHP_SELF‘])).‘‘)));
#查询ES中的数据,返回数组数据
$arr=export($url,$post_data);
#从数组中获取你想要的数据,然后在组合成一个新的数组
$array=$arr[‘aggregations‘][‘2‘][‘buckets‘];
foreach($array as $key => $value){
    $data[‘@timestamp‘]=$value[‘key_as_string‘];
    $data[‘request_PV‘]=$value[‘doc_count‘];
    $data[‘request_IP‘]=$value[‘3‘][‘value‘];
    #Time为导入ES中的ID,具有唯一性。(不同tpye的可以相同)
    $Time=strtotime($data[‘@timestamp‘]);
    $urls="
      #调用函数import导入数据 
    import($urls,$data);
}
?>

下面这个文件是存放./lib文件下的,和执行的php文件必须同名。

vim lib/access_info.txt


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

{
  "size": 0,
  "aggs": {
    "2": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1h",  #"time_zone": "Asia/Shanghai" 此行需要删除,否则时间对不上
        "min_doc_count": 1,
        "extended_bounds": {
          "min": start_time, #start_time会被换成具体的时间
          "max": end_time
        }
      },
      "aggs": {
        "3": {
          "cardinality": {
            "field": "geoip.ip"
          }
        }
      }
    }
  },
   
  "highlight": {
    "pre_tags": [
      "@[email protected]"
    ],
    "post_tags": [
      "@/[email protected]"
    ],
    "fields": {
      "*": {}
    },
    "require_field_match": false,
    "fragment_size": 2147483647
  },
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "*",
          "analyze_wildcard": true
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "@timestamp": {
                  "gte": start_time,
                  "lte": end_time,
                  "format": "epoch_second"  #由毫秒换成秒
                }
              }
            }
          ],
          "must_not": []
        }
      }
    }
  }
}

根据上面的代码,我们可以定期获取ES中的重要数据。这样获取的数据只是结果数据,不是很精确,但能反应网站的趋势,而且查询非常快速!如果想要长时间保存重要的数据,可以使用这个方式,数据存入数据库。

以上是个人对能长期保存ES结果数据的做法,如果有更好的方法,希望能一起讨论!

时间: 2024-10-11 22:00:43

elasticsearch数据长期保存的方案的相关文章

[转] [Elasticsearch] 数据建模 - 处理关联关系(1)

[Elasticsearch] 数据建模 - 处理关联关系(1) 标签: 建模elasticsearch搜索搜索引擎 2015-08-16 23:55 6958人阅读 评论(0) 收藏 举报 分类: Search(43) Elasticsearch(43) 目录(?)[+] 数据建模(Modeling Your Data) ES是一头不同寻常的野兽,尤其是当你来自SQL的世界时.它拥有很多优势:性能,可扩展性,准实时的搜索,以及对大数据的分析能力.并且,它很容易上手!只需要下载就能够开始使用它了

oracle数据性能库优化方案精髓整理收集回顾

oracle数据库性能优化总体法则: 一.减少数据访问(减少硬盘房访问次数) 二.返回更少的数据(减少网络传输或磁盘访问) 三.减少交互次数(减少网络传输) 四.减少服务器开销(减少cpu及内存开销) 五.利用更多的资源(增加资源) ===================具体说明================= 一.减少数据访问(减少硬盘房访问次数) 1.减少数据访问 1.1.创建并使用正确的索引 索引会大大增加DML(增删改)的开销[合理的索引会大大提高效率100倍.1000倍,但不合理的索

在DevExpress程序中使用Winform分页控件直接录入数据并保存

一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数据,这种对于字段比较少,而且内容相对比较简单的情况下,效率是比较高的一种输入方式.本篇随笔主要介绍在DevExpress程序中使用GridView直接录入数据并保存的实现,以及使用Winform分页控件来进行数据直接录入的实现操作. 1.在GridView上展示数据 在GridView上展示数据,只

安卓实训第十天:利用SharedPreferences来实现数据的保存和读取,以及实现手机电话备份,XMLserializer

一.利用SharedPreferences来实现数据的保存和读取: 1.Mainactivity: package com.example.sharedpreferencesdemo; import com.example.sharedpreferencesdemo.util.SharedPreferencesUtil; import android.app.Activity; import android.app.AlertDialog; import android.content.Cont

数据的保存和读取

1数据的保存 btn_ok.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String user = et_user.getText().toString().trim(); String pwd = et_pwd.getText().toString().trim(); if(user.isEmpty()||pwd.isEmpty()){ Toast.makeText(get

Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/files/LoginTest.txt------/data/data/(包名)/files/(文件名) 导出的文件内容: 三.实现代码 新建一个Android 工程.这里我选择的是2.1即API 7,进行开发的,其它都是默认下一步下一步即可. /datasave/res/layout/activity

HBase存储时间相关多列数据的两种方案

所谓“时间相关多列数据”指的是同一个Key下具有多个属性数据,并且这些数据与时间具有相关性,多数场景是该Key对应在不同时间时刻的行为数据.在实际应用中,这类数据很多,例如电子商务网站上用户最近一段时间浏览的宝贝集合.访问的URL列表等. 使用HBase存储此类数据时,有以下两种常用的方案: 多行单列 表结构设计 Row Key:用户标识ID + (Long.MAX_VALUE - timestamp) Column Family:’cf’ Column Qualifier:’’ Value:宝

android应用的数据应该保存到哪儿

做android app开发会涉及到不同数据的保存,比如数据缓存,客户登陆信息保存,客户状态的保存等等. 那针对这不同的数据我们应该保存在什么地方呢? 1.应用卸载也不会删除的数据 直接在sdCard根目录创建一个文件夹,保存数据. 优点:保存时间长,应用卸载也不会被删除.缺点:任何人都可以访问这个目录. 2.跟随应用的存在而存在的数据 Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 以上这个目录会随

(转)Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 (这里仅从数据缓存方面考虑,当然,后期可以采用Hadoop+HBase+Hive等分布式存储分析平台) 三.主流解Cache和数据库对比: 上述技术基本上代表了当今在数据存储方面所有的实现方案,其中主要涉及到了普通关系型数据库(MySQL/PostgreSQL),NoSQL数据