Elasticsearch 實(shí)戰(zhàn)案例(索引切分、模板信殊、別名、數(shù)據(jù)遷移)

背景

基于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)

image.png

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

image.png

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)注明阻逮!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秩彤,隨后出現(xiàn)的幾起案子叔扼,更是在濱河造成了極大的恐慌,老刑警劉巖漫雷,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件币励,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡珊拼,警方通過(guò)查閱死者的電腦和手機(jī)食呻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澎现,“玉大人仅胞,你說(shuō)我怎么就攤上這事〗1瑁” “怎么了干旧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妹蔽。 經(jīng)常有香客問(wèn)我椎眯,道長(zhǎng),這世上最難降的妖魔是什么胳岂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任编整,我火速辦了婚禮,結(jié)果婚禮上乳丰,老公的妹妹穿的比我還像新娘掌测。我一直安慰自己,他們只是感情好产园,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布汞斧。 她就那樣靜靜地躺著夜郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粘勒。 梳的紋絲不亂的頭發(fā)上竞端,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音庙睡,去河邊找鬼事富。 笑死,一個(gè)胖子當(dāng)著我的面吹牛埃撵,可吹牛的內(nèi)容都是我干的赵颅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼暂刘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饺谬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起谣拣,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤募寨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后森缠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拔鹰,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贵涵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了列肢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宾茂,死狀恐怖瓷马,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跨晴,我是刑警寧澤欧聘,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站端盆,受9級(jí)特大地震影響怀骤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焕妙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一蒋伦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧访敌,春花似錦凉敲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阻塑,卻和暖如春蓝撇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陈莽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工渤昌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人走搁。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓独柑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親私植。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忌栅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容