ES3_3URL查询
在URL中使用查询参数是一种轻量查询(Query-string),一些复杂的查询条件最好还是通过请求体查询组织。
在URL中使用查询参数是一种轻量查询(Query-string),一些复杂的查询条件最好还是通过请求体查询组织。
请求体查询(查询表达式)包含了ES大部分查询功能。
聚合查询
搜索源码分析。
一般来说,查问题有以下几个层次:
debug 可以说是撒手锏了,一般不到万不得已的情况不会 debug,费时费力,而且上线后谁还能在服务器上开个 debug 端口?印象中,遇到非常棘手的问题时,只能 review 代码然后在关键位置加日志,究其根本原因,是没法看到进程运行时的内存状况。Arthas 就是为了解决这种问题而诞生的。
Elasticsearch 是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎。大致上,它有以下重要特征:
这篇文档主要介绍如何配置测试环境、搭建ES集群。
把服务器名、资源名记录到zk里。
通过调用Zookeeper节点创建的API接口就可以创建一个顺序节点,并且在API返回值中会返回这个节点的完整名字,利用此特性,可以生成全局ID,其步骤如下
程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端从而更改配置。
Zookeeper的两大特性:
利用其两大特性,可以实现集群机器存活监控系统,若监控系统在/clusterServers
节点上注册一个Watcher监听,那么但凡进行动态添加机器的操作,就会在/clusterServers节点下创建一个临时节点:/clusterServers/[Hostname]
,这样,监控系统就能够实时监测机器的变动情况。
集群需要有一个Master,比如MySQL中需要有一个Master来负责写请求。ZooKeeper的强一致性可以保证这样的Master是唯一的。
集群中的每个节点可以定时在一个命名空间内创建节点,但只有一个客户端能创建成功,此时其成为Master。
分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问一个或一组资源时的一致性,主要分为排它锁和共享锁。
共享锁又称为读锁,若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都被释放。
在需要获取共享锁时,所有客户端都会到/shared_lock下面创建一个临时顺序节点,如果是读请求,那么就创建例如/shared_lock/host1-R-00000001的节点,如果是写请求,那么就创建例如/shared_lock/host2-W-00000002的节点。
不同事务可以同时对一个数据对象进行读写操作,而更新操作必须在当前没有任何事务进行读写情况下进行,通过Zookeeper来确定分布式读写顺序,大致分为四步。
其释放锁的流程与独占锁一致。
上述共享锁的实现方案,可以满足一般分布式集群竞争锁的需求,但是如果机器规模扩大会出现一些问题,下面着重分析判断读写顺序的步骤3。
针对如上图所示的情况进行分析
可以看到,host1客户端在移除自己的共享锁后,Zookeeper发送了子节点更变Watcher通知给所有机器,然而除了给host2产生影响外,对其他机器没有任何作用。大量的Watcher通知和子节点列表获取两个操作会重复运行,这样会造成系能鞥影响和网络开销,更为严重的是,如果同一时间有多个节点对应的客户端完成事务或事务中断引起节点小时,Zookeeper服务器就会在短时间内向其他所有客户端发送大量的事件通知,这就是所谓的羊群效应(惊群效应)。
可以有如下改动来避免羊群效应。
/shared_lock/[Hostname]-请求类型-序号
的临时顺序节点。此方案改动主要在于:每个锁竞争者,只需要关注/shared_lock节点下序号比自己小的那个节点是否存在即可。
先进入队列的请求操作先完成后,才会开始处理后面的请求。FIFO队列就类似于全写的共享模型,所有客户端都会到/queue_fifo这个节点下创建一个临时节点,如/queue_fifo/host1-00000001。
创建完节点后,按照如下步骤执行。
最终的合并计算需要基于很多并行计算的子结果来进行,开始时,/queue_barrier节点已经默认存在,并且将结点数据内容赋值为数字n来代表Barrier值,之后,所有客户端都会到/queue_barrier节点下创建一个临时节点,例如/queue_barrier/host1。
创建完节点后,按照如下步骤执行。
就 ZooKeeper 来说,只明白原理是不够的,因为实际场景非常多,在不同场景下 ZooKeeper 几乎都有不同的应用模式,不过幸运的是 ZooKeeper 已经有一个比较完善的客户端 Curator,在生产环境下几乎不需要投入太多人力就可以解决大部分集群协调问题。