本文簡單介紹了ES、Kibana和Go語言操作ES,
Elasticsearch
介紹
Elasticsearch(ES)是一個基于Lucene構建的開源、分布式、RESTful介面的全文搜索引擎,Elasticsearch還是一個分布式檔案資料庫,其中每個欄位均可被索引,而且每個欄位的資料均可被搜索,ES能夠橫向擴展至數以百計的服務器存盤以及處理PB級的資料,可以在極短的時間記憶體儲、搜索和分析大量的資料,通常作為具有復雜搜索場景情況下的核心發動機,
Elasticsearch能做什么
- 當你經營一家網上商店,你可以讓你的客戶搜索你賣的商品,在這種情況下,你可以使用ElasticSearch來存盤你的整個產品目錄和庫存資訊,為客戶提供精準搜索,可以為客戶推薦相關商品,
- 當你想收集日志或者交易資料的時候,需要分析和挖掘這些資料,尋找趨勢,進行統計,總結,或發現例外,在這種情況下,你可以使用Logstash或者其他工具來進行收集資料,當這引起資料存盤到ElasticsSearch中,你可以搜索和匯總這些資料,找到任何你感興趣的資訊,
- 對于程式員來說,比較有名的案例是GitHub,GitHub的搜索是基于ElasticSearch構建的,在github.com/search頁面,你可以搜索專案、用戶、issue、pull request,還有代碼,共有40~50個索引庫,分別用于索引網站需要跟蹤的各種資料,雖然只索引專案的主分支(master),但這個資料量依然巨大,包括20億個索引檔案,30TB的索引檔案,
Elasticsearch基本概念
Near Realtime(NRT) 幾乎實時
Elasticsearch是一個幾乎實時的搜索平臺,意思是,從索引一個檔案到這個檔案可被搜索只需要一點點的延遲,這個時間一般為毫秒級,
Cluster 集群
群集是一個或多個節點(服務器)的集合, 這些節點共同保存整個資料,并在所有節點上提供聯合索引和搜索功能,一個集群由一個唯一集群ID確定,并指定一個集群名(默認為“elasticsearch”),該集群名非常重要,因為節點可以通過這個集群名加入群集,一個節點只能是群集的一部分,
確保在不同的環境中不要使用相同的群集名稱,否則可能會導致連接錯誤的群集節點,例如,你可以使用logging-dev、logging-stage、logging-prod分別為開發、階段產品、生產集群做記錄,
Node節點
節點是單個服務器實體,它是群集的一部分,可以存盤資料,并參與群集的索引和搜索功能,就像一個集群,節點的名稱默認為一個隨機的通用唯一識別符號(UUID),確定在啟動時分配給該節點,如果不希望默認,可以定義任何節點名,這個名字對管理很重要,目的是要確定你的網路服務器對應于你的ElasticSearch群集節點,
我們可以通過群集名配置節點以連接特定的群集,默認情況下,每個節點設定加入名為“elasticSearch”的集群,這意味著如果你啟動多個節點在網路上,假設他們能發現彼此都會自動形成和加入一個名為“elasticsearch”的集群,
在單個群集中,你可以擁有盡可能多的節點,此外,如果“elasticsearch”在同一個網路中,沒有其他節點正在運行,從單個節點的默認情況下會形成一個新的單節點名為”elasticsearch”的集群,
Index索引
索引是具有相似特性的檔案集合,例如,可以為客戶資料提供索引,為產品目錄建立另一個索引,以及為訂單資料建立另一個索引,索引由名稱(必須全部為小寫)標識,該名稱用于在對其中的檔案執行索引、搜索、更新和洗掉操作時參考索引,在單個群集中,你可以定義盡可能多的索引,
Type型別
在索引中,可以定義一個或多個型別,型別是索引的邏輯類別/磁區,其語意完全取決于你,一般來說,型別定義為具有公共欄位集的檔案,例如,假設你運行一個博客平臺,并將所有資料存盤在一個索引中,在這個索引中,你可以為用戶資料定義一種型別,為博客資料定義另一種型別,以及為注釋資料定義另一型別,
Document檔案
檔案是可以被索引的資訊的基本單位,例如,你可以為單個客戶提供一個檔案,單個產品提供另一個檔案,以及單個訂單提供另一個檔案,本檔案的表示形式為JSON(JavaScript Object Notation)格式,這是一種非常普遍的互聯網資料交換格式,
在索引/型別中,你可以存盤盡可能多的檔案,請注意,盡管檔案物理駐留在索引中,檔案實際上必須索引或分配到索引中的型別,
Shards & Replicas分片與副本
索引可以存盤大量的資料,這些資料可能超過單個節點的硬體限制,例如,十億個檔案占用磁盤空間1TB的單指標可能不適合對單個節點的磁盤或可能太慢服務僅從單個節點的搜索請求,
為了解決這一問題,Elasticsearch提供細分你的指標分成多個塊稱為分片的能力,當你創建一個索引,你可以簡單地定義你想要的分片數量,每個分片本身是一個全功能的、獨立的“指數”,可以托管在集群中的任何節點,
Shards分片的重要性主要體現在以下兩個特征:
- 分片允許你水平拆分或縮放內容的大小
- 分片允許你分配和并行操作的碎片(可能在多個節點上)從而提高性能/吞吐量 這個機制中的碎片是分布式的以及其檔案匯總到搜索請求是完全由ElasticSearch管理,對用戶來說是透明的,
在同一個集群網路或云環境上,故障是任何時候都會出現的,擁有一個故障轉移機制以防分片和節點因為某些原因離線或消失是非常有用的,并且被強烈推薦,為此,Elasticsearch允許你創建一個或多個拷貝,你的索引分片進入所謂的副本或稱作復制品的分片,簡稱Replicas,
Replicas的重要性主要體現在以下兩個特征:
- 副本為分片或節點失敗提供了高可用性,為此,需要注意的是,一個副本的分片不會分配在同一個節點作為原始的或主分片,副本是從主分片那里復制過來的,
- 副本允許用戶擴展你的搜索量或吞吐量,因為搜索可以在所有副本上并行執行,
ES基本概念與關系型資料庫的比較
| ES概念 | 關系型資料庫 |
|---|---|
| Index(索引)支持全文檢索 | Database(資料庫) |
| Type(型別) | Table(表) |
| Document(檔案),不同檔案可以有不同的欄位集合 | Row(資料行) |
| Field(欄位) | Column(資料列) |
| Mapping(映射) | Schema(模式) |
ES API
以下示例使用curl演示,
查看健康狀態
curl -X GET 127.0.0.1:9200/_cat/health?v
輸出:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 1564726309 06:11:49 elasticsearch yellow 1 1 3 3 0 0 1 0 - 75.0%
查詢當前es集群中所有的indices
curl -X GET 127.0.0.1:9200/_cat/indices?v
輸出:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana_task_manager LUo-IxjDQdWeAbR-SYuYvQ 1 0 2 0 45.5kb 45.5kb green open .kibana_1 PLvyZV1bRDWex05xkOrNNg 1 0 4 1 23.9kb 23.9kb yellow open user o42mIpDeSgSWZ6eARWUfKw 1 1 0 0 283b 283b
創建索引
curl -X PUT 127.0.0.1:9200/www
輸出:
{"acknowledged":true,"shards_acknowledged":true,"index":"www"}
洗掉索引
curl -X DELETE 127.0.0.1:9200/www
輸出:
{"acknowledged":true}
插入記錄
curl -H "ContentType:application/json" -X POST 127.0.0.1:9200/user/person -d '
{
"name": "dsb",
"age": 9000,
"married": true
}'
輸出:
{
"_index": "user",
"_type": "person",
"_id": "MLcwUWwBvEa8j5UrLZj4",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
也可以使用PUT方法,但是需要傳入id
curl -H "ContentType:application/json" -X PUT 127.0.0.1:9200/user/person/4 -d '
{
"name": "sb",
"age": 9,
"married": false
}'
檢索
Elasticsearch的檢索語法比較特別,使用GET方法攜帶JSON格式的查詢條件,
全檢索:
curl -X GET 127.0.0.1:9200/user/person/_search
按條件檢索:
curl -H "ContentType:application/json" -X PUT 127.0.0.1:9200/user/person/4 -d '
{
"query":{
"match": {"name": "sb"}
}
}'
ElasticSearch默認一次最多回傳10條結果,可以像下面的示例通過size欄位來設定回傳結果的數目,
curl -H "ContentType:application/json" -X PUT 127.0.0.1:9200/user/person/4 -d '
{
"query":{
"match": {"name": "sb"},
"size": 2
}
}'
Go操作Elasticsearch
elastic client
我們使用第三方庫https://github.com/olivere/elastic來連接ES并進行操作,
注意下載與你的ES相同版本的client,例如我們這里使用的ES是7.2.1的版本,那么我們下載的client也要與之對應為github.com/olivere/elastic/v7,
使用go.mod來管理依賴:
require (
github.com/olivere/elastic/v7 v7.0.4
)
簡單示例:
package main
import (
"context"
"fmt"
"github.com/olivere/elastic/v7"
)
// Elasticsearch demo
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Married bool `json:"married"`
}
func main() {
client, err := elastic.NewClient(elastic.SetURL("http://192.168.1.7:9200"))
if err != nil {
// Handle error
panic(err)
}
fmt.Println("connect to es success")
p1 := Person{Name: "rion", Age: 22, Married: false}
put1, err := client.Index().
Index("user").
BodyJson(p1).
Do(context.Background())
if err != nil {
// Handle error
panic(err)
}
fmt.Printf("Indexed user %s to index %s, type %s\n", put1.Id, put1.Index, put1.Type)
}
更多使用詳見檔案:https://godoc.org/github.com/olivere/elastic
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45053.html
標籤:Go
上一篇:Go第三方日志庫logrus
下一篇:influxDB
