1、Elasticsearch的数据组织架构



1.1、Elasticsearch结构概念


  • 集群(cluster):拥有相同cluster-name的elasticsearch结点的集合(每个结点其实就是一个elasticsearch进程实例)。
  • 节点(node):集群中的一个 Elasticearch 实例。
  • 索引(index):相当于关系型数据库中database的概念,比如2018.01.01日志的IDS日志单独形成一个索引,IDS-2018.01.01,这是一个逻辑的概念。
  • 分片(shared):
    • 主分片(primary shared):索引的子集,索引可以切分成多个分片,分布到不同的集群节点上。
    • 副本(replica shared):一个主分片可以有一个或多个副本分片作为备份。
  • 类型(type),相当于关系型数据库中table的概念。比如IDS-2018.01.01中的warnning.log
  • 文档(document),相当于一条数据的原始数据的集合,一般就是一条JSON。
  • 字段(field),JSON中的某个字段值。

    从索引到后面都是组织数据的结构概念,分片(无论主副)可以自由分布在集群中的不同结点上,也不关系结点的主副概念(master-cluster和slave-cluster)。

1.2、创建索引时,如何分配主从分片等的配置


一般使用elasticsearch-head创建分片时,默认分片数5、副本数1(意思是每个分片一个副本),分片数创建后不可修改,副本数可修改,数量按需要配置。注意:一个shared的主分片和副本不能放在同一个结点上,否则结点故障的容错机制(数据冗余备份)将失去效果。

1.3、分片的路由计算


公式如下:

shared = hash(_id) %number_of_primary_shareds

一般情况下是对_id字段进行hash处理后对主分片数目求余得到该条数据具体应该写入那个分片。

1.4、主副分片保障数据一致性


默认情况下,数据写入主分片后,会给所有副本发送方消息,当有一个副本也成功写入数据后,及返回数据写入成功。如需要修改可以如下修改配置

?consistency=all

1.5、分片的分配


一般是Elasticsearch自动进行,一些参数可以控制该过程的

cluster.routing.allocation.enable #可以分配那些分片,默认是all,none是彻底拒绝,其他选项有primaries和new_primaries。
cluster.routing.allocation.allow_rebalance #默认是indices_all_active,就是等待所有分片启动后,开始负载均衡,不然启动过程中浪费太多流量。
cluster.routing.allocation.cluster_concurrent_rebalance #默认是两个,含义是并发负载均衡任务数量,当结点数目增加,且负载压力不大的条件下,可适当增加。
cluster.routing.allocation.node_initial_primaries_recoveries #结点重启时,允许同时恢复的主分片数,默认是4个,如果结点是多磁盘,且I/O压力不大时,可以适当增加。
cluster.routing.allocation.node_concurrent_recoveries #除主分片重启恢复意外的情况下,可以同时运行的数据恢复业务,默认是2个。
indices.recovery.concurrent_stream #网络复制恢复分片时候的流数,默认是3个。
indices.recovery.max_bytes_per_sec #结点恢复时候的速率,默认40MB,建议加大。

1.6、自动发现配置


  • 组播方式 223.2.2.4 54328 发送clustername信息
  • 单播方式

1.7、其他配置项


?timeout=30s #默认60s,含义是Elasticsearch等待异常结点是否可以恢复的等待时间。

2、Elasticsearch的数据写入和检索以及数据防丢失机制



2.1、数据写入流程


内存buffer->segment->磁盘

segment可以理解为一个倒排索引的子集,举例如下:

doc1:"tom","jill"
doc2:"tom"

倒排索引如下表

字段/文档 doc1 doc2
tom x x
jill x

2.2、segment的机制


  • 写盘机制:一个segment刷到缓存中,Lucene可以去检索,等到segment真的写到磁盘去了,commit文件更新,commit可以理解为segment的目录表,刷新(refresh)时间默认是1s,基本属于准实时检索。
  • 归并机制:segment太多,不利于系统和性能,会归并。

2.3、写盘和归并的配置


#修改refresh时间 ,设置成-1,则停止refresh
curl -XPOST http://127.0.0.1:9200/IDS-2018.01.01/_settings -d '{"refreah_interval":"10s"}'
#修改归并配置
curl -XPOST http://127.0.0.1:9200/IDS-2018.01.01/_settings -d '{"persistent":{"key-name":"value"}}'
#归并配置选项
indices.store.throttle.max_bytes_per_sec #归并线程限速配置,默认20M,建议迁移到100M或更高。
index.merge.policy.floor_segment #默认2M,小于这个大小的segment,优先归并。
index.merge.policy.max_merge_at_once #默认一次最多归并10个segment。
index.merge.policy.max_merge_at_once_explicit #默认optimize时候,一次最多归并20个segment。
index.merge.policy.max_merge_segment #默认5GB。归并后的segment的大最大大小。

2.4、translog磁盘同步

磁盘写入等待缓存一起写,记录数据信息,如果出现异常,会按照这个文件恢复数据,但是这个数据5s写一次,所以还是有可能丢失5s的数据。如果需要,可以调小这个时间间隔:

index.gateway.local.sync

默认30分钟、或者满512M才会清空。(或者确实写入磁盘,commit文件确认了,translog才会清空flush,)

ELK系列二:Elasticsearch的架构原理和配置优化的更多相关文章

  1. 【分布式搜索引擎】Elasticsearch分布式架构原理

    一.相关概念介绍 1)集群(cluster) 一个集群(cluster)由一个或多个节点组成. 这些节点具有相同的cluster.name,它们协同工作,分享数据和负载.当加入新的节点或者删除一个节点 ...

  2. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

  3. ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解

    前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...

  4. kafka系列四、kafka架构原理、高可靠性存储分析及配置优化

    一.概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...

  5. Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务

    一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2  应用服务和数据服务拆分  特点:App.DB.Fi ...

  6. Elasticsearch的架构原理剖析

    Elasticsearch 是最近两年异军突起的一个兼有搜索引擎和NoSQL数据库功能的开源系统,基于Java/Lucene构建.Elasticsearch 看名字就能大概了解下它是一个弹性的搜索引擎 ...

  7. ELK系列(4) - Elasticsearch cannot write xcontent for unknown value of type class java.math.BigDecimal

    问题与分析 在使用Elasticsearch进行index数据时,发现报错如下: java.lang.IllegalArgumentException: cannot write xcontent f ...

  8. 软件架构系列二:Clean架构

    外圈的层次可以依赖内层,反之不可以:内圈核心的实体代表业务,不可以依赖其所处的技术环境. 这是著名软件大师Bob大叔提出的一种架构,也是当前各种语言开发架构.干净架构提出了一种单向依赖关系,从而在逻辑 ...

  9. ELK系列(3) - Elasticsearch修改jvm参数

    方法 Elasticsearch默认会配置1G的JVM堆的初始值和最大值,该jvm参数被配置在/config/jvm.options里: -Xms1g -Xmx1g 如果只是个人开发小项目,可以把参数 ...

随机推荐

  1. utf16编码格式

    UTF-16是Unicode字符集的一种转换方式,即把Unicode的码位转换为16比特长的码元串行,以用于数据存储或传递.UTF-16编码规则如下: 2.2.1 从U+D800到U+DFFF的码位( ...

  2. 前端Table数据导出Excel使用HSSFWorkbook(Java)

    一.实现原理: 1. 前端查询列表数据并渲染至table(<table>...</table>)表格 2. 表格html代码传输至后台 3. 后台把html转成Excel输出流 ...

  3. JSP内置对象—session

    什么是session? session对象是用来在每个用户之间分别保存每个用户信息的对象,以便跟踪用户的操作状态.session的信息保存在server端,session的id保存在client的co ...

  4. Objective-C语法之扩展(Extension)的使用

    Objective-C 2.0增加了Class Extension用于解决两个问题: 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读.私有可读写的属性 可声明私有方法: ...

  5. Loadrunner对https协议(单双向SSL)的web端性能测试

    1.项目背景 1.1 单双向SSL的含义及部署 单向SSL即我们说到的https协议. 特点是,浏览器需要请求验证服务器证书: 基本含义是:一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务 ...

  6. CSS 文本缩进,行间距

    文本缩进:text-indent:2.0em; 行间距:line-height:1.5em;

  7. 将windbg设置为默认调试器命令

    前提条件:安装好windbg软件(默认安装位置) 以截取组态王运行系统崩溃为例: 64位系统0.文件更新替换 将Touchvew.exe以及Touchvew.pdb覆盖替换C:\Program Fil ...

  8. 【转载】springboot + swagger

    注:本文参考自 http://www.jianshu.com/p/0465a2b837d2 https://www.cnblogs.com/java-zhao/p/5348113.html swagg ...

  9. jQuery Colorbox弹窗插件使用教程小结、属性设置详解以及colorbox关闭

    jQuery Colorbox是一款弹出层,内容播放插件,效果极佳,当然我主要是用来弹出图片啦. jQuery Colorbox不仅有弹性动画效果,淡入淡出效果,幻灯片播放,宽度自定义,还能够ajax ...

  10. Exception occurred while processing this request, check the log for more information!安装ActiveMq-5.14.1 配置安全验证报错解决

    安装ActiveMq-5.14.1  并配置了安全验证成功后,客户端也连接成功了.服务端也能通过http://IP:8161登录到控制台. 但是在点击队列,想要查看队列视图时报错,如下图: 查看日志发 ...