ElasticSearch6.x之xpack-sql初窥

3,439 阅读5分钟
原文链接: mp.weixin.qq.com

概述

x-pack在5.0后已经作为组件集成到松耦合集成到ES 中,x-pack是一个集安全、警报、监视、报告和图形功能于一身的扩展,轻松开启或关闭那些你想要的功能。5.0之前须安装单独的 Shield、Watcher和Marvel等插件才能获得在 X-Pack中所有的功能。在6.x版本中已经默认集成,无需在安装,而且x-pack默认都是开启的。这里介绍的 x-pack-sql是需要白金版才能开启使用,并且6.3版本以后开始支持 jdbc,这个特性大大降低了学习门槛,你再也不用记一大堆rest接口api 了。

ES安装

下载

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.1.tar.gz

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

 

license

访问以下链接

https://license.elastic.co/registration

 

 

填写好上面信息后发送,会给你邮箱发送一个下载license的链接

 

 

 

选择你要的版本下载即得到license-platinum.json文件

 

修改license-platinum.json内容,主要是红色的两个字段,platinum即白金版 ,expiry_date_in_mills表示license失效时间

 

{

    "license": {

        "uid": "b2c9c477-1288-4287-9768-9c33a2c80ff4",

        "type": "platinum",

        "issue_date_in_millis": 1543968000000,

        "expiry_date_in_millis": 3107746200000,

        "max_nodes": 100,

        "issued_to": "nan a (fulis)",

        "issuer": "Web Form",

        "signature": "AAAAAwAAAA12nztKGXIJnZM1P6QAAAABmC9ZN0hjZDBGYnVyRXpCOW5Bb3FjZDAxOWpSbTVoMVZwUzRxVk1PSmkxaktJRVl5MUYvUWh3bHZVUTllbXNPbzBUemtnbWpBbmlWRmRZb25KNFlBR2x0TXc2K2p1Y1VtMG1UQU9TRGZVSGRwaEJGUjE3bXd3LzRqZ05iLzRteWFNekdxRGpIYlFwYkJiNUs0U1hTVlJKNVlXekMrSlVUdFIvV0FNeWdOYnlESDc3MWhlY3hSQmdKSjJ2ZTcvYlBFOHhPQlV3ZHdDQ0tHcG5uOElCaDJ4K1hob29xSG85N0kvTWV3THhlQk9NL01VMFRjNDZpZEVXeUtUMXIyMlIveFpJUkk2WUdveEZaME9XWitGUi9WNTZVQW1FMG1DenhZU0ZmeXlZakVEMjZFT2NvOWxpZGlqVmlHNC8rWVVUYzMwRGVySHpIdURzKzFiRDl4TmM1TUp2VTBOUlJZUlAyV0ZVL2kvVk10L0NsbXNFYVZwT3NSU082dFNNa2prQ0ZsclZ4NTltbU1CVE5lR09Bck93V2J1Y3c9PQAAAQBIBVV1WIP9VGkQWDReAg09XCkXBk+DyDgWInKoY0XFDPkpd0MklR5tAsZ3qrEeCp9W66wURn0fEpFEMOKDPSpXAm2DF4t1UHo+ucXqo19TQU+jigvdz2EHfjPp9OUZdhKWpgf0phswP8Uz1mQ8HBQ1KtNhBh7hAAdmCGOUHcUw4ZOg9dMg676Z5N6Ktgt8SRo4Ydwsxn263yRvYfCCXLiXqDw2DF0zJonXzNnEqouu2kLkJjigxehs09gD21tL+Egi6zwH1DXj81di8h9skxTc3mxv2fO4s8I9mImc7IqHeYAY4lVWnvS8JAQGOJMW45bbyN5sRaF6Hcns/2l6I6Ak",

        "start_date_in_millis": 1543968000000

    }

}

 

 

将license.json拷贝到目录

/export/home/tools/elasticstack/license.json

破解

打开下载好的elasticsearch-6.5.1.tar.gz,找到modules/x-pack-core目录下的

x-pack-core-6.5.1.jar

 

 

打开x-pack-core-6.5.1.jar,替换下面两个class文件

 

 

这里我已经将两个编译好的class放这里了,同样源码文件也在这里(如果想要文件可以联系我 stantnks@gmail.com)

 

编译上面两个源文件的方法如下,依赖的classpath对应的jar在安装包中都可以找到

 

export CLASSPATH=.:./x-pack-core-6.3.0.jar;./lucene-core-7.3.1.jar;./elasticsearch-6.3.0.jar;./elasticsearch-core-6.3.0.jar

 

javac -classpath $CLASSPATH -d . LicenseVerifier.java

javac -classpath $CLASSPATH -d . XPackBuild.java

 

部署ES

mkdir -p /export/home/tools/elasticstack

cp elasticsearch-6.5.1.tar.gz /export/home/tools/elasticstack

cd /export/home/tools/elasticstack

tar -xvf elasticsearch-6.5.1.tar.gz

ls -s elasticsearch-6.5.1 elasticsearch

 

配置ES

系统配置

1.禁用交换内存

On Linux systems, you can disable swap temporarily by running(这一步没有必要)

sudo swapoff -a

 

2.将锁定内存大小限制改成无限大(即不限制锁定内存大小)

vi /etc/security/limits.conf

linkage soft memlock unlimited

linkage hard memlock unlimited

检查

 

 

3.修改进程能打开的最大文件句柄数量

vi /etc/security/limits.conf

linkage soft nofile 65536

linkage hard nofile 65536

检查

 

 

4.增加虚拟内存设置

vi /etc/sysctl.conf

vm.max_map_count=262144

检查

 

 

5.限制程序可以fork的进程数

vi /etc/security/limits.conf

linkage soft noproc 8192

linkage hard noproc 8192

 

elasticsearch.yml

配置elasticsearch.yml时需要注意每个属性分号后面需要有一个空格(如果没有空格启动就会报解析错误)

 

1.锁定物理内存

锁住内存不要交换出去,不然内存会无限扩张出去,直到把服务器内存占满

bootstrap.memory_lock: true

 

通过以下命令查看mlockall配置

curl -XGET "10.40.101.8:9200/_nodes?pretty&filter_path=**.mlockall"

 

上面的配置项只有在系统的以下配置配置为不限制情况下才行(即不限制锁定内存大小)

vi /etc/security/limits.conf

linkage soft memlock unlimited

linkage hard memlock unlimited

 

2.数据目录

path.data: /export/home/tools/elasticstack/es-indexdata

 

3.日志目录

path.logs: /export/home/tools/elasticstack/es-logs

 

4.集群名字

cluster.name: wx-data

 

5.节点名称

node.name: 10.40.101.8

 

6.主机IP

network.host: 10.40.101.8

 

7.配置为单节点(6.5.1版本配置了报错,奇怪)

# es.enforce.bootstrap.checks: false

# discovery.type: single-node

 

8. 关闭x-pack-security

xpack.security.enabled: false

 

 

JVM参数配置

/export/home/tools/elasticstack/elasticsearch/config/jvm.options

 

# 修改最大堆和初始化堆大小

-Xms8g

-Xmx8g

 

# 增加持久带参数

-XX:MetaspaceSize=128m

-XX:MaxMetaspaceSize=256m

 

启动ES

cd /export/home/tools/elasticstack/elasticsearch/bin

./elasticsearch -d

 

停止ES

jps -l|grep Elasticsearch|awk '{print $1}'|xargs kill

 

查看授权

curl -XGET 'http://10.40.101.10:9200/_license'

 

基础版

 

 

白金版

 

 

破解为白金版

cd /export/home/tools/elasticstack

 

curl -XPOST \

-H 'Content-Type:application/json' \

-d @license-platinum.json \

'http://10.40.101.10:9200/_xpack/license?acknowledge=true&pretty'

 

 

 

变更为基础版

curl -XPOST \

'10.40.101.10:9200/_xpack/license/start_basic?acknowledge=true&pretty'

 

 

检查jdbc是否可用

 

 

 

启用安全

vi config/elasticsearch.yml

xpack.security.transport.ssl.enabled: true

xpack.security.enabled: true

 

配置密码

cd bin/

./elasticsearch-setup-passwords interactive

 

 

 

安全模式访问API

curl -XGET -u 'elastic:密码' 'http://10.40.101.10:9200/_license'

 

 

安全模式进去SQL-CLI

./elasticsearch-sql-cli 

'http://elastic:密码@10.40.101.10 '

 

 

客户端-jdbc适配

maven依赖

 

<repositories>

<repository>

    <id>elastic.co</id>

    <url>https://artifacts.elastic.co/maven</url>

</repository>

</repositories>

 

<dependencies>

<dependency>

    <groupId>org.elasticsearch.client</groupId>

    <artifactId>transport</artifactId>

    <version>6.4.2</version>

    <exclusions>

<exclusion>

    <groupId>org.elasticsearch</groupId>

    <artifactId>elasticsearch</artifactId>

</exclusion>

<exclusion>

    <groupId>commons-logging</groupId>

    <artifactId>commons-logging</artifactId>

</exclusion>

<exclusion>

    <groupId>org.elasticsearch.plugin</groupId>

    <artifactId>transport-netty3-client</artifactId>

</exclusion>

    </exclusions>

</dependency>

<dependency>

    <groupId>org.elasticsearch.plugin</groupId>

    <artifactId>transport-netty4-client</artifactId>

    <version>6.4.2</version>

</dependency>

<dependency>

    <groupId>org.elasticsearch.plugin</groupId>

    <artifactId>x-pack-sql-jdbc</artifactId>

    <version>6.4.2</version>

</dependency>

<dependency>

    <groupId>org.elasticsearch.client</groupId>

    <artifactId>x-pack-transport</artifactId>

    <version>6.4.2</version>

</dependency>

<dependency>

    <groupId>org.elasticsearch</groupId>

    <artifactId>elasticsearch</artifactId>

    <version>6.4.2</version>

</dependency>

</dependencies>

 

注意:

下载依赖时如果下载不下来,请将C:\Users\Administrator\.m2\settings.xml改个名字, 例如改成settings.xml.bak,或$M2_HOME/conf/settings.xml改个名字。

等下载完成后再改回来。下载完成后需要将C:\Users\Administrator\.m2\repository或$M2_HOME\repository 目录下下载好的依赖jar包拷贝到你真实的本地仓库目录下

 

创建索引

curl -XPUT -u 'elastic:密码' \

 -H "Content-Type:application/json" \

"10.40.101.10:9200/twitter/doc/1" \

-d '{

    "user" : "kimchy",

    "post_date" : "2009-11-15T14:12:12",

    "message" : "trying out Elasticsearch"

}'

 

查看索引数据

 

 

使用jdbc查询

DriverManagerDataSource ds=new DriverManagerDataSource();

ds.setDriverClassName("org.elasticsearch.xpack.sql.jdbc.jdbc.JdbcDriver");

ds.setUrl("jdbc:es://http://10.40.101.10:9200");

ds.setUsername("elastic");

ds.setPassword("密码");

JdbcTemplate jt=new JdbcTemplate(ds);

Integer cnt=jt.queryForObject("SELECT count(1) FROM twitter", Integer.class);

System.out.println("查询到记录数:" + cnt);

List<Map<String,Object>> list=jt.queryForList("SELECT * FROM twitter");

for(Map<String,Object> map: list){

System.out.println("查询记录明细:" + map);

}

 

疑问和坑

    使用sql和jdbc基本没啥问题,但是 6.x版本transport必须要tls,这里面坑比较多。尤其是证书这块,比较复杂,等后面整理好了,再发一篇出来,不然只查询没法索引不是很坑吗。

 

参考资料

https://www.elastic.co/guide/en/elasticsearch/reference/6.5/xpack-sql.html