ELK 性能(2) — 如何在大业务量下保持 Elasticsearch 集群的稳定

介绍

如何在大业务量下保持 Elasticsearch 集群的稳定?

内容

当我们使用 Elasticsearch 时,期望获得的是

  • 集群的问题
  • 快速的搜索

设想我们有一个论坛的数据需要索引存储到 Elasticsearch 里

  • 每个用户的个人信息
  • 讨论与评论
  • 以及用户形成的组与圈子
Server 1 Server 2 Server 3
C-D-(M) C-D-M* C-D-(M)

对于以上每个服务器 1、2、3:

CPU: 10 phyical cores @ 2.80GHz
RAM: 256GB or more ...
Disques: SSD 300GB or more ...
C  = Client
D = Data
M* = Elected Master
M = Eligible as Master

峰值出现在下午 5 点,有 75% 的用户同时在线,操作包括:

  • 发布与评论
  • 搜索讨论与文件
  • 个人信息的更新
  • 创建与加入新的组或圈子
  • 加入感兴趣的话题并讨论

下午 5 点发生了什么?

  • 堆内存骤然升高
  • 由于 CPU 的占用提升,GC 增加

为了解决这样类似的问题,我们需要改变底层的架构以及请求方式。

多米诺效应

Server 1 Server 2 Server 3
C-D-(M) C-D-M* (不可用) C-D-(M)

如果当前节点是主节点,当 JVM 在几秒内无法响应时,会发生新的选举。而相同的问题在新的主节点选举完成后立即会发生,这会导致集群不稳定。

** 即使宕机的不是主节点,再平衡也需要花时间,同时也会给集群带来压力

解决方案

分而治之

容量大的堆在进行垃圾回收时需要的时间更长,这个缺点也是导致集群不稳定的原因

虚拟化

  • 不要为堆分配
  • 设置 cluster.routing.allocation.same_shard.host

如何组织这些节点?

  • 主节点:

    • 主节点管理并反映一个集群的真实状态。
  • 客户端节点:(只为客户端节点开放 HTTP)

    • 客户端节点将数据节点保护在防火墙之后,只有客户端节点可以被外部访问。

    • 客户端节点知道数据存储的位置,并且可以查询正确的片(shard)归并结果并返回。

  • 数据节点:

    • 只有数据节点存储数据,用它们来索引并搜索。

** 不要使用主节点作为客户端,因为在大量聚合、排序以及需要大量计算的脚本执行时,会导致节点的状态不稳定。

小技巧

  • 将最小节点的数量(minimum number of eligible nodes)设置为 2 ,这样当节点丢失一个主节点时,整个集群还可以正常工作。
  • 为了让 Elasticsearch 能够平滑的运作,不要将所有的系统内存都分配给 JVM :需要可用的内存让文件系统缓存使用,这样磁盘存取会更快。
  • 为特定的主节点分配较小的堆(例如,1GB 可能就足够了),这样它们就不会因为 GC 的停顿受到很大影响。

如何计算分片(shard)大小?

由场景决定。

保持分片(shard)的平衡

  • 在以上的场景中,我们会保持每个分片(shard)大小在 1 到 4GB ,这样查询速度会比较快,在重启或者节点宕掉的时候分片重排也会比较快。

    分片必须足够小,让硬件可以有能力处理。分片本身的大小并不受技术的限制,它受硬件的限制。

  • 当分片增长到很大时,我么可以选择为 Elasticsearch 重建整个索引并设置更多的分片,可以进行横向扩展,或者根据(时间段,用户)拆分索引。

    注意,一旦需要处理很多分片,需要在数据分布与协调各个分片的代价中做权衡。

参考

参考来源:

2016.4 Camilo Sierra - How to get a stable Elasticsearch cluster in high traffic website

结束

ELK 性能(2) — 如何在大业务量下保持 Elasticsearch 集群的稳定的更多相关文章

  1. centos7下部署elasticSearch集群

    OS:Centos7x虚拟机 1H2Gjdk:1.8elasticsearch:5.6.0 单节点配置请参考:centos7下elasticSearch安装配置 配置master节点 # 在配置文件的 ...

  2. 在centos7使用docker下搭建elasticsearch集群

    一 .docker的安装 https://www.cnblogs.com/ghostdot/p/12410242.html 二.创建相关映射文件 cd /home/ mkdir node cd nod ...

  3. Windows下搭建elasticsearch集群案例

    https://blog.csdn.net/u014236259/article/details/64129918

  4. ELK 性能(4) — 大规模 Elasticsearch 集群性能的最佳实践

    ELK 性能(4) - 大规模 Elasticsearch 集群性能的最佳实践 介绍 集群规模 集群数:6 整体集群规模: 300 Elasticsearch 实例 141 物理服务器 4200 CP ...

  5. ELK 性能(3) — 在 Docker 上运行高性能容错的 Elasticsearch 集群

    ELK 性能(3) - 在 Docker 上运行高性能容错的 Elasticsearch 集群 介绍 在 Docker 上运行高性能容错的 Elasticsearch 集群 内容 通常熟悉的开发流程是 ...

  6. 大流量下的 ElasticSearch 搜索演进

    这是泥瓦匠(bysocket.com)的第27篇精华分享 ES (ElasticSearch)是分布式搜索引擎.引擎太晦涩,其实类似一个 MySQL ,一个存储.方便提供下面功能: 近实时搜索 全文检 ...

  7. Elasticsearch学习总结 (Centos7下Elasticsearch集群部署记录)

    一.  ElasticSearch简单介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...

  8. 【ELK】【docker】6.Elasticsearch 集群启动多节点 + 解决ES节点集群状态为yellow

    本章其实是ELK第二章的插入章节. 本章ES集群的多节点是docker启动在同一个虚拟机上 ====================================================== ...

  9. linux下配置tomcat集群的负载均衡

    linux下配置tomcat集群的负载均衡 一.首先了解下与集群相关的几个概念集群:集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台.在客户端看来,一个集群就象是一个服 ...

随机推荐

  1. [BeiJing2006]狼抓兔子

    题面 一眼看就是最小割板子题,建图也很直观,注意每一条边建双向边其实不用建4条边,只要反向边的容量和正边相同就行.然后直接跑最大流板子就行.不过此题拿vector存图会MLE……而拿链前存图就能卡过去 ...

  2. 网络嗅探与欺骗(FTP部分)——P201421410029

    第三部分 FTP协议分析 1. 两个同学一组,A和B. 2.A同学架设FTP服务器,并设置用户名和密码,例如wbx /wbx 3.B同学在机器中安装Wireshark,并将其打开:之后用用户名和密码登 ...

  3. 装饰器 python 你也可以叫语法糖

    1.最简单的装饰器不带入参 def  func(): pass def  decorate(func) def wrapper(): return func() return wrapper 使用 @ ...

  4. SQL Prompt 智能提示插件

    1.安装及破解参照地址:http://jingyan.baidu.com/article/a3a3f811da2b3a8da3eb8a4b.html 2.安装包下载: 1)下载 2)http://do ...

  5. Android解决Intent中的数据重复问题

    转载地址:http://www.cnblogs.com/anrainie/articles/2383941.html 最近在研究Android,遇到了一些Notification(通知)的问题: .N ...

  6. Android漏洞——将Android恶意代码隐藏在图片中

    研究人员发现了Android上又一个严重的安全漏洞:将Android恶意代码隐藏在图片中(Hide Android Applications in Images). 在该漏洞向外界公开之前,Googl ...

  7. 【php增删改查实例】第一节 - PHP开发环境配置

    最近需要使用PHP,于是把平时的积累整理一下,就有了这个教程. 首先是环境配置: 1.操作系统:windos7 2.后台:PHP 3.前台:Html + js + css 4.数据库:MYSQL 5. ...

  8. 对JSON传递图片Base64编码的一点总结

    项目中跟Java对接的时候需要传输图片,经过Base64编码后传输的. 但是实际调试的时候发现Java那边始终无法正常解析出图片. 冷静想想之后,发现问题在于使用OpenCV读取图片,编码的是Mat: ...

  9. 利用Kinect实现用指尖隔空控制鼠标(源码放出)

    简介 此程序为利用Kinect实现用手指隔空控制鼠标,是我另一个项目的一部分,因为在另外那个项目中鼠标的click是通过一种特殊的方式实现的,因此这个程序只实现了用手控制鼠标的移动,并没有点击的功能. ...

  10. 使用ClosedXML,读取到空行

    最近项目中使用了ClosedXML.dll来处理Excel,在读取Excel的时候,用workSheet.Rows()获取Excel行数,默认读取Excel最大行数1048576 所以为了读取到不是空 ...