精通ES的单节点和集群安装
前言
之前有用到搜索引擎Solr
, 当时我想上ElasticSearch
的, 然后趁机学习下, 可是Leader
要用Solr
没说原因.
现在想来, 应该机器资源不够.
结果Solr
的文章还没出来, 反而先出了ElasticSearch
的.
于是现在就开始学习如何精通ElasticSearch
, 工欲善其事必先利其器, 先来精通一下如何安装.
选择 ES 版本
https://www.elastic.co/cn/support/matrix
版本 | JDK8 |
JDK9 |
JDK10 |
---|---|---|---|
5.6.x |
✔ | ✖ | ✖ |
6.0.x |
✔ | ✖ | ✖ |
6.1.x |
✔ | ✖ | ✖ |
6.2.x |
✔ | ✔ | ✖ |
6.3.x |
✔ | ✖ | ✔ |
从官方提供的表格, 可以看到6.x
开始, 官方将JDK
打包到ElasticSearch
里面了.
并且, 6.2.x
开始同时支持JDK8
和JDK9
, 6.3.x
同时支持JDK8
和JDK10
, 支持的版本号一路突飞猛进.
目前生产环境最新也才JDK8
, 所以我这里选择了最新的5.x
版本5.6.3
.
安装 ES 并在单节点启动
直接在官网下载就好了
1 | cd /opt |
然后访问http://虚拟机IP:9200
.
一般这样就可以启动了, 但是我在虚拟机里面启动的, 所以出现了各种各样的问题.
修改 jvm 内存
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error=’Cannot allocate memory’ (errno=12)
There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
An error report file with more information is saved as:
/opt/elasticsearch/hs_err_pid3215.log
可以看到, JVM
内存不足了, 有两个建议
- 给虚拟机加内存.
- 修改
-Xms
和-Xmx
配置, 改小一点, 如512m
.
1 | vim config/jvm.options |
如果改了JVM
配置还是启动不了, 就直接加虚拟机内存吧. 我后来是加了内存.
禁止 root 用户启动
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:106) ~[elasticsearch-5.6.3.jar:5.6.3]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:195) ~[elasticsearch-5.6.3.jar:5.6.3]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.3.jar:5.6.3]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.3.jar:5.6.3]
那就新建一个es
用户就好了
1 | # 添加一个 es 用户组 |
虚拟内存区域太低 vm.max_map_count
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
vm.max_map_count
是linux
系统的一个配置, 限制一个进程拥有的VMA
(虚拟内存区域)的数量.
不懂也没关系. 这是运维做的事, 咱们只要能跑起来就好了.
临时解决方案(重启失效)执行以下命令:
1 | sysctl -w vm.max_map_count=262144 |
永久配置当然是写入文件
1 | echo "vm.max_map_count=262144" >> /etc/sysctl.conf |
绑定 IP 允许局域网访问
启动起来后, 发现浏览器访问http://虚拟机IP:9200
失败.
然后在虚拟机执行以下命令
1 | curl http://127.0.0.1:9200 |
修改配置文件, 注意这里是危险操作, 生产环境不能绑定0.0.0.0
, 绑定内网IP
就好了.
1 | echo "network.host: 0.0.0.0" >> config/elasticsearch.yml |
安装可视化插件 elasticsearch-head
在安装ElasticSearch
集群前, 先来安装一下这个可视化插件.elasticsearch-head
提供了一个可视化的操作页面.
不同ElasticSearch
版本有不同的安装方法.
在5.0.0
后, ElasticSearch
不再支持直接安装elasticsearch-head
插件, 所以只能单独启动elasticsearch-head
服务器.
https://github.com/mobz/elasticsearch-head/issues/262#issuecomment-228927247
因为要安装npm
, 我就懒得弄了, 直接跑docker
搞定.
1 | docker run -p 9100:9100 -d mobz/elasticsearch-head:5 |
然后修改config/elasticsearch.yml
, 追加CORS
跨域配置.
1 | http.cors.enabled: true |
然后访问http://虚拟机IP:9100
打开控制台, 输入http://虚拟机IP:9200
, 点击连接即可.
安装 ES 集群
要弄一个集群, 我们得先弄几个节点, 我们复制/opt/elasticsearch
文件夹到/opt/elasticsearch2
和/opt/elasticsearch3
.
记得先删除里面的data
目录, 否则会出现错误failed to send join request to master
.
先设置个master
节点, 修改/opt/elasticsearch/config/elasticsearch.yml
.
1 | # 1. 支持跨域访问, 供 head 使用 |
然后设置两个slave
节点, 同样修改config/elasticsearch.yml
, 记得修改端口号, 避免端口冲突.
1 | # 1. 支持跨域访问, 供 head 使用 |
然后都启动起来
1 | /opt/elasticsearch/bin/elasticsearch -d |
过一段时间, 启动完毕, 访问http://虚拟机IP:9100
打开head
控制台, 连接到任意一个节点, 就可以获取整个集群的信息.