Elastic Search 集群
总体目标
三台服务器192.168.112.130 、131 、132,进行es集群。
假设使用130这台服务器作为master,其他两台作为slave。
具体过程
找到 config/elasticsearch.yml 文件,
- 配置集成名称。
cluster.name: my-cluster
- 配置节点的名称,根据服务器不同更改不同的名称。
比如node-1,node-2,node-3
node.name: node-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"]
- 配置初始化主节点。
三个服务器统一使用一个master。
cluster.initial_master_nodes: ["node-1"]
- 配置ip地址与端口。
network.host: 0.0.0.0
http.port: 9200
- 分别启动三个服务器的es。
bin/elasticserarch
如果运行不成功,莫慌,在本篇文章后面会附带常见问题以及解决方案,都是实际开发中常见的问题,肯定能够很好地解决问题。
- 检测。
访问某个地址比如 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": {},
...
}
常见问题
运行起来可能遇到的问题比较多,一个一个慢慢解决。
【问题一】:不能以root身份启动es。
可以看到运行时异常为 org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root 问题如图所示:
解决方案:以root身份新建一个非root用户,以这个用户启动es。比如输入指令: useradd yan
【问题二】:权限不足
启动时错误提示为:Exception in thread “main” java.nio.file.AccessDeniedException: /home/yan/elasticsearch-7.2.0/config/jvm.options
首先切换为root身份,把整个elasticsearch文件夹的拥有者改为自己这个非root用户。
chown yan elasticsearch-7.2.0 -R
然后记得换回非root用户:
su yan
【问题三】:内存空间不够。
es运行时比较需要消耗内存空间的,默认是1g的内存,但是也有可能提示内存不够,如图所示:
解决方法:修改es的config/jvm.options配置文件,找到-Xms1g与-Xmx1g修改为200m。如图所示:
-Xms200m
-Xmx200m
【问题四】:max virtual memory areas vm.max_map_count [65530] is too low …
解决方法:
以root身份,修改以下路径配置文件:/etc/sysctl.conf
vi /etc/sysctl.conf
添加一行配置 vm.max_map_count=262144
,如图所示:
修改完成后一定记得输入以下命令让配置生效。
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 …
解决方法:
修改配置文件:/etc/security/limits.conf
vi /etc/security/limits.conf
添加内容如下:
* soft nproc 4096
* hard nproc 4096
和问题五的解决方案一起,可以看到配置后如图所示:
【问题七】让外部访问ES
默认情况下使用的是localhost,外部是访问不了自己服务器上的ES的,为了能够让自己云服务器上的ES能够被外部直接访问,用浏览器直接打开,需要稍微配置一下,配置方法即修改elasticsearch.yml的network.host。
vi config/elasticsearch.yml
找到network.host,去掉前面的注释,修改为0.0.0.0,重新启动es即可。
大功告成!
感谢以下地址博主!参考教程:
https://cloud.tencent.com/developer/article/1189282
总结
es集群挺简单的,但是es的启动却可能会出这么多问题,真是……
不过其实也不算麻烦,耐心一点就可以很快解决了,如果有遇到什么问题,欢迎交流。
这些操作都是在自己的虚拟机中完成的,那么,云服务器上是不是也是一样的操作呢?由于本人只有两台云服务器,腾讯云和阿里云分别一台,我尝试搭建一个es集群,结果以失败告终,原因如下:
在withyan.cn(阿里云)启动master,然后在smileyan.cn(腾讯云)启动slave,尝试在slave中通过配置withyan.cn的外网地址进行集群,但是一直显示连接失败,我查看一下master的集群状态,如图所示:
其中这个172.17.24.192是我阿里云服务器的内网地址,也就是说,master启动后,暴露给外面的地址是阿里云的内网地址,在这种情况下,当然腾讯云的ES是不能与之进行集群的,因为根本找不到master在哪里。
所以,尽量在内网进行集群吧。
Smileyan
2019年8月1日 8:17