ELK的理论杂项知识
- 2019 年 10 月 7 日
- 筆記
区分9200端口口和9300端口
- 9300端口:ES节点之间通讯使用,是TCP协议端口号,ES集群之间通讯端口号
- 9200端口:ES节点 和 外部 通讯使用,暴露ES RESTful接口端口号
倒排索引
ES为什么那么快?正是因为ES内部采用了倒排索引。让我们来看下什么是倒排索引吧。
什么是正排索引?
- 源数据
1 我是中国人 2 我是大学生
如果使用正排索引的话,建立索引的过程是这样的:
切词结果: 1 我 我是 中国 中国人 2 我 我是 大学 大学生 将切词结果进行创建索引,保存文章/id。当搜索的时候, 索引库中如有匹配则返回文章内容。 不足:通过切词之后,索引比正文多了。
倒排索引:
1. 我(1:1){0},(2:1){0} 2. 我是(1:1){0},(2:1){0} 3. 中国(1:1){2} 4. 中国人(1:1){2} 5. 大学(2,1){2} 6. 大学生(2,1){2} 解释: ()中保存的第一个元素是文章id,第二个元素是出现次数。 {} 中保存的是当前分词在文章中的偏移量。 通过这样的方式,当我们去搜索的时候。比如搜索‘中国’,当拿到中国的时候 就可以看到哪些地方含有中国这两个字。类似于字典的目录。
ES的优势
- 横向可扩展性: 只需要增加台服务器,做一点儿配置,启动一下Elasticsearch就可以并入集群。
- 分片机制 提供更好的分布性:同一个索引分成多个分片(sharding), 这点类似于HDFS的块机制;分而治之的方式可提升处理效率。
- 高可用 提供复制( replica) 机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其他可用节点上。
- 使用简单:
- 共需一条命令就可以下载文件,然后很快就能搭建一一个站内搜索引擎。
Elasticsearch应用场景
大型分布式日志分析系统ELK elasticsearch(存储日志)+ logstash(收集日志) + kibana(展示数据) 大型电商商品搜索系统 网盘搜索引 网站内搜索
Elasticsearch版本控制
为什么要进行版本控制
为了保证数据再多线程操作下的准确性
悲观锁和乐观锁
- 悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据准确性的操作
- 乐观锁:假设不会发生并发冲突,只在提交操作是检查是否违反数据完整性。
内部版本控制和外部版本控制
- 内部版本控制: version自增长,修改数据后,version会自动的加1
- 外部版本控制:为了保持_version与外部版本控制的数值一致
ES基本概念名词
Cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
Shards代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
Recovery代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
logstash 抽取MySQL的数据到ES的配置文件
input { jdbc { jdbc_driver_library => "G:developlogstash-7.3.2binjobmysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/drugs_manager" jdbc_user => "root" jdbc_password => "root" schedule => "* * * * *" statement => "SELECT * FROM drugs;" use_column_value => true tracking_column_type => "timestamp" tracking_column => "update_time" last_run_metadata_path => "syncpoint_table" } } #output { # stdout { # codec => rubydebug # } #} output { elasticsearch { hosts => ["127.0.0.1"] user => "" password => "" index => "drugs_manager" document_id => "%{id}" } }