1 Elasticsearch
1.1 部署方式
Elasticsearch為去中心化的分布式架構,由若干節點組成集群。節點中沒有固定的主控角色,可以靈活伸縮規模。集群中每台服務器通常只需部署一個Elasticsearch節點,每個節點可以將本機的所有數據盤用於存儲索引數據。
Elasticsearch的數據存儲和分析基於Lucene,下面是Elasticsearch的一些基本概念:
- 節點(Node) - 一個Elasticsearch運行的實例。
- 集群(Cluster) - 具有同一集群名稱的節點組成的分布式集群。
- 索引(Index) - 一個日志記錄的集合,類似數據庫。須要注意的是索引的名稱不能有大寫字母。
- 切片(Shard) - 每個索引的數據可以划分成若干切片,不同切片會被存儲到不同的節點上以實現客戶端讀寫條帶化。
- 副本(replica) - 切片的數據冗余,和切片主體的內容相同,保證數據安全和高可用。
1.2 安裝
可以直接從官網下載頁面下載軟件包,然后直接解壓到指定目錄,即可完成的安裝。也可以按照官網教程直接配置yum倉庫進行安裝和更新。
參考文檔:
1.3 主要配置
Elasticsearch的主要配置文件為"config/elasticsearch.yml",下表為一些常用的配置項目說明:
| 名稱 |
類型 |
描述 |
| cluster.name |
string |
集群名稱,具有同一集群名稱的Elasticsearch節點才能組成一個集群。 |
| node.name |
string |
節點名稱,每個節點必須在集群中有一個唯一的名稱以便識別。 |
| index.number_of_shards |
int |
每個索引數據的默認切片數量,這個值的修改不會影響已創建的索引。默認為5。 |
| index.number_of_replicas |
int |
每個索引切片默認的副本數量。默認為1。 |
| path.data |
string |
存儲索引數據的目錄路徑列表,路徑之間使用逗號分隔。例如:/data1,/data2,/data3 |
| network.bind_host |
string |
服務要監聽的IP地址。默認為本機所有IP地址。 |
| network.publish_host |
string |
在集群中公開的IP地址。默認為本機主機名對應的IP地址。如果使用默認值,則需要編輯"/etc/hosts"文件,讓Elasticsearch能夠解析本機的主機名。 |
| transport.tcp.port |
int |
供其它節點通訊連接的TCP端口。默認為9300。 |
| http.port |
int |
供客戶端使用的RESTFul API的HTTP端口。默認為9200。 |
1.4 運行
如果是使用yum安裝,系統中已經配置好elasticsearch服務,可按照常規服務的方式進行啟動和停止。如果是解壓軟件包安裝,則執行安裝目錄下的"bin/elasticsearch -d"直接以后台方式運行節點,使用kill停止節點。
1.5 安裝插件
kopf插件提供了完善的集群管理功能,使管理員能夠使用圖形化的方式查看和管理集群中的節點和各種狀態數據。在Elasticsearch的目錄 下運行"bin/plugin -install lmenezes/elasticsearch-kopf"安裝kopf插件,在瀏覽器的地址欄輸入"http://{ip}:{http port}/_plugin/kopf/"即可打開kopf插件的web頁面。
bigdesk插件能夠對機群的各種能夠性能數據進行監控。在Elasticsearch的目錄下運行"bin/plugin -install lukas-vlcek/bigdesk/2.5.0"安裝bigdesk插件,在瀏覽器的地址欄輸入"http://{ip}:{http port}/_plugin/bigdesk/"即可打開bigdesk插件的web頁面。
參考文檔:
1.6 索引模板
索引模板可以給索引預先設置一些的屬性和參數,當一個要創建的索引與模板匹配時,可以直接把模板上的設置應用到索引上,這一特性在須要給不同索引進行區別配置時非常有用。
操作索引模板的RESTFul API為"/_template/{name}",可以向集群中任意一個Elasticsearch服務端節點訪問該API接口,"name"表示要操作 的索引模板名稱。PUT方法用於設置索引模板內容,GET方法用於獲取索引模板內容,DELETE方法用於刪除索引模板,HEAD方法用於測試索引模板是 否存在。
索引模板的內容為JSON格式,主要項目如下:
{
"template": "mysql*", // 匹配的索引名稱,可以使用通配符
"order": 0, // 在多模板匹配時的生效順序,0表示最優先
"settings": { // 用於設置索引的一些參數
"number_of_shards": 1 // 切片數量
}
"mappings": { // 用於設置索引的字段
"_default_": { // 用於所有索引類型的字段設置
"_source": { // "source"字段的設置
"enabled": true, // 是否啟用
"compress": true // 是否壓縮數據
},
},
"logs": { // 用於"logs"類型的索引的字段設置
"_source": {
"compress": false
},
"_ttl": { // 自動刪除設置
"default": "90d", // 保留的天數
"enabled": true // 是否啟用自動刪除(默認為false)
},
"properties": // 其它字段設置
{
"message": { // 字段名
"type": "string" // 數據類型
},
"@timestamp": {
"format": "dateOptionalTime",
"type": "date"
},
"host": {
"type": "string",
"index": "not_analyzed" // 表示這個字段的值不進行分詞處理(可以加快存儲的速度並且數據可用於分組統計)
},
"port": {
"type": "long"
},
"request_time": {
"type": "double"
}
}
}
},
}
|
當一個索引匹配多個模板時,如果模板之間的某項設置發生沖突,則以生效順序最優先的模板為准。
參考文檔:
1.7 集群動態配置
除了啟動時加載配置文件外,Elasticsearch支持在運行時對集群的一些參數進行動態配置。進行集群動態配置的RESTFul API為"/_cluster/settings",可以向集群中任意一個Elasticsearch服務端節點訪問該API接口。PUT方法用於設置配 置,GET方法用於獲取配置。
配置的內容為如下JSON格式:
{
"persistent": { // 永久生效的配置項
"item1": "value1",
"item2": "value2",
...
},
"transient": { // 臨時生效的配置項,在集群中所有節點停止或重啟后將失效
"item1": "value1",
"item2": "value2",
...
}
}
|
下表為一些常用的集群動態配置項目說明:
| 名稱 |
類型 |
描述 |
| cluster.routing.allocation.enable |
string |
制定在集群中的索引分配模式,all表示進行任何有必要的索引存儲位置調整;primaries表示只針對索引主體進行調整,不對副本調整;none表示不會進行任何索引存儲位置的調整。默認為all。 |
| cluster.routing.allocation.cluster_concurrent_rebalance |
int |
在集群中可以同時進行的索引重新分配任務數,如果這個值為0,在增加新節點后已有索引將不會重新調整存儲的位置。默認為2。 |
| cluster.routing.allocation.node_concurrent_recoveries |
int |
在集群中可以同時進行的索引數據恢復任務數,如果這個值為0,在一個節點離線后它原有的索引副本將不會重新分配到其它節點上。默認為2。 |
| indices.recovery.max_bytes_per_sec |
string |
在進行索引恢復時每秒傳輸的字節數。默認為40MB。 |
| cluster.blocks.read_only |
bool |
集群中的所有數據是否為只讀狀態。默認為false。 |
例如要暫時禁止客戶端向集群中寫入數據:
curl -XPUT 'http://127.0.0.1:9200/_cluster/settings' -d '{
"transient": {
"cluster.blocks.read_only": true
}
}'
|
參考文檔:
1.8 索引動態配置
通過RESTFul API接口"/_cluster/{index/}settings"在運行時對索引的一些參數進行動態配置,其中"index"表示要配置的索引名稱, 如果不指定則表示配置所有索引。可以向集群中任意一個Elasticsearch服務端節點訪問該API接口。PUT方法用於設置配置,GET方法用於獲 取配置。
配置的內容為如下JSON格式:
{
"index": {
"item1": "value1",
"item2": "value2",
...
}
}
|
下表為一些常用的索引動態配置項目說明:
| 名稱 |
類型 |
描述 |
| number_of_replicas |
int |
每個索引切片的副本數量。 |
| index.blocks.read_only |
bool |
索引是否為只讀狀態。 |
參考文檔:
1.9 注意事項
在一個Elasticsearch節點離線時,集群會立即啟動數據恢復操作,把副本復制到其它節點上。這一特性在臨時停止一個節點進行相關維護時非常不利,因為節點會在一段時間后再次啟動,並不須要進行數據恢復,無謂的數據恢復會導致集群的IO資源白白被占用。
要避免數據恢復,可以在節點停止前先通過集群動態配置RESTFul API接口設置" cluster.routing.allocation.node_concurrent_recoveries "為0,等節點啟動后,再設置" cluster.routing.allocation.node_concurrent_recoveries "為原來的值即可。
2 Logstash
2.1 部署方式
每台服務器上通常只須部署一個Logstash實例,用於采集服務器上各種服務產生的日志並發送到Elasticsearch集群。
2.2 安裝
從官網下載頁面下載Logstash的軟件包,直接解壓到指定目錄,即可完成安裝。
參考文檔:
2.3 主要配置
Logstash的配置文件語法類似json。
主要的配置文件格式參考:
input
{
# 從文件輸入
file
{
# 要采集的日志文件路徑,可以使用通配符
path => "/var/log/mysql/*.error.log"
# 通過自定義字段來指定Elasticsearch的索引
add_field => { "@__index_name" => "mysql_error" }
}
# 從文件輸入
file
{
# 指定多個日志文件路徑
path => ["/var/log/mysql1/*.slow.log","/var/log/mysql2/*.slow.log"]
# 通過自定義字段來指定Elasticsearch的索引
add_field => { "@__index_name" => "mysql_slow" }
# 多行編碼器,用於將多行日志內容合並為一條記錄
# 下面配置表示將開頭不包含"# User"字樣的行都與之前包含"^# User"字樣的行合並
# 匹配的日志內容樣例:
# # User foo
# # Time 1s
# select * from table1
# where field1=1;
codec => multiline
{
# 要匹配的字符串模型
pattern => "^# User"
# true表示選中不匹配pattern的行進行操作,false表示選中匹配pattern的行進行操作,這個字段默認為false
negate => true
# previous表示選中的行向之前的行合並,next表示選中的行向之后的行合並
what => previous
}
}
}
# 過濾器配置,用於在輸出前進行一些數據處理
# 每個過濾器都可以指定add_field、add_tag、remove_field、remove_tag屬性來對字段和標記進行添加刪除
filter
{
# 按照csv文件格式過濾內容,通常用於按照固定分隔符來提取字段
csv
{
# 在日志內容中用於分隔字段的分隔符,默認為","
separator => " "
# 指定各字段的名稱,如果不指定則默認為column1 column2 ...
# 下面語法將按照空格來分隔字段,並且把前三個字段命名為"col1"、"col2"和"col3"
# 匹配的日志內容樣例:"debug 10.1.1.1 /primary/second?param=foo"
columns => ["col1","col2","col3"]
}
# 按照grok規則過濾結構化內容,通常用於按照正則表達式來提取字段
grok
{
# 指定字段匹配的規則
# 下面語法將按照單詞、IP地址、URI、整數、浮點數和字符串來匹配6個字段
# 匹配的日志內容樣例:"debug 10.1.1.1 /primary/second?param=foo 777 1.5 hellow world"
match => { "message" => "%{WORD:col_str} %{IP:col_ip} %{URIPATHPARAM:col_uri} %{NUMBER:col_num:int} %{NUMBER:col_float:float} %{GREEDYDATA:col_text}" } }
}
# 使用Ruby腳本處理數據
ruby
{
# 要執行的代碼,event對象表示當前處理的文檔記錄
# 下面的語法將創建一個字段"f3",它的值是字段"f1"加上字段"f2"的結果
code => "event['f3'] = event['f1'] + event['f2']"
}
# 過濾存放日期時間內容的字段為時間戳類型
date
{
# 用於存放過濾結果的字段名,默認為"@timestamp"
target => "my_timestamp"
# 要過濾的字段以及其日期格式(可匹配多個格式)
# 下面語法將匹配的內容:"2000-09-01 02:03:04" or "9/Sep/15 02:03:04"
match => [ "datetime", "yyyy-M-d H:m:s", "d/MMM/yy H:m:s" ]
}
# 進行一些字段的常規數據處理
mutate
{
# 對字段進行類型轉換
# 目前支持的類型:integer, float, string, boolean
convert => { "field1" => "integer" }
# 使用正則表達式對字符串字段的內容進行替換
# 數組中的每3個元素表示一組"字段名,原值,新值"
gsub => [ "field1", "[0-9]+", "number", "field2", "s", "x" ]
# 把字符串字段內容中的大寫字母替換為小寫字母
lowercase => [ "field1", "field2" ]
# 將兩個字段的內容生成為數組並存放到第一個字段中
merge => { "field1" => "field2" }
# 給字段改名
rename => { "field1" => "field2" }
# 給字段指定新的值
replace => { "field1" => "new value" }
# 根據指定的分隔符把字符串字段拆分為數組
split => { "field1" => "," }
# 給字符串字段的內容去除頭尾空格
strip => [ "field1", "field2" ]
# 更新一個已存在字段的內容
update => { "field1" => "new value" }
# 把字符串字段內容中的小寫字母替換為大寫字母
uppercase => [ "field1", "field2" ]
}
}
# 輸出配置
output
{
# 輸出到Elasticsearch
elasticsearch
{
# 使用的索引名稱,不能有大寫字母
# 下面語法將字段"@__index_name"加上"當前日期"組成可變的索引名稱
index => "%{@__index_name}-%{+YYYY.MM.dd}"
# 要連接的Elasticsearch集群名稱
cluster => "sdp-elk"
# Logstash實例在Elasticsearch集群中的節點名稱
node_name => "mysql-host1"
# 加入集群時可連接的Elasticsearch服務器IP地址列表
# 如果客戶端和服務器在同一子網內,沒有網關隔離,可以不設置此項
# Logstash 1.5.0在打開調試日志后必須設置此項
host => ["10.1.1.1:9300","10.1.1.2:9300"]
# 進行網絡通訊時要綁定的本機IP地址
bind_host => "10.1.1.100"
# 進行網絡通訊時要綁定的本機TCP端口
bind_port => 9300
}
}
|
參考文檔:
Output plugins - elasticsearch
logstash-patterns-core - patterns
2.4 運行
在安裝目錄中執行"bin/logstash -f {conf_file} -l {log_file} &"直接以后台方式運行Logstash實例,使用kill停止。
主要命令行參數說明:
-f, --config CONFIGFILE
配置文件的路徑,可以使用通配符來表示多個文件,也可以是一個存放配置文件目錄路徑。這個參數沒有默認值。
-l, --log FILE
日志文件的路徑。日志默認輸出到控制台。
--debug
開啟調試日志。
參考文檔:
3 Kibana
3.1 部署方式
Kibana是一個圖形化的Elasticsearch客戶端,提供了豐富的數據查詢和統計功能。由於Kibana的自身數據也存儲於 Elasticsearch集群中,所以每個實例都是輕量級和無狀態的。一個Kibana實例可以和Elasticsearch節點部署在同一服務器上, 通常在Elasticsearch集群中任選2台服務器部署即可實現主備模式的高可用訪問。
3.2 安裝
從官網下載頁面下載Kibana的軟件包,直接解壓到指定目錄,即可完成的安裝。
參考文檔:
3.3 主要配置
Kibana配置文件為安裝目錄下的"conf/kibana.yml"。,下表為一些常用的配置項目說明。
| 選項名 |
類型 |
描述 |
| port |
int |
服務的HTTP端口。默認為5601。 |
| host |
string |
服務要監聽的IP地址。默認為本機所有IP地址。 |
| elasticsearch_url |
string |
Elasticsearch的RESTFul API地址。默認為本機地址。 |
| kibana_index |
string |
在Elasticsearch集群中存儲自身數據的索引名。默認為".kibana"。 |
| pid_file |
string |
存放Kibana進程ID的文件路徑。默認為空表示不保存進程ID。 |
| log_file |
string |
存放Kibana日志的文件路徑。默認為空表示不保存日志。 |
3.4 運行
在安裝目錄中執行"bin/kibana >> {log_file} &"直接以后台方式運行Kibana實例,使用kill停止。
在瀏覽器的地址欄輸入"http://{ip}:{http port}"即可打開Kibana的頁面。


