Elastic Search 集群

总体目标

三台服务器192.168.112.130 、131 、132,进行es集群。
假设使用130这台服务器作为master,其他两台作为slave。

具体过程

找到 config/elasticsearch.yml 文件,

  1. 配置集成名称。
cluster.name: my-cluster
  1. 配置节点的名称,根据服务器不同更改不同的名称。
    比如node-1,node-2,node-3
node.name: node-1
  1. 配置其他节点地址信息,根据服务器不同更改不同的地址。
    这个时候需要注意,master与slave是不同的。
## 特别注意,这个是master的配置,去掉前面注释符
 cluster.initial_master_nodes: ["node-1"]
 ## 注意关于discovery.seed...不需要做任何操作,保留注释符。

两个slave除了node-name是一样的配置。这个seed_hosts可以理解为所有master的url。

### 特别注意,这个是slave的配置,去掉前面注释符.
 discovery.seed_hosts: ["192.168.112.130"]
  1. 配置初始化主节点。
    三个服务器统一使用一个master。
cluster.initial_master_nodes: ["node-1"]
  1. 配置ip地址与端口。
network.host: 0.0.0.0
http.port: 9200
  1. 分别启动三个服务器的es。
bin/elasticserarch

如果运行不成功,莫慌,在本篇文章后面会附带常见问题以及解决方案,都是实际开发中常见的问题,肯定能够很好地解决问题。

  1. 检测。
    访问某个地址比如 http://192.168.112.130:9200/_cluster/state?pretty如果集群成功,则浏览器上显示的json格式数据将会比较多,如下:
{ 
    "cluster_name": "my-cluster",
    "cluster_uuid": "AHJWuUvRRfu2WgZEIXV2pA",
    "version": 18,
    "state_uuid": "ifm67DgeRPiPzS_7RKcIfg",
    "master_node": "xBV1kzAzToiid55qXyQI3A",
    "blocks": {},
    ...
}

es7 集群安装ik_服务器

常见问题

运行起来可能遇到的问题比较多,一个一个慢慢解决。

【问题一】:不能以root身份启动es。

可以看到运行时异常为 org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root 问题如图所示:

es7 集群安装ik_es7 集群安装ik_02

解决方案:以root身份新建一个非root用户,以这个用户启动es。比如输入指令: useradd yan

【问题二】:权限不足

启动时错误提示为:Exception in thread “main” java.nio.file.AccessDeniedException: /home/yan/elasticsearch-7.2.0/config/jvm.options

es7 集群安装ik_服务器_03

首先切换为root身份,把整个elasticsearch文件夹的拥有者改为自己这个非root用户。

chown yan elasticsearch-7.2.0 -R

然后记得换回非root用户:

su yan
【问题三】:内存空间不够。

es运行时比较需要消耗内存空间的,默认是1g的内存,但是也有可能提示内存不够,如图所示:

es7 集群安装ik_es7 集群安装ik_04

解决方法:修改es的config/jvm.options配置文件,找到-Xms1g与-Xmx1g修改为200m。如图所示:

-Xms200m
-Xmx200m
【问题四】:max virtual memory areas vm.max_map_count [65530] is too low …

es7 集群安装ik_elasticsearch_05

解决方法:

以root身份,修改以下路径配置文件:/etc/sysctl.conf

vi /etc/sysctl.conf

添加一行配置 vm.max_map_count=262144 ,如图所示:

es7 集群安装ik_es7 集群安装ik_06

修改完成后一定记得输入以下命令让配置生效。

sysctl -p
【问题五】max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

解决方法:

修改配置文件:/etc/security/limits.conf

vi /etc/security/limits.conf

添加内容如下:

*               soft    nofile           65536
*               hard    nofile           65536

修改后的与问题六在一块儿,可以看下面的图片。

【问题六】max number of threads [3895] for user [ES] is too low …

es7 集群安装ik_配置文件_07

解决方法:

修改配置文件:/etc/security/limits.conf

vi /etc/security/limits.conf

添加内容如下:

*               soft    nproc           4096
*               hard    nproc           4096

和问题五的解决方案一起,可以看到配置后如图所示:

es7 集群安装ik_es7 集群安装ik_08

【问题七】让外部访问ES

默认情况下使用的是localhost,外部是访问不了自己服务器上的ES的,为了能够让自己云服务器上的ES能够被外部直接访问,用浏览器直接打开,需要稍微配置一下,配置方法即修改elasticsearch.yml的network.host。

vi config/elasticsearch.yml

找到network.host,去掉前面的注释,修改为0.0.0.0,重新启动es即可。

es7 集群安装ik_配置文件_09

大功告成!

感谢以下地址博主!参考教程:

https://cloud.tencent.com/developer/article/1189282

总结

es集群挺简单的,但是es的启动却可能会出这么多问题,真是……

不过其实也不算麻烦,耐心一点就可以很快解决了,如果有遇到什么问题,欢迎交流。

这些操作都是在自己的虚拟机中完成的,那么,云服务器上是不是也是一样的操作呢?由于本人只有两台云服务器,腾讯云和阿里云分别一台,我尝试搭建一个es集群,结果以失败告终,原因如下:

在withyan.cn(阿里云)启动master,然后在smileyan.cn(腾讯云)启动slave,尝试在slave中通过配置withyan.cn的外网地址进行集群,但是一直显示连接失败,我查看一下master的集群状态,如图所示:

es7 集群安装ik_配置文件_10


其中这个172.17.24.192是我阿里云服务器的内网地址,也就是说,master启动后,暴露给外面的地址是阿里云的内网地址,在这种情况下,当然腾讯云的ES是不能与之进行集群的,因为根本找不到master在哪里。

所以,尽量在内网进行集群吧。

Smileyan

2019年8月1日 8:17