因为工作需要用到elasticsearch,最近在测试环境部署单机版的elasticsearch服务,可以说是相当的波折,一个问题解决一个问题又来,都要吐血了已经,还好最终都得以解决,解决后那一刻真尼玛的爽啊啊啊。。。
问题列表:
- elasticsearch版本的选择,官网那么多版本该怎么选,选的版本能否顺利集成到现有项目中
- 部署的elasticsearch服务是否需要启用xpack.security验证(需要用户名密码)
- elasticsearch x-pack插件铂金版破解问题
- 安装插件elasticsearch-head遇到的版本安装问题
- sql插件elasticsearch-sql执行SQL遇到的Authorization问题
- kibana的安装使用
问题1:
因为我们项目部署在阿里云服务器,将来使用的elasticsearch不出意外应该就是阿里云的es,那么部署就必须按阿里云es的规范来,阿里云现有好几个版本可以选择,最终选择了6.7.0版本。
问题2:
因为项目使用的springboot版本问题,不能使用spring-boot的starter方式集成elasticsearch,只能通过client的方式操作es,阿里云也有相应的api文档(High Level REST Client(6.7.x))。这个是要支持用户名验证码的,所以部署时要开启xpack.security验证。
问题3:
这个比较麻烦,涉及到替换x-pack-core模块的两个类文件,这个晚点再补充。
问题4:
插件elasticsearch-head版本安装因elasticsearch选的是6.7.0,所以也只能安装Cerebro v0.8.3,它的界面是这样的:
问题5:
解决elasticsearch-sql插件执行SQL需要Authorization问题
插件elasticsearch-sql安装过程也比较顺利,参考github完成安装
但是如果elasticsearch开启了权限验证,就会报如下错误:
Error:{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication token for REST request [/_sql]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication token for REST request [/_sql]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
需要输入elasticsearch服务用户名密码来验证才能执行SQL查询,但是github上面并没有说明这部分。怎么办呢? 只能去issues栏里面去找看看有没有人遇到一样的问题,还真的有。
Getting 401 error if authentication is enabled Elasticsearch
但是很无奈,我看完后还是没办法解决问题。。。烦,更让我郁闷的是这个问题关闭了,也就是帮助提问者解决了。。反正我看不懂,可能自己的问题,呵呵。
在网上继续查找答案,但是遇到这个问题的几乎没有,看来只有硬头皮从源码入手碰碰运气了,因为是nodejs写的,自己不熟悉,只能试试了。
解压es-sql-site-standalone.zip后得到site-server和_site目录,进入其中的_site目录,打开controllers.js
这里只列出主要的部分:
// settings
var settings = location.search.substring(1).split("&").reduce(function (r, p) {
r[decodeURIComponent(p.split("=")[0])] = decodeURIComponent(p.split("=")[1]);
return r;
}, {});
var elasticsearchSqlApp = angular.module('elasticsearchSqlApp', ["ngAnimate", "ngSanitize"]);
// auth
if (settings['username']) localStorage.setItem("auth", "Basic " + window.btoa(settings['username'] + ":" + settings['password']));
if (localStorage.getItem("auth")) {
elasticsearchSqlApp.config(function ($httpProvider) {
$httpProvider.interceptors.push(function () {
return {
request: function (config) {
config.headers['Authorization'] = localStorage.getItem("auth");
return config;
}
};
});
});
}
看到这里应该知道,作者留有验证Authorization这部分逻辑,是从url地址中读取用户名username和密码password的
再次执行Search就可以了。
后续继续补充安装过程。。。