• Elasticsearch7 单节点与集群部署


    最近对新版本的ES进行测试,现在整理一下。

    一、Elasticsearch 7.x 特性

    ES 7.0是2019年4月份发布的,底层是Lucence 8.0。其新特性有:

    1、废除单个索引下多Type的支持

    2、彻底废弃_all字段支持,为提升性能默认不再支持全文检索

    3、新增应用程序主动检测功能,搭配对应版本的kibana,用户可监测应用服务的健康状态,并在出现问题后及时发出通知

    4、取消Query结果中的Hits Count的支持(聚合查询除外),使得查询性能大幅提升。这就意味着,每次查询后将不能得到精确的结果集数量

    5、完整的High Level REST Client,对于java编程,建议采用该方式操作ES集群

    6、新增间隔查询(Intervals Queries),用户可设置多字符串在文档中出现的先后顺序进行检索

    7、新增Script Score Query,通过此操作,用户可以精确控制返回结果的score分值

    8、引入新的集群协调子系统,缩减配置项提升稳定性。时间戳纳秒级支持,提升数据精度

    9、自带jdk,所以在安装ES时不再需要单独下载和配置JAVA_HOME。

    10、不会再有OOM的情况,JVM引入了新的circuit breaker(熔断)机制,当查询或聚合的数据量超过单机处理的最大内存限制时会被截断,并抛出异常。

    11、默认Primary Shard数从5到1,避免Over Sharding;

    12、TOP-K检索更快,即查询相关性速度优化,采用Weak-AND算法,核心原理:取TOP N结果集,估算命中记录数。

    一般我们在计算文本相关性的时候,会通过倒排索引的方式进行查询,通过倒排索引要比全量遍历节约大量时间,但有时仍然很慢。原因时很多时候我们其实只是想要top n个结果,一些结果明显较差的也进行了复杂的相关性计算,而weak-and算法通过计算每个词的贡献上限来估计文档的相关性上限,从而建立一个阈值对倒排中的结果进行剪枝,从而得到提速的效果。

    二、Elasticsearch7.3.2安装步骤

    下载地址:https://www.elastic.co/cn/downloads/elasticsearch

    如上图,下载对应需要的 ES,ES 支持 Docker 方式启动。ES 7.x 不需要本地 JDK 环境支持:

    ES 5,安装需要 JDK 8 以上;ES 6.5,安装需要 JDK 11 以上;ES 7.3.2,内置了 JDK 12

    1、解压(我用的是linux,下载的elasticsearch-7.3.2-linux-x86_64.tar.gz)

    tar -xzf elasticsearch-7.3.2-linux-x86_64.tar.gz
    cd elasticsearch-7.3.2/
    
    • 1
    • 2

    目录结构说明:

    bin :脚本文件,包括 ES 启动 & 安装插件等等

    config : elasticsearch.yml(ES 配置文件)、jvm.options(JVM 配置文件)、日志配置文件等等

    JDK : 内置的 JDK,JAVA_VERSION=“12.0.2”

    lib : 类库

    logs : 日志文件

    modules : ES 所有模块,包括 X-pack 等

    plugins : ES 已经安装的插件。默认没有插件

    JVM堆内存大小的设置,请参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html

    2、启动 Elasticsearch

    启动方式很简单,进入bin目录,直接./elasticsearch

    刚开始我是用的root用户启动的,报如下错误:

    OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
    [2019-09-17T19:47:26,884][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [iZ2zednnrz8j330kpcso5eZ] uncaught exception in thread [main]
    org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.3.2.jar:7.3.2]
    	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.3.2.jar:7.3.2]
    	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.3.2.jar:7.3.2]
    	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.3.2.jar:7.3.2]
    	at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.3.2.jar:7.3.2]
    	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.3.2.jar:7.3.2]
    	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.3.2.jar:7.3.2]
    Caused by: java.lang.RuntimeException: can not run elasticsearch as root
    	at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:105) ~[elasticsearch-7.3.2.jar:7.3.2]
    	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:172) ~[elasticsearch-7.3.2.jar:7.3.2]
    	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.3.2.jar:7.3.2]
    	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.3.2.jar:7.3.2]
    	... 6 more
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ES提示在root用户下是不能启动的,所以就需要增加一个用户es。

    #添加用户
    adduser es
    #设置密码
    passwd es
    ---------------
    #授权,root用户下
    chmod -v u+w /etc/sudoers
    #编辑
    vim /etc/sudoers
    #文件中插入,在root用户的下面(NOPASSWD:ALL,使用sudo时不用输密码)
    es      ALL=(ALL)       NOPASSWD:ALL
    #收回权限
    chmod -v u-w /etc/sudoers
    ---------------
    #添加分组
    groupadd testgroup
    usermod -G testgroup es
    #修改es目录的访问权限
    chown -R es:testgroup *
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    用户es创建完成后,直接启动。然而启动又报错了,如下:

    查看了下资料发现,是我linux版本的问题导致的。

    因为Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动解决:修改elasticsearch.yml 添加一下内容 :

    #bootstrap.memory_lock: true

    bootstrap.system_call_filter: false

    然后保存后,就ok了。


    1、报max_map_count错误:

    解决办法:

    修改配置sysctl.conf

    sudo vi /etc/sysctl.conf

    添加下面配置:vm.max_map_count=655360,并执行命令:sysctl -p

    2、报max file descriptors错误:

    max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

    解决办法:

    编辑 /etc/security/limits.conf,追加以下内容(*为所有用户,可指定用户):

    * soft nofile 65536

    * hard nofile 65536

    此文件修改后需要重新登录用户,才会生效


    如果让ES在后台保持运行,可以使用:nohup ./elasticsearch >es.log 2>&1 &

    nohup ./elasticsearch 1>/dev/null 2>&1 &

    打开新的窗口访问一下:curl ‘127.0.0.1:9200’,返回如下内容,说明单节点的ES已经启动成功了。

    name : 默认启动的时候指定了 ES 实例名称

    cluster_name : 默认名为 elasticsearch

    version :版本信息


    可以通过curl ‘127.0.0.1:9200/_cat/nodes/v’ ,可以看到当前节点的信息,如下:

    #健康检查
    curl '127.0.0.1:9200/_cat/health?v'
    
    #查询es中所有索引,所有已存在的索引
    curl '127.0.0.1:9200/_cat/indices?v'
    
    #创建新的索引【索引要求是全小写字符,可以有下划线隔开】
    curl -XPUT 127.0.0.1:9200/my_new_index?pretty
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在给索引添加数据时,需要注意,由于7.x不再支持创建type,但实际上并未彻底去掉type,而是提供了默认值“_doc”。

    执行添加文档:

    curl -XPUT 127.0.0.1:9200/my_new_index/_doc/1pretty -d ‘{“name”:“zhangsan”,“age”:“33”}’

    结果报错了。。。

    {“error” : “Content-Type header [application/x-www-form-urlencoded] is not supported”,“status” : 406}

    找到问题后,执行下面的命令就可以了。

    curl -H “Content-Type: application/json” -XPUT 127.0.0.1:9200/my_new_index/_doc/1pretty -d ‘{“name”:“张三”,“age”:“33”}’

    查看数据

    curl -XGET 127.0.0.1:9200/my_new_index/_doc/1pretty


    **补充:**官方给的消息是从6.8 和 7.1 开始默认提供安全插件,已经不需要付费购买了,配置起来也很简单。

    第一步:切换到elastsearch的目录下,使用下列命令生成证书

    bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""
    
    • 1

    第二步:打开config/elasticsearch.yaml,在尾部添加下面一行代码:

    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第三步:自动生成好几个默认用户和密码

    启动elasticsearch,新打开一个终端,使用cd命令切换到elasticsearch目录,然后使用bin/elasticsearch-setup-passwords auto 命令自动生成好几个默认用户和密码。


    三、ES集群的配置

    直接把elasticsearch.yml的配置贴出来:

    # ---------------------------------- Cluster -----------------------------------
    # Use a descriptive name for your cluster:
    cluster.name: intellis-7.4.2
    
    # ------------------------------------ Node ------------------------------------
    # Use a descriptive name for the node:
    node.name: node-2
    
    # Path to directory where to store the data (separate multiple locations by comma):
    path.data: /data/apps/middle/es/elasticsearch-7.4.2/data
    
    # Path to log files:
    path.logs: /data/apps/middle/es/elasticsearch-7.4.2/logs
    
    # Set the bind address to a specific IP (IPv4 or IPv6)
    network.host: 172.59.30.254
    
    # Set a custom port for HTTP:
    http.port: 9202
    #集群服务的端口,默认为9300
    transport.tcp.port: 9300
    
    # --------------------------------- Discovery ----------------------------------
    #
    # Pass an initial list of hosts to perform discovery when this node is started:
    # The default list of hosts is ["127.0.0.1", "[::1]"]
    
    discovery.seed_hosts: ["172.59.30.51:9300","172.59.30.254:9300","172.59.30.99:9300"]
    
    # Bootstrap the cluster using an initial set of master-eligible nodes:
    #
    cluster.initial_master_nodes: ["node-1","node-2","node-3"]
    
    #此处我使用了sql插件,所以需要禁用ES默认sql插件
    xpack.sql.enabled: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 集群关联遇到的坑:所有节点的集群配置完成前,不要单独启动某一个节点!!!如果拷贝已启用的,请手动删除data和logs目录的数据!!!

    四、Elasticsearch安全认证

    安全认证是在7.6上操作。

    1、集群身份认证

    在elasticsearch.yml配置文件中加入

    xpack.security.enabled: true
    
    • 1

    2、生成证书

    在创建过程中加入密码

    ./bin/elasticsearch-certutil ca
    
    • 1

    会生成elastic-stack-ca.p12,将证书copy到config下,命名为elastic-certificates.p12。所有集群节点共用同一个证书文件,将elastic-certificates.p12拷贝到其它节点上。

    3、配置elasticsearch.yml文件

    #开始加过了,不要重复
    #xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.keystore.type: PKCS12
    xpack.security.transport.ssl.verification_mode: certificate
    xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
    xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
    xpack.security.transport.ssl.truststore.type: PKCS12
    xpack.security.audit.enabled: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4、将证书密码加入到你的Elasticsearch keystore中

    ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
    
    ./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
    
    • 1
    • 2
    • 3

    启动每一个节点。所有节点启动完成后,生成用户密码

    5、集群创建用户密码

    需要保证存在master节点,在一个节点上创建就可以了。

    #手动创建密码
    ./bin/elasticsearch-setup-passwords interactive
    #自动创建密码
    ./bin/elasticsearch-setup-passwords auto
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    1.5-11:整数的个数
    PyQt5 布局Layout
    MetaGPT day06 Environment组件源码 多智能体辩论
    任意文件读取和漏洞复现
    Java 跨域解决
    低代码相关概念及钉钉宜搭初使用
    Python爬虫之Js逆向案例(10)-爬虫数据批量写入mysql数据库
    MyBatis关系映射
    TikTok快速起号技巧(下篇)
    git vscode
  • 原文地址:https://blog.csdn.net/m0_67391521/article/details/126717041