Elasticsearch使用及集群6.x破解

警告:以下破解内容仅供个人学习使用,严禁商用!

Elasticsearch.md

安装Elasticsearch

需要安装官方新版Java,地址:www.java.com
可以从 elasticsearch.org/download 下载最新版本的 Elasticsearch ,解压即可。
安装jdk yum install java-1.8.0-openjdk* -y

Marvel

    Marvel 是 Elasticsearch 的管理和监控工具,可在 Elasticsearch目录中运行以下命令来下载和安装 Marvel插件:./bin/plugin -i elasticsearch/marvel/latest
    关闭Marvel:echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml

    查看Marvel:http:\/\/localhost:9200\/_plugin\/marvel\/
    查看Sense:在Marvel中通过点击dashboards,在下拉菜单中访问Sense开发者控制台,或者直接访问以下地址:http:\/\/localhost:9200\/_plugin\/marvel\/sense\/

运行Elasticsearch

命令:./bin/elasticsearch
启动后,如果只有本地可以访问,尝试修改配置文件 elasticsearch.yml 中network.host(注意配置文件格式不是以#开头的要空一格, :后要空一格) 为network.host: 0.0.0.0
如果想在后台以守护进程模式运行,添加-d参数。

测试:curl 'http://localhost:9200/?pretty'
会出现以下返回信息:
{
  "name" : "iHwDofo",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "gj7nu-kQQbGP40BV5Kp1Zw",
  "version" : {
    "number" : "6.0.0",
    "build_hash" : "8f0685b",
    "build_date" : "2017-11-10T18:41:22.859Z",
    "build_snapshot" : false,
    "lucene_version" : "7.0.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
说明ELasticsearch集群已经启动并且正常运行.

节点(node)是一个运行着的 Elasticsearch 实例。
集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,一个节点也可以组成一个集群。

关闭 Elasticsearch:ctrl + c 或者 curl -XPOST 'http://localhost:9200/_shutdown'

API

JavaAPI

Elasticsearch 为Java用户提供了两种内置客户端

节点客户端(node client):

    节点客户端以无数据节点(none data node)身份加入集群,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。

传输客户端(Transport client):

    这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。

两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。

基于HTTP协议,以JSON为数据交互格式的RESTful API

其他所有程序语言都可以使用RESTful API,通过9200端口的与Elasticsearch进行通信。
请求模板:
    curl -X '://:/?' -d ''

VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)

例如:curl -XGET 'http://localhost:9200/_count?pretty' -d '
        {
            "query": {
                "match_all": {}
            }
        }'

默认是不显示请求头,如果要显示,使用curl命令后跟-i参数:
    curl -i -XGET 'localhost:9200/'

基本概念

索引

在Elasticsearch中存储数据的行为就叫做索引(indexing)。
Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

添加索引:
curl -XPUT 'localhost:9200/customer/external/1?pretty' -H 'Content-Type: application/json' -d '

{
    "name": "Jimmy Yankee"
  }

检索

curl -XGET 'http://localhost:9200/megacorp/employee/1?pretty'
检索 megacorp 索引的 empoyee 类型的 1 号

检索全部(默认情况下会返回前十个结果):

curl -XGET 'http://localhost:9200/megacorp/employee/_search?pretty'

查询字符串:

curl -XGET 'http://localhost:9200/megacorp/employee/_search?q=first_name:Jack'
使用_search关键字,将查询语句传给参数 q=

DSL查询

以JSON请求体的形式发起查询
curl -XGET 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query":{
        "match":{
            "first_name":"Jack"
        }
    }
}'

添加过滤器查询

如:查询大于三十岁叫Jack的员工
curl -XGET 'http:localhost:9200/megacorp/employee/_search' -d '
{
    "query":{
        "filtered":{
            "filter":{
                "range":{
                    "age"{"gt":30} <1>
                }
            },
            "query":{
                "match":{
                    "first_name":"Jack"<2>
                }
            }
        }
    }
}'
<1>属于区间过滤器,用于查找所有年龄大于30岁的数据,gt为 "greater than" 的缩写。
<2>match 语句

全文搜索(模糊匹配)

搜索喜欢rock climbing 的员工
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
    "query":{
        "match":{
            "about":"rock climbing"
        }
    }
}'
Elasticsearch 根据结果相关性评分来对结果进行排序(文档与查询条件的匹配程度)

短语搜索

匹配确切的若干个单词或短语
即将 match 查询变为 match_phrase 查询即可。
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
    "query":{
        "match_phrase":{
            "about":"rock climbing"
        }
    }
}'

高亮搜索

从搜索结果中高亮匹配到的关键字,即在语句上增加 highlight 参数:
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
    "query":{
        "match_phrase":{
            "about":"rock climbing"
        }
    },
    "highlight":{
        "fields":{
            "about":{}
        }
    }
}'
返回结果中会有新的部分叫做 highlight,包含了来自 about字段中的文本,并且用来标识匹配到的单词。

聚合(aggregations)

是实时从匹配查询语句的文档中动态计算生成的。
简单例子:找到所有职员中最大的共同爱好
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
    "aggs":{
        "all_interests":{
            "terms":{"field":"interests"}
        }
    }
}'
查询叫Jack的人最大的共同爱好
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
    "query":{
        "match":{
            "first_name":"Jack"
        }
    },
    "aggs"{
        "all_interests":{
            "terms":{
                "field":"interests"
            }
        }
    }
}'

分级汇总:如查询每种兴趣下职员的平均年龄
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
    "aggs"{
        "all_interests":{
            "terms":{
                "fiels":"interests"
            },
            "aggs"{
                "avg_age":{
                    "avg":{
                        "field":"age"
                    }
                }
            }
        }
    }
}'

集群

集群健康

输入 curl -XGET 'http://localhost:9200/_cluster/health' 即可查看集群健康状态
返回结果中status 提供一个综合指标来表示集群的服务状态
green:所有的主要分片和复制分片都可用
yellow:所有主要分片可用,但不是所有复制分片都可用
red:不是所有的主要分片都可用

添加索引

分片是Elasticsearch在集群中分发数据的关键。把分片想象成数据的容器。
文档存储在分片中,然后分片分配到你集群中的节点上。当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。
分片可以是主分片(primary shard)或者是复制分片(replica shard)。
你索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。

创建 blog 索引,设置分配3个主分片和一个复制分片(默认一个索引会被分配5个主分片)
curl -XPUT 'http://localhost:9200/blogs' -H'Content-Type:application/json' -d '
{
   "settings" : {
      "number_of_shards" : 3,
      "number_of_replicas" : 1
   }
}'

检查文档是否存在

curl -i -XHEAD 'http://localhost:9200/_index/_type/_id'
存在会返回 200 OK,不存在会返回 404 NOT Found

更新文档

使用 XPUT 方法即可
curl -XPUT 'http://localhost:9200/_index/_type/_id' -H 'Content-Type:application/json' -d '
{
    "title":"the new title",
    "text":"the new text",
    "date":"2018/11/28"
}'
更新后可以看到 _version 字段增加了,created 标识为 false

创建新文档

最简单的是使用 POST 方法让Elasticsearch自动生成 _id
curl -XPOST 'http://localhost:9200/_index/_type' -d '{ ... }'

或者使用op_type 查询参数:
curl -XPUT 'http://localhost:9200/_index/_type/_id?op_type' -d '{}'

或者在url后面加 /_create:
curl -XPUT 'http://localhost:9200/_index/_type/_id/_create' -d '{}'

若请求成功创建了一个新文档,将返回正常的元数据且相应状态码是 201 Created
否则返回 409 Conflict

删除文档

curl -XDELETE 'http://localhost:9200/_index/_type/_id'
如果找到该文档,则返回200 OK _version 会增加
否则返回 404 Not Found

版本控制

只希望文档的_version是1时更新才生效
curl -XPUT 'http://localhost:9200/_index/_type/_id?version=1' -d '{}'
当_version =2 时会发生 409 Conflict 状态

外部版本号:它检查是否小于指定的版本,如果请求成功,外部版本号就会被存储到 _version 中。

如创建一个包含外部版本号5的新博客
curl -XPUT 'http://localhost:9200/_index/_type/_id?version=5&version_type=external' -d '{}'

更新这个文档
curl -XPUT 'http://localhost:9200/_index/_type/_id?version=10&version_type=external' -d '{}'

当外部版本号不小于版本号时会报 409 Conflict

局部更新

  最简单的update请求表单接受一个局部文档参数doc,它会合并到现有文档中——对象合并在一起,存在的标量字段被覆盖,新字段被添加。
如为对象添加一个tags 字段和一个views字段

curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
    "doc":{
        "tags":["testing"],
        "views":0
    }
}'

用脚本增加views数量:
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' id '
{
    "script":"ctx._source.views+=1"
}'

使用脚本增加新标签到 tags 数组中
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
    "scripe":"ctx._source.tags+=new_tag",
    "params":{
        "new_tag":"search"
    }
}'

根据内容删除文档
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
    "script":"ctx.op = ctx._source.views == count ? 'delete' : 'none'",
    "params":{
        "count":1
    }
}'

更新可能不存在的文档(upsert)
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
    "script":"ctx._source.views+=1",
    "upsert":{
        "views":1
    }
}'

更新时发生冲突,需要重新尝试(retry_on_conflict参数设置重试次数):
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update?retry_on_conflict=5' -d '
{
    "script":"ctx._source.views+=1",
    "upsert":{
        "views":1
    }
}'

检索多个文档

使用mget API.mget 参数是一个 docs 数组,数组的每个节点定义一个文档的_index _type _id 元数据,如果你只想检索一个或几个确定的字段,也可以定义一个 _source 参数:
curl -XPOST 'http://localhost:9200/_mget' -d '
{
   "docs" : [
      {
         "_index" : "website",
         "_type" :  "blog",
         "_id" :    2
      },
      {
         "_index" : "website",
         "_type" :  "pageviews",
         "_id" :    1,
         "_source": "views"
      }
   ]
}'

如果所有文档具有相同的 _index 和 _type ,就可以通过简单的 ids 数组来代替完整的 docs 数组:
curl -XPOST 'http://localhost:9200/_index/_type/_mget' -d '
{
    "ids":["2","1"]
}'

杂项

下载地址

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-6.3.2-linux-x86_64.tar.gz

配置相关

设置打开文件描述符

vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
* soft memlock unlimited
* hard memlock unlimited

配置内核参数

vim /usr/lib/sysctl.d/50-default.conf
vm.max_map_count=362144 
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
sysctl -p  #此命令可能不生效,可以重启使配置生效

创建elastic用户用来启动elasticsearch

[root@es-node1 ~]# useradd elastic
[root@es-node1 ~]# echo "123456" |passwd --stdin elastic
[root@es-node1 ~]# mkdir -pv /Data/es/
mkdir: 已创建目录 "/Data"
mkdir: 已创建目录 "/Data/es/"
[root@es-node1 ~]# chown -R elastic:elastic /Data/es/
[root@es-node1 ~]# chown -R elastic:elastic /usr/local/elasticsearch-6.3.2/
#退出,重新登录(可以的话最好重启服务器,发现有些参数不重启不生效)
[root@es-node1 config]# exit
#切换用户并启动服务
[root@es-node1 ~]# su - elastic
[elastic@es-node1 ~]$ cd /usr/local/elasticsearch
[elastic@es-node1 elasticsearch]$ nohup ./bin/elasticsearch > /tmp/elastic.log & #或者添加 -d/--daemonize 参数后台运行,日志文件在path.logs指定的目录下
[1] 2426
[elastic@es-node1 elasticsearch]$ nohup: 忽略输入重定向错误到标准输出端
[elastic@es-node1 elasticsearch]$ tailf /tmp/elastic.log 

安装配置kibana

[root@kb-node1 ~]# tar xf kibana-6.3.2-linux-x86_64.tar.gz -C /usr/local/
[root@kb-node1 ~]# cd /usr/local/
[root@kb-node1 local]# ln -sv kibana-6.3.2-linux-x86_64/ kibana
"kibana" -> "kibana-6.3.2-linux-x86_64/"
[root@kb-node1 local]# cd kibana
[root@kb-node1 kibana]# vim config/kibana.yml
[root@kb-node1 kibana]# grep "^[a-z]" config/kibana.yml
server.port: 5601      #监听的端口
server.host: "192.168.1.110"   #监听的地址
elasticsearch.url: "http://192.168.1.107:9200"   #elasticsearch访问的URL地址
[root@kb-node1 kibana]# ./bin/kibana &  #启动服务

x-pack破解

留备份

elasticsearch-6.3.0\modules\x-pack\x-pack-core目录下找到x-pack-core-6.3.0.jar,复制一份出来留个备份

创建破解文件

package org.elasticsearch.license;

import java.nio.*;
import org.elasticsearch.common.bytes.*;
import java.util.*;
import java.security.*;
import org.elasticsearch.common.xcontent.*;
import org.apache.lucene.util.*;
import org.elasticsearch.core.internal.io.*;
import java.io.*;
 
 
public class LicenseVerifier
{
    public static boolean verifyLicense(final License license, final byte[] encryptedPublicKeyData) {
       return true;
    }
    
    public static boolean verifyLicense(final License license) {
         return true;
    }
}


package org.elasticsearch.xpack.core;

import org.elasticsearch.common.io.*;
import java.net.*;
import org.elasticsearch.common.*;
import java.nio.file.*;
import java.io.*;
import java.util.jar.*;
 
 
public class XPackBuild
{
    public static final XPackBuild CURRENT;
    private String shortHash;
    private String date;
    
    @SuppressForbidden(reason = "looks up path of xpack.jar directly")
    static Path getElasticsearchCodebase() {
        final URL url = XPackBuild.class.getProtectionDomain().getCodeSource().getLocation();
        try {
            return PathUtils.get(url.toURI());
        }
        catch (URISyntaxException bogus) {
            throw new RuntimeException(bogus);
        }
    }
    
    XPackBuild(final String shortHash, final String date) {
        this.shortHash = shortHash;
        this.date = date;
    }
    
    public String shortHash() {
        return this.shortHash;
    }
    
    public String date() {
        return this.date;
    }
    
    static {
        final Path path = getElasticsearchCodebase();
        String shortHash = null;
        String date = null;
        Label_0157: {
           
            shortHash = "Unknown";
            date = "Unknown";
        }
        CURRENT = new XPackBuild(shortHash, date);
    }
}

编译破解文件

mkdir org/elasticsearch/license/
mv LicenseVerifier.class org/elasticsearch/license/LicenseVerifier.class
jar uvf x-pack-core-6.3.0.jar org/elasticsearch/license/LicenseVerifier.class    

mkdir org/elasticsearch/xpack/core/
mv LicenseVerifier.class org/elasticsearch/xpack/core/XPackBuild.class
jar uvf x-pack-core-6.3.0.jar org/elasticsearch/xpack/core/XPackBuild.class

获取license证书

1. https://license.elastic.co/registration 填些用户名,邮箱(重要,获取下载链接),Country选择China,其他信息随意填写
2. 打开邮箱获取的地址,将下载后的文件改名为license.json
3. 修改文件中的内容,将两个属性改为
    将 "type":"basic" 替换为 "type":"platinum"    # 基础版变更为铂金版
    将 "expiry_date_in_millis":1561420799999替换为 "expiry_date_in_millis":3107746200000    # 1年变为50年
4. 使用curl替换 license(license.json指的是刚刚下载修改属性后的证书,要开启elasticsearch服务)
    curl -H "Content-Type: application/json" -XPUT 'http://192.168.7.245:9200/_xpack/license?acknowledge=true' -d @license.json
5. 若失败,修改配置文件
    xpack.security.enabled: false
    破解成功后改回来
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
6. 上传后查看证书时间
    curl -XGET http://192.168.7.245:9200/_license

配置SSL并启用z-pack

创建证书

[elastic@es-node1 elasticsearch]$ cd /usr/local/elasticsearch/bin/
[elastic@es-node1 bin]$ ./elasticsearch-certgen

解压证书

[elastic@es-node1 bin]$ mkdir /tmp/cert
[elastic@es-node1 bin]$ mv cert.zip /tmp/cert/
[elastic@es-node1 bin]$ cd /tmp/cert/
[elastic@es-node1 cert]$ unzip cert.zip 
Archive:  cert.zip
   creating: ca/
  inflating: ca/ca.crt               
  inflating: ca/ca.key               
   creating: elasticsearch/
  inflating: elasticsearch/elasticsearch.crt  
  inflating: elasticsearch/elasticsearch.key  
[elastic@es-node1 cert]$ ll
总用量 8
drwxrwxr-x 2 elastic elastic   34 9月  20 13:47 ca
-rw------- 1 elastic elastic 5157 9月  20 13:47 cert.zip
drwxrwxr-x 2 elastic elastic   56 9月  20 13:47 elasticsearch
[elastic@es-node1 cert]$ mv ca/* /usr/local/elasticsearch/config/
[elastic@es-node1 cert]$ mv elasticsearch/*  /usr/local/elasticsearch/config/
[elastic@es-node1 cert]$ cd /usr/local/elasticsearch/config/
[elastic@es-node1 config]$ ll -rct  #最后四个
总用量 48
-rw-rw---- 1 elastic elastic    0 9月  19 16:15 users_roles
-rw-rw---- 1 elastic elastic    0 9月  19 16:15 users
-rw-rw---- 1 elastic elastic  197 9月  19 16:15 roles.yml
-rw-rw---- 1 elastic elastic  473 9月  19 16:15 role_mapping.yml
-rw-rw---- 1 elastic elastic 6380 9月  19 16:15 log4j2.properties
-rw-rw---- 1 elastic elastic 2942 9月  19 16:15 jvm.options
-rw-r----- 1 elastic elastic 2853 9月  19 16:15 elasticsearch.yml-bak
-rw-rw---- 1 elastic elastic  207 9月  19 16:20 elasticsearch.keystore
-rw-rw---- 1 elastic elastic 2905 9月  20 13:27 elasticsearch.yml
-rw-rw-r-- 1 elastic elastic 1671 9月  20 13:57 ca.key
-rw-rw-r-- 1 elastic elastic 1200 9月  20 13:57 ca.crt
-rw-rw-r-- 1 elastic elastic 1675 9月  20 13:57 elasticsearch.key
-rw-rw-r-- 1 elastic elastic 1237 9月  20 13:57 elasticsearch.crt  

将证书拷贝到其他节点的config目录下

[elastic@es-node1 config]$ scp *.crt  *.key  192.168.1.108:/usr/local/elasticsearch/config/
[elastic@es-node1 config]$ scp *.crt  *.key  192.168.1.109:/usr/local/elasticsearch/config/

配置SSL

[elastic@es-node1 config]$ vim elasticsearch.yml
[elastic@es-node1 config]$ tail elasticsearch.yml
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true  
xpack.security.enabled: true              #之前配置为false注意删除或者修改
xpack.security.transport.ssl.enabled: true
xpack.ssl.key: elasticsearch.key
xpack.ssl.certificate: elasticsearch.crt
xpack.ssl.certificate_authorities: ca.crt

创建集群相关用户

[elastic@es-node1 bin]$ ./elasticsearch-setup-passwords -h  #查看命令帮助 
Sets the passwords for reserved users

Commands
--------
auto - Uses randomly generated passwords          #主要命令选项,表示系统将使用随机字符串设置密码
interactive - Uses passwords entered by a user    #主要命令选项,表示使用用户输入的字符串作为密码

Non-option arguments:
command              

Option         Description        
------         -----------        
-h, --help     show help          
-s, --silent   show minimal output
-v, --verbose  show verbose output
[elastic@es-node1 bin]$ ./elasticsearch-setup-passwords auto  #为了演示效果,这里我们使用系统自动创建
Initiating the setup of passwords for reserved users elastic,kibana,logstash_system,beats_system.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y     #选择y


Changed password for user kibana                   #kibana角色和密码
PASSWORD kibana = 4VXPRYIVibyAbjugK6Ok

Changed password for user logstash_system          #logstash角色和密码
PASSWORD logstash_system = 2m4uVdSzDzpt9OEmNin5

Changed password for user beats_system             #beast角色和密码
PASSWORD beats_system = O8VOzAaD3fO6bstCGDyQ

Changed password for user elastic                  #elasticsearch角色和密码
PASSWORD elastic = 1TWVMeN8tiBy917thUxq

配置kibana,添加elasticsearch用户认证

[root@kb-node1 ~]# vim /usr/local/kibana/config/kibana.yml 
[root@kb-node1 ~]# grep "^elastic"  /usr/local/kibana/config/kibana.yml 
elasticsearch.url: "http://192.168.1.107:9200"
elasticsearch.username: "elastic"
elasticsearch.password: "1TWVMeN8tiBy917thUxq"   #就是上一步创建的elastic的账号和密码

重启kibana,重启后打开kibana web页面,可以使用用户名和密码登录了(使用之前创建的用户名和密码登录即可)

你可能感兴趣的:(Elasticsearch使用及集群6.x破解)