1. 程式人生 > >使用Kafka、Elasticsearch、Grafana搭建業務監控系統(三)Elasticsearch

使用Kafka、Elasticsearch、Grafana搭建業務監控系統(三)Elasticsearch

系列目錄

一、Elasticsearch是什麼

如果之前學習過ES基礎知識可以跳過,直接看spring整合ES

Elasticsearch是一個基於Apache Lucene™的開源搜尋引擎。無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、效能最好的、功能最全的搜尋引擎庫。 但是,Lucene只是一個庫。想要使用它,你必須使用Java來作為開發語言並將其直接整合到你的應用中,更糟糕的是,Lucene非常複雜,你需要深入瞭解檢索的相關知識來理解它是如何工作的。 Elasticsearch也使用Java開發並使用Lucene作為其核心來實現所有索引和搜尋的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜尋變得簡單。 不過,Elasticsearch不僅僅是Lucene和全文搜尋,我們還能這樣去描述它:

  • 分散式的實時檔案儲存,每個欄位都被索引並可被搜尋
  • 分散式的實時分析搜尋引擎
  • 可以擴充套件到上百臺伺服器,處理PB級結構化或非結構化資料

而且,所有的這些功能被整合到一個服務裡面,你的應用可以通過簡單的RESTful API、各種語言的客戶端甚至命令列與之互動。 上手Elasticsearch非常容易。它提供了許多合理的預設值,並對初學者隱藏了複雜的搜尋引擎理論。它開箱即用(安裝即可使用),只需很少的學習既可在生產環境中使用。 Elasticsearch在Apache 2 license下許可使用,可以免費下載、使用和修改。 隨著你對Elasticsearch的理解加深,你可以根據不同的問題領域定製Elasticsearch的高階特性,這一切都是可配置的,並且配置非常靈活。

簡單來說,Elasticsearch就是一個基於Lucene庫封裝的分散式、可擴充套件、實時的搜尋與資料分析引擎。隱藏了 Lucene 的複雜性,取而代之的提供一套簡單一致的 RESTful API。

這裡穿插一個Elasticsearch的小故事:

許多年前,一個剛結婚的名叫 Shay Banon 的失業開發者,跟著他的妻子去了倫敦,他的妻子在那裡學習廚師。 在尋找一個賺錢的工作的時候,為了給他的妻子做一個食譜搜尋引擎,他開始使用 Lucene 的一個早期版本。 直接使用 Lucene 是很難的,因此 Shay 開始做一個抽象層,Java 開發者使用它可以很簡單的給他們的程式新增搜尋功能。 他釋出了他的第一個開源專案 Compass。 後來 Shay 獲得了一份工作,主要是高效能,分散式環境下的記憶體資料網格。這個對於高效能,實時,分散式搜尋引擎的需求尤為突出, 他決定重寫 Compass,把它變為一個獨立的服務並取名 Elasticsearch。 第一個公開版本在2010年2月釋出,從此以後,Elasticsearch 已經成為了 Github 上最活躍的專案之一,他擁有超過300名 contributors(目前736名 contributors )。 一家公司已經開始圍繞 Elasticsearch 提供商業服務,並開發新的特性,但是,Elasticsearch 將永遠開源並對所有人可用。 據說,Shay 的妻子還在等著她的食譜搜尋引擎…

好了,言歸正傳,我們先了解一下ES的幾個基本概念:

叢集(cluster)

一個叢集就是由一個或多個節點組織在一起, 它們共同持有你全部的資料, 並一起提供索引和搜尋功能。 一個叢集由一個唯一的名字標識, 這個名字預設就是“elasticsearch”。 這個名字很重要, 因為一個節點只能通過指定某個叢集的名字,來加入這個叢集。在生產環境中顯式地設定這個名字是一個好習慣,但是使用預設值來進行測試/開發也是不錯的。

注意,一個叢集中只包含一個節點是合法的。另外,你也可以擁有多個叢集,叢集以名字區分。

節點(node)

一個節點是你叢集中的一個伺服器,作為叢集的一部分,它儲存你的資料,參與叢集的索引和搜尋功能。 和叢集類似, 一個節點也是由一個名字來標識的, 預設情況下, 這個名字是一個隨機的Marvel角色的名字,這個名字會在節點啟動時分配給它。這個名字對於管理工作來說很重要,因為在這個管理過程中,你會去確定網路中的哪些 伺服器對應於Elasticsearch叢集中的哪些節點。

一個節點可以通過配置叢集名稱的方式來加入一個指定的叢集。 預設情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的叢集中,這意味著,如果你在你的網路中啟動了若干個節點, 並假定它們能夠相互發現彼此,它們將會自動地形成並加入到一個叫做“elasticsearch” 的叢集中。

在一個叢集裡可以擁有任意多個節點。而且,如果當前你的網路中沒有執行任何Elasticsearch節點,這時啟動一個節點,會預設建立並加入一個叫做“elasticsearch”的單節點叢集。

索引(index)

一個索引就是一個擁有相似特徵的文件的集合。比如說,你可以有一個客戶資料的索引,另一個產品目錄的索引,還有一個訂單資料的索引。一個索引由一個名字來 標識(必須全部是小寫字母的),並且當我們要對這個索引中的文件進行索引、搜尋、更新和刪除的時候,都要使用到這個名字。在一個叢集中,你能夠建立任意多個索引。

型別(type)

在一個索引中,你可以定義一種或多種型別。一個型別是你的索引的一個邏輯上的分類/分割槽,其語義完全由你來定。通常,會為具有一組相同欄位的文件定義一個型別。比如說,我們假設你運營一個部落格平臺 並且將你所有的資料儲存到一個索引中。在這個索引中,你可以為使用者資料定義一個型別,為部落格資料定義另一個型別,當然,也可以為評論資料定義另一個型別。

文件(document)

一個文件是一個可被索引的基礎資訊單元。比如,你可以擁有某一個客戶的文件、某一個產品的一個文件、某個訂單的一個文件。文件以JSON格式來表示,而JSON是一個到處存在的網際網路資料互動格式。

在一個index/type裡面,你可以儲存任意多的文件。注意,一個文件物理上存在於一個索引之中,但文件必須被索引/賦予一個索引的type。

分片和複製(shards and replicas)

一個索引可以儲存超出單個結點硬體限制的大量資料。比如,一個具有10億文件的索引佔據1TB的磁碟空間,而任一節點可能沒有這樣大的磁碟空間來儲存或者單個節點處理搜尋請求,響應會太慢。

為了解決這個問題,Elasticsearch提供了將索引劃分成多片的能力,這些片叫做分片。當你建立一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引” 可以被放置到叢集中的任何節點上。

分片之所以重要,主要有兩方面的原因:

  • 允許你水平分割/擴充套件你的內容容量
  • 允許你在分片(位於多個節點上)之上進行分散式的、並行的操作,進而提高效能/吞吐量

至於一個分片怎樣分佈,它的文件怎樣聚合回搜尋請求,是完全由Elasticsearch管理的,對於作為使用者的你來說,這些都是透明的。

在一個網路/雲的環境裡,失敗隨時都可能發生。在某個分片/節點因為某些原因處於離線狀態或者消失的情況下,故障轉移機制是非常有用且強烈推薦的。為此, Elasticsearch允許你建立分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。

複製之所以重要,有兩個主要原因:

  • 在分片/節點失敗的情況下,複製提供了高可用性。複製分片不與原/主要分片置於同一節點上是非常重要的。
  • 因為搜尋可以在所有的複製上並行執行,複製可以擴充套件你的搜尋量/吞吐量 總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(即沒有複製) 或多次。一旦複製了,每個索引就有了主分片(作為複製源的分片)和複製分片(主分片的拷貝)。 分片和複製的數量可以在索引建立的時候指定。在索引建立之後,你可以在任何時候動態地改變複製的數量,但是你不能再改變分片的數量。

預設情況下,Elasticsearch中的每個索引分配5個主分片和1個複製。這意味著,如果你的叢集中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣每個索引總共就有10個分片。

我們用關係型資料庫Mysql類比Elasticsearch,可以更好的理解ES 在這裡插入圖片描述

(1)關係型資料庫中的資料庫(DataBase),等價於ES中的索引(Index) (2)一個數據庫下面有N張表(Table),等價於1個索引Index下面有N多型別(Type), (3)一個數據庫表(Table)下的資料由多行(ROW)多列(column,屬性)組成,等價於1個Type由多個文件(Document)和多Field組成。 (4)在一個關係型資料庫裡面,schema定義了表、每個表的欄位,還有表和欄位之間的關係。 與之對應的,在ES中:Mapping定義索引下的Type的欄位處理規則,即索引如何建立、索引型別、是否儲存原始索引JSON文件、是否壓縮原始JSON文件、是否需要分詞處理、如何進行分詞處理等。 (5)在資料庫中的增insert、刪delete、改update、查search操作等價於ES中的增PUT/POST、刪Delete、改_update、查GET.

關於分片和副本,我們可以從head外掛直觀理解(建議安裝) 在這裡插入圖片描述 上圖中20181025索引有5個主分片、2個副本,所以最終應該有5*(2+1)=15個分片 在這裡插入圖片描述 head外掛中主分片用粗線標出,我們可以發現主分片以及副本分佈在哪個節點都是完全隨機,由ES管理的

ES的基本概念介紹到這裡,由於ES基礎知識繁多,我也是接觸不久,更多的ES基礎知識請參考下方連結,本文不做過多闡述。

二、spring-elasticsearch配置

pom檔案配置
    <!-- elasticsearch client -->
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>2.1.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
        <version>2.0.4.RELEASE</version>
    </dependency>

公司使用的ES版本有點老…各位可以根據實際情況選擇 關於spring-data-elasticsearch與elasticsearch的對應關係官方文件是這樣說明的:github地址

spring data elasticsearch elasticsearch
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2
spring-elasticsearch.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <elasticsearch:transport-client id="esTransportClient"
        cluster-nodes="127.0.0.1:9300" cluster-name="elasticsearch" />

    <bean name="elasticsearchTemplate"
        class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg ref="esTransportClient" />
    </bean>
</beans>

cluster-nodes是叢集中的節點地址,如果是叢集用,隔開。這裡注意一下java中節點通訊預設9300埠,而RESTful API預設使用9200埠通訊 cluster-name是叢集名稱,預設值是elasticsearch

三、程式碼實現

ElasticsearchTemplate

ElasticsearchTemplate是Spring對ES的java api進行的封裝。 常用的幾個方法:

	/**
	 * Bulk index all objects. Will do save or update
	 *
	 * @param queries
	 */
	void bulkIndex(List<IndexQuery> queries);

	/**
	 * return number of elements found by given query
	 *
	 * @param query
	 * @return
	 */
	<T> long count(SearchQuery query);

	/**
	 * Create an index for given indexName
	 *
	 * @param indexName
	 */
	boolean createIndex(String indexName);

	/**
	 * Create mapping for a given indexName and type
	 *
	 * @param indexName
	 * @param type
	 * @param mappings
	 */
	boolean putMapping(String indexName, String type, Object mappings);

	/**
	 * Deletes an index for given indexName
	 *
	 * @param indexName
	 * @return
	 */
	boolean deleteIndex(String indexName);

	/**
	 * Execute the search query against elasticsearch and return result as {@link List}
	 *
	 * @param query
	 * @param clazz
	 * @param <T>
	 * @return
	 */
	<T> List<T> queryForList(SearchQuery query, Class<T> clazz);

其中對於監控業務來說,主要需要用到新增/刪除索引、建立mapping、批量寫入資料,而查詢或者統計更多是在grafana展示曾處理。但是條件查詢是spring-es中很重要的一環,我也會介紹一下最常使用的queryForList方法

Kafka資料寫入ES

先看下bulkIndex的引數List<IndexQuery> queries

package org.springframework.data.elasticsearch.core.query;

/**
 * IndexQuery
 *
 * @author Rizwan Idrees
 * @author Mohsin Husen
 */

public class IndexQuery {

	private String id;
	private Object object;
	private Long version;
	private String indexName;
	private String type;
	private String source;
	private String parentId;

	//省略get set
}

ides中文件的主鍵,寫入時不用處理 objectsoruce就是實際的文件內容,object是寫入的實體類物件,sourcejson格式字串 version是用來控制版本的,不用處理 indexName是索引名 type是型別名

構建完IndexQuery後,就可以呼叫方法插入資料了,具體插入程式碼如下:

EsIndexBO 是我構建的一個實體類,JSONObject 是alibaba的fastjson

public class EsIndexBO {

    /**
     * 索引名
     */
    private String indexName;

    /**
     * 型別
     */
    private String type;

    /**
     * 文件內容
     */
    private JSONObject source;
    
    //忽略get set
}

    public void bulkIndex(List<EsIndexBO> esIndexBOList) {

        if (CollectionUtils.isEmpty(esIndexBOList)) {
            LOGGER.warn(".bulkIndex() esIndexBOList is emtpy");
            return;
        }

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

        Date date = new Date();

        List<IndexQuery> indexList = new ArrayList<>();

        int counter = 0;

        for (EsIndexBO esIndexBO : esIndexBOList) {

            IndexQuery indexQuery = new IndexQuery();

            JSONObject source = esIndexBO.getSource();
            //這個欄位的用處後面會有說明
            source.put("esTimeField", sdf.format(date) + "+08:00");

            indexQuery.setSource(JSON.toJSONString(source));
            indexQuery.setIndexName(esIndexBO.getIndexName());
            indexQuery.setType(esIndexBO.getType());

            indexList.add(indexQuery);

            if (counter % 1000 == 0) {
                bulkIndexWithRetry(indexList);
                indexList.clear();
            }

            counter++;
        }

        if (indexList.size() > 0) {
            bulkIndexWithRetry(indexList);
        }

    }

    private void bulkIndexWithRetry(List<IndexQuery> indexList) {
        try {
            elasticsearchTemplate.bulkIndex(indexList);
        } catch (Exception e) {

            Random random = new Random();
            int millis = (random.nextInt(5) + 1) * 1000;

            try {
                Thread.sleep(millis);
            } catch (InterruptedException e1) {
                throw new RuntimeException(e1);
            }

            LOGGER.warn("bulkIndex failed, now retry. ExceptionMsg={}", e.getMessage());
            elasticsearchTemplate.bulkIndex(indexList);
        }
    }

每到1000就會批量插入一次,並且會有一次失敗嘗試的機會 索引不存在的話會自動建立,並且有預設的mapping 非常重要:關於esTimeField這個額外新增的欄位,主要是用於之後grafana分析ES資料時的聚合查詢,並且必須符合ES要求的時間格式yyyyMMdd'T'HHmmssZ。由於中國屬於東八區,所以Z替換為+08:00。參考官方文件:built-in-date-formats

定時任務刪除索引

由於線上資料量巨大,所以建立的索引是按天分割,這個從我上面head外掛的圖片就能看出 因為是監控資料,我不會保留太久,所以需要定期刪除資料,也就是按天刪除索引

配置spring定時任務

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

    <!-- 定時任務相關配置 -->
    <task:executor id="executor" pool-size="10"
        queue-capacity="128" />
    <task:scheduler id="scheduler" pool-size="10" />
    <task:annotation-driven executor="executor"
        scheduler="scheduler" />

</beans>

定時任務cron表示式 每天凌晨1點執行(如果是多節點需採用分散式鎖或根據ip判斷),刪除7天前的那個索引

@Component
public class DropIndexTask {

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    /**
     * log
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(DropIndexTask.class);

    @Scheduled(cron = "0 0 1 * * ?")
    public void dropNgLogIndex() {
        try {
            String deleteIndex = dateAdd(-7);
            boolean result = elasticsearchTemplate.deleteIndex(deleteIndex);
            if (!result) {
                LOGGER.warn("index:{} delete fail", deleteIndex);
            } else {
                LOGGER.info("index:{} delete success", deleteIndex);
            }
        } catch (Exception e) {
            LOGGER.error("dropIndex task error,error message:{}", e.getMessage(), e);
        }
    }

    /**
     * 獲得當前日期前n天的日期
     */
    private String dateAdd(int interval) {
        // 得到當前時間n天前的日期並轉換成yyyyMMdd格式
        Calendar rightNow = Calendar.getInstance();
        rightNow.setTime(new Date());
        rightNow.add(Calendar.DAY_OF_YEAR, interval);
        Date date = rightNow.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(date);
    }
}
定時任務建立索引以及mapping

為什麼沒有一開始就提到這個呢?是因為寫入ES時沒有索引會自動建立,並且下面的type會建立預設的mapping,但是在最後grafana分析的時候發現了問題,導致我們必須回過頭來手動建立。

舉個例子,假設建立了一個index為20181101,type為test,有一個欄位packageName以及時間欄位esTimeField,那麼這時候通過RESTful查詢http://127.0.0.1:9200/20181101/test/_mapping會得到該type的mapping:

{
  "20181101": {
    "mappings": {
      "test": {
        "properties": {
          "packageName": {
            "type": "string"
          },
          "esTimeField": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
        }
      }
    }
  }
}

ES中有一個分詞的概念,並且欄位預設都是分詞的,這樣就會導致一個問題。假設packageName有2個值com.tecent.wechatcom.tecent.qq,由於預設分詞,ES根據.會分成多個詞語,導致最終分成了多組 所以我們需要將packageName這個欄位的mapping設定為不分詞,也就是not_analyzed,這樣才能正確的分為2組

同時,出現這個問題後我做了相關調查,瞭解了ES建立index、type以及mapping的規則,並且自己做了實驗,這裡用通俗易懂的文字分享給大家

同一個index下先建立了template1的mapping,如下所示;這時候可以建立template2和template3,但是不可以建立template4 就是說 在一個index下只要建立好了一個type的mapping(不管是主動建立還是寫入資料自動建立的),這時候可以在新的type下多出一些欄位建立新的mapping規則,也可以去掉一些欄位建立新的mapping規則,但是不可以修改相同位置且名字一樣的欄位的mapping規則。 在這裡插入圖片描述

總結:index下想要新建立一個type的mapping 先和該index下所有的type的mapping對比 可以多 可以少 但是不能修改相同欄位(位置結構、名字都相同)的mapping規則。在一個index下,不管有多少type,相同欄位(位置結構、名字都相同)的mapping只能有一個

重要:由於寫入資料會自動建立索引以及type的mapping,所以我們需要提前建立,那麼定時任務就需要在前一天建立好index和mapping(我是在每天的23點建立第二天的) 這裡省略定時任務程式碼,可以參考上面刪除索引的

定義存入ES的實體類,假設只有1個欄位packageName

@Document(indexName = "stdomainindexmappingindex")
public class StDomainIndexMapping {

    @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
    private String packageName;

}

我們看一下@Document註解

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {

	String indexName();

	String type() default "";

	boolean useServerConfiguration() default false;

	short shards() default 5;

	short replicas() default 1;

	String refreshInterval() default "1s";

	String indexStoreType() default "fs";

	boolean createIndex() default true;
}

indexName必填,其他我都採用預設值。提前說明一下,如果type沒有填寫,在之後的putMapping操作結束後,該index下會自動生成一個實體類類名全小寫的type以及我們定義的mapping

{
  "20181101": {
    "mappings": {
      "stdomainindexmapping ": {
        "properties": {
          "packageName": {
            "type": "string",
            "index": "not_analyzed"
          },
          "esTimeField": {
            "type": "date",
            "format": "strict_date_optional_time||epoch_millis"
          },
        }
      }
    }
  }
}

另外然後按照我前面總結的mapping規則,之後type對應的欄位都會適用mapping,可能不太好理解,大家自己嘗試下就懂了

再看一下@Field註解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {

	FieldType type() default FieldType.Auto;

	FieldIndex index() default FieldIndex.analyzed;

	DateFormat format() default DateFormat.none;

	String pattern() default "";

	boolean store() default false;

	String searchAnalyzer() default "";

	String analyzer() default "";

	String[] ignoreFields() default {};

	boolean includeInParent() default false;
}

對我來說需要使用的就是typeindex,將index設為FieldIndex.not_analyzed就是不分詞。另外如果有巢狀物件,type需要使用FieldType.Object,巢狀物件只需要@Field,不需要@Document

到這裡大家可能會有疑問,@Document需要把索引名寫在註解裡,我給的預設名字是stdomainindexmappingindex,而我又是按天建立索引的,如何動態修改成20181101的呢?答案是用反射處理

先放上反射工具類

    public static Object changeAnnotationValue(Annotation annotation, String key, Object newValue) {

        Object handler = Proxy.getInvocationHandler(annotation);

        Field f;

        try {
            f = handler.getClass().
            
           

相關推薦

使用KafkaElasticsearchGrafana搭建業務監控系統Elasticsearch

系列目錄 一、Elasticsearch是什麼 如果之前學習過ES基礎知識可以跳過,直接看spring整合ES Elasticsearch是一個基於Apache Lucene™的開源搜尋引擎。無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、效

使用KafkaElasticsearchGrafana搭建業務監控系統技術選擇

系列目錄 一、背景 為了更好的對埋點資料進行視覺化分析,專案組決定開發一套自己的監控系統 二、技術選擇 Kafka or mq? Kafka是LinkedIn開源的分散式釋出-訂閱訊息系統,目前歸屬於Apache定級專案。Kafka主要特點是基於Pull

LAMP+Postfix+Dovecot+Postfixadmin搭建郵件管理系統

接上篇,我們部署完了MySQL服務,接下來開始不是Apache服務。四、部署Apache服務     1、安裝Apache所必須的依賴包     [[email protected] ~]# yum -y ins

influxdb+grafana搭建業務監控平臺前篇-相關環境搭建

引言 在介紹具體的業務監控搭建之前還是現在介紹介紹influxdb和grafana。 時間序列資料庫 在開始介紹Influxdb之前先簡要介紹一下時間序列資料庫。 何謂時間序列資料庫? 什麼是時間序列資料庫,最簡單的定義就是資料格式裡包含Timestamp欄位的資料,比

Prometheus+Grafana搭建監控系統

基本概念Prometheus時間序列化資料庫,我的理解就是將資料打上標籤,以時間維度儲存。後面有機會在深入研究。GrafanaPrometheus中儲存的資料,通過Grafana很優美的展現出來。 好就講這麼多,多了我也不懂。。軟體安裝Prometheus官網下載(https://prometheus.io/

Influxdb+collectd+grafana搭建現代化監控系統

在此採用centos+Influxdb+collectd+grafana搭建監控系統,特此說明下influxdb的0.9,0.10,0.11,0.12均不支援delect功能,0.8和0.13支援delect功能,其實最主要的區別是0.9版本和0.10版本,0.

Java中StringStringBuilderStringBuffer常用源碼分析及比較:StringStringBuilderStringBuffer比較

val str 成員變量 相同 += let .get end art 看這篇隨筆之前請務必先看前面兩章: Java中String、StringBuilder、StringBuffer常用源碼分析及比較(一):String源碼分析 Java中String、StringBui

ElasticSearch教程————ElasticSearch叢集搭建

公司一直在使用ES作為分散式的搜尋引擎,由於資料量的不斷升高,ES出現了效能瓶頸。公司決定進一步的優化ES配置,所以最近幾天在研究ES,最近會更新一系列ES的教程,希望大家持續關注。不多說了,Action。 前言 這篇博文我們親自搭建一個簡單的Elast

1225JMeterPostmanRequests介面測試經驗分享-POST請求

上傳檔案的請求是真實公司的介面;所以內容打了馬賽克,希望能夠理解。 (一)POST請求-multipart/form-data 此次分享主要講的是Content-Type設定為application/form-data的POST請求,即以表單檔案上傳的形式提交的post請求。 因為手

搭建ELK日誌分析系統-Elasticsearch安裝

前言 搭建ELK系統有兩種方式 1、元件獨立安裝(更深入瞭解ELK系統的工作流程) 2、使用docker容器安裝(這種方式配置更簡單,快捷方便) 本系列文章使用元件獨立安裝的方式,如果你想使用docker容器安裝,請跳過本教程 環境需求 本教

基於iOS的網路音視訊實時傳輸系統- VideoToolbox編碼音視訊資料為H264AAC

server端 -- 編碼音視訊資料為H264、AAC 這部分花了好多時間,本身就不具備這方面的相關知識,查閱了不少資料,不過關於VideoToolbox和AudioToolbox方面的編碼資料寥寥無幾,雖然網上搜索結果看似特別多,其實一看 內容也大同小異,建議還是看看官方

在IIS上搭建WebSocket服務器

復制代碼 .ashx class ctype pen maximum charset ash too 編寫客戶端代碼 1.新建一個*.html文件。 ws = new WebSocket(‘ws://192.168.85.128:8086/Handler1.ashx?use

自己搭建自動化巡檢系統 通過telnet實現遠程創建loopback

telnet loopback 我們在上一章完成了用代碼操作telnet,實現了遠程控制,分析前面的代碼會發現健壯性太低,需要進行優化,後續會通過開發一個交互式界面來完成人工介入操作網絡的過程。本次實驗目的:實現自動化創建環回口首先更新拓撲,拉出新的路由器和一臺交換機import telnetlibi

react搭建後臺管理系統

管理系 for menu port 文件中 segment 後臺管理 ans create 先準備工具:  yarn安裝:    npm install -g yarn #yarn也是包管理工具,只不過它構建效率更高    官方使用教程:https://yarnpkg.

函數計算搭建 Serverless Web 應用- 分鐘搭建 Web 應用

env 方便 級別 語言 摘要 設置 基礎設施 路由 serve 摘要: 本文對使用自定義域名 + HTTP 觸發器搭建 Web 應用的步驟進行詳細介紹,手把手帶您三分鐘搭建穩定可靠的 Web 應用。 簡介阿裏雲 函數計算(Function Compute) 是事件驅動的全

輕松部署Zabbix集中監控系統

定制 fonts 登錄 yum disable base 日誌 onf pre Zabbix簡介 zabbix概念 zabbix是一個基於WEB界面的提供分布式系統監視以及網絡監視功能的企業級的開源解決方案。zabbix能監視各種網絡參數,保證服務器系統的安全運營;並提供柔

Zabbix監控系統:Zabbix管理之自動發現服務

1. 建立自動發現 配置->自動發現->建立發現規則 設定名稱 配置IP範圍 設定延遲時間 設定IP地址為唯一性準則 啟用發現規則 2. 建立動作 配置->動作->建立動作 2.1 設定執

Zabbix監控系統:初識Zabbix

一、Zabbix簡介 Zabbix 是由 Alexei Vladishev 開發的一種網路監視、管理系統,基於 Server-Client 架構。可用於監視各種網路服務、伺服器和網路機器等狀態。 使用各種 Database-end 如 MySQL, PostgreSQL, SQLite, O

LAMP+Postfix+Dovecot+Postfixadmin搭建郵件管理系統

接上期,我們部署完了Postfix服務,下面開始部署Dovecot服務。 七、部署Dovecot服務     1、下載dovecot安裝包     [[email protected] ~]# wget -c

LAMP+Postfix+Dovecot+Postfixadmin搭建郵件管理系統

接上期,我們為了更方便的管理 Postfix 郵箱,而不是再命令列下進行管理,於是,部署 Postfixadmin 成為一種必要,下面,我們就開始著手部署 Postfixadmin。 八、部署Postfixadmin     1、下載postfixadmin