2、Elasticsearch发展
2.1 Elasticsarch发展史
2004年,shay banon基于lucene开发了compass。
2010年,shay banon重构了compass,取名为elasticsearch,使其支持分布式和水平扩展。
2012年,Elasticsearch BV公司被创建,围绕Elasticsearch及相关软件提供商业服务和产品。
2015年,Elasticsearch公司更名为Elastic.
Lucene 是一个高性能的搜索引擎库,它提供索引数据和搜索数据的功能,内部非常复杂,elasticsearch利用了lucene的高性能,封装了它的复杂性,对外可以提供rest接口,不同语言的应用都可以调用。
轶事:
2004年,shay banon失业了,准备给他厨师老婆做一个食谱的搜索引擎,如果直接使用Lucene很难,所以他把使用lucene抽象了一下,并开源了,开发者可以直接在程序里使用compass来进行搜索,2010年的时候,它已经重构了compass,取名为elasticsearch,支持分布式和水平扩展。
2.2 Elasticsarch重要版本
Elastic的版本维护政策维护当前主要版本的最新次要版本,以及上一个主要版本的最新次要版本,例如7.10.2,7主版本,10为次要版本,2为修复bug的版本。它的具体的版本政策可以查看(https://www.elastic.co/cn/support/eol),elasticsearch主要版本特性如下:
在实际生产中推荐采用7.x,官方做了很多优化,性能更好,功能更强大。
3、Elasticsearch应用场景
Elastic公司围绕着elasticsearch构建一整套生态系统,适用了很多热门的使用场景
3.1 Elastic生态圈
2013年logstash被收购,同年kibana加入elastic公司,后续它陆续收购了beat、prealert(机器学习)等公司,将其纳入到elastic生态圈。
- beats,轻量数据采集器,可收集文件、网络包等数据,它们安装在目标服务器作为代理,转发数据到logstash或elasticsearch上。
- X-Pack,商业套件,提供了一些增值服务,有些组件也开源了。
3.2 使用场景
网站搜索
设计了丰富的api来提供搜索服务,github、stackoverflow等网站的搜索都是基于elasticsearch。
日志
将分散的日志,集中化存储到elasticsearch上。
日志管理一般分为:日志收集,格式化,检索,风险告警。
数据库同步
通过某种同步机制将数据库某个表的数据同步到elasticsearch上,然后提供搜索服务。
指标分析
提供了分组查询、top查询、排序、相关度打分,可以进行数据分析
4、Elasticsearch整体架构
4.1 整体架构图
如上图所示,elasticsearch整体的功能划分:
restful api,表示提供rest风格的api来实现编程何管理
Transport, 网络传输模块,支持http,thrift等主流协议,默认tcp
Scripting,脚本语言,支持使用groovy、painless等脚本语言
3rd plugin,支持第三方插件
Index module 索引文档、search module,搜索文档
River,支持接入其它数据源
Jmx,监控
Discovery,服务发现模块
Lucene directory,底层存储基于lucene实现
Gateway,可以持久化到本地或者其它文件系统
4.2 基本概念
开发视角:
文档
可搜索的最小单位,我们向elasticsearch存储的一条数据,就是一个文档。每个文档都有一个id,可以自己指定,也可以让elasticsearch生成。
索引
索引是文档的容器,一类文档的集合。可以对文档元数据进行定义,比如名称、类型等。在物理上,索引的数据分布在分片上。
Type
在7.0以前,一个索引可以定义多个type,7.0版本后,type废除了,只有一个type为“_doc”。
系统视角:
集群
一个elasticsearch集群由多个节点构成,它的分布式架构支持存储水平扩容,并且依靠副本可用性也很高。
节点
一个节点就是一个elasticsearch实例,即一个java进程。节点根据功能可以划分多种角色,比如主节点、数据节点、协调节点、ingest节点等。默认一个节点这些角色都承担。
分片
为了解决数据水平扩展,通过分片将数据分散到集群的节点上。一个索引分片数的设计需要提前做好评估,太大和太小都不好,具体怎么评估,后续的文章会来探讨。
5、Elasticsearch集群搭建
5.1 Elasticsearch安装
安装java8环境,7.0后的elasticsearch版本,内置了java环境
下载elasticsearch二进制文件(7.10.2)
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-10-2
启动elasticsearch集群(3节点)
启动命令:
bin/elasticsearch -E node.name=node0 -E cluster.name=mylocalcluster -E path.data=node0_data
bin/elasticsearch -E node.name=node1 -E cluster.name=mylocalcluster -E path.data=node1_data
bin/elasticsearch -E node.name=node2 -E cluster.name=mylocalcluster -E path.data=node2_data
接口查看状态
节点的状态(http://localhost:9200)
{
"name" : "node0", //节点名称
"cluster_name" : "mylocalcluster", //集群名称
"cluster_uuid" : "nTdmburYQPmB2Ppmw0UhiQ",
"version" : {
"number" : "7.10.2",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "747e1cc71def077253878a59143c1f785afa92b9",
"build_date" : "2021-01-13T00:42:12.435326Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
集群的状态(http://localhost:9200/_cat/nodes)
127.0.0.1 31 78 11 cdhilmrstw * node0 //*表示是主节点
127.0.0.1 33 78 10 cdhilmrstw - node1
127.0.0.1 33 78 9 cdhilmrstw - node2
集群的健康状态(http://localhost:9200/_cat/nodes)
{
"cluster_name": "mylocalcluster",
"status": "green", //集群状态
"timed_out": false,
"number_of_nodes": 3,//节点数
"number_of_data_nodes": 3,//数据节点数
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100.0
}
安装kibana来管理elasticsearch
下载kibana安装包
https://www.elastic.co/cn/downloads/past-releases#kibana
配置
config\kibana.yml配置指向elastisearch集群
elasticsearch.hosts: ["http://localhost:9200","http://localhost:9201","http://localhost:9202"] i18n.locale: "zh-CN"
启动kibana,执行命令bin/kibana
进入管理界面
导入样本数据(可选,可以自己验证功能)
Kibana查看elasticsearch索引和数据
安装cerebro可视化的查看集群状态
cerebro-0.9.4\conf\application.conf
修改配置文件
启动bin\cerebro.bat
查看管理界面http://localhost:9000
5.2 Elasticsarch发展史
添加文档
POST user/_doc
{
"name" : "xiao ming",
"age" : 12
}
注意post(自动生成id)、put(可以指定Id。如果id已经存在报错)效果是不一样的
查询文档
GET /user/_doc/2
更多的api可以查看官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs.html
6、总结
本篇文章先是介绍了elasticsearch的发展历史以及重大版本说明,知道7.x版本以后已经不支持自定义type了。接着介绍了elascitc公司生态圈以及elasticsearch的使用场景,知道了elasticsearch主要用于全文检索、日志等热门的场景中。然后通过一个elasticsearch集群搭建和相关组件的安装,快速上手了下文档基础操作。最后对elasticsearch整体功能、集群、节点、分片等主要概念做了一些简单说明,这样我们对elasticsearch有了大概的了解。后面的文章会对elasticsearch的功能和核心原理进行进一步探讨。
程序员的核心竞争力其实还是技术,因此对技术还是要不断的学习,关注“IT巅峰技术” ,该公众号内容定位:中高级开发、架构师、中层管理人员等中高端岗位服务的,除了技术交流外还有很多架构思想和实战案例,作者是“《 消息中间件 RocketMQ技术内幕》 ”一书作者,同时也是“RocketMQ上海社区”联合创始人,曾就职于拼多多、德邦等公司,现任上市快递公司架构负责人,主要负责开发框架的搭建、中间件相关技术的二次开发和运维管理、混合云及基础服务平台的建设;请关注公众号,一起探讨、学习.