背景
基于ELK搭建的日志平臺(tái),前期匆忙建設(shè)過(guò)程中一些參數(shù)和設(shè)計(jì)未做過(guò)多的考慮,上線后就需要不斷根據(jù)實(shí)際情況做調(diào)整,而一些調(diào)整限于ELK的一些特性,一旦操作不當(dāng)就會(huì)出現(xiàn)丟數(shù)據(jù)涝开、數(shù)據(jù)寫(xiě)入異常瘪匿、數(shù)據(jù)查不到等情況操软。
因此如何在這種背景下仁锯,做到對(duì)使用方無(wú)感知的動(dòng)態(tài)調(diào)整是我們所要實(shí)現(xiàn)的目標(biāo)双炕。所以本文更加注重實(shí)踐而非深層次的理論講解,有興趣深入了解的可以自行研習(xí)死相。
總體架構(gòu)
CASES
CASE1:按日/月生成索引
創(chuàng)建的nginx access_log索引素挽,開(kāi)始采集2周后阅酪,數(shù)據(jù)達(dá)到25G+(number_of_replicas=1瑞躺,因此總體數(shù)據(jù)超過(guò)50G)曼振,如果不進(jìn)行索引拆分弛姜,該索引將越來(lái)越大初肉,最終會(huì)嚴(yán)重影響查詢效率,并且一旦出現(xiàn)索引損壞造成的風(fēng)險(xiǎn)也更大。
通過(guò)配置logstash ouput 插件實(shí)現(xiàn)按照日期生成新索引:
output {
elasticsearch {
hosts => ["192.168.0.1:9200"]
index => "php-nginx-log-%{+YYYY.MM.DD}" #按照天生成索引
}
}
通過(guò)我們的配置,目前會(huì)存在2個(gè)index,分別為歷史的php-nginx-log索引和以php-nginx-log.2019-01-15索引源内。
CASE2:Kibana查詢所有數(shù)據(jù)
由于目前我們的索引不再是指定的具體索引,還是一類(lèi)按照事先約定的命名格式索引集合肺缕,這時(shí)我們想要能夠在Kibana查詢數(shù)據(jù)時(shí)不受影響,能夠正常查詢到數(shù)據(jù)姆吭,此時(shí)主要有兩種解決方式:
1昂灵、更改Kibana的Create index pattern,使用通配符關(guān)聯(lián)出所有index
2遏弱、使用index aliases奏候,詳情:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/indices-templates.html
Elasticsearch的別名,就類(lèi)似數(shù)據(jù)庫(kù)的視圖渠啊,別名不僅僅可以關(guān)聯(lián)一個(gè)索引罚缕,它能聚合多個(gè)索引与纽,下文還會(huì)提到別名的更重要的特性。
通過(guò)別名的方式是更加建議的方式懒闷。
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "new_index1", "alias" : "alias1" } }
]
}
說(shuō)明:這里使用Elasticsearch的REST API進(jìn)行設(shè)置荔棉,具體詳情參考官網(wǎng):https://www.elastic.co/guide/en/elasticsearch/reference/6.5/docs.html ,下文中的類(lèi)似代碼塊都是此類(lèi)調(diào)用赂蕴。
CASE3:通過(guò)模板創(chuàng)建Index
創(chuàng)建index后,如果未指定具體mapping,則在插入具體doc數(shù)據(jù)時(shí),會(huì)自動(dòng)生成骨田,具體數(shù)據(jù)字段的數(shù)據(jù)類(lèi)型Elasticsearch會(huì)做一定的動(dòng)態(tài)識(shí)別悠汽,但是大部分都將以string定義假抄,這種情況下我們?cè)谑褂脭?shù)據(jù)時(shí) 行您,就會(huì)出現(xiàn)一些不便骤星,如 Kibana一些函數(shù)必須是整型類(lèi)型、ip類(lèi)型的字段才可以使用爆哑,另外全部默認(rèn)為string類(lèi)型會(huì)導(dǎo)致查詢效率的低下和存儲(chǔ)容量的浪費(fèi)洞难。
這時(shí)就需要我們?nèi)ブ付╥ndex的mapping,而很重要的一點(diǎn):mapping中的filed一點(diǎn)指定后(無(wú)論是默認(rèn)生成還是手動(dòng)聲明)就無(wú)法進(jìn)行update filed操作揭朝,如果要修改通常只能進(jìn)行create 新的index队贱。因此我們往往會(huì)在index寫(xiě)入數(shù)據(jù)前就創(chuàng)建好index的mapping,如下:
PUT new_index1
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"_doc" : {
"properties" : {
"field1" : { "type" : "text" }
}
}
}
}
而通過(guò)CASE1中潭袱,已經(jīng)說(shuō)明了我們的index都是由Logstash按照日期自動(dòng)創(chuàng)建的柱嫌,因此手動(dòng)通過(guò)API的方式無(wú)法滿足我們的需求,這時(shí)我們就需要使用Elasticsearch的template特性:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/indices-templates.html
創(chuàng)建template:
PUT _template/template_nginx_log
{
"index_patterns": ["php-nginx-log*"],
"settings": {
"number_of_shards": "5",
"number_of_replicas": "1"
},
"aliases": {
"php-nginx-log": {}
},
"mapping": {
"doc": {
"properties": {
"@timestamp": {
"type": "date"
},
"geoip": {
"type": "object"
},
"geoip_city_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"geoip_continent_code": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"geoip_country_code2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"user_device_os_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
具體說(shuō)明:
index_patterns:指定index匹配表達(dá)式屯换,這個(gè)特性十分重要编丘,如果配置為 ”php-nginx-log*“,則所有以php-nginx-log為前綴的索引都將自動(dòng)使用該template進(jìn)行索引創(chuàng)建彤悔,而不需要特殊指定
aliases:為索引指定一個(gè)別名嘉抓,同樣的,通過(guò)該配置就能實(shí)現(xiàn)我們前面提到的問(wèn)題晕窑,讓按照日期創(chuàng)建的新index能夠被正確的查詢到
CASE4:原index數(shù)據(jù)遷移(mapping有修改)
1)CASE3開(kāi)頭的時(shí)候提到過(guò)抑片,需要按照固定的mapping創(chuàng)建index,來(lái)達(dá)到生成的index能使用規(guī)范的數(shù)據(jù)類(lèi)型的目的杨赤,而歷史index中數(shù)據(jù)想要修改mapping只能重新創(chuàng)建敞斋,這時(shí)我們通常使用Elasticsearch的reindex特性:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/docs-reindex.html
POST _reindex?slices=5&refresh
{
"source": {
"index": "php-nginx-log-2019.01",
"size": 10000
},
"dest": {
"index": "php-nginx-log-2019.01.15"
}
}
說(shuō)明:
默認(rèn)情況下级遭,_reindex使用1000進(jìn)行批量操作,您可以在source中調(diào)整batch_size渺尘,如上面設(shè)置為了1萬(wàn)
-
Reindex支持Sliced Scroll以并行化重建索引過(guò)程挫鸽。 這種并行化可以提高效率,并提供一種方便的方法將請(qǐng)求分解為更小的部分鸥跟,如上面設(shè)置為了slices=5
1)slices大小的設(shè)置可以手動(dòng)指定丢郊,或者設(shè)置slices設(shè)置為auto,auto的含義是:針對(duì)單索引医咨,slices大小=分片數(shù)枫匾;針對(duì)多索引,slices=分片的最小值拟淮。
2)當(dāng)slices的數(shù)量等于索引中的分片數(shù)量時(shí)干茉,查詢性能最高效。slices大小大于分片數(shù)很泊,非但不會(huì)提升效率角虫,反而會(huì)增加開(kāi)銷(xiāo)。
3)如果這個(gè)slices數(shù)字很大(例如500)委造,建議選擇一個(gè)較低的數(shù)字戳鹅,因?yàn)檫^(guò)大的slices 會(huì)影響性能。
-
如果要進(jìn)行大量批量導(dǎo)入昏兆,請(qǐng)考慮通過(guò)設(shè)置index.number_of_replicas來(lái)禁用副本:0枫虏。
主要原因在于:復(fù)制文檔時(shí),將整個(gè)文檔發(fā)送到副本節(jié)點(diǎn)爬虱,并逐字重復(fù)索引過(guò)程隶债。這意味著每個(gè)副本都將執(zhí)行分析,索引和潛在合并過(guò)程跑筝。
相反死讹,如果使用零副本進(jìn)行索引,然后在提取完成時(shí)啟用副本继蜡,則恢復(fù)過(guò)程本質(zhì)上是逐字節(jié)的網(wǎng)絡(luò)傳輸回俐。 這比復(fù)制索引過(guò)程更有效。
2)我們要保證新舊index的數(shù)據(jù)平滑遷移對(duì)用戶無(wú)感知稀并,此時(shí)可以使用前文提到的alias,流程為:
1 . 就index使用alias单默,數(shù)據(jù)使用方通過(guò)alias查詢數(shù)據(jù)
2 . reindex生成的新index不要?jiǎng)?chuàng)建別名碘举,進(jìn)行數(shù)據(jù)reindex操作
3 . 待數(shù)據(jù)復(fù)制完成后,調(diào)用remove+add alias接口搁廓,該操作為原子操作引颈,可以保證數(shù)據(jù)無(wú)縫遷移耕皮,具體代碼如下:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/indices-aliases.html
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test2", "alias" : "alias1" } }
]
}
總結(jié)
至此我們就總結(jié)完了一些Elasticsearch及ELK架構(gòu)下常用CASE,通過(guò)合理的使用組件的特性蝙场,來(lái)滿足我們的業(yè)務(wù)需求凌停。
后面我們還將總結(jié)一些Logstash的經(jīng)典CASE。
歡迎關(guān)注 高廣超的簡(jiǎn)書(shū)博客 與 收藏文章 售滤!
歡迎關(guān)注 頭條號(hào):互聯(lián)網(wǎng)技術(shù)棧 罚拟!
個(gè)人介紹:
高廣超:多年一線互聯(lián)網(wǎng)研發(fā)與架構(gòu)設(shè)計(jì)經(jīng)驗(yàn),擅長(zhǎng)設(shè)計(jì)與落地高可用完箩、高性能赐俗、可擴(kuò)展的互聯(lián)網(wǎng)架構(gòu)。目前從事大數(shù)據(jù)相關(guān)研發(fā)與架構(gòu)工作弊知。
本文首發(fā)在 高廣超的簡(jiǎn)書(shū)博客 轉(zhuǎn)載請(qǐng)注明阻逮!