公司ES升级带来的坑怎么填?

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

前言

公司的ES最近需要全部进行升级,目的是方便维护和统一管理。以前的版本不统一,这次准备统一升级到一个固定的版本。

同时还会给ES加上权限控制,虽然都是部署在内网,为了防止误操作,加上权限还是有必要的。

带来的问题就是我这边的程序得改了,目前用的是Spring Data Elasticsearch来操作ES。

问题

首先版本从5.x升级到6.4.0,我这边用的Spring Boot是2.0.1版本,这块是兼容的,没有影响。唯一导致我这边要改动的就是权限这块。

在Spring Boot的文档中,提供了三种操作ES的框架,有两种是走Http协议的,也就是操作9200端口,是可以直接支持用户名和密码配置的。

elasticsearch-rest-client

spring.elasticsearch.rest.uris=http://search.example.com:9200
spring.elasticsearch.rest.username=user
spring.elasticsearch.rest.password=secret

JestClient:

spring.elasticsearch.jest.uris=http://search.example.com:9200
spring.elasticsearch.jest.read-timeout=10000
spring.elasticsearch.jest.username=user
spring.elasticsearch.jest.password=secret

偏偏我用的是第三种Spring Data Elasticsearch,没有认证信息的配置,但是有一个扩展属性properties

@ConfigurationProperties(prefix = "spring.data.elasticsearch")
public class ElasticsearchProperties {

    /**
     * Elasticsearch cluster name.
     */

    private String clusterName = "elasticsearch";

    /**
     * Comma-separated list of cluster node addresses.
     */

    private String clusterNodes;

    /**
     * Additional properties used to configure the client.
     */

    private Map<StringString> properties = new HashMap<>();
}

在TransportClientFactoryBean中初始化Settings的时候,会取properties中值

private Settings settings({
    if (properties != null) {
            Settings.Builder builder = Settings.builder();

            properties.forEach((key, value) -> {
                builder.put(key.toString(), value.toString());
            });

            return builder.build();
    }
    return Settings.builder()
            .put("cluster.name", clusterName)
            .put("client.transport.sniff", clientTransportSniff)
            .put("client.transport.ignore_cluster_name", clientIgnoreClusterName)
            .put("client.transport.ping_timeout", clientPingTimeout)
            .put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval)
            .build();
}

于是我在properties 中加上认证信息的配置发现还是不行,因为这个全新认证是扩展的,需要增加x-pack-transport才行。

<!-- add the x-pack jar as a dependency -->
<dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>x-pack-transport</artifactId>
      <version>6.4.2</version>
</dependency>

恶心的是中央仓库没有,还得指定仓库:

<repositories>
      <!-- add the elasticsearch repo -->
      <repository>
         <id>elasticsearch-releases</id>
         <url>https://artifacts.elastic.co/maven</url>
         <releases>
            <enabled>true</enabled>
         </releases>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
      </repository>
</repositories>

当你加入这些依赖之后你会发现,还是不能采用spring.data.elasticsearch.xxx这种方式直接配置认证信息,因为底层不是用的xpack扩展的client构造的, 用的是PreBuiltTransportClient,看下代码:

protected void buildClient() throws Exception {

    client = new PreBuiltTransportClient(settings());

    clusterNodes.stream() //
            .peek(it -> logger.info("Adding transport node : " + it.toString())) //
            .forEach(client::addTransportAddress);

    client.connectedNodes();
}

最终还是放弃了自动配置的方式,自己手动配置定义Client来支持权限认证。

@Bean
public Client client() {
    try {
        Settings.Builder builder = Settings.builder()
                .put("client.transport.ping_timeout", pingTimeout)
                .put("cluster.name", clusterName)
                .put("xpack.security.user", username + ":" + password)
                .put("xpack.security.transport.ssl.enabled""true")
                .put("xpack.security.transport.ssl.truststore.path", keystorePath)
                .put("xpack.security.transport.ssl.keystore.path", keystorePath)
                .put("xpack.security.transport.ssl.verification_mode""certificate");
        Settings settings = builder.build();
        String[] nodes = clusterNodes.split(",");
        TransportAddress[] addressArray = new TransportAddress[nodes.length];
        for (int i = 0; i < nodes.length; i++) {
            String[] nodeArray = nodes[i].split(":");
            addressArray[i] = new TransportAddress(InetAddress.getByName(nodeArray[0]), Integer.parseInt(nodeArray[1]));
        }
        return new PreBuiltXPackTransportClient(settings).addTransportAddresses(addressArray);
    } catch (Exception e) {
        logger.error("初始化ESClient异常", e);
    }
    return null;
}
  • username:用户名

  • password:密码

  • keystorePath:证书地址,会有一个.p12的证书

不知大家发现没有,看上去我们自定义的代码也没什么特别,关键点在于PreBuiltXPackTransportClient,框架中用的是PreBuiltTransportClient,所以我们才需要自定义。

配置完了你会发现还是不行,各种jar冲突,Spring Boot的版本还需要升级,于是只能升到目前最新的2.1.0版本。升级完之后又有坑了。

升级之前Data中的注解,要指定类型,keyword变成了Keyword

@Field(type=FieldType.Keyword)

ES的这个Field注解没有别名映射的属性,就是我es中存的u_name, 实体类中写的是username,这个确实不太方便,像data mongodb中都有这样的功能,有知道怎么解决的要给我留言哈,学习下。

然后就是security的一个坑了,升级之后security版本也升级了,下载下来的jar包用不了,错误如下:

c212beddcd2c571d99021ce05b1c717b29aa6a5d
err.png

一开始以为是网络原因,没下载完,然后重新删了再下,试了5次还是不行,最后没办法,我手动下载了spring-security-config这个包,替换了本地仓库的jar。

下载地址:https://mvnrepository.com/artifact/org.springframework.security/spring-security-config/5.1.1.RELEASE

以上就是这次升级过程中踩过的坑,分享给大家。这次只是客户端这块的改变,至于ES是怎么开启权限认证的我这边就不做讲解了,因为这块不是我弄的,所以我也不熟悉,等后面有机会我也去研究研究可以给大家分享,反正是基于xpack搞的。


原文发布时间为:2018-11-26

本文作者:尹吉欢

本文来自云栖社区合作伙伴“猿天地”,了解相关信息可以关注“猿天地”。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
小程序 IDE 开发工具
【社区每周】小程序开放服务类型调整;my.pageScrollTo新增偏移量参数(10月第一期)
【社区每周】小程序开放服务类型调整;my.pageScrollTo新增偏移量参数(10月第一期)
19 0
|
12天前
|
程序员 vr&ar
【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目版本,公司名,公司识别名,主页,联系方式
本插件可以使用蓝图获取到项目的一些基本配置,如获取:公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许窗口重设大小、允许关闭、允许最大化、允许最小化、虚假立体渲染设备的眼部偏移、视野用于虚假立体渲染设备。
39 0
【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目版本,公司名,公司识别名,主页,联系方式
|
6月前
|
程序员 CDN
github Release 下载加速,绿色合法,遥遥领先
你有没有这样一个困惑,当你寻找了很久终于找到一个解决问题的方案,发现这个工具在 GitHub 上,接下来等待我们的就是遥遥无期的龟速下载。
308 0
github Release 下载加速,绿色合法,遥遥领先
|
2月前
|
移动开发 小程序 安全
【社区每周】AIT现支持免登陆使用;小程序内嵌外跳H5页面支持支付宝端内官方应用(8月第一期)
【社区每周】AIT现支持免登陆使用;小程序内嵌外跳H5页面支持支付宝端内官方应用(8月第一期)
50 0
|
供应链 安全 JavaScript
GitHub 宣布新政策:要求所有贡献代码的用户在 2023 年底前启用双因素认证
尽管双因素验证机制为在线帐户提供了重要的额外保护,但 GitHub 的内部研究表明,目前只有大约 16.5% 的活跃用户对其帐户启用了增强性的安全措施。
222 0
|
开发者
【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )(一)
【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )(一)
271 0
【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )(一)
【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )(二)
【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )(二)
128 0
【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )(二)
|
JavaScript
K项目的一些心得之全球模板里的几个骚操作
K项目的一些心得之全球模板里的几个骚操作
P3项目全球模板狗血设置之一 --- 发货到成本中心需要输入Customer
P3项目全球模板狗血设置之一 --- 发货到成本中心需要输入Customer
P3项目全球模板狗血设置之一 --- 发货到成本中心需要输入Customer
|
数据安全/隐私保护
苹果提交版本后显示”缺少出口合规证明“的解决办法
苹果提交版本后显示”缺少出口合规证明“的解决办法
1435 0

热门文章

最新文章