概述

我们看到很多教程都是使用一台机器安装elasticsearch,然后kibana,然后各种组件全部怼到了一台机器上。有的教育机构资源比较丰富的,会找三个节点来安装一个小集群。他们主要是教大家怎样入门elasticsearch,但是我们的教程是生产级的,又是保姆级的,我们会教大家搭建一个相对稳定的架构,并且教大家怎样维护他,就像给客户做了一个完整的项目一样。但是,不积跬步无以至千里,我们要先从最基本的学起,这篇我们Demo一下单节点,三节点和一些工具的安装和配置

1. 单节点elasticsearch

  • JDK:运行elasticsearch需要jvm,所以我们需要在机器上安装java。java的 版本需要在1.8之上,如果我们从官网链接跳转下载地址,是会下载自带jdk的elasticsearch的。

    • 下载地址:https://www.elastic.co/cn/downloads/elasticsearch
    • 不带jdk的:https://www.elastic.co/cn/downloads/elasticsearch-no-jdk

    es自带的jdk是java的最新版,目前是jdk14。大部分公司对于java的版本是有要要求的,不管是出于安全考虑还是管控的考虑,所以大家可以使用公司指定的jdk版本,先安装java,在安装es。(没有公司再用java1.6或者1.7了吧。。。。)

    另外,如果我们的安装时候的系统环境比较特殊,比如非x86架构,也需要使用自己的java环境,比如我们这次实验的环境就是ARM架构(树莓派),我们就选择操作系统的镜像源中的java。

  • 安装elasticsearch:根据管理方式的不一样,启动方式可能不一样

    # x86版本
    yum install -y https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.0-x86_64.rpm
    # 我用的是ubuntu 20.04 LTS for ARM,用的是这个
    dpkg -i https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.0-arm64.deb
    
  • 完成后什么都不用配置就能启动了

    $ systemctl start elasticsearch
    
  • 启动后测试一下

    root@node1:/opt/packages/elastic# curl localhost:9200
    {
      "name" : "node1",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "_na_",
      "version" : {
        "number" : "7.9.0",
        "build_flavor" : "default",
        "build_type" : "deb",
        "build_hash" : "a479a2a7fce0389512d6a9361301708b92dff667",
        "build_date" : "2020-08-11T21:36:48.204330Z",
        "build_snapshot" : false,
        "lucene_version" : "8.6.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    
  • 当然,作为专业的人员,总是要做一些配置的,修改/etc/elasticsearch/elasticsearch.yml

    # 指定监听的端口,默认是localhost
    network.host: 0.0.0.0
    # 这个是说指定了服务器起来之后去哪发现这个集群,这里的172.16.0.1就是本机的地址
    discovery.seed_hosts: ["172.16.220.11"]
    
  • 再重启一下看看是不是正常

    systemctl restart elasticsearch
    

2. 单节点kibana

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

  • 安装,请根据情况安装,这里米有arm版本的,我只好在我的笔记本上启了一个虚拟机

    # x86版本
    yum install -y https://artifacts.elastic.co/downloads/kibana/kibana-7.9.0-x86_64.rpm
    
  • 修改/etc/kibana/kibana.yml

    # 监听的IP地址
    server.host: "0.0.0.0"
    # kibana服务器显示的名字,可以不配置
    server.name: "master1"
    # ES的地址
    elasticsearch.hosts: ["http://172.16.220.11:9200"]
    # 忽略自签证书
    elasticsearch.ssl.verificationMode: none
    
  • 启动kibana

    systemctl start kibana
    
  • 打开浏览器,访问http://172.16.220.11:5601,就可以看到界面了

3. 三节点elasticsearch

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

  • 我们在刚才的基础上修改配置文件,我们假设有三台机器,master1,master2,master3,地址分为别172.16.220.11,172.16.220.12,172.16.220.13

  • 为数据创建独立的目录并且修改权限

    mkdir -p /data/es/data
    mkdir -p /data/es/logs
      
    chown -R elasticsearch:elasticsearch /data/es/
    
  • master1上的/etc/elasticsearch/elasticsearch.yml

    # 集群需要一个名字(必须的)
    cluster.name: es-enterprise-demo
    # 节点也需要一个名字
    node.name: master1
    # 节点的属性,我们可以认为是标签
    node.attr.dc: 803
    node.attr.row: 2
    node.attr.enclosure: 3
    node.attr.rack: r1
    # 存数据的目录
    path.data: /data/es/data
    # 存日志的目录(是es系统的日志,不是存放在es中的数据的日志)
    path.logs: /data/es/logs
    # 在系统启动的时候,是否首先分配所有的内存,如果我们的堆内存heap配置为系统的一半的时候,就把这个选项打开,生产环境建议打开
    bootstrap.memory_lock: true
    # 监听的端口,建议每个机器有两个网口,这个用于通讯的使用万兆光纤
    network.host: 172.16.220.11
    # 服务的监听端口
    http.port: 9200
    # 集群发现的地址
    discovery.seed_hosts: ["172.16.220.11", "172.16.220.12", "172.16.220.13"]
    # 集群启动的时候发现集群的地址,如果没有指定,会去整个网段扫描
    cluster.initial_master_nodes: ["172.16.220.11", "172.16.220.12", "172.16.220.13"]
    # 一个集群中的N个节点启动后,才允许进行数据恢复处理
    gateway.recover_after_nodes: 3
    # 设置是否可以通过正则或者_all删除或者关闭索引库,默认true表示必须需要显式指定索引库名称
    # 生产环境建议设置为true,删除索引库的时候必须显式指定,否则可能会误删索引库中的索引库。
    action.destructive_requires_name: true
    
  • master2上的/etc/elasticsearch/elasticsearch.yml

    # 集群需要一个名字(必须的)
    cluster.name: es-enterprise-demo
    # 节点也需要一个名字
    node.name: master2
    # 节点的属性,我们可以认为是标签
    node.attr.dc: 803
    node.attr.row: 2
    node.attr.enclosure: 4
    node.attr.rack: r3
    # 存数据的目录
    path.data: /data/es/data
    # 存日志的目录(是es系统的日志,不是存放在es中的数据的日志)
    path.logs: /data/es/logs
    # 在系统启动的时候,是否首先分配所有的内存,如果我们的堆内存heap配置为系统的一半的时候,就把这个选项打开,生产环境建议打开
    bootstrap.memory_lock: true
    # 监听的端口,建议每个机器有两个网口,这个用于通讯的使用万兆光纤
    network.host: 172.16.220.12
    # 服务的监听端口
    http.port: 9200
    # 集群发现的地址
    discovery.seed_hosts: ["172.16.220.11", "172.16.220.12", "172.16.220.13"]
    # 集群启动的时候发现集群的地址,如果没有指定,会去整个网段扫描
    cluster.initial_master_nodes: ["172.16.220.11", "172.16.220.12", "172.16.220.13"]
    # 一个集群中的N个节点启动后,才允许进行数据恢复处理
    gateway.recover_after_nodes: 3
    # 设置是否可以通过正则或者_all删除或者关闭索引库,默认true表示必须需要显式指定索引库名称
    # 生产环境建议设置为true,删除索引库的时候必须显式指定,否则可能会误删索引库中的索引库。
    action.destructive_requires_name: true
    
  • master3上的/etc/elasticsearch/elasticsearch.yml

    # 集群需要一个名字(必须的)
    cluster.name: es-enterprise-demo
    # 节点也需要一个名字
    node.name: master3
    # 节点的属性,我们可以认为是标签
    node.attr.dc: 803
    node.attr.row: 4
    node.attr.enclosure: 6
    node.attr.rack: r3
    # 存数据的目录
    path.data: /data/es/data
    # 存日志的目录(是es系统的日志,不是存放在es中的数据的日志)
    path.logs: /data/es/logs
    # 在系统启动的时候,是否首先分配所有的内存,如果我们的堆内存heap配置为系统的一半的时候,就把这个选项打开,生产环境建议打开
    bootstrap.memory_lock: true
    # 监听的端口,建议每个机器有两个网口,这个用于通讯的使用万兆光纤
    network.host: 172.16.220.13
    # 服务的监听端口
    http.port: 9200
    # 集群发现的地址
    discovery.seed_hosts: ["172.16.220.11", "172.16.220.12", "172.16.220.13"]
    # 集群启动的时候发现集群的地址,如果没有指定,会去整个网段扫描
    cluster.initial_master_nodes: ["172.16.220.11", "172.16.220.12", "172.16.220.13"]
    # 一个集群中的N个节点启动后,才允许进行数据恢复处理
    gateway.recover_after_nodes: 3
    # 设置是否可以通过正则或者_all删除或者关闭索引库,默认true表示必须需要显式指定索引库名称
    # 生产环境建议设置为true,删除索引库的时候必须显式指定,否则可能会误删索引库中的索引库。
    action.destructive_requires_name: true
    
  • 启动集群

    systemctl start elasticsearch
    
  • 查看一下状态

     curl -XGET master1:9200/_cat/health?v
    epoch      timestamp cluster            status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
    1599016520 03:15:20  es-enterprise-demo green           3         3      0   0    0    0        0             0                  -                100.0%
    

4. 双节点kibana

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

  • kibana自己是带一个proxy的,但是免费版中没有,我们需要借助其他的工具来做负载均衡,比如nginx之类,我们这里安装的时候不用考虑这么多,只需要在kibana中指定所有es的地址就可以了,因为kibana的信息是存放在es之中的,默认是叫.kibana的一个index,所以不管哪个kibana节点上看到的信息都是一样的,不管几个kibana节点都一样

  • 编辑/etc/kibana/kibana.yml

    master1

    server.host: "172.16.220.11"
    server.name: "master1"
    elasticsearch.hosts: ["http://172.16.220.11:9200", "http://172.16.220.12:9200", "http://172.16.220.13:9200"]
    

    master2

    server.host: "172.16.220.12"
    server.name: "master2"
    elasticsearch.hosts: ["http://172.16.220.11:9200", "http://172.16.220.12:9200", "http://172.16.220.13:9200"]
    

5. logstash简单使用

  • 下载地址:

  • 修改配置文件

    input {
        file {
            path => "/var/log/nginx/access.log"
        }
    }
    output {
        elasticsearch {
            hosts => [ "localhost:9200" ]
        }
    }
    

6. 怎样安装插件

插件顾名思义就是为了扩展ES本身不具备的功能的时候才需要安装的,集成在ES内部的程序,随着ES的启动一起启动。而在ES和kibana的内部都提供了插件管理机制,有一套比较完整的规范,而我们安装插件的时候,只需要运行elasticsearch-plugin或者kibana-plugin,就可以轻松安装插件了。

如果一些插件是官方提供的,我们直接运行命令安装就可以(官方插件地址),如果没有的话,就需要指定插件位置,比如

  • 直接安装

    ./bin/elasticsearch-plugin repository-s3
    
  • 指定URL位置,指定http或者https也行

    ./bin/elasticsearch-plugin install com.floragunn:search-guard-7:7.8.1-43.0
    ./bin/elasticsearch-plugin install https://url/to/search-guard-elasticsearch-plugin-<version>.zip 
    
  • 下载到本地,指定文件位置

    bin/elasticsearch-plugin install file:///path/to/search-guard-elasticsearch-plugin-<version>.zip
    

kibana同理。

需要注意的是,很多教程中提到了很重要的安全插件x-pack,这个插件在6.2之后就被集成到了系统之中,不用额外安装,我们只需要在配置中把xpack.security.enabled配置成true就可以了,而官方文档中,把x-pack的文件放在了security一章,我们专门找一章再说安全相关的知识。

7. 添加license

  • 界面添加:

    image-20200902112610387

  • 上传许可证(license),我们可以去找官方申请一个,一般来说会通过邮件的形式发送一个连接,然后我们可以下载,下载之后是一个json文件,点击Update your license

    image-20200903112727392

  • 成功之后就会显示日期

    image-20200903112957049