做者:靠发型吃饭的柳树算法
原文地址:https://mp.weixin.qq.com/s/223b7xAABBtplpAv5OjAIgsql
那一年,伦敦,Shay Banon 在找工做,他老婆在烹饪学校学习厨艺。数据库
Shay 发现,老婆天天都要在大量的食谱中找本身想要的那份食谱,因而在找工做之余,开始给老婆作一个食谱搜索的工具。api
市面上的搜索引擎,彷佛没什么选择,只有 Lucene,可是 Lucene 又很难用,因而 Shay 在外面又抽象了一层,屏蔽了 Lucene 底层的复杂逻辑。bash
Shay 开源了这套给老婆搜索食谱用的系统,叫 Compass.restful
后来, Shay 找到了工做,他发现以前写的那套系统,在追求高性能、高可用的生产环境,实在太脆弱,因而又从新写了一套,Compass 也更名为了 Elasticsearch.架构
Shay 在把 Compass 重写为 Elasticsearch 时,面对的问题,其实就是:nosql
你已经拥有了 Lucene,拥有了倒排索引,如何用它们来创造一个,让用户用起来特别爽、又特别可靠的搜索引擎?工具
Now,让咱们跟着 Shay 的脚步,一块儿设计一个高性能高可靠的 Elasticsearch 吧!性能
Shay 如今拥有的一切:
简单画个图:
如今咱们屏蔽 Elasticsearch 的底层实现,其实一个 Elasticsearch 实例对于咱们来讲,就是一个节点,一个能够提供数据搜索和探寻能力的节点:
一开始,里面空空如也,什么都没有。
Mysql 往数据库插入数据以前,须要先建立表,指定字段、主键等等,Elasticsearch 也须要建立“表”。
在 Elasticsearch 的领域语言里,「表」被称为「索引」,「行数据」被称为「文档」。
如今咱们往节点里面定义一个「索引」blog:
PUT /blogs{ "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 }}复制代码
你会发现,和 Mysql 不一样,咱们并无定义这个“表”里有什么字段,这就是 nosql 的好处,你能够在以后插入的文档里,随时给这个“表”添加新的字段。
咱们定义的是两个配置:
如今咱们的节点,再也不是空空如也,而是这样:
P0、P一、P2 就是 blog 索引的 3 个主分片。
为何没有副本分片?
由于对于单节点的架构来讲,进行冗余备份就毫无心义的,只会浪费内存和磁盘。
如今咱们往集群里添加第二个节点,很简单,只要它和第一个节点有一样的 cluster.name 配置,它就会自动发现集群并加入到其中:
原先被雪藏起来的三个副本分片,如今都在这个新增的节点上,被激活了。
这套架构,用着用着,咱们发现两个节点的 CPU 、RAM 等硬件资源都十分紧张,随时可能奔溃,怎么办?
没有什么是加一套机器不能解决的,若是有,那就加两套:
甚至你还能把副本分片的数量调整到 2:
固然,上面那句话是句玩笑话,若是没有把单机的性能发挥到极限,不去思考如何提高单机的性能和算法的优点,一味的依靠拓机器数量,是十分愚蠢的。
在咱们加了一个节点进去后,Elasticsearch 集群自动的帮咱们从新平均分布全部的数据。
Elasticsearch 前面的这个 elastic,果真名不虚传。
这套架构是高可靠的,假设 Master 节点 Node1 忽然奔溃了,这时候集群会选举出一个新的节点。
这还不够,咱们失去 Node 的同时,也失去了原来 Node 1 上的两个主分片,P1 和 P2,幸运的是,Node 2 和 Node 3 上有对应的副本分片,集群会把对应的副本分片提高为主分片:
经过本身封装的 Engine 层,屏蔽了 Lucene 的底层复杂的操做;
经过集群架构,构建了一套高性能、高可靠的搜索系统;
Shay 把本来复杂、上手难度极大的 搜索库 Lucene,打造为了对使用者很是友好的 Elasticsearch。
又后来,Shay 和他的伙伴们建立了一家公司,Elastic.
这家公司围绕 Elasticsearch ,对外界提供数据搜索和探索的服务。
对于一家公司来讲,它能够直接使用 Elastic 提供好的现成的搜索服务,好比日志搜索、监控、站点搜索等等,来给本身的应用集成搜索功能,这是 Elastic 的 SAAS 业务;
固然,若是你是一家有开发能力的公司,能够直接使用 Elasticsearch,来赋予应用数据搜索和探寻的能力,这是 Elastic 的 PAAS 业务。