Elasticsearch集群、Kibana配置及常用REST指令

第一部分 集群配置

1 准备环境

首先准备3台机器,例如预装CentOS 7.6,可以分别修改下hostname,如下:

hostnamectl set-hostname es1
hostnamectl set-hostname es2
hostnamectl set-hostname es3

接下来配置互相免密访问,先去es1:

ssh-keygen

一路下来,就产生了~/.ssh/id_rsa.pub文件,将里面的内容复制到新建的authorized_keys文件里。

cd ~/.ssh
touch authorized_keys

然后将es2和es3的key也都复制到authorized_keys文件里,再将authorized_keys复制到es2/es3对应的位置,这样3台机器就可以互相免密访问了。
接下来安装jdk11,注意新的es都要求起码是jdk11了。先把自带的jdk删掉。

rpm -qa|grep jdk
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
rpm -e --nodeps ......

然后将从oracle官网下载的jdk下载、解压、并配置环境。

cd /usr/local
wget .../jdk-11.0.8_linux-x64_bin.tar.gz
tar -zxvf jdk-11.0.8_linux-x64_bin.tar.gz
vim ~/.bashrc
export JAVA_HOME=/usr/local/jdk-11.0.8
export ES_HOME=/usr/local/elasticsearch-7.8.1
export PATH=$PATH:$JAVA_HOME/bin:$ES_HOME/bin
source ~/.bashrc

3台机器一样操作。

2 配置ES集群

下载并解压es安装包:

cd /usr/local
wget .../elasticsearch-7.8.1-linux-x86_64.tar.gz
tar -zxvf elasticsearch-7.8.1-linux-x86_64.tar.gz

配置es,主要参考官网,只说重要的:

vim elasticsearch-7.8.1/config/elasticsearch.yml

首先是集群名和节点名,最好各个机器自己改下,别用默认的,不费事:

cluster.name: logging-prod
node.name: prod-data-1
node.name: prod-data-2
node.name: prod-data-3

生产环境,最好自己选个主节点:

node.master: true

接下来是主机地址,集群配置必须改这个,3个集群各改各的,端口可以不改,ip是示例:

network.host: 192.168.1.11
network.host: 192.168.1.12
network.host: 192.168.1.13

为了集群节点互相发现,接下来的配置比较重要(如果不配置,只能在本地同一台机器上互相发现),可以是ip地址,也可以是主机名,端口默认是9300,可以省略。

discovery.seed_hosts:
   - 192.168.1.11:9300
   - 192.168.1.12:9300
   - 192.168.1.13:9300

也可以写成这种形式:

discovery.seed_hosts: ["192.168.1.11", "192.168.1.12", "192.168.1.13"]

接下来是集群初始化配置,官方说,用来引导集群,用来确定第一次选举的候选主节点。在开发模式,如果不配置,该步骤会由节点自动完成,但是不安全。生产模式,第一次最好显式列出候选主节点,后续重启或者增加新节点的时候,这个配置就不起作用了。

cluster.initial_master_nodes: 
   - prod-data-1
   - prod-data-2
   - prod-data-3

第一次运行配置一下这个,不然老报warning。
还可以配置jvm内存占用最大最小值:

vim jvm.options
-Xms1g
-Xmx1g

3 启动ES

直接运行会报错,说无法用root用户启动,所以新建用户和组:

groupadd es
useradd es -g esgroup
passwd es

cd /usr/local
chown -R es:esgroup  elasticsearch-7.8.1

su es 
./elasticsearch

启动后仍然报错:

ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

这时候就切换回root,编辑如下:

vim /etc/sysctl.conf

添加vm.max_map_count=655360,再执行:

sysctl -p

还有:

vim /etc/security/limits.conf

在最后添加如下:

*       hard    nofile  65536
*       soft    nofile  65536
# End of file

切换回es的用户,重新启动ES。其它两台机器也都需要进行这样的配置。再运行,发现还是报错,说找不到其它节点,这时候应该是防火墙的问题,把3个机器的防火墙都关掉。

systemctl stop firewalld
systemctl disable firewalld

终于不报错了,可以去浏览器看节点了。

http://192.168.1.11:9200/_cat/nodes?v
192.168.1.12  9 97 0 0.00 0.02 0.05 dilmrt - node-2
192.168.1.13 19 97 2 0.14 0.12 0.08 dilmrt - node-3
192.168.1.11 20 50 0 0.00 0.02 0.05 dilmrt * node-1

一切OK!现在可以更改下ES的运行方式,以守护进程运行,会在ES目录建立一个pid文件:

elasticsearch -d -p pid
pkill -F pid

如果想做成系统服务,也可以参考官网。

4 安全配置

首先kibana, ES都停掉,编辑elasticsearch.yml,开启security:

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

也可以使用echo "xpack.security.transport.ssl.enabled: true" >> elasticsearch.yml命令来。3台机器都这么改,然后3台启动,如果集群不启动,修改密码会失败。但是启动后,报这个错:

javax.net.ssl.SSLHandshakeException: No available authentication scheme

需要配置节点间的SSL证书。

elasticsearch-certutil ca
Please enter the desired output file [elastic-stack-ca.p12]: # 默认
Enter password for elastic-stack-ca.p12 : # CA证书的密码,直接回车

生成了一个elastic-stack-ca.p12文件,继续:

elasticsearch-certutil cert --ca elastic-stack-ca.p12
Enter password for CA (elastic-stack-ca.p12) : # CA证书的密码,直接回车
Please enter the desired output file [elastic-certificates.p12]: # 默认
Enter password for elastic-certificates.p12 : # 证书密码,直接回车

elastic-stack-ca.p12复制到每个节点的config目录,然后编辑ES配置:

vim elasticsearch.yml

再添加一些:

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

3个节点都要这样。如果之前的证书设置了密码,就稍微复杂些,需要配置elasticsearch-keystore,这里略,ES Stack的产品都有类似的keystore,避免在配置文件中明文展示密码。
可以启动3个节点了,这时候访问网页会要求密码。然后给6个内建用户(官网说明)修改密码,随便哪个机器都行:

elasticsearch-setup-passwords interactive

也可以选择auto来自动生成,保存好了,然后可以密码访问ES了。更多加密安全设置可以参考官网。

5 Kibana

直接解压安装,编辑配置vim kibana.yml

server.host: "0.0.0.0"
server.name: "my-kibana"
elasticsearch.hosts: ["http://192.168.1.11:9200"]
kibana.index: ".kibana"
elasticsearch.username: "kibana_system"
elasticsearch.password: "上一步自动生成的密码"

然后后台运行:

nohup ./bin/kibana --allow-root &

就可以访问了。

http://192.168.1.11:5601

记住,由于ES设置了密码,所以这里也需要输入ES的密码,不是Kibana的密码。

6 ES重启

参考官网,为避免集群不必要的IO操作,先关闭副本分配:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "primaries"
  }
}

关闭索引:

POST _flush/synced

停止机器学习任务(可选),然后关闭所有节点。做完变更后,重启节点。最后恢复allocation:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}

第二部分 REST指令

1 索引

创建索引

PUT students
{
  "mappings": {
    "properties": {
      "name": {"type": "text", "fielddata": true},
      "gender": {"type": "keyword"},
      "age": {"type": "integer", "doc_values": false},
      "location": {"type": "geo_point"},
      "intro": {
          "type": "text",
          "analyzer": "standard",
          "search_analyzer": "simple"
      }
    }
    "_source": {
        "enabled": false
    }
  }
  "settings": {
      "number_of_shards": 10,
      "number_of_replicas": 2
  }
  "aliases": {
      "girls": {
          "filter": {
            "term": {
                "gender": "F"
            } 
          }
          
      }
  }
}

对于非text类型字段,默认开启文档值机制,可以通过doc_values关闭;对于text类型,可以开启fielddata机制,但不推荐,太消耗资源。
如果想要使用Kibana的地图,就必须有geo_point类型,用来做索引模式,有多种赋值方式,比如:"location": [151.12, -33.51]
_source用于关闭文档原始值,只是用来节省空间,但不推荐关闭!
另外还有范围类型、日期、scaled_float(适合货币)、多数据类型fields。
索引创建完后无法修改,只能通过_split_shrink_reindex接口创建新索引,并将之前的文档存储进来,不过副本数量可以随时更改。

修改索引

PUT students/_mapping
{
  "properties": {
    "weight": {"type": "integer"}
  }
}

刷新索引

POST students/_refresh

开关索引

POST students/_close
POST students/_open

所有索引

GET _all/_search

_all代表所有索引,也可以不写,不指明索引那就是全部索引。

2 文档

创建、修改文档

POST students/_doc
{
  "name": "Tom",
  "gender": "M",
  "age": 20
}
POST students/_doc/1?refresh=true

更新文档,_version值会自动增加,这是内部版本号,带上这个版本号,就启用了乐观锁机制。可通过version_type设置使用外部版本号。

PUT students/_doc/1?version=1

如果使用_create接口,就只能创建,无法更新:

POST students/_doc/1/_create
POST students/_create/1

PUT会修改整个文档,而不是部分参数字段,除非使用_update接口,不过只能单个字段。如果希望不存在时创建,就带上一个参数。

POST students/_update/1
{
    "doc": {
        "age": 25
    },
    "doc_as_upsert": true
}

查看文档

GET students/_doc/1
GET students/_doc/1?_source=false
GET students/_source/1

删除文档

DELETE students/_doc/1
POST students/_delete_by_query
{
    "query": {
        "match": {
            "name": "Tom"
        }
    }
}
# 或者
{
  "query": {
    "bool": {"must_not": [{"exists": {"field": "name"}}] }
  }
}

如果发生版本冲突version_conflict_engine_exception,就加上如下:

POST students/_delete_by_query?conflicts=proceed&wait_for_completion=false

3 其它

文本分析

GET _analyze
{
    "analyzer": "standard",
    "text": "This is a sample text to be analyzed."
}

查看节点

GET _nodes

集群设置

GET _cluster/settings
PUT _cluster/settings
{
    "persistent": {
        "action.auto_create_index": "false"
    }
}

可以用来关闭自动创建索引(直接添加文档)。

运行Painless脚本

POST _scripts/painless/_execute

4 检索

查找

使用查询字符串传递DSL。

GET students/_search?q=name:tom jerry
GET students/_search?q=name:(tom jerry) AND smith
GET students/_search?q=name:tom~2
GET students/_search?q=age:[1 TO 10]

基于请求体,匹配查询:

POST students/_search
{
    "from": 10,
    "size": 50,
    "query": {
        "term": {
            "name": "tom"
        }
    }
}
POST students/_search
{
    "query": {
        "match": {
            "tags": "tom jerry"
        }
    }
}

注意termkeywords不会分词,须完全匹配,而matchtext是可以分词的。此外还有termsterms_setmulti_matchmatch_phrasequery_string等,不赘述。
范围查询:

POST students/_search
{
    "query": {
        "range": {
            "age": {
                "gte": 10,
                "lte": 20
            }
        }
    }
}

存在性查询:

POST students/_search
{
    "query": {
        "exists": {
            "field": "name"
        }
    }
}

模糊查询:

POST students/_search
{
    "query": {
        "fuzzy": {
            "name": {
                "value": "tim",
                "fuzziness": 1
            }
        }
    }
}

还有纠错提示查询等。

分页排序

分页还有scrollsearch after等。
排序可以字段排序,也可以数组排序。

POST students/_search
{
    "sort" [
        "age",
        {"name": "desc"},
        {"my_list": {
            "order": "desc",
            "mode": "max"
        }}
    ]
}

分析器

可以在创建的时候指定分析器,直接使用内置分析器,参考创建索引的小结,一个是编入索引的分析器standard,一个是检索文档时的分析器simple
也可以在检索的时候指定覆盖之,略。
提取词项:

POST students/_termvectors/1
{
    "fields": ["intro", "name"]
}
POST students/_termvectors
{
    "doc": {
        "intro": "This is my sample doc"
    }
}

还可以创建自定义分析器,略。中文分析器用ik_smartik_max_word,后者比较贪。

其它

聚集、分桶、特殊数据类型、SQL等查询略。


参考:《Elastic Stack应用宝典》这本书不错。
elasticsearch权限验证(Auth+Transport SSL)

你可能感兴趣的:(Elasticsearch集群、Kibana配置及常用REST指令)