ElasticSearch简介、安装、集群、Logstash todo

es基本概念

ElasticSearch与mysql

  1. mysql专注于数据的持久化存储与管理,也就是crud,mysql如果单表达到百万以上数据,我们进行一个检索与查询都是一个非常慢的操作
  2. 真正做海量数据的检索与分析,es更在行,可以秒级的从海量数据中检索出我们感兴趣的数据

什么是ElasticSearch

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

特点:

  1. 分布式的实时文件存储,每个字段都被索引并可被搜索
  2. 分布式的实时分析搜索引擎–做不规则查询
  3. 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
  4. 可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。
  5. 天生支持分布式

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

Gateway,代表ES索引的持久化存储方式。在Gateway中,ES默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。当ES集群关闭或重启的时候,它就会从Gateway里去读取索引数据。比如LocalFileSystem和HDFS、AS3等。

ES能做什么?
全文检索(全部字段)、模糊查询(搜索)、数据分析(提供分析语法,例如聚合)

不支持事务,不支持多表

ElasticSearch对比Solr

  • Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能(集群);
  • Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
  • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
  • Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。

ElasticSearch安装与启动

前提

  • 因为是学习,所以下载的是windows版本的,真正在企业中使用的话肯定是linux版本。
  • ElasticSearch是使用java开发的,es需要的jdk版本要是1.8以上,所以在安装之前必须保证jdk安装完毕

ElasticSearch官方地址

下载地址与版本

5.6.8压缩包下载地址

版本使用的是5.6.8,该版本官网已经不再维护,todo等整理完旧版,再尝试新版的
官网截止2020.11.14已经更新到7.10

目录结构

在这里插入图片描述

解决跨域访问

如果不安装后面的elasticsearch-head(ES的图形化界面插件)是可以不修改,直接启动

修改elasticsearch配置文件:config/elasticsearch.yml,增加以下两句命令:

http.cors.enabled: true
http.cors.allow-origin: "*"

启动

点击bin目录下的elasticsearch.bat

在这里插入图片描述

注意:9300是tcp通讯端口,集群间和TCPClient都执行该端口,9200是http协议的RESTful接口 。

安装ES的图形化界面插件

elasticsearch-5-*以上版本安装head需要安装node和grunt

ES的图形化界面插件地址

将elasticsearch-head-master压缩包解压到任意目录,但是要和elasticsearch的安装目录区别开

nodeJs

nodeJs下载地址

安装完毕,可以通过cmd控制台输入:node -v 查看版本号

将grunt安装为全局命令 ,Grunt是基于Node.js的项目构建工具

grunt类似于maven,是node.js所需的环境
这个命令类似于把所有的maven依赖都下载(这么解释可能有误差,但先这么理解吧)

进入elasticsearch-head-master目录启动head,在命令提示符下输入命令:

npm install -g grunt-cli
备用:npm config set registry https://registry.npm.taobao.org

这个命令是elasticsearch-head-master目录下有一个Gruntfile.js,类似于一个项目的pom文件,把所需要的依赖引入到此项目中

>npm install
>备用:npm install -g cnpm --registry=https://registry.npm.taobao.org
>grunt server

在这里插入图片描述
浏览器输入 http://localhost:9100,就可以访问到es库了

docker安装es和kibana

docker pull elasticsearch:7.4.2

docker pull kibana:7.4.2

# 查询虚拟机可用内存,available,我的是333,老师说还可以
free -m

# echo "http.host: 0.0.0.0" es可被远程任何ip访问
# key v 之间的空格是必须的
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml

chmod -R 777 /mydata/elasticsearch/

# 9200 外部访问rest-api 请求
# 9300 是es在分布式集群状态下节点之间的通信端口
# discovery.type=single-node  es以单节点运行
# -e ES_JAVA_OPTS="-Xms64m -Xmx128m" 如果不指定,es启动会将我们的内存全部占用
# 公司一般上线的时候服务器都是32G的,到时候可以给es多分配
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2


docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 \
-d kibana:7.4.2

ElasticSearch相关概念(术语)

概述

Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。

然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。

在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch比传统关系型数据库如下:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

在这里插入图片描述

  1. 索引 index

动词,相当于mysql中的insert
名词,相当于mysql中的Database

  1. 类型 type(弃用)

在 Index(索引)中,可以定义一个或多个类型。
类似于 MySQL 中的 Table;每一种类型的数据放在一起;
Es6之后,没有type这个概念了

  1. 文档 Document

保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格 式的,Document 就像是 MySQL 中的某个 Table 里面的内容;

倒排索引

保存的数据是以下的保存的记录,先对每条记录进行分词,维护一张倒排索引表(左)

当查红海特工行动的时候,倒排索引表记录中有,12345,123,5,因为记录中包含了5个,就会把5个记录都查出来,

这时候就看相关性得分,我们发现1、2、3、5都命中两次,
举例,3号共有三个单词,命中了两个,5号共有4个单词,命中了两个,则3号分高。

它会将所有的都查出来,最后根据得分进行排序。

在这里插入图片描述

接近实时 NRT

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒以内)

集群 cluster

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群

节点 node

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。

和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。

这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。

一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。

在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。

分片和复制 shards&replicas

一个索引可以存储超出单个结点硬件限制的大量数据。

比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。

为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。

当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片很重要,主要有两方面的原因:
1. 允许你水平分割/扩展你的内容容量。
2. 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。

至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。

在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制

复制之所以重要,有两个主要原因: 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。

总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。

默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。

IK分词器

使用ES标准分词器的问题

当我们创建索引时,字段使用的是标准分词器,对于英文,它会对每一个单词进行分词,对于中文,它会把每一个字进行分词。

POST _analyze
{
  "analyzer": "standard",
  "text":"the 2 quick brown-foxes jumped over the lazy dog"
}

所以需要安装ik分词器

IK分词器简介

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

IK分词器3.0的特性如下:

  1. 采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力
  2. 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理
  3. 对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。
  4. 支持用户词典扩展定义
  5. 针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。

ES集成IK分词器

下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases ,版本对应es版本

下载Realease,tag还得mvn安装

将解压后的文件夹拷贝到ES目录下的plugins下,并重命名文件夹为ik

重新启动ElasticSearch,即可加载IK分词器

IK提供了两个分词算法ik_smart 和 ik_max_word

其中 ik_smart 为最少切分,节省空间,ik_max_word为最细粒度划分(看情况一般用这个)

# 我 是 中国人
POST _analyze
{
  "analyzer": "ik_smart",
  "text":"我是中国人"
}


# 我 是 中国人 中国 国人
POST _analyze
{
  "analyzer": "ik_max_word",
  "text":"我是中国人"
}

分词-自定义扩展词库

ik分词器只能对日常的词语分词,对近几年网络流行的,或者自己定义的词语这些新的词汇没办法识别,我们需要自己来扩展。

ik目录下的config目录下的main.dic,它里面会放好多词,例如 五光十色 ,分词器就会把它截取出来

自定义词库是/usr/share/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

我们可以在这个文件配置一个远程词库,让ik分词器自己向远程发送请求。这个远程请求可以是一个java项目,也可以是一个nginx

docker安装nginx

# es配置远程扩展字典,配置完后重启es
vi /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <entry key="remote_ext_dict">http://192.168.56.10/es/fenci.txt</entry>
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

ES集群

集群的相关概念已经在上面叙述过了

搭建集群

创建elasticsearch-cluster文件夹,把ES文件夹复制三份放进去,并改名node1,node2,node3

修改每一个node节点,也就是node1,node2,node3目录下的config\elasticsearch.yml

#节点1的配置信息:
#集群名称,保证唯一
cluster.name: my-elasticsearch
#节点名称,必须不一样
node.name: node-1
#必须为本机的ip地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9200
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9300
#设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

启动各个节点服务器

elasticsearch-cluster\node*\bin\elasticsearch.bat

使用elasticsearch-header查看集群情况

节点:一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。

分片:单个节点硬件一定有最大限制,ES把索引划成了多份。

实列场景:
假设 IndexA 有2个分片,我们向 IndexA 中插入10条数据 (10个文档),那么这10条数据会尽可能平均的分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。

复制:分片之后有一个问题,如果1分片的服务挂了,那1分片就失效了,所以就又会把分片复制一份到不同的节点。

至此,就有了10个分片
在这里插入图片描述
在这里插入图片描述

Logstash

介绍

Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集 起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。

可以做数据同步,例如mysql的数据发生变化时,将数据直接同步到es中,而不是像之前一样,利用java代码来进行更新。

将mysql数据导入到es

  1. 在解压目录下,创建mysqletc文件夹
    测试:bin目录:logstash -e ‘input { stdin { } } output { stdout {} }’
  2. mysqletc文件夹下创建mysql.conf
  3. 在bin目录下打开dos窗口,输入
    logstash -f …/mysqletc/mysql.conf

mysql.conf内容

input {
  jdbc {
    # mysql jdbc connection string to our backup databse
    jdbc_connection_string =>"jdbc:mysql://192.168.17.132:3306/tensquare_article?characterEncoding=UTF8"
    # the user we wish to excute our statement as
    jdbc_user => "root"
    jdbc_password => "root"
    # the path to our downloaded jdbc driver  
    jdbc_driver_library => "F:/darkHorse/software/logstash-5.6.8/logstash-5.6.8/mysqletc/mysql-connector-java-5.1.46.jar"
    # the name of the driver class for mysql
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    # 是否分页
    jdbc_paging_enabled => "true"
    jdbc_page_size => "5000"
    statement => "select id,title,content from tb_article"
    # 从左往右,年月日时分秒,全部为*则默认每分钟更新
      schedule => "* * * * *"
  }
}
output {
  elasticsearch {
    hosts => "localhost:9200" 
    index => "tensquare336"
    # 自增id,用的是上面那个查出来的id
    document_id => "%{id}"
    document_type => "article336"
  }
  stdout {
  	  # 以 json 格式输出
      codec => json_lines
  }
} 

todo 多表导入,包括es导入es中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值