elasticsearch實戰經驗積累記錄

elasticsearch常用命令

檢查es版本信息

curl IP:9200


查看集羣是否健康

http://IP:9200/_cat/health?v

curl 'IP:9200/_cat/health?v'

查看集羣狀態

curl -XGET ip:9200/_cluster/state

curl -XGET ip:9200/_cluster/health?pretty

查看節點列表

http://IP:9200/_cat/nodes?v

curl 'IP:9200/_cat/nodes?v'

curl 'ip:9200/_nodes/stats'

列出所有索引及存儲大小

http://IP:9200/_cat/indices?v

curl 'IP:9200/_cat/indices?v'--查詢所有索引及數據大小


查看線程狀態

GET /_cat/thread_pool

查看線程狀態

http://172.21.0.5:9200/_nodes/thread_pool

線程池優化

更改配置文件elasticsearch.yml增加如下內容:

thread_pool.search.queue_size: 500

#queue_size允許控制沒有線程執行它們的掛起請求隊列的初始大小。

thread_pool.search.size: 200

#size參數控制線程數,默認爲核心數乘以5。

thread_pool.search.min_queue_size:10

#min_queue_size設置控制queue_size可以調整到的最小量。

thread_pool.search.max_queue_size: 1000

#max_queue_size設置控制queue_size可以調整到的最大量。

thread_pool.search.auto_queue_frame_size: 2000

#auto_queue_frame_size設置控制在調整隊列之前進行測量的操作數。它應該足夠大,以便單個操作不會過度偏向計算。

thread_pool.search.target_response_time: 6s

#target_response_time是時間值設置,指示線程池隊列中任務的目標平均響應時間。如果任務通常超過此時間,則將調低線程池隊列以拒絕任務。


獲取集羣主ip

 curl -s localhost:9200/_cat/nodes?v|awk -F":" '{print $1;print $9}'|grep "*"|awk '{print $1}'


創建索引

創建索引名爲XX,默認會有5個分片,1個索引

curl -XPUT 'IP:9200/XX?pretty'


添加一個類型

curl -XPUT 'IP:9200/XX/external/2?pretty' -d '

{

   "gwyy": "John"

}'


更新一個類型

curl -XPOST 'IP:9200/XX/external/1/_update?pretty' -d '

{

   "doc": {"name": "Jaf"}

}'


刪除指定索引

curl -XDELETE 'IP:9200/_index?pretty'


分片處理

過濾查看所有未分配索引的方式,c知道哪個索引的哪個分片就開始手動修復,通過reroute的allocate分配

curl -s “http://10.19.22.142:9200/_cat/shards” | grep UNASSIGNED結果如下,第一列表示索引名,第二列表示分片編號,第三列p是主分片,r是副本

知道哪個索引的哪個分片就開始手動修復,通過reroute的allocate分配

curl -XPOST '{ESIP}:9200/_cluster/reroute' -d '{

    "commands" : [ {

          "allocate_replica" : {

              "index" : "eslog1",

              "shard" : 4,

              "node" : "es1",

              "allow_primary" : true

          }

        }

    ]

}'

分配時可能遇到的坑,需要注意的地方

分配副本時必須要帶參數”allow_primary” : true, 不然會報錯

當集羣中es版本不同時,如果這個未分配的分片是高版本生成的,不能分配到低版本節點上,反過來低版本的分片可以分配給高版本,如果遇到了,只要升級低版本節點的ES版本即可

案例

通過/_cat/shards 查看,發現有從分配處於一個未分配的狀態,該命令該出的數據奇怪的地方是,我的集羣明明有三臺機器,但是shareds裏面只給出了兩臺。


data 2 r STARTED 449516 1.6gb 100.73.22.5 22-5

data 2 p STARTED 449516 1.6gb 100.73.22.6 22-6

data 2 r UNASSIGNED


然後通過查閱官方手冊,查詢UNASSIGNED 的原因,然後發現很多種可能性的,但是官方的api 的case裏面,shards 是直接給出了原因的,但是我的es卻沒有給出原因。怎麼辦呢?在api文檔裏面找答案,發現了/_cluster/reroute 的命令,一看就知道是救星,既然狀態是UNASSIGNED, 我手動指定 該切片到特定的節點,不就可以了麼。


執行命令


curl -XPOST ‘100.73.22.5:9200/_cluster/reroute’ -d ‘{

“commands” : [{

"move" : {

"index" : "data",

"shard" : 0,

"from_node" : "22-6" ,

"to_node": "22-5"

}

}]

}’


4.手動移動分片和副本:

移動分片:

$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[{

"move":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"from_node":"ali-hk-ops-elk1",

"to_node":"ali-hk-ops-elk2"

}

}]

}'


取消分片:

$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[{

"cancel":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk1"

}

}]

}'


分配分片:

$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[{

"allocate":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk2"

}

}]

}'


將某個未分配的索引手動分配到某個節點上.


$curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{

"commands":[

{

"move":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"from_node":"ali-hk-ops-elk1",

"to_node":"ali-hk-ops-elk2"

}

},

{

"cancel":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk1"

}

},

{

"allocate":{

"index":"filebeat-ali-hk-fd-tss1",

"shard":1,

"node":"ali-hk-ops-elk1"

}

}]

}'




curl -XPOST '10.9.86.252:9200/_cluster/reroute' -d '{ "commands": [{"allocate_replica": {"index": "esuser117db1","shard": 5,"nodes": "in-searchN-A2"}}]}'


未分配副本解決方法(經過實戰有效可行):

如果手動分配無效的話,可採用如下針對未分配索引的副本數目設置操作處理

設置索引副本數目爲0

curl -XPUT '192.168.12.131:9200/vip_active223/_settings' -d '{"index": {"number_of_replicas":0}}'

設置索引副本數目爲1

curl -XPUT '192.168.12.131:9200/vip_active223/_settings' -d '{"index": {"number_of_replicas":1}}'


#elasticsearch集羣安全重啓方法

我們需要的是,告訴 Elasticsearch 推遲再平衡,因爲對外部因子影響下的集羣狀態,我們自己更瞭解。操作流程如下:


可能的話,停止索引新的數據。雖然不是每次都能真的做到,但是這一步可以幫助提高恢復速度。

禁止分片分配。這一步阻止 Elasticsearch 再平衡缺失的分片,直到你告訴它可以進行了。如果你知道維護窗口會很短,這個主意棒極了。你可以像下面這樣禁止分配:

查看:curl -XGET ip:9200/_cluster/settings

修改:curl -XPUT ip:9200/_cluster/settings {}


PUT /_cluster/settings

{

    "transient" : {

        "cluster.routing.allocation.enable" : "none"

    }

}

關閉單個節點。

執行維護/升級。

重啓節點,然後確認它加入到集羣了。

用如下命令重啓分片分配:


PUT /_cluster/settings

{

    "transient" : {

        "cluster.routing.allocation.enable" : "all"

    }

}

分片再平衡會花一些時間。一直等到集羣變成 綠色 狀態後再繼續。


重複第 2 到 6 步操作剩餘節點。

到這步你可以安全的恢復索引了(如果你之前停止了的話),不過等待集羣完全均衡後再恢復索引,也會有助於提高處理速度。




防止內存溢出(生產環境建議設置鎖住內存)

你需要打開配置文件中的mlockall開關,它的作用就是運行JVM鎖住內存,禁止OS交換出去。在elasticsearch.yml配置如下:

bootstrap.memory_lock: true

置爲true來鎖住內存不進行swapping。因爲當jvm開始swapping時es的效率 會降低,所以要保證它不swap,可以把ES_MIN_MEM和ES_MAX_MEM兩個環境變量設置成同一個值,並且保證機器有足夠的內存分配給es。 同時也要允許elasticsearch的進程可以鎖住內存,linux下啓動es之前可以通過`ulimit -l unlimited`命令設置


防止出現內存溢出但是進程沒有退出

jvm.options

-XX:+ExitOnOutOfMemoryErrorsss


elasticsearch集羣內部節點超時解決

默認配置爲:節點每隔1s同master發送1次心跳,超時時間爲30s,測試次數爲3次,超過3次,則認爲該節點同master已經脫離了。以上爲elasticsearch的默認配置。在實際生產環境中,每隔1s,太頻繁了,會產生太多網絡流量。我們可以在elasticsearch.yml如下修改。 

discovery.zen.fd.ping_timeout: 120s  

discovery.zen.fd.ping_retries: 6  

discovery.zen.fd.ping_interval: 30s



如何加快我的index速度

Elasticsearch預先配置了許多設置,嘗試確保您保留足夠的資源來搜索和索引數據。但是,如果您使用Elasticsearch嚴重偏向寫入,則可能會發現調整某些設置以提高索引性能是有意義的,即使這意味着丟失一些搜索性能或副本數據。 下面,我們將探討一些方法來優化用例來進行索引,而不是搜索數據。(預設值是兼顧搜索和索引)


分片分配: 如果你要創建一個更新頻繁的索引,請確保指定足夠的主分片,以便您可以在所有節點間均勻分佈索引負載。一般建議是每個集羣中的節點分配一個主分片。如果你的CPU和磁盤夠用,2個或者更多的主分片是可行的(注意:這個是對單個索引來描述的)。但是,請記住,分片過度分配會增加開銷,並可能會對搜索產生負面影響,因爲搜索請求需要打到索引中的每個分片。另一方面,如果分配的分片數少於節點數,you may create hotspots?因爲包含這些分片的節點需要處理比不包含任何索引分片的節點更多的索引請求。

禁止 merge throttling: merge throttling是elasticsearch的一個自動機制:當es檢測到合併速度落後於索引速度時,es會throttle 索引請求。 如果要優化索引性能,而不是搜索性能,可以通過更新集羣設置來禁止掉merge throttling(通過將indices.store.throttle.type設置爲“none”)。You can make this change persistent (meaning it will persist after a cluster restart) or transient (resets back to default upon restart), based on your use case.

增加indexing buffer的大小: 這個index-level 設置(indices.memory.index_buffer_size)決定了在將文檔寫入到磁盤上的segment之前buffer的總大小。默認爲總heap的10%,以便爲索引請求預留更多的heap,which doesn’t help you if you’re using Elasticsearch primarily for indexing.??

先index,後replicate: 初始化索引時,在索引設置中指定零個複本分片,並在索引完成後添加副本。 這將提高索引性能。但是有一定的風險。

刷新間隔拉長: 增加Index Settings API中的刷新間隔。 默認情況下,索引刷新過程每秒都會發生一次,但是在較大的索引期間,降低刷新頻率可以幫助減輕部分工作量。

調整translog設置: 從版本2.0開始,Elasticsearch將在每次請求後將Translog數據刷新到磁盤,從而降低硬件故障時數據丟失的風險。如果你中索引性能,並且不太擔心潛在的數據丟失的可能,您可以將index.translog.durability更改爲異步。 有了這一點,索引只會在每個sync_interval上提交寫入磁盤,而不是在每個請求之後提交寫入磁盤,從而使其更多的富餘資源可以提供索引請求。


es集羣節點數據遷移場景:集羣中需要替換一臺新機器,需要把集羣中的老的機器的數據遷移到集羣其他的機器中,下面的命令是排除掉10.0.0.1,把這臺機器的數據遷移到器羣其他機器中。

curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'

{

  "transient" : {

    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"

  }

}

'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章