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. php原生导出简单word表格(TP为例) (原)

      后台: # 菲律宾名单word导出 public function export_word(){ $tids = $_GET['tids']; $userinfo=M("philippi ...

  2. 修改checkbox样式-1

    说明 使用伪类来对复选框进行样式修改.以下以最简单的一个样式修改为实例进行说明. 步骤介绍: 将一个label与复选框进行绑定,将两者放在同一个div下 调整 label的外部样式使其作为复选框的外形 ...

  3. linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池

    最近测试环境上测试的项目通过shutdown.sh始终无法彻底关闭. 之前临时解决方法两种: 第一:通过ps -ef|grep tomcat查看到tomcat的进程直接使用kill来杀死进程. 第二: ...

  4. webpack4 打包 library 遇到的坑

    output: { publicPath: '/', path: path.join(__dirname, 'lib'), filename: 'chart.js', library: 'tchart ...

  5. FreeMarker学习(内建函数参考)

    内容参考:http://freemarker.foofun.cn/dgui_quickstart_basics.html 一.字符串内建函数 boolean: 字符串转为布尔值.字符串必须是 true ...

  6. curl 使用笔记

    一.使用案例 curl -H "cookie:userName=shangyy" www.baidu.com 二.使用 1.从Netscape的网页服务器上获得该网站的主页: cu ...

  7. SpringCloud(四)之Netflix开源组件断路器Hystrix介绍

    一.前言? 1.Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种 ...

  8. 系统调用与内存管理(sbrk、brk、mmap、munmap)(转)

    一.系统调用(System Call):在Linux中,4G内存可分为两部分——内核空间1G(3~4G)与用户空间3G(0~3G),我们通常写的C代码都是在对用户空间即0~3G的内存进行操作.而且,用 ...

  9. linux 基础学习常见问题

    1.当命令行还在运行不能输入任何东西时,按ctrl+c       停掉那个正在运行.

  10. 一百一十七:CMS系统之注册页面对接短信验证码

    from flask import Blueprint, requestfrom exts import alidayufrom utils import restfulfrom utils.capt ...