【南京Meetup】苏宁Elastic平台化实践中踩过哪些坑,又是如何解决的?

  1. 云栖社区>
  2. Elasticsearch技术团队>
  3. 博客>
  4. 正文

【南京Meetup】苏宁Elastic平台化实践中踩过哪些坑,又是如何解决的?

黯灭_邓彬 2018-07-25 16:56:17 浏览2232

在南京 Elastic Meetup 南京交流会专场中,苏宁大数据平台搜索平台组的韩宝君为我们带来如何在大量的数据中发现数据的价值。从大数据平台的架构出发,详细解读了平台的概况和服务化平台的模块等方面的知识。最后,具体举出了在实践中出现的一些问题及对应的处理方案。
阿里云Elasticsearch 1核2G首月免费试用,开始云上实践吧
直播视频回顾
[PPT下载请点击]https://yq.aliyun.com/download/2885)
以下为精彩视频内容整理:

苏宁大数据平台总体架构

大数据平台职责是提供苏宁集团各个业务所需要的大数据存储和计算能力,保证平台的稳定、高效运行,高平台易用性。本文将从ES平台总体介绍、ES平台化之路、实战经验这三个方面来为大家详细解读。大数据平台分为服务层、计算层、存储层三个部分。服务层包括大数据管理平台、数据云、数据开发平台、机器学习、准实时计算、OLAP、实时计算等。ES位于计算层。

Elasticsearch平台概况

集群规模包括18个集群、195个节点、接入100+个业务、4500+个索引数据量64+TB;平台功能包括独占服务和共享服务、资源利用率和业务隔离的权衡;计量计费,强调成本概念;页面化服务增加了使用便利性,减少错误操作,节约时间。

为什么做ES平台?

在一年前四月份时的苏宁,ES没有被普遍使用,版本不统一,计算平台需兼容多版本ES业务自己管理,无专业团队维护,稳定性、性能无法保障,人力和物力方面存在资源浪费现象。所以为了解决这种混乱的状况,我们的目标是做一个专业的ES平台。
ES平台的发展主要经历两个阶段,人肉阶段与自动化阶段。人肉阶段包括人肉部署集群、人肉对接业务、人肉运维集群。自动化阶段包括自动化部署集群、申请服务页面化、计量计费功能、可用性、性能监控、安全增强、数据探查。人肉阶段的对接文档包括业务信息、项目信息、应用场景和数据量级(可知每天新增多少数据占多大存储)。下图讲述了数据的索引方式。

image001

服务化平台

服务化平台包括以下几个模块:
 监控管理:ES集群的各项监控指标展示。
 集群管理:支持多集群,可以查看具体集群信息和节点列表。
 项目管理:使用ES服务的项目列表,分配给各自系统的秘钥。
 资源管理:机器列表,该机器归属于哪些集群及部署哪些软件包。
 软件包管理:支持选择的ES版本相关软件包。
 索引管理:该系统下的索引列表,索引的详细信息。
 工单管理:用户可以提交相应的工单,管理员审批。
 计量管理:系统、集群、索引的请求量和存储量及详情。
 查询管理:可以像kibana一样查询ES。
其中最重要的是集群管理中的管理员可以添加黑名单和白名单。对于用户申请加入集群可以选择用户视图,然后等待管理员审批。在工单部分管理员可以看到新增字段、创建索引、创建集群等,管理员可以对其进行审批。然后进入到索引管理阶段,以申请索引为例,管理员可以根据申请情况进行下一步的监控处理。监控包括集群巡检、集群监控、节点监控、索引监控和线程池监控。由于集群数目众多,人工处理麻烦,所以我们会定期扫描处理。检查运行状况。
同时,还需要对用户进行计量管理。如下图所示可以对索引量进行管理。对于查询管理,用户只有查看权限、不能修改、删除。

image003

实战经验

我们在实践过程中遇到过许多问题,对此,我们是如何来解决呢?

问题一

一个简单的macth_all查询报如下错:
Caused by: org.elasticsearch.hadoop.rest.EsHadoopInvalidRequest: An HTTP lineis larger than 4096 bytes. (该错误表示http请求超过了ES的http请求长度限制)对于这个问题我们的解决方案是,修改elasticsearch-hadoop源码

  1. https://github.com/hanbj/elasticsearch-hadoop.git (hanbj_v5.4.2)
  2. Commits:An HTTP line is larger than 4096 bytes
    如需要进一步了解,详情见PR: https://github.com/elastic/elasticsearch-hadoop/pull/1154

问题二

线程池模块在处理header时有一点小问题。对于这个问题我们的解决方案是,修改elasticsearch源码。
如需要进一步了解,详情见PR: https://github.com/elastic/elasticsearch/pull/26068

问题三

创建一个Hive外部表指向ES中的某个索引,通过Hive HQL直接操作ES。当运行下面的HQL时,发现找不到数据。select from table_name where city_code in (‘010’, ‘791’);但是下面两条Hql都可以找到数据:select from table_name where city_code in (‘010’);select * from table_name where city_code in ('791'); 对于这个问题我们的解决方案是,修改elasticsearch-hadoop源码,

  1. https://github.com/hanbj/elasticsearch-hadoop.git (hanbj_v5.4.2)
  2. Commits:check cluster name and add SparkSession conf
    如需要进一步了解,详情见PR: https://github.com/elastic/elasticsearch-hadoop/pull/1135

问题四

Master选举修改,当集群规模越来越大,在高并发、高基数查询和高写入量并存场景下,节点负载高有时可能导致该节点脱离集群或者触发重新选举master,这两种情况下可能都会导致分片漂移,造成资源的浪费。对于这个问题我们的解决方案是,部分节点单机多实例部署、适量增大ping的超时时间、master、data、ingest节点分离(至少设置3个实例为master节点实现多可靠)、修改master选举算法(master节点成为master的优先级最高,其次是ingest节点做担保)如需要进一步了解,详情见:

  1. https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2)
  2. Commits:elect master ,include ingest node

问题五

目前有近20个ES集群,部分集群http端口一样。REST方式访问ES集群时,只要IP和端口配置正确,就可以进行访问对于这个问题我们的解决方案是:
修改elasticsearch-hadoop源码

  1. https://github.com/hanbj/elasticsearch-hadoop.git(hanbj_v5.4.2)
  2. Commits:check cluster name and add SparkSession conf,params append cluster.name 修改elasticsearch源码
  3. https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2)
  4. Commits:RestClient add check cluster name,
    RestClient add check cluster name (netty3)

具体访问集群方式改变成:见下图。

image005

问题六

黑白名单控制的问题。集群安全稳定至关重要,为了控制集群以外的机器对集群进行无效查询和攻击,所以应该支持动态允许/防止一些机器访问集群。对于这个问题我们的解决方案是,修改elasticsearch源码(支持IPv4、IPv6和通配符)

  1. https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2)
  2. Commits:black and white list
  3. 参数:都可动态修改
     http.filter.enabled

 transport.filter.enabled
 http.filter.allow
 http.filter.deny
 transport.filter.allow
 transport.filter.deny

问题七

在共享集群的模式下,频繁或大并发的导出操作,会给集群造成比较大的压力,导致该集群下其他业务的正常查询延迟。对于这个问题我们的解决方案是,修改elasticsearch源码,添加相应的控制参数,可以控制导出的并发量和数据量。

  1. https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2)
  2. Commits:limit scroll
  3. 参数:都可动态修改
     scroll.enabled

 scroll.interval
 scroll.concurrent.indices
 scroll.limit

问题八

目前的elasticsearch-hadoop版本不支持删除索引和数据,但业务有这方面的需求。对于这个问题我们的解决方案是,修改elasticsearch-hadoop源码,增加删除索引和根据query删除数据的逻辑。

  1. https://github.com/hanbj/elasticsearch-hadoop.git (hanbj_v5.4.2)
  2. Commits: delete index and delete by query

问题九

delete_by_query和update_by_query API 和其他API 格式不统一,容易对业务造成困扰。对于这个问题我们的解决方案是,修改elasticsearch源码

  1. https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2)
  2. Commits:delete by query,update by query

问题十

Transport模块有一个专用的跟踪记录器,当被激活时,记录传入和进出请求。可以使用一组通配符模式来控制哪些操作将被跟踪。默认情况下,每个请求将被跟踪,除了故障检测和ping。但是日志中并没有打印请求源,不方便进行追踪。我在ES的基础上增加了请求源IP、内部请求转发、请求发送、响应接收的详细日志。对于这个问题我们的解决方案是,修改elasticsearch源码,增加了请求源IP、内部请求转发、请求发送、响应接收的详细日志。

  1. https://github.com/hanbj/elasticsearch.git (hanbj_v5.4.2)
  2. Commits:请求追踪

问题十一

Gateway模块用于存储ES集群的MetaData。MetaData每一次改变(比如增加、删除索引等),都要通过Gateway模块进行持久化。当集群第一次启动的时候,这些信息就会从Gateway模块中读出并应用。状态文件存的都是二进制,不具备可读性。对于这个问题我们的解决方案是,修改elasticsearch源码,实现查看所有、全局、单个索引的状态文件内容。

阿里云Elasticsearch 1核2G首月免费试用,开始云上实践吧