elasticsearch2.4升级elasticsearch6.2心得

服务端部分:

一、升级前准备

jdk1.8+;

二、安装步骤

  1. 下载地址
    目前最高版本6.4,谨慎起见目前使用的是6.4之前最新的一个小版本6.3
    https://www.elastic.co/guide/en/elasticsearch/reference/6.3/parent-join.html
  2. 创建elasticsearch用户和用户组(elasticsearch为了安全起见禁止了root操作权限)
  3. tar -zxvf elasticsearch-6.3.2.tar.gz
  4. 创建 data和logs目录(为后面的数据存储和日志存储的目录,所有创建的目录最后都必须所属elasticsearch用户和 用户组,不然会报没有写的权限错误) elasticsearch对系统每个进程最大同时打开文件数和进程可以拥有的VMA(虚拟内存区域)的数量有要求需要修改以下 两个文件 /etc/security/limits.conf soft nproc 65536 hard nproc 65536 /etc/sysctl.conf(修改完后需要执行sysctl -p 使之生效) vm.max_map_count=262144
  5. 修改配置文件
# 集群的名字
    cluster.name: cunjk
    # 节点名字
    node.name: node-1
    # 数据存储目录(刚刚我们创建的目录的绝对地址)
    path.data: /opt/elasticsearch/data
    # 日志目录
    path.logs: /opt/elasticsearch/logs
    #本机的ip地址
    network.host: xxx.xxx.x.xxx
    #设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
    discovery.zen.ping.unicast.hosts: ["xxx.xxx.x.xxx]
    # 设置节点间交互的tcp端口(集群),(默认9300)
    transport.tcp.port: 9300
    # 监听端口(默认)
    http.port: 9200
    # 增加参数,使head插件可以访问es
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    # 开启内联脚本
    script.allowed_types: inline

三、注意事项 启动的时候必须使用elasticsearch用户,且安装的elasticsearch先关文件必须是elasticsearch的用户和用户组所属权限

elasticsearch是根据cluster.name来判别集群的,如果服务器上有多个集群必须区分

elasticsearch集群启动必须先启动主节点

代码部分:

一、pom依赖

  1. lucene依赖7以上,elasticsearch为选定的6.x版本,jdk1.8+

二、API

  1. 5.x以上废弃父子文档关系,改为使用join连接详见文档https://www.elastic.co/guide/en/elasticsearch/reference/6.3/parent-join.html
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 0
    },
    "mappings": {
        "_doc": {
          "properties": {
            "t_join_field": {
              "type": "join",
              "relations": {
                "account": "drug_sale"
              }
            }
          }
        }
      }
 }
  1. javaAPI参照 https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html
  2. restfulAPI参照 https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

三、应用部分值得注意的重要更改

  1. 创建连接客户端已取消TransportClient.builder()直接构建改为更安全的PreBuiltTransportClient()构建
  2. 返回的field信息已不支持addField方法,API入口仍然保留但已弃用,github源码声明会在更高的版本完全弃用
  3. join结构的父子关系不在使用parent(parent_id)指定,理由同addField,此处需借鉴restul接口,直接声明json串
  4. 5.x以后restful的调用需要声明请求类型 请求需要加上
-H "Content-Type:application/json"

    例如  curl -X GET  -H "Content-Type:application/json" 'http://xxx.xxx.x.xxx:9200/xxxx/_search?pretty' -d 
         '{"query": {"has_child": {"type": "drug_sale","query": {"term": {"card_id": "80048540"}}}},"_source":["card_id","name"]}'
  1. 单次最大查询量,创建索引后需执行,不然会影响滚动查询和全量查询(暂未找到对应配置)
curl -XPUT -H "Content-Type:application/json" 'http://xxx.xxx.xx.xxx:9200/_all/_settings?preserve_existing=true' -d '{"index.max_result_window" : "30000"}'

其他聚合及删除查询API的更改不再赘述

较与版本2.4的比较

一、速度上有了提升,尤其是删除方面6比2多了指定查询删除,在elasticsearch2.4时只能先查后删进行滚动删除比较影响数据更新的速度,6.xz之后的指定删除功能速度提高了好几倍,这样大大的提高了需要删除来进行更新的功能 其次在直接更新的速度上6较与2也有提升

二、在聚合查询和大数据量查询上,elasticsearch6.x 的Sliced Scroll的并行特性可以加快大数据量或需要大量筛查的数据的速度

升级心得

elasticsearch6.3.2的升级和测试持续了三周,在升级过程中遇到一些坑,由于elasticsearch官网对javaAPI的支持并不友好,主要还是restful接口的 描述上述标注的地方有的并未写在文档中,需要去javaAPI翻查源代码对比restful接口调试elasticsearch官网对javaAPI的支持并不全,优先功能建议先 调试restful接口,然后翻查源码,javaAPI的底层仍是调用的restful接口