1 ES分布式机制的透明隐藏特性
ES本身就是一个分布式系统,就是为了处理海量数据的应用。ES隐藏了复杂的分布式机制,简化了配置和操作的复杂度。ES在现在的互联网环境中,盛行的原因,主要的核心就是分布式的简化。
ES隐藏的内容:分片机制、集群发现机制(cluster discovery)、shard负载均衡、shard副本、请求路由、集群扩容、shard重分配等。
如:分片机制-shard, 主分片 primary shard。不管多少个节点,也不管index创建的时候,分多少个primary shard,是否需要管理哪一个节点管理哪些shard?
如:shard负载均衡,在读写操作的时候,是否考虑过,本次操作在哪一个shard上执行?

2 ES的扩容
什么水平扩容?什么是垂直扩容?
水平扩容:就是如果资源不足的时候,添加新的资源。如:服务器能力不足,买新服务器,存储不足,买新的服务器。
垂直扩容:如果资源不足的时候,优化资源。如:服务器能力不足,替换新的更强的服务器。

2.1 水平扩容
增加新的集群节点,实现扩容。水平扩容方案使用的频率更高。

2.2 垂直扩容
替换集群节点硬件配置。在节点数量不变的情况下,实现扩容逻辑。垂直扩容有硬件瓶颈,且成本过高,相对使用的更少。

3 节点变化时的数据rebalance
在节点发生变化时,ES的cluster会自动调整每个节点中的数据,也就是shard的重新分配。这个过程就是rebalance。ES做rebalance,目的是为了提高性能。理论上,当数据量达到一定级别的时候,每个shard分片上的数据量是均等的。那么每个节点管理的shard数量是均等的情况,ES集群才能提供最好的服务性能。

4 master节点作用
现在不是讲如何配置master,是讲解master的功能。讲解master概念。
维护集群元数据的节点。如:索引的变更(创建和删除),对应的元数据保存在master节点中。
集群在默认配置中,会自动的选举出master节点。
master不是请求的唯一接收节点。只是维护元数据的特殊节点。不会导致单点瓶颈。
元数据是一个收集管理的过程。不是一个必要的不可替代的数据。Master如果宕机,集群会选举出新的master,新的master会在集群的所有节点中重新收集集群元数据并管理。

5 节点平等的分布式架构
节点平等 - 每个节点都能接收客户端请求。不会造成单点压力
自动请求路由 - 节点在接收到客户端请求时,会自动的识别应该由哪个节点处理本次请求,并实现请求的转发。
响应收集 - 在自动请求路由后,接收客户端请求的节点会自动的收集其他节点的处理结果,并统一响应给客户端。

6 并发冲突
ES是一个分布式的集群应用,是处理高并发环境的应用。有高并发,就可能有并发冲突问题。
如电商系统中的商品库存更新问题。

6.1 悲观锁
一般是关系型数据库中使用。控制并发执行数量。让每个单位时间中,只有一个线程控制一条数据。如:表级锁,行级锁,读锁,写锁等。

6.2 乐观锁
基于版本(时间戳)实现的数据控制方式。也就是在对数据实现写操作时,必须保证被修改数据的版本(时间戳)与读取时的版本(时间戳)完全一致。常使用于关系型数据库、分布式数据存储应用、数据缓存服务器等。在ES中通常使用乐观锁机制控制并发访问冲突问题。
select xxx from table where xxxxxxx
update table set xxx=new_value, version = new_version where id=? and version=上一次查询到的数据

6.2.1 测试内置_version
案例数据:

GET products_index/phone_type/1

{
"_index": "products_index",
"_type": "phone_type",
"_id": "1",
"_version": 1, # 元数据 version。 版本信息。 默认是ES控制。每次写操作,版本自增1。删除也是写操作。
"found": true,
"_source": {
"name": "IPHONE 8",
"remark": "64G",
"price": 548800,
"producer": "APPLE",
"tags": [
"64G",
"red color",
"Nano SIM"
]
}
}

  

全量替换(乐观锁):乐观锁的使用,就是通过参数version。ES会检查请求中的version和存储中的version是否相等。如果不相等报错,如果相等,修改。

PUT /products_index/phone_type/1?version=2
{
"name" : "iphone x",
"remark" : "256G",
"price" : 899900,
"producer" : "apple",
"tags" : [ "256G" ]
}

  

6.2.2 测试external version
ES提供了一个feature,就是可以自定义version实现ES内置的_version元数据版本管理功能。与元数据_version的区别是:元数据比对必须完全一致;而external version必须比元数据_version数据大。
external version版本控制特点:要求提供的version数据必须比元数据_version大。在更新成功后,ES中记录的元数据_version修改为提供的external version数据值。
案例数据:

GET products_index/phone_type/1

{
"_index": "products_index",
"_type": "phone_type",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"name": "iphone x",
"remark": "256G",
"price": 899900,
"producer": "apple",
"tags": [
"256G"
]
}
}

  

元数据_version修改:

PUT /products_index/phone_type/1?version=3
{
"name" : "iphone x",
"remark" : "256G",
"price" : 899900,
"producer" : "apple",
"tags" : [ "256G" ]
}

  

external version修改:

PUT /products_index/phone_type/1?version=5&version_type=external
{
"name" : "iphone x",
"remark" : "256G",
"price" : 899900,
"producer" : "apple",
"tags" : [ "256G" ]
}

  

6.2.3 测试partial update乐观锁
在ES中,使用partial update更新数据时,ES内部自动使用乐观锁控制数据的并发安全。如果出现数据冲突(版本不一致)的时候,ES会提示更新失败。可以通过命令中的参数实现手工管理乐观锁。在ES中,retry_on_conflict和version参数不能同时使用。因为ES中的partial update本身自带乐观锁控制。所以,如果再传递一个version参数,是有底层控制冲突的。
使用参数retry_on_conflict,自动重试多次,实现乐观锁控制。

POST /products_index/phone_type/1/_update?retry_on_conflict=3
{
"doc": {
"price" : 2999900
}
}

  

使用参数version,指定版本的乐观锁控制

POST /products_index/phone_type/1/_update?version=5
{
"doc": {
"price" : 999900
}
}

  

Elastic Search 分布式架构分析的更多相关文章

  1. 分布式MySQL数据库TDSQL架构分析

    摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TD ...

  2. 分布式搜索引擎Elasticsearch的架构分析

    一.写在前面 ES(Elasticsearch下文统一称为ES)越来越多的企业在业务场景是使用ES存储自己的非结构化数据,例如电商业务实现商品站内搜索,数据指标分析,日志分析等,ES作为传统关系型数据 ...

  3. Elastic Search 上市了,市值翻倍,这群人财务自由了!

    国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约证券交易所上市了! 当说到搜索时,大部分 ...

  4. Flickr 网站架构分析

    Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...

  5. 分库分表后跨分片查询与Elastic Search

    携程酒店订单Elastic Search实战:http://www.lvesu.com/blog/main/cms-610.html 为什么分库分表后不建议跨分片查询:https://www.jian ...

  6. 万字长文:ELK(V7)部署与架构分析

    ELK(7版本)部署与架构分析 1.ELK的背景介绍与应用场景 在项目应用运行的过程中,往往会产生大量的日志,我们往往需要根据日志来定位分析我们的服务器项目运行情况与BUG产生位置.一般情况下直接在日 ...

  7. 深入分析Elastic Search的写入过程

    摘要 之前写过一篇ElasticSearch初识之吐槽,不知觉竟然过去了两年了.哎,时光催人老啊.最近又用到了ES,想找找过去的总结文档,居然只有一篇,搞了半年的ES,遇到那么多的问题,产出只有这么点 ...

  8. Elastic Search快速上手(1):简介及安装配置

    前言 最近开始尝试学习Elastic Search,因此决定做一些简单的整理,以供后续参考,快速上手使用ES. 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多 ...

  9. elastic search&logstash&kibana 学习历程(一)es基础环境的搭建

    elastic search 6.1.x 常用框架: 1.Lucene Apache下面的一个开源项目,高性能的.可扩展的工具库,提供搜索的基本架构: 如果开发人员需用使用的话,需用自己进行开发,成本 ...

随机推荐

  1. 在iOS开发中使用icon font的方法

    http://iconfont.cn/help/iconuse.html 在开发阿里数据iOS版客户端的时候,由于项目进度很紧,项目里的所有图标都是用最平常的背景图片方案来实现.而为了要兼容普通屏与R ...

  2. No hash for parcel CDH-XXX.parcel.torrent

    在安装 CDH 时,到 Install Parcels 这一步,分发 Parcels 一直过不去,界面一直报 Failure due to stall on seeded torrent,查看日志一直 ...

  3. mysql数据库索引和引擎

    1. 数据库索引 1.1 索引作用 当我们在数据库表中查询数据时,若没有索引,会逐个遍历表格中的所有记录,表格中数据记录量大时很耗时.建立索引就像创建目录一样,直接通过索引找到数据存储位置,加快查找. ...

  4. Mac下持续集成-Mac下Tomcat+Jenkins集成环境搭建

    一.MAC安装jdk及环境变量配置 1)访问Oracle官网 http://www.oracle.com,浏览到首页的底部菜单 ,然后按下图提示操作: 2)下载完成后点击安装包,按提示即可完成安装. ...

  5. linux下如何单独编译设备树?

    答: make <vendor>/<device_name>.dtb 如: make freescale/fsl-1043a-rdb.dtb

  6. handler定义

    Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中来接收.处理该消息,以避免直 ...

  7. UML分类

    类型                       静态图                     行为图                用例图                  交互图         ...

  8. Qt编写数据可视化大屏界面电子看板2-配色方案

    一.前言 做完整个数据可视化大屏界面电子看板系统后,为了提升点逼格,需要提供好几套默认的风格样式以供选择,这样用户可以选择自己喜欢的配色方案来作为整个系统的颜色方案,去看了下市面上大部分的大屏电子看板 ...

  9. 九十二:CMS系统之cms后台登录界面

    html <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="ut ...

  10. DRF之APIView源码解析

    目录 Django项目中的代码如下 APIView源码解析 源码解析总结 Django项目中的代码如下 urls.py中: from django.conf.urls import url from ...