Elasticsearch 高可用集群搭建

以下我们将基于 elasticsearch-6.6.0 版本,在单机上部署 3 个节点组成的集群。3个节点都用作候选主节点,且同时作为数据节点。

集群搭建

  1. 下载 elasticsearch-6.6.0 二进制包,解压,复制 3 份,分别命名为 es1, es2, es3。

  2. 分别修改 config/elasticsearch.yml 的配置,

es1 如下:

# 集群名称,相同集群的节点名称一致
cluster.name: my-application
# 节点名称
node.name: es1
# 数据存储路径
path.data: /path/to/es1/data
# 日志存储路径
path.logs: /path/to/es1/logs
# 是否用作候选主节点,默认为 true
node.master: true
# 是否用作数据节点,默认为 true
node.data: true
# HTTP 端口,提供 RESTful 服务交互
http.port: 5201
# TCP 端口,集群节点之间通信
transport.tcp.port: 5301
# 集群中相互通信的节点
discovery.zen.ping.unicast.hosts: ["localhost:5301","locahost:5302","locahost:5303"]
# 集群最小主节点个数
discovery.zen.minimum_master_nodes: 2

es2 如下:

# 集群名称,相同集群的节点名称一致
cluster.name: my-application
# 节点名称
node.name: es2
# 数据存储路径
path.data: /path/to/es2/data
# 日志存储路径
path.logs: /path/to/es2/logs
# 是否用作候选主节点,默认为 true
node.master: true
# 是否用作数据节点,默认为 true
node.data: true
# HTTP 端口,提供 RESTful 服务交互
http.port: 5202
# TCP 端口,集群节点之间通信
transport.tcp.port: 5302
# 集群中相互通信的节点
discovery.zen.ping.unicast.hosts: ["localhost:5301","locahost:5302","locahost:5303"]
# 集群最小主节点个数
discovery.zen.minimum_master_nodes: 2

es3 如下:

# 集群名称,相同集群的节点名称一致
cluster.name: my-application
# 节点名称
node.name: es3
# 数据存储路径
path.data: /path/to/es3/data
# 日志存储路径
path.logs: /path/to/es3/logs
# 是否用作候选主节点,默认为 true
node.master: true
# 是否用作数据节点,默认为 true
node.data: true
# HTTP 端口,提供 RESTful 服务交互
http.port: 5203
# TCP 端口,集群节点之间通信
transport.tcp.port: 5303
# 集群中相互通信的节点
discovery.zen.ping.unicast.hosts: ["localhost:5301","locahost:5302","locahost:5303"]
# 集群最小主节点个数,为了防止脑裂,最小主节点个数应该为(候选主节点个数 / 2 + 1)
discovery.zen.minimum_master_nodes: 2
  1. 分别启动 3 个节点
cd /path/to/es1
bin/elasticsearch -d
  1. 在浏览器中查看集群状态
查看集群状态

可视化管理

通过 elasticsearch-head 可以可视化的管理 es 集群。

elasticsearch-head 项目地址 http://mobz.github.io/elasticsearch-head

如果本地有 nodejs 环境,通过以下步骤安装 elasticsearch-head。

git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start

安装完成,在浏览器中访问 http://localhost:9100/

可视化集群管理

elasticsearch-head 在访问 es 实例 RESTful API 时会存在跨域问题,es 实例启动时,配置文件需要添加一下参数

http.cors.enabled: true
http.cors.allow-origin: "*"

基础操作

创建索引

PUT /my_index

{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  }
}

number_of_shards: 主分片数量,默认为 5
number_of_replicas: 分片副本数量,默认为 1

动态更新副本数量

PUT /my_index/settings

{
  "number_of_replicas": 1
}

高可用性验证

这里以另外一个真实在用的集群来演示集群的高可用性。

步骤一

  • 索引 app_jgus_ynapp_jgus 都是在单节点集群情况下创建的,默认主分片数量为 5,副本数量为 0。
  • 后来,集群扩展到 3 个节点,我为 app_jgus 动态更新了副本数量为 1。
  • 该集群处于 green 状态:
集群正常

步骤二

  • 集群中 es3 节点失败了,集群处于 red 状态,有主分片缺失,此时集群不可用。
  • app_jgus 索引的查询依然可以正常进行,因为 app_jgus 的每个主分片都有 1 个副本,剩余 2 个节点中保存有所有的索引数据。
  • 索引 app_jgus_yn 由于没有为主分片生成副本,随 es3 节点失败,缺少了 2 个主分片,缺失的分片数据将无法被操作。
集群中节点挂了

步骤三

  • 重启 es3 节点,刷新查看集群状态
节点 es3 恢复中
  • 最终,集群状态恢复为步骤一中的正常状态

步骤四

  • 为索引 app_jgus_yn 动态更新副本数量,将 number_of_replicas 设为 1,即每个主分片都有 1 份副本。
  • 每个分片都拥有了 1 份副本,集群处于 green 状态
动态修改副本数量

步骤五

  • 原主节点宕机,es3 被选为新的主节点。
  • 由于原来每个主分片,都有副本,虽然一个节点宕机了,但其他 2 个节点有所有的数据,依赖可以完成所有的数据操作。此时,集群状态为 yellow。
原主节点宕机,集群依然可以提供服务
  • 一段时间以后,新的集群将达到 green 状态
新的集群达到完美状态

步骤六

  • 恢复原节点,相当于在已经稳定的集群中再新增节点。
  • 集群将在新节点上分配数据,并最终达到新的 green 状态。
集群新增节点

问题排查记录

问题一

在集群搭建完成以后,创建索引过程中,遇到了数据分片 unassigned 的异常。大致情况如下:

分片 unassigned

查看分片 unassigned 原因

GET /_cluster/allocation/explain?pretty
查看分片 unassigned 的具体原因

这里是因为空间不够引起的。

解决方案是调整集群磁盘水印的参数。

PUT /_cluster/settings

{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.high": "95%",
    "cluster.routing.allocation.disk.watermark.low": "93%"
  }
}

问题二

集群搭建过程中,配置文件显式指定 transport.tcp.port ,但未显式设置 discovery.zen.ping.unicast.hosts 时,几个节点之间无法组成集群,各自独立。

我在配置时,3 个 es 节点的 transport.tcp.port 分别为 5301、5302、5303。当没有显式设置 discovery.zen.ping.unicast.hosts 时,会自动按照 9300、9301、9302 的端口顺序设置这个广播地址,因此无法与真实的实例端口通信。以上是我通过查看进程占用的端口得出的结论。

参考

谈一谈Elasticsearch的集群部署

ES集群的高可用

ElasticSearch高可用集群环境搭建和分片原理

如何在Elasticsearch中解析未分配的分片(unassigned shards)

Elasticsearch unassigned 故障排查

Elasticsearch 学习笔记 索引创建、插入、查询、修改、删除

如果你看完本文有收获,欢迎关注我的公众号:精进Java (craft4j)。这是一个专注 于Java 后端与架构内容学习分享的公众号。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容