天天看點

elk筆記8--index

elk筆記8--index

  • ​​1. index 建立的幾種方式​​
  • ​​1.1 直接建立index​​
  • ​​1.2 按照目前日期建立索引​​
  • ​​1.3 建立帶有rollover功能的索引​​
  • ​​2. 索引的常見設定​​
  • ​​2.1 基本設定​​
  • ​​2.2 index 為unassigned的常見處理方式​​
  • ​​2.3 叢集為red處理​​
  • ​​2.4 提高消費速度常見方法​​
  • ​​2.5 常見問題​​
  • ​​3. 說明​​

1. index 建立的幾種方式

1.1 直接建立index

第一種方式最普通,此類index 寫入時在logstash中直接指定index01即可;

其缺點是當日志量大的時候,會影響性能。

PUT index01
{}
out:
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "index01"
}      

1.2 按照目前日期建立索引

該方式建立日志,寫入時候每天會建立一個帶日期的index,此類寫入時在logstash中配置如下:

index => “index02-%{+YYYY.MM.dd}”

PUT /%3Cindex02-%7Bnow%2Fd%7D%3E
{}
out:
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "index02-2020.06.21"
}      

1.3 建立帶有rollover功能的索引

該方式建立一個index帶日期和序号,并設定一個_write别名;

每次執行rollover的時候,會按照目前日期和和序号+1的方式生成新索引,并将_write别名指向最新索引;

是以實際寫入的時候直接使用_write索引即可,該方式比較使用生産中使用;

實際使用的時候,若資料量過大,應該加一個cron定時按照政策進行rollover。

PUT /%3Cindex03-%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
  "index03_write": {}
  }
}
out:
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "index03-2020.06.21-000001"
}
rollover:
POST index03_write/_rollover
out:
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "old_index" : "index03-2020.06.21-000001",
  "new_index" : "index03-2020.06.21-000002",
  "rolled_over" : true,
  "dry_run" : false,
  "conditions" : { }
}      

2. 索引的常見設定

2.1 基本設定

  1. index.number_of_replicas 副本數量
  2. index.routing.allocation.require.zone 索引存儲的zone
  3. index.routing.allocation.include._name 索引存儲的節點名稱
  4. index.routing.allocation.include._ip 索引存儲的節點ip
  5. index.routing.allocation.total_shards_per_node 索引在每個節點上可以存儲多少個分片

2.2 index 為unassigned的常見處理方式

當叢集yellow時候,一般為配置設定未正常配置設定,包括如下常見4類處理方法:

  1. zone限制
PUT index_name/_settings
{
  "index" : {
    "routing" : {
      "allocation" : {
        "require" : {
          "zone" : ""
        }
      }
    }
  }
}      
  1. include._ip 限制
PUT index_name/_settings
{
 "index" : {
 "routing" : {
   "allocation" : {
     "include" : {
       "_ip" : ""
        }
      }
    }
  }
}      
  1. include._name 限制
PUT index_name/_settings
{
 "index" : {
 "routing" : {
   "allocation" : {
     "include" : {
       "_name" : ""
        }
      }
    }
  }
}      
  1. total_shards_per_node 值過小導緻shard無法配置設定到所有節點上
PUT index_name/_settings
{
  "index" : {
    "routing" : {
      "allocation" : {
        "total_shards_per_node" : "3" #此值根據節點數量和分片數量更改即可
      }
    }
  }
}      
  1. data 節點數量不夠,導緻主備shard無法配置設定

    案例說明:

    使用者收到告警:叢集為yellow

    在叢集中通過 GET _cluster/allocation/explain 檢視結果如下,即同一個索引的副本和主分片不能出現在同一個節點中, 推測可能節點數量不夠;

"explanation": "the shard cannot be allocated to the same node on which a copy of the shard already exists [[id5_equip_v1][1], node[Htz1RdjST-2gdvkti0xfCQ], [P], s[STARTED], a[id=NaGQ1AraS_SQwUKb-1j2xw]]"      

繼續 GET _cat/nodes?v , 發現叢集中隻有一個data節點,3個master節點,是以可以判斷是叢集節點數量少,而索引設定了非0副本導緻yellow的。

解決方法1:
添加data節點,使其能夠配置設定shard;
解決方法2:
使用者可以接受的情況下,設定shard的副本為0,一般測試叢集可以設定副本為0,正式叢集建議設定1個副本
index_name
PUT index_name/_settings
{
  "index": {
    "number_of_replicas":"0"
  }
}      

2.3 叢集為red處理

筆者由于磁盤異常,且某些測試index沒有設定副本,導緻節點為red。

此時處理方法包括:

1)删除red的index

所有的資料都會丢失

2)通過reroute對red對應的index配置設定空的primary shard

丢失的分片資料丢失,沒丢失的可以繼續使用

GET _cluster/allocation/explain
{
  "index" : "dmesg001-2020.07.15-000003",
  "shard" : 1,
  "primary" : true,
  "current_state" : "unassigned",
  "unassigned_info" : {
    "reason" : "NODE_LEFT",
    "at" : "2020-07-15T15:27:55.563Z",
    "details" : "node_left [J2H0nVv9T-uH-ZymDUJ2yQ]",
    "last_allocation_status" : "no_valid_shard_copy"
  },
  "can_allocate" : "no_valid_shard_copy",
  "allocate_explanation" : "cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster",
  ......
  }
  
配置設定分片異常的,可以先通過reroute加retry_failed 參數來初步修複, 也可以嘗試 _flush,無法修複的可以嘗試配置設定空分片。
POST /_cluster/reroute?retry_failed=true

POST red_index_name/_flush

POST _cluster/reroute
{
"commands" : [ {
"allocate_empty_primary" : {
"index" : "dmesg001-2020.07.15-000003",
"shard" : 1,
"node" : "node-3",
"accept_data_loss" : true
}
}
]
}      

2.4 提高消費速度常見方法

  1. 适當增加分片數量

    當logstash資源充足的時候,shard數量過少可能造成寫入瓶頸,是以此時可以 适當增加shard分片資料。

  2. 适當增加logstash數量

    當shard分片資料比較多,logstash數量較少的時候,可能造成消費 瓶頸,此時可以通過增加logstash數量來提高消費速率。

  3. 适當增加kafka topic partion數量

    當分片數量和logstash數量充足的時候,若topic partion過低,也會導緻logstash無法提高消費速率,此時可以适當提高topic的partion數量。

  4. 将索引寫入到ssd節點

    對于有一定規模的叢集,可以設定hot、stale、freeze節點,hot節點用ssd節點,stale節點用普通的機械盤,freeze節點用最差的機械盤。

    寫入時候一般将重要的索引直接寫入hot節點(保證最快的寫入速率),普通的索引 寫入到stale節點,當機的索引儲存在freeze節點。當stale節點中的索引寫入速度無法提上去的時候,就可以通過rollover将起配置設定到hot節點中,進而提高起寫入速率。

POST a01_logtail_write/_rollover
{
  "settings": {
  "index": {
  "number_of_shards" : "6",
  "routing": {
    "allocation": {
      "require": {
        "zone": "hot"
          }
        }
      }
    }
  }
}      
  1. 去掉副本

    去掉副本可以明顯提高寫入速率,但節點故障存在一定丢資料的風險;是以 ,當資料不太重要,緊急情況下可以通過去掉副本來快速提高寫入速率,資料無lag的時候可以再恢複副本。

  2. 使用hangout代替logstash

    在同等資源下,hangout的消費速率明顯比logstash高一般是logstash的2-3倍的消費速率。

2.5 常見問題

  1. index 建立了如何修改shard數量

    正常情況是不允許修改的,對于可以rollover類型,或者按照日期的index,可以通過修改模闆來更新shard數量,進而建立下一個index的時候就自動更新了shard數量;

    如下建立模闆後,更新settings的shard資料即可:

PUT _template/index_03
{
     "index_patterns": ["index03-*"], 
     "settings": {
       "number_of_shards": 2
     }
   }      
  1. 判斷叢集狀态常用的指令
GET _cluster/allocation/explain
GET _cat/health?v
GET _cat/indices?v&health=yellow
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
GET index_name/_setting
預設 explain 不會區分primary和非primary,且隻能檢視1個shard;是以,當有多個shard異常的時候,一般先用_cat/shards?v 檢視哪些shard未配置設定且為主分片,然後再用條件式的explain檢視具體原因
GET _cluster/allocation/explain
{
 "index": "my-index-000001",
 "shard": 0,
 "primary": true
}      
  1. curl 查詢更新資訊
無認證的叢集: curl h01:9201/_cat/indices 
有認證的叢集:curl -u elastic:elastic [-XGET可以省略] h01:9204/_cat/indices ,需要 -u 參數加入使用者認證
使用curl put資料:curl -u elastic:elastic -H "Content-Type: application/json" -XPUT h01:9204/test1122/_settings -d '{"index": { "number_of_replicas": "0"}}' 
XPUT必須要加上,且需要加上-H "Content-Type: application/json"參數,否則會報如下406錯誤:
{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}      

3. 說明