[TOC]

1. 集群改动

1. Zen Discovery 改动

不再有discovery.zen.minimum_master_nodes这个控制集群脑裂的配置,转而由集群自主控制,并且新版在启动一个新的集群的时候需要有cluster.initial_master_nodes初始化集群列表。

1
2
discovery.seed_hosts: ["10.20.5.39:9201","10.20.5.39:9400"]
cluster.initial_master_nodes: ["10.20.5.39:9201"]

discovery.seed_hosts:7.x版本新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点,由discovery.zen.ping.unicast.hosts参数改变而来。

cluster.initial_master_nodes: 7.x版本新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点。

2. 插件改动

1. IndexStore 和 DirectoryService 被移除

PR: Remove IndexStore and DirectoryService

主要修改:

  1. 移除所有IndexStore类,将继承FsDirectoryService的类换成实现IndexStorePlugin.DirectoryFactory接口。

2. slf4j-log4j12包依赖问题

由于Hdfs模块内,依赖了slf4j-log4j12,但是内部包有冲突,需要排除后,手动依赖一个指定版本。

此时,会报

1
java.security.AccessControlException: access denied ("jaCustomva.lang.RuntimePermission" "createSecurityManager")

错误,具体原因并未找到。

解决办法为:排除冲突包,依赖指定版本:

1
2
3
4
5
<dependency>
			<artifactId>slf4j-log4j12</artifactId>
			<groupId>org.slf4j</groupId>
			<version>1.7.10</version>
		</dependency>

3. 参数调整(优化)

1. 慢查询超时设置

默认查询的超时是-1,即不超时。超时设置使用:

1
2
3
4
PUT _cluster/settings
{
   "transient": {"search.default_search_timeout":"250s"}
}

2. Mapping动态字段设置

当前线上集群的磁盘占用大小:

V2集群的磁盘占用大小为:

可以看到,同样的数据量,磁盘占用相差了 30G 左右,差距很大。

经分析,查看两者的SchemaV2版本的schema多出了一些动态创建的字段,而这些字段本身是不需要的,导致磁盘占用变大,部分数据如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
       "picUrl" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "platform" : {
          "type" : "keyword",
          "eager_global_ordinals" : true
        },
        "position" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },

因为默认的dynamictrue,所以在添加数据时,对于没有在mapping中定义的字段,es会自动添加该字段。

解决方案:

mapping中,指定dynamicfalse

1
2
3
4
5
6
"mappings" : {
      "dynamic": false, 
      "_source" : {
        "enabled" : false
      },
      ...}	

对于dynamic字段的取值有三种:

true:允许ES动态创建mapping

false:不允许ES动态创建mapping,但是数据可以写入;

strict:当写入数据中有mapping定义之外的数据,直接报错,不能进行写入;