- 文章名稱:Elasticsearch Reference[2.2]
- 原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/2.2/setup-upgrade.html
- 譯者:code4j
升級(jí)
升級(jí)前請(qǐng)注意:
- 參考版本變化文檔。
- 升級(jí)前請(qǐng)?jiān)谠陂_發(fā)環(huán)境測(cè)試升級(jí)版本蜘澜。
- 升級(jí)前備份數(shù)據(jù)施流。不做備份的話是沒法回滾到上一版的。
Elasticsearch通潮尚牛可以使用滾動(dòng)升級(jí)步驟瞪醋,服務(wù)不會(huì)中斷。這章詳細(xì)介紹如何進(jìn)行滾動(dòng)升級(jí)和停機(jī)升級(jí)装诡。
當(dāng)前版本是否支持滾動(dòng)升級(jí)银受,請(qǐng)參照如下表格:
升級(jí)前 | 升級(jí)后 | 支持的升級(jí)方式 |
---|---|---|
0.90.x | 2.x | 停集群升級(jí) |
1.x | 2.x | 停集群升級(jí) |
2.x | 2.y | 滾動(dòng)升級(jí)(y>x) |
備份你的數(shù)據(jù)
升級(jí)之前請(qǐng)經(jīng)常做備份,這樣出了問題你可以回滾鸦采。升級(jí)有時(shí)候還包括Lucene版本升級(jí)宾巍,Lucene升級(jí)后更新的索引可能在原來版本的Elasticsearch上跑不起來。
備份1.0往后的版本
在1.0往后的版本做備份渔伯,使用快照這一特性會(huì)方便很多顶霞,詳細(xì)指示看這里:backup and restore with snapshots。
備份0.9及以前的版本
備份0.90.x版本步驟如下:
第一步:
下面這一步防止備份的時(shí)候索引刷新到磁盤:
PUT /_all/_settings
{
"index": {
"translog.disable_flush": "true"
}
}
第二步:
下面這步防止集群備份的時(shí)候锣吼,數(shù)據(jù)從一個(gè)節(jié)點(diǎn)平衡到另一個(gè)節(jié)點(diǎn)选浑。
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}
第三步:備份你的數(shù)據(jù)
等再平衡和索引刷新禁用后,用你喜歡的方法開始備份數(shù)據(jù)(打成tar包玄叠,使用存儲(chǔ)快照或者備份軟件)
第四步:重新打開再平衡和索引刷新
當(dāng)備份完成古徒,不需要再從Elasticsearch讀取數(shù)據(jù)后,必須要重新打開再平衡和索引刷新:
PUT /_all/_settings
{
"index": {
"translog.disable_flush": "false"
}
}
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}
滾動(dòng)升級(jí)
滾動(dòng)升級(jí)允許Elasticsearch集群一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)升級(jí)读恃,不需要停機(jī)隧膘。集群中不支持同時(shí)運(yùn)行多個(gè)版本代态,因?yàn)榉制粫?huì)從新版本分配到舊版本的節(jié)點(diǎn)上。
從這個(gè)列表中檢查當(dāng)前版本的ES是否支持滾動(dòng)升級(jí)疹吃。
滾動(dòng)升級(jí)步驟如下:
第一步:禁用分片再平衡
當(dāng)你關(guān)閉一個(gè)節(jié)點(diǎn)時(shí)蹦疑,分片分配進(jìn)程將分片從當(dāng)前節(jié)點(diǎn)復(fù)制到集群另一個(gè)節(jié)點(diǎn)上,這將會(huì)浪費(fèi)大量的I/O操作互墓”啬幔可以在關(guān)閉節(jié)點(diǎn)前禁用這個(gè)特性:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}
第二步:停止不必要的索引蒋搜,并執(zhí)行同步刷新(這一步可選)
你可以在升級(jí)期間愉快的進(jìn)行索引操作篡撵,當(dāng)然,如果你使用如下命令豆挽,停止不必要的索引育谬,并執(zhí)行同步刷新,分片恢復(fù)速度會(huì)更快:
POST /_flush/synced
同步刷新是錦上添花的操作帮哈。如果出現(xiàn)索引掛起的現(xiàn)象操作就會(huì)失敗膛檀,為了安全起見有必要多試幾次。
第三步:?jiǎn)蝹€(gè)節(jié)點(diǎn)停機(jī)并升級(jí)
升級(jí)前關(guān)閉一個(gè)節(jié)點(diǎn)娘侍。
注意:當(dāng)使用zip或tar包升級(jí)咖刃,默認(rèn)情況下Elasticsearch home目錄下的config,data憾筏,log嚎杨,plugins等目錄都會(huì)被覆蓋。
最好解壓到不同的目錄氧腰,這樣升級(jí)期間就不會(huì)刪除原來的目錄了枫浙。自定義的目錄可以通過path.conf和path.data來設(shè)置。
RPM或DEB包會(huì)把目錄放到 合適的位置古拴。
使用rpm/deb安裝包升級(jí):
- 使用
rpm
或dpkg
安裝新包箩帚,所有的目錄都會(huì)被放到合理的位置,配置文件不會(huì)被覆蓋黄痪。
使用zip或tar包解壓安裝:
- 解壓安裝包紧帕,確保不要覆蓋
config
和data
目錄。 - 從舊的安裝目錄拷貝
conf
目錄到新安裝目錄桅打,或者使用--path.conf
選項(xiàng)到外部的config目錄 - 從舊的安裝目錄拷貝
data
目錄到新的安裝目錄是嗜,或修改config/elasticsearch.yml
中的path.data
設(shè)置data目錄為原來的目錄。
第四步:?jiǎn)?dòng)升級(jí)過的節(jié)點(diǎn)
啟動(dòng)升級(jí)后的節(jié)點(diǎn)并確認(rèn)加入到集群中油额,可以通過日志或下面的命令來確認(rèn):
GET _cat/nodes
第四步:重新打開分片再平衡
當(dāng)節(jié)點(diǎn)加入集群后叠纷,使用以下命令重啟分片再平衡:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}
第六步:等待節(jié)點(diǎn)恢復(fù)正常
等待集群分片平衡結(jié)束后,再升級(jí)下一個(gè)節(jié)點(diǎn)潦嘶。這一過程可以使用下面的命令檢查:
GET _cat/health
等到status
這一列由yellow
變成green
涩嚣,Green表示主分片和副本都分配完了崇众。
重點(diǎn):滾動(dòng)升級(jí)過程中,高版本上的主分片不會(huì)把副本分配到低版本的節(jié)點(diǎn)航厚,因?yàn)楦甙姹镜臄?shù)據(jù)格式老版本不認(rèn)顷歌。
如果高版本的主分片沒法分配副本,換句話說如果集群中只剩下了一個(gè)高版本節(jié)點(diǎn)幔睬,那么節(jié)點(diǎn)就保持未分配的狀態(tài)眯漩,集群健康會(huì)保持yellow
。
這種情況下麻顶,檢查下有沒有初始化或分片分配在執(zhí)行赦抖。
一旦另一個(gè)節(jié)點(diǎn)升級(jí)結(jié)束后,分片將會(huì)被分配辅肾,然后集群狀態(tài)會(huì)恢復(fù)到green
队萤。
沒有使用同步刷新的分片恢復(fù)時(shí)間會(huì)慢一點(diǎn)。分片的狀態(tài)可以通過_cat/recovery
請(qǐng)求監(jiān)控:
GET _cat/recovery
第七部:重復(fù)上述步驟
當(dāng)集群穩(wěn)定并且節(jié)點(diǎn)恢復(fù)后矫钓,對(duì)剩下的節(jié)點(diǎn)重復(fù)上述過程要尔。
停集群升級(jí)
當(dāng)升級(jí)跨越大版本的Elasticsearch時(shí),需要停集群重啟:從0.x到1.x或1.x到2.x等新娜。滾動(dòng)升級(jí)不支持跨大版本的集群赵辕。
按照以下步驟進(jìn)行停機(jī)群升級(jí):
第一步:禁用分片分配
當(dāng)你關(guān)閉一個(gè)節(jié)點(diǎn)時(shí),分片分配進(jìn)程將分片從當(dāng)前節(jié)點(diǎn)復(fù)制到集群另一個(gè)節(jié)點(diǎn)上概龄,這將會(huì)浪費(fèi)大量的I/O操作还惠。可以在關(guān)閉節(jié)點(diǎn)前禁用這個(gè)特性:
PUT /_cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}
如果從0.90.x升級(jí)到1.x旁钧,使用以下配置:
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.disable_allocation": true,
"cluster.routing.allocation.enable": "none"
}
}
第二步:執(zhí)行同步刷新
停止不必要的索引吸重,并執(zhí)行同步刷新,分片恢復(fù)速度會(huì)更快:
POST /_flush/synced
同步刷新是錦上添花的操作歪今。如果出現(xiàn)索引掛起的現(xiàn)象操作就會(huì)失敗嚎幸,為了安全起見有必要多試幾次。
第三步:關(guān)閉并升級(jí)全部的節(jié)點(diǎn):
關(guān)閉集群全部節(jié)點(diǎn)的ES服務(wù)寄猩,每個(gè)節(jié)點(diǎn)使用和 滾動(dòng)重啟 一樣的方法升級(jí)每個(gè)節(jié)點(diǎn)嫉晶。
第四步:?jiǎn)?dòng)集群
如果你有專門的master節(jié)點(diǎn)群(master節(jié)點(diǎn)就是node.master為true并且node.data為false的節(jié)點(diǎn)),最好先啟動(dòng)它們田篇。等待它們形成集群并選舉出主節(jié)點(diǎn)替废。這個(gè)過程可以通過日志檢查。
一旦達(dá)到 最小可選舉主節(jié)點(diǎn)個(gè)數(shù)時(shí)泊柬,將會(huì)形成一個(gè)集群并選舉出主節(jié)點(diǎn)椎镣。然后就可以通過_cat/health
和 _cat/nodes
API監(jiān)控節(jié)點(diǎn)加入雞群的情況:
GET _cat/health
GET _cat/nodes
使用上述API檢查節(jié)點(diǎn)是否成功加入集群。
第五步:等待集群恢復(fù)至yellow
只要節(jié)點(diǎn)加入集群兽赁,節(jié)點(diǎn)上的主分片就開始在本地恢復(fù)状答。最初_cat/health
將會(huì)返回red
狀態(tài)冷守,表示有主分片還沒分配。
一旦每個(gè)節(jié)點(diǎn)的本地分片都恢復(fù)了惊科,狀態(tài)將會(huì)變成yellow
拍摇,表示所有的主分片都分配了,但并不是所有副本都有分配馆截。這就是期待的效果充活,畢竟分片平衡還被禁用中。
第六步:重啟平衡
延后副本分配蜡娶,直到所有節(jié)點(diǎn)都加入集群混卵,master就可以給本地已有分片拷貝的節(jié)點(diǎn)分配副本了。這時(shí)所有節(jié)點(diǎn)都在集群中翎蹈,可以安全得重啟分片平衡了淮菠。
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}
如果從0.90.x升級(jí)到1.x男公,使用以下配置:
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.disable_allocation": false,
"cluster.routing.allocation.enable": "all"
}
}
集群此時(shí)開始分配副本到所有節(jié)點(diǎn)荤堪,這時(shí)索引和搜索操作都是安全的了。但是如果你等恢復(fù)結(jié)束后再操作索引分片會(huì)恢復(fù)得快一點(diǎn)枢赔。
你可以通過 _cat/health
和 _cat/recovery
監(jiān)控這個(gè)過程
一旦_cat/health
返回結(jié)果的 status
列返回 green
澄阳,說明所有的主分片和副本都分配完畢。