108_es生產(chǎn)集群版本升級之基于集群整體重啟策略進(jìn)行2.x到5.x的大版本升級
滾動升級策略,集群,集群里面有多個節(jié)點,一個節(jié)點一個節(jié)點的重啟和升級
如果是大版本之間的升級,集群重啟策略,要先將整個集群全部停掉,如果采取滾動升級策略的話,可能導(dǎo)致說,一個集群內(nèi),有些節(jié)點是es 5.5,有些節(jié)點是es 2.4.3,這樣的話是可能會有問題的
升級的過程,其實是跟之前的一模一樣的
es在進(jìn)行重大版本升級的時候,一般都需要采取full cluster restart的策略,重啟整個集群來進(jìn)行升級。rolling upgrade在重大版本升級的時候是不合適的。
執(zhí)行一個full cluster restart升級的過程如下:
我們先停掉之前的es 5.5,刪除所有相關(guān)的目錄,然后安裝一個es 2.4.3,再將其升級到es 5.5
chown -R elasticsearch /usr/local/elasticsearch
chown -R elasticsearch /var/log/elasticsearch
chown -R elasticsearch /var/data/elasticsearch
chown -R elasticsearch /etc/elasticsearch
su elasticsearch
elasticsearch -d -Dpath.conf=/etc/elasticsearch
kill -SIGTERM 15516
curl -XPUT 'http://localhost:9200/forum/article/1?pretty' -d '
{
"title": "first article",
"content": "this is my first article"
}'
(1)禁止shard allocation
我們停止一個node時,可能導(dǎo)致部分replica shard死掉了,此時shard allocation機(jī)制會立即在其他節(jié)點上分配一些replica shard過去。如果是停止node導(dǎo)致primary shard死掉了,會將其他node上的replica shard提升為primary shard,同理會給其復(fù)制足夠的replica shard,保持replica副本數(shù)量。但是這回導(dǎo)致大量的IO開銷。我們首先得先禁止這個機(jī)制:
curl -XPUT 'http://localhost:9200/_cluster/settings?pretty' -d '
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}'
(2)執(zhí)行一次flush操作
我們最好是停止接受新的index寫入操作,并且執(zhí)行一次flush操作,確保數(shù)據(jù)都fsync到磁盤上。這樣的話,確保沒有數(shù)據(jù)停留在內(nèi)存和WAL日志中。shard recovery的時間就會很短。
curl -XPOST 'http://localhost:9200/_flush/synced?pretty'
此時,最好是執(zhí)行synced flush操作,因為我們最好是確保說flush操作成功了,再執(zhí)行下面的操作
如果flush操作報錯了,那么可以反復(fù)多執(zhí)行幾次
(3)關(guān)閉和升級所有的node
如果是將es 2.x版本升級到es 5.x版本,唯一的區(qū)別就在這里開始了,先將整個集群中所有的節(jié)點全部停止
將最新版本的es解壓縮替代之前的es安裝目錄之前,一定要記得先將plugins做個備份
將集群上所有node上的es服務(wù)都給停止,然后按照rolling upgrade中的步驟對集群中所有的node進(jìn)行升級
將所有的節(jié)點全部停掉,將所有的node全部替換為最新版本的es安裝目錄
(4)升級plugin
最新版的es解壓開來以后,就可以看看,可以去做一個plugin的升級
es plugin的版本是跟es版本相關(guān)聯(lián)的,因此必須使用elasticsearch-plugin腳本來安裝最新的plugin版本
(5)啟動cluster集群
如果我們有專門的master節(jié)點的話,就是那些將node.master設(shè)置為true的節(jié)點(默認(rèn)都是true,都有能力作為master節(jié)點),而且node.data設(shè)置為false,那么就先將master node啟動。等待master node組建成一個cluster之后,這些master node中會選舉一個正式的master node出來??梢栽趌og中檢查master的選舉。
只要minimum number of master-eligible nodes數(shù)量的node發(fā)現(xiàn)了彼此,他們就會組成一個cluster,并且選舉出來一個master。從這時開始,可以監(jiān)控到加入cluster的node。
依次將所有的node重新啟動起來
elasticsearch -d -Epath.conf=/etc/elasticsearch
如果是將es 2.x升級到es 5.x,記得將log4j.properties拷貝到你外部的目錄中去,而且還要重新做目錄的權(quán)限的更改
curl -XGET 'http://localhost:9200/_cat/health?pretty'
curl -XGET 'http://localhost:9200/_cat/nodes?pretty'
(6)等待cluster狀態(tài)變成yellow
只要每個ndoe都加入了cluster,就會開始對primary shard進(jìn)行receover過程,就是看有沒有數(shù)據(jù)在WAL日志中的,給恢復(fù)到內(nèi)存里。剛開始的話,_cat/health請求會反饋集群狀態(tài)是red,這意味著不是所有的primary shard都被分配了。
只要每個node發(fā)現(xiàn)了自己本地的shard之后,集群status就會變成yellow,意味著所有的primary shard都被發(fā)現(xiàn)了,但是并不是所有的replica shard都被分配了。
(7)重新啟用allocation
直到所有的node都加入了集群,再重新啟用shard allocation,可以讓master將replica分配給那些本地已經(jīng)有replica shard的node上。
curl -XPUT 'http://localhost:9200/_cluster/settings?pretty' -d '
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}'
cluster這個時候就會開始將replica shard分配給data node。此時可以恢復(fù)index和search操作,不過最好還是等待replica shard全部分配完之后,再去恢復(fù)讀寫操作。
我們可以通過下面的api來監(jiān)控這個過程
GET _cat/health
GET _cat/recovery
如果_cat/health中的status列變成了green,那么所有的primary和replica shard都被成功分配了