「学习笔记」ElasticSearch分布式特性 与 Search机制

1. ElasticSearch 的分布式特性

1.1 分布式介绍
  1. ES支持集群模式,即一个分布式系统。其好处主要有以下 2 个:
    1. 可增大系统容量。比如:内存、磁盘的增加使得ES能够支持PB级别的数据;
    2. 提高了系统可用性。即使一部分节点停止服务,集群依然可以正常对外服务。
  2. ES集群由多个ES实例构成。 + 不同集群通过集群名字来区分,通过配置文件elasticsearch.yml中的cluster.name可以修改,默认为elasticsearch + 每个ES实例的本质,其实是一个JVM进程,且有自己的名字,通过配置文件中的node.name可以修改。
1.2 构建 ES 集群
# 创建一个本地化集群my_cluster
bin/elasticsearch -Epath.data=node1 -Ecluster.name=my_cluster -Enode.name=node1 -d
bin/elasticsearch -Ehttp.port=8200 -Epath.data=node2 -Ecluster.name=my_cluster -Enode.name=node2 -d
bin/elasticsearch -Ehttp.port=7200 -Epath.data=node3 -Ecluster.name=my_cluster -Enode.name=node3 -d

可以通过 cerebro 插件可以看到,集群my_cluster中存在三个节点,分别为:node1node2node3

「学习笔记」ElasticSearch入门

1. 概述

1.1 ElasticStack特点
  1. 使用门槛低,开发周期短,上线快
  2. 性能好,查询快,实时展示结果
  3. 扩容方便,快速支撑增长迅猛的数据
1.2 ElasticStack各组件作用
  1. Beats:数据采集
  2. LogStash: 数据处理
  3. ElasticSearch(核心引擎): 数据存储、查询和分析
  4. Kibana: 数据探索与可视化分析
1.3 ElasticStack使用场景
  • 搜索引擎、日志分析、指标分析
1.4 ElasticStack安装启动
  1. ElasticSearch启动:解压到安装目录,启动bin/elasticsearch(默认端口:http:\\localhost:9200, 加参数-d后台启动)
  2. ElasticSearch集群:
bin/elasticsearch -d 
bin/elasticsearch -Ehttp.port=8200 -Epath.data=node2 -d
bin/elasticsearch -Ehttp.port=7200 -Epath.data=node3 -d
  1. Kibana启动:解压到安装目录,启动bin/kibana(默认端口:http:\\localhost:5601
1.5 ElasticSearch常见术语
  1. Document(文档):用户存储在ES中的数据文档
  2. Index(索引):由具有相同字段的文档列表组成
  3. field(字段):包含具体数据
  4. Node(节点):一个ES的实例,构成clister的单元
  5. Cluster(集群):对外服务的一个/多个节点
1.6 Document介绍
  1. 常用数据类型:字符串、数值型、布尔型、日期型、二进制、范围类型
  2. 每个文档都有一个唯一ID标识。(可以自行指定,也可由ES自动生成)
  3. 元数据,用于标注文档的相关信息:
    • _index:文档所在的索引名
    • _type:文档所在的类型名(后续的版本中type这个概念将会被移除,也不允许一个索引中有多个类型)
    • _id:文档唯一标识
    • _source:文档的原始JSON数据,可从这获取每个字段的内容
    • _all:整合所有字段内容到该字段。(默认禁用)
    • _version:文档字段版本号,标识被操作了几次
  4. Index介绍:
    • 索引中存储相同结构的文档,且每个index都有自己的Mapping定义,用于定义字段名和类型;
    • 一个集群中可以有多个inex,类似于可以有多个table。
  5. RESTful API两种交互方式:
    1. CURL命令行:curl -XPUT xxx
    2. Kibana DevTools————PUT xxx{ }
  6. Index API: 用户创建、删除、获取索引配置等。
    1. 创建索引:
      • PUT /test_index #创建一个名为test_index的索引
    2. 查看索引:
      • GET _cat/indices #查看所有的索引
    3. 删除索引:
      • DELETE /test_index #删除名为test_index的索引
1.7 CRUD操作(交互基于Kibana DevTools)
  1. 创建文档
# 创建ID为1的Document
PUT /test_index/doc/1
{
 "username":"alfred",
 "age":"24"
}
#
# 不指定ID创建Document(ID会自动生成)
POST /test_index/doc
{
 "username":"buzhiding",
 "age":"1"
}
  1. 查询文档:
# 查看名为test_index的索引中id为1的文档
GET /test_index/doc/1
#
# 查询所有文档:
# 查询名为test_index的索引中所有文档,用到endpoint:_search,默认返回符合的前10条
# term和match的区别:term完全匹配,不进行分词器分析;match模糊匹配,进行分词器分析,包含即返回
GET /test_index/doc/_search
{
 "query":{
  "term":{
   "_id":"1"
  }
 }
}
  1. 批量操作文档:
# 批量创建文档,用到endpoint:_bulk
# index和create的区别,如果文档存在时,使用create会报错,而index会覆盖
POST _bulk
{"index":{"_index":"test_index","_type":"doc","_id":"3"}}
{"username":"alfred","age":"20"}
{"delete":{"_index":"test_index","_type":"doc","_id":"1"}}
{"update":{"_id":"2","_index":"test_index","_type":"doc"}}
{"doc":{"age":"30"}}
#
# 批量查询文档,使用endpoint:_mget
GET _mget
{
 "doc":[
  {
   "_index":"test_index",
   "_type":"doc",
   "_id":"1"
  },
  {
   "_index":"test_index",
   "_type":"doc",
   "_id":"2"
  }
 ]
}
  1. 删除文档:
# 根据搜索内容删除文档,使用endpoint:_delete_by_query
POST /test_index/doc/_delete_by_query
{
 "query":{
  "match":{
   "username":"buzhiding"
  }
 }
}
# 
# 删除整个test_index的索引中的文档,依然使用endpoint:_delete_by_query
POST /test_index/doc/_delete_by_query
{
 "query":{
  "match_all":{}
 }
}

2. ElasticSearch倒排索引与分词

2.1 倒排索引
  1. 正排索引和倒排索引
    • 正排索引:文档ID —> 文档内容
    • 倒排索引:单词—> 文档ID列表
  2. 倒排索引组成:(单词词典,倒排列表)
    1. 单词词典(Term Dictionary
      • 记录所有文档的单词,记录了单词到倒排列表的关联信息,一般使用B+Tree实现。
    2. 倒排列表(Posting List
      • 记录单词对应的文档集合,由倒排索引项Posting List组成。
      • 倒排索引项:
        1. 文档ID:用于获取原始信息。
        2. 词频TF:记录该单词在该文档中的出现次数,用于计算相关性得分。
        3. 位置Position:记录单词在文档中的分词位置(多个),用于词语搜索。
        4. 偏移Offset:记录单词在文档的开始和结束位置,用于高亮显示。
2.2 分词Analysis

分词:将文本转换成一系列单词Term/Token的过程,也可称作文本分析,ES中叫作:Analysis。

「学习笔记」基于Redis的分布式锁实现

SETNX命令简介

  • SETNX key value返回(1:key的值被设置,0:key的值没被设置),将key的值设为value,并且仅当key不存在。
  • 锁的key为目标数据的唯一键,value为锁的期望超时时间点;
  • 基于Redis实现的分布式锁,主要基于redissetnx(set if not exist)命令;

1. jedis实现分布式锁

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.1</version>
</dependency>
1.1 实现示例:
public static boolean correctGetLock(String lockKey, String requestId, int expireTime) {
    String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
    if ("OK".equals(result)) {
        return true;
    }
    return false;
}

jedis.set(String key, String value, String nxxx, String expx, int time) - key:保证唯一,用来当锁(redis记录的key) - valueredis记录的value,目的是为了标志锁的所有者(竞争锁的客户端),保证解锁时只能解自己加的锁。requestId可以使用UUID.randomUUID().toString()方法生成 - nxxx"NX"意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作,若key已经存在,则不做任何操作 - expx"PX"意思是要给这个key加一个过期的设置(单位毫秒),过期时间由第五个参数决定 - timeexpx设置为"PX"时,redis key的过期时间

「学习笔记」深入学习Redis及集群

Redis本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB。另外Redis也可以对存入的Key-Value设置expire时间。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

1. Redis数据结构及命令操作

1.1 基本概念及操作
  • 默认16个数据库,类似数组下表从零开始,初始默认使用零号库;
  • 统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上,redis默认端口是6379;
  • select命令切换数据库:select 0-15;
  • dbsize:查看当前数据库的key的数量;
  • flushdb:清空当前库;
  • flushall;通杀全部库;
1.2 Redis数据结构

redis存储的是:key-value格式的数据,其中key都是字符串,value有5种不同的数据结构:String、Hash、List、Set、Zset(Sorted Set)

「学习笔记」MySQL慢日志查询分析

同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等。这些日志可以帮助我们定位mysqld内部发生的事件,数据库性能故障,记录数据的变更历史,用户恢复数据库等等。

  • 错误日志:记录启动、运行或停止mysqld时出现的问题。
  • 通用日志:记录建立的客户端连接和执行的语句。
  • 更新日志:记录更改数据的语句。该日志在MySQL 5.1中已不再使用。
  • 二进制日志:记录所有更改数据的语句。还用于复制。
  • 慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询
  • Innodb日志:InnoDB redo log(记录了事务的行为,可以很好的通过其对页进行“重做”操作)

1. 开启慢查询日志

开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。 通过show variables like 'slow_query%';查询是否开了慢查询(默认禁用OFF)

0%