ElasticSearch之二——集群
ElasticSearch 集群
首先看下ElasticSearch(ES)的架构:
术语解释:
- cluster:代表一个集群,集群中有多个节点,其中有一个master节点,master通过选举自动产生;
- shards:代表索引分片,ES可以把一个完整的索引分成多个分片,并将它们分布到不同的节点上,从而构成分布式索引;
- replicas:代表索引副本,副本可以保证系统的高可用性,当某个节点的某个分片损坏时可以从副本中恢复,此外,多个分片副本还可以起到负载均衡的作用;
- recovery:代表数据恢复,ES在有节点加入或退出时会根据机器的负载对索引分片进行重新分配;
- river:代表ES的一个数据源,它是以插件方式存在的一个ES服务,通过读取river中的数据并把它索引到ES中,官方的river有couchDB、RabbitMQ、Kafka、 Wikipedia等;
- geteway:代表ES索引快照的存储方式,ES默认是把索引存放到内存中,当内存满了再持久化到磁盘。geteway对索引快照进行存储,当这个集群关闭再重新启动时就会从geteway中读取索引备份数据。ES支持多种类型的gateway,如本地文件系统(默认),分布式文件系统(HDFS);
discovery.zen,ES自动发现节点的机制,ES是一个基于P2P协议的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互;
- transport,代表ES内部节点之间或集群与客户端的交互方式,默认使用TCP协议,同时支持HTTP协议(json格式)、thrift、servlet、zeroMQ、memcached等传输协议(通过插件方式集成);
ES的分布式操作大多是自动完成的:
1、跨节点平衡集群中各节点的索引与搜索负载;
2、自动复制索引数据以提供冗余副本,防止硬件错误导致数据丢失;
3、自动在节点之间路由,以帮助找到检索的数据;
4、无缝扩展或者恢复集群;
node(节点)是ES运行中的实例,一个或多个具有相同cluster.name的节点构成一个cluster(集群),它们协同工作,共享数据,并共同分担工作负载。
集群中的一个节点会被选为master,它将负责管理集群范畴的变更,例如创建或删除索引,在集群中添加或删除节点,但master无需参与文档层面的变更和搜索,这意味着仅有一个master并不会因流量增长而成为瓶颈。
作为用户,我们可以访问包括master在内的集群中的任一节点,每个节点都知道各个文档的位置,并能够将我们的请求直接转发到拥有我们想要的数据的节点,无论我们访问的是哪个节点它都会控制从拥有数据的节点收集响应的过程,并返回给客户端最终的结果,这一切都是由ES透明管理的。
1、添加索引
在ES中,分片用来分配集群中的数据。把分片想象成一个数据的容器。数据被存储在分片中,然后分片又被分配在集群的节点上。当你的集群扩展或者缩小时,elasticsearch会自动的在节点之间迁移分配分片,以便集群保持均衡。
分片分为 主分片(primary shard) 以及 从分片(replica shard) 两种:
- 主分片,在你的索引中,每一个文档都属于一个主分片。理论上主分片对存储多少数据是没有限制的,但分片的最大数量完全取决于你的实际状况:硬件的配置、文档的大小和复杂度、如何索引和查询你的文档,以及你期望的响应时间。
- 从分片,从分片只是主分片的一个副本,它用于提供数据的冗余副本,在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求。
索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变。
接下来,我们在空的单节点集群中上创建一个叫做blogs的索引。一个索引默认设置了5个主分片,但是为了演示,我们这里只设置3个主分片和一组从分片(每个主分片有一个从分片对应):
- PUT /blogs
- {
- "settings" : {
- "number_of_shards" : ,
- "number_of_replicas" :
- }
- }
现在,我们的集群看起来就像下图所示了有索引的单节点集群,这三个主分片都被分配在Node 1。
在ES集群中可以监控统计很多信息,其中最重要的就是:集群健康(cluster health)。它的 status 有 green、yellow、red 三种;
- GET /_cluster/health
返回:
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 3,
"active_shards": 3,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 3
}
其中status可以告诉我们当前集群是否处于一个可用的状态。三种颜色分别代表:
状态 | 意义 |
---|---|
green |
所有主分片和从分片都可用 |
yellow |
所有主分片可用,但存在不可用的从分片 |
red |
存在不可用的主要分片 |
集群的健康状况yellow意味着所有的 主分片(primary shards) 启动并且运行了,这时集群已经可以成功的处理任意请求,但是 从分片(replica shards) 没有完全被激活。事实上,当前这3个从分片都处于unassigned(未分配)的状态,它们还未被分配到节点上。在同一个节点上保存相同的数据副本是没有必要的,如果这个节点故障了,就等同于所有的数据副本也丢失了。
2、容错转移
为了提高系统的可用性,生产环境几乎不会使用单节点ES集群。
下面介绍如何使用双节点集群(cluster-two-nodes),只要第二个节点与第一个节点的cluster.name相同(参见./config/elasticsearch.yml文件中的配置),它就能自动发现并加入到第一个节点的集群中。如果没有,请结合日志找出问题所在。这可能是多播(multicast)被禁用,或者防火墙阻止了节点间的通信。
如下图,双节点集群——所有的主分片和从分片都被分配:
当第二个节点加入后,就产生了三个 从分片(replica shards) ,它们分别于三个主分片一一对应。也就意味着即使有一个节点发生了损坏,我们可以保证数据的完整性。
所有被索引的新文档都会先被存储在主分片中,之后才会被平行复制到关联的从分片上。这样可以确保我们的文档在主节点和从节点上都能被检索。
3、横向扩展
随着应用需求的增长,我们该如何扩展?如果我们启动第三个节点,集群内会自动重组,这时便成为了三节点集群(cluster-three-nodes)。
分片已经被重新分配以平衡负载:
在Node 1和Node 2中分别会有一个分片被移动到Node 3上,这样一来,每个节点上就都只有两个分片了。这意味着每个节点的硬件资源(CPU、RAM、I/O)被更少的分片共享,所以每个分片就会有更好的性能表现。
分片本身就是一个非常成熟的搜索引擎,它可以使用单个节点的所有资源。我们一共有6个节点(3个主分片和3个从分片),因此最多可以扩展到6个节点,每个节点上有一个分片,这样每个分片都可以使用到所在节点100%的资源了。
前面提到,主分片的数量在索引创建时就确定了,而从分片的数量可以随时调整:
- PUT /blogs/_settings
- {
- "number_of_replicas" :
- }
将从分片的数量增加到2份:
从图中可以看出,现在blogs的索引总共有9个分片:3个主分片和6个从分片。也就是说,现在我们就可以将总节点数扩展到9个,就又会变成一个节点一个分片的状态了。最终我们得到了三倍搜索性能的三节点集群。
4、故障恢复
如果上面的三节点集群中有一个节点发生故障,例如:
被杀掉的节点是主节点。而为了集群的正常工作必须需要一个主节点,所以首先进行的进程就是从各节点中选择了一个新的主节点:Node 2。
主分片1和2在我们杀掉Node 1后就丢失了,我们的索引在丢失主节点的时候是不能正常工作的。如果我们在这个时候检查集群健康状态,将会显示red:存在不可用的主节点!
幸运的是,丢失的两个主分片的完整拷贝在存在于其他的节点上,所以新的主节点所完成的第一件事情就是将这些在Node 2和Node 3上的从分片提升为主分片,然后集群的健康状态就变回至yellow。这个提升的进程是瞬间完成了,就好像按了一下开关。
那么为什么集群健康状态依然是是yellow而不是green呢?是因为现在我们有3个主分片,但是我们之前设定了1个主分片有2个从分片,但是现在却只有1份从分片,所以状态无法变为green,不过我们可以不用太担心这里:当我们再次杀掉Node 2的时候,我们的程序依旧可以在没有丢失任何数据的情况下运行,因为Node 3中依旧拥有每个分片的备份。
如果我们重启Node 1,集群就能够重新分配丢失的从分片,这样结果就会与三节点两从集群一致。如果Node 1依旧还有旧节点的内容,系统会尝试重新利用他们,并只会复制在故障期间的变更数据。
5、分布式存储
当需要新增一个文档到索引中时,需要为这个文档找到一个主分片进行存储,它按照下面的公式选择主分片:
shard = HASH(文档ID) % 主分片数量
其中,文档ID也可以被替换成其它能唯一表示一个文档的字符串。另外,主分片数量在索引创建时就已经确定了,运行过程中不允许修改,因此,同一个文档总是会被路由到同一个主分片上。
ES集群如果包含多个节点,每个节点都可以服务所有请求,节点可以根据上面的方法计算出当前请求的文档在哪个分片,然后转发请求到该节点上。
参考文档:
http://www.learnes.net/distributed_cluster/
ElasticSearch之二——集群的更多相关文章
- 原创 | 手摸手带您学会 Elasticsearch 单机、集群、插件安装(图文教程)
欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/ ...
- 使用Spring Data ElasticSearch+Jsoup操作集群数据存储
使用Spring Data ElasticSearch+Jsoup操作集群数据存储 1.使用Jsoup爬取京东商城的商品数据 1)获取商品名称.价格以及商品地址,并封装为一个Product对象,代码截 ...
- Elasticsearch高级之-集群搭建,数据分片
目录 Elasticsearch高级之-集群搭建,数据分片 一 广播方式 二 单播方式 三 选取主节点 四 什么是脑裂 五 错误识别 Elasticsearch高级之-集群搭建,数据分片 es使用两种 ...
- 全文搜索引擎 Elasticsearch 入门:集群搭建
本文主要介绍什么是 ElasticSearch 以及为什么需要它,如何在本机安装部署 ElasticSearch 实例,同时会演示安装 ElasticSearch 插件,以及如何在本地部署多实例集群, ...
- 1.ElasticSearch系列之集群部署
第一步:安装JDK JDK要求jdk1.8+,不安装也可以,ES自带JDK 第二步:系统配置 2.1 禁用交换区 sudo swapoff -a 2.2 开最大文件数的限制 编辑文件 /etc/sec ...
- Elasticsearch 安装与集群配置
一.软件版本 操作系统:CentOS-6.5-x86_64 ES版本:5.0 主机:192.168.63.246 主机: 192.168.63.242 二.部署环境规划: 1. 需求:jdk版本: ...
- ELK 之一:ElasticSearch 基础和集群搭建
一:需求及基础: 场景: 1.开发人员不能登录线上服务器查看详细日志 2.各个系统都有日志,日志数据分散难以查找 3.日志数据量大,查询速度慢,或者数据不够实时 4.一个调用会涉及到多个系统,难以在这 ...
- ElasticSearch高可用集群环境搭建和分片原理
1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...
- Elasticsearch(5)--- 基本命令(集群相关命令、索引CRUD命令、文档CRUD命令)
Elasticsearch(5)--- 基本命令 这篇博客的命令分为ES集群相关命令,索引CRUD命令,文档CRUD命令.这里不包括Query查询命令,它单独写一篇博客. 一.ES集群相关命令 ES集 ...
随机推荐
- poj3013 邻接表+优先队列+Dij
把我坑到死的题 开始开题以为是全图连通是的最小值 ,以为是最小生成树,然后敲了发现不是,看了下别人的题意,然后懂了: 然后发现数据大,要用邻接表就去学了一下邻接表,然后又去学了下优先队列优化的dij: ...
- lucene-Field.Store解析
本文主要内容装载这里 Store 三种形态 COMPRESS:压缩保存.用于长文本或二进制数据 (后期高版本舍弃了) YES:保存 NO:不保存 具体案例 package demo.first; im ...
- cookie的写入与读出
cookie在jquery中有指定的cookie操作类 $.cookie('the_cookie'); // 读取 cookie $.cookie('the_cookie', 'the_value') ...
- APIO2015简要题解
这场比赛当初是67(?)反正就是Cu滚粗了…… 先给个题目的传送门:http://wenku.baidu.com/link?url=mUxdsYomenU-e9SFVPacVtXysemiQA4KnP ...
- 【poj3263】 Tallest Cow
http://poj.org/problem?id=3263 (题目链接) 题意 n头奶牛排成一排,最高的一头I身高H,给出R个条件(a,b),表示a,b之间的奶牛都要比a矮,b的身高大于等于a.求每 ...
- Linux su和sudo命令的区别,并获得root权限
su(superuser) su表示切换用户,如: 输入:su命令后回车表示切换当前的用户到root用户,或者: 输入:su - root(或者其他用户名)这里加了"-"后表示也切 ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- TypeScript Class(类)
传统的JavaScript注重用函数和基于原型的继承来创建可复用的组件,但这可能让用习惯面对对象方式的程序员感到棘手,因为他们的继承和创建对象都是由类而来的.从JavaScript的下一个版本,ECM ...
- 多播程序设计(基于UDP协议)
首先要搞清楚多播IP地址有哪些 D类IP地址就是多播地址,范围是224.0.0.0 ~ 239.255.255.255 其中又划分为以下类别 D类地址的划分 类别 地址范围 描述 局部链接地址(本地网 ...
- springMVC的注解@RequestParam与@PathVariable的区别
1.在SpringMVC后台控制层获取参数的方式主要有两种, 一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取. ...