摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!
  • ES 基础
  • ES 集群
  • ES 集群上业务优化

一、ES 基础

ES 的安装下载,网上一大片,我这边不在重复。可以看看我以前做的小笔记:

Spring Boot 2.0 M7 整合 ES 5 、Kibana 和 X-pack

其中 ES 三大要素:

  • 文档(Document)
    文档,在面向对象观念就是一个对象。在 ES 里面,是一个大 JSON 对象,是指定了唯一 ID 的最底层或者根对象。文档的位置由 _index、_type 和 _id 唯一标识。文档元数据:

    • _index :文档在哪存放
    • _type : 文档表示的对象类别
    • _id :文档唯一标识
  • 索引(Index)
    索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。比如项目索引命名为 project ,交易索引命名为 trade 等。
  • 类型(Type)
    类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如设计项目分为 ui 、 ux 这些类型。可以放在该类目进行区分。但一般操作,很少用到这么复杂的。

可见, _index 索引的重要性。避免某个索引存储不相关的数据。

二、ES 集群

ES 集群搭建,文章很多。我这边也不一一列举了。先看 ES 集群分布式图

集群(Cluster)

跟服务器集群类似,多个 ElasticSearch 运行实例(节点 Node)的组合体是 ElasticSearch 集群。

ElasticSearch 是天然分布式的,可以通过水平扩容为集群添加更多节点。

ElasticSearch 集群是去中心化的,只有一个主节点(Master)。而且主节点是动态选举,因此不会出现单点故障。

那节点是什么?

节点(Node)

上面说过,一个 ElasticSearch 运行实例就是节点。任何节点都可以被选举成为主节点。主节点负责集群内所以变更,比如文档的增加、删除等。所以集群不会因为主节点流量的增大成为瓶颈。因为任何节点都会成为主节点。

如图,P1 P2 P0 是节点内的主分片,其他 R 是副分片。

那分片是什么?

分片(Shard)

分片,是 ES 节点中最小的工作单元。分片仅保存全部数据的一部分。分片包括主分片和副分片,主分片是副分片的拷贝。主分片和副分片基本没有大的区别。

如果是全文搜索,会查询到每个分片,然后将每个分片的结果进行全局地收集,并处理返回。

举个例子:比如新建了一个索引 project , 存储项目相关的数据。那具体的某个 project A 的数据会被切分,存储在不同的分片上。那么根据 project A 的 _id 如何路由到具体的分片上呢?

分片的路由公式是这样的:

shard = hash(routing) % number_of_primary_shards
  • hash 函数生成数字,经过取余算法得到余数。余数就是分片的位置。
  • routing 是可变值,支持自定义。默认文档 _id
  • number_of_primary_shards 主分片的数量

三、ES 集群上业务优化

倘若如果刚刚那个例子,一个索引 project , 存储项目相关的数据。项目的数量级越来越大,亿量级,万亿量级。那一个大索引的查询啥的都会出现瓶颈。这时候该怎么优化呢?

这时候是不是想到了,一句常说的:空间换时间。
这时候是不是也想到了,MySQL 分库

所以大索引的拆分,也不是很难。类似分片的路由规则,根据具体业务指定即可。

这里,我们可以定义 1000 个索引,分别名为 project_1、project_2、project_3…

然后在 ES 集群上面架一层简单的 proxy 。里面核心的业务路由规则可以这样:

index_id = project_id % 1000
  • project_id 项目自增 ID
  • index_id 得出来的索引对应的 ID

总结一张图:

  • ES proxy 层:做总索引和真正分索引的映射
  • ES 索引配置管理:做索引与业务的映射
  • ES 集群:就是上面讲的

参考资料

  • https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-index-field.html

以下专题教程也许您会有兴趣

 
(关注微信公众号,领取 Java 精选干货学习资料) 
(添加我微信:bysocket01。加入纯技术交流群,成长技术)

ES 集群上,业务单点如何优化升级?的更多相关文章

  1. ES 集群调整、升级 最佳实践

    日常应用中我们会经常对es 集群做一些参数调整或者升级版本,但是每次关闭节点再打开 其中的数据同步的痛苦估计有很多人领悟过(有可能出现IO或者网络拥堵导致恶性循环)官网有套方案可以尝试一下: 1.关掉 ...

  2. es集群数据库~运维相关

    一 数据同步方案  1 ES-JDBC  不能实现删除同步操作.MYSQL如果删除,ES不会删除  2 logstash-input-jdbc  能实现insert update,但是仍然不能实现删除 ...

  3. elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)

    一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...

  4. ES 集群管理(集群规划、集群搭建、集群管理)

    一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...

  5. 磁盘空间引起ES集群shard unassigned的处理过程

    1.问题描述 早上醒来发现手机有很多ES状态为red的告警,集群就前几天加了几个每天有十多亿记录的业务,当时估算过磁盘容量,应该是没有问题的,但是现在集群状态突然变成red了,这就有点懵逼了. 2.查 ...

  6. 本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效)

    本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效) 随着业务量的增加,本地的ES集群服务器性能和磁盘空间有点不够使用,项目组考虑使用腾讯云服务器,以下是我测试的使用_reindex ...

  7. Spark学习之在集群上运行Spark

    一.简介 Spark 的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展程序的计算能力.好在编写用于在集群上并行执行的 Spark 应用所使用的 API 跟本地单机模式下的完全一样.也就是说 ...

  8. elasticsearch(es) 集群恢复触发配置(Local Gateway参数)

    elasticsearch(es) 集群恢复触发配置(Local Gateway) 当你集群重启时,几个配置项影响你的分片恢复的表现. 首先,我们需要明白如果什么也没配置将会发生什么. 想象一下假设你 ...

  9. Elasticsearch-6.7.0系列(二)ES集群安装与验证

    准备3台centos7机器/虚拟机,每台都安装上elasticsearch6.7.0 ,安装过程参考我的另一篇博客<Elasticsearch-6.7.0系列(一)9200端口 .tar.gz版 ...

随机推荐

  1. python笔记:#011#循环

    循环 目标 程序的三大流程 while 循环基本使用 break 和 continue while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 -- 从上向下,顺序执行 ...

  2. Github发现优秀的开源项目

    先上个大logo,哈哈. github上有非常多的资源,我们可以在github上搜索到非常多的开源项目.那么如何使用github查找资源? 罗列出一下几种方式. 1.Explore 登录GitHub, ...

  3. spring cloud 入门系列七:基于Git存储的分布式配置中心

    我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为 ...

  4. Python(1)

    Python 学习 Part1 1. 斐波那契数序列 >>> a,b=0,1 >>> a 0 >>> b 1 >>> while ...

  5. 一种轻量级的微信小程序日志监控的方法

    今天一个活动要写个H5,明天一个功能要用小程序,天天都在写bug.用户反馈小程序用起来有问题还特么还不知道到底出了啥bug,反馈多了,老板要扣工资了!看来挖了太多坑不填也不行,程序异常还是要主动追踪, ...

  6. 解决window.showModalDialog在Firefox无法支持

    在网页程序中,有时我们会希望使用者按下按钮后开启一个保持在原窗口前方的子窗口,而在IE中,我们可以使用showModalDialog来达成,语法如下 : vReturnValue = window.s ...

  7. linux 用户空间与内核空间——高端内存详解

    摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对 ...

  8. FMDB的简单实用

    一.FMDB 的框架引入点击此处去GitHub下载 二.FMDB 的优缺点 优点:使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了 ...

  9. Notify和NotifyAll的区别?

    Notify和NotifyAll都是用来对对象进行状态改变的方式,只是他们的作用域不太一样,从字面上就能看的出来,当对象被上锁之后,当其他的方法要去访问该对象中的数据,就需要该对象对其进行解锁,当然, ...

  10. DOS系统常用命令

    前言: DOS命令是DOS操作系统使用的命令.DOS操作系统是一种磁盘操作系统,从Windows95.98到今天的Windows10都内置有DOS操作系统.可以通过"win+R", ...