Ubuntu下Elasticsearch 2.1集群部署过程与遇到的问题及解决方法(开机自启动、root用户启动)
SEO:ES 2.0 2.1 Elastic Elasticsearch Linux Ubuntu root start stop 开机启动 开机自启动 安装 部署 使用 脑裂 无法 不能 发现 集群 节点
(本文适合有一定Linux基础的读者阅读。由于几乎是按流水账过程记录,而不是教程,建议操作之前读完一遍)
本人在部署ES2.1集群时,遇到了诸多问题,花了很大功夫,才解决,特在此记录解决过程及方法,希望帮到有需要的人。
据使用者的讨论,ES在2.0版本之后发生了很大变化,因此网上的一些资料已经不再适用,在查阅资料时需要根据版本判断,灵活变通方法。
操作系统:Ubuntu 14.04.1 64位
jdk:1.8.0_20 64位
Elasticsearch 2.1
ES部署步骤:
(1)下载目前(2015年12月18日)最新版的ES 2.1的tar.gz包,解压,放至wsn用户目录,修改config\elasticsearch.yml配置文件,添加(或对已有的但被注释掉的语句,取消注释并修改)以下语句:
cluster.name: groupname(设定的集群名称) node.name: node_10.10.2.145(设定的当前节点名称) network.host: 10.10.2.145(可以理解为监听/绑定的IP,本人设置为本机在局域网中的IP,尝试过如果设置127.0.0.1,之后在本机可以访问ES但在局域网中不能访问) index.number_of_shards: 9(分片数量) http.max_content_length: 2000mb(使用中发现,如果使用默认值,使用curl post插入300M以上的txt时会报错) http.compression: true
【注意】每行语句前不能有空格,冒号后必须有一个空格,否则可能启动报错
【注意】可使用 bin/elasticsearch 启动,此时不是服务形式。root用户不能以此方式启动,否则会报错
其中node.name network.host需要根据每台机器的IP等修改(本人是在一台服务器部署好之后将该服务器复制为3台,复制后需要根据机器修改部分配置)
(2)(也可以不进行此步骤,详见下)将elasticsearch添加入系统服务service
/etc/init.d/ 下建立软连接,操作步骤为:
使用cd命令进入/etc/init.d/ ,然后
ln -s /home/wsn/wshare/es/elasticsearch-2.1.0/bin/elasticsearch elasticsearch sudo update-rc.d elasticsearch defaults 95 10 //按照官方说法,这是适用于Ubuntu的方法,猜测为加入服务,参考Running as a Service on Linux https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-service.html#using-systemd
加入服务后,经过测试,仍然无法使用start stop等命令,报错(如下图):
需使用service elasticsearch 启动服务,与直接使用bin/elasticsearch效果相同。
因此,本人决定不使用将其加入服务的方法(加入服务除了启动时输命令方便,别的好像没什么卵用),采用手动配置启动脚本与开机自启动方式,因此加入服务部分的操作(2)可不进行。
(3)配置开机自启动
【2016-5-26更新:发现root用户也可以启动ElasticSearch,方法是在启动时添加Des.insecure.allow.root参数,如下:
bin/elasticsearch -Des.insecure.allow.root=true(参考 How to run Elasticsearch 2.1.1 as root user in Linux machine - Stack Overflow http://stackoverflow.com/questions/34920801/how-to-run-elasticsearch-2-1-1-as-root-user-in-linux-machine)】
本人使用的Ubuntu中,语句放入/etc/init.d/rc.local文件中,即可在开机时运行。
/etc/init.d/rc.local 文件,最后一行后加入:
sh /home/wsn/wshare/auto_start.sh
便能够开机启动auto_start.sh
在/home/wsn/wshare/auto_start.sh中写入:
sh /home/wsn/wshare/es/elasticsearch-2.1.0/start_es.sh
便能够开机时执行start_es.sh。
start_es.sh是启动Elasticsearch并后台运行的脚本,内容为:
su -c “/home/wsn/wshare/es/elasticsearch-2.1.0/bin/elasticsearch &” – wsn # ↑ 临时切换为wsn用户执行-c后的命令,执行后切换为原用户
(wsn用户是Ubuntu系统中建立的另一个用户)
即临时切换为wsn用户并执行”-c”后的命令语句,因此root用户可使用此脚本启动ES(注意第一行后可能需要添加空格,否则有报错)。
通过以上操作,部署ES和开机自启动便完成了。同时,root用户也可使用如上的start_es.sh脚本启动ES,一定程度地避免了root不能直接启动ES带来的不便。
停止ES使用查找进程并kill的方法(ps -ef|grep elastic),尚未找到更好的方法。但使用kill进程方法停止时,ES能感知到并写入ES关闭的日志,因此推测kill进程时ES可以正常退出而非被强制结束。
(4)其它注意事项
①期间遇到的问题:开机启动无法成功,并且看不到脚本执行过程的输出,因此将输出重定向到/tmp/debug3.log(tmp目录下不易产生权限问题),即/etc/init.d/rc.local中加入的语句改为
sh /home/wsn/wshare/auto_start.sh < /tmp/debug3.log
之后,如果开机时执行上述命令有报错,便可以在/tmp/debug3.log文件中看到运行过程的输出。
②另外,jdk配置需要位于/etc/profile文件中,对所有用户都生效。配置方法为,在/etc/profile文件末尾添加
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_20 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
(具体的JAVA_HOME路径需要按实际情况填写)
如果配置jdk的方法是将上述语句添加到针对某个用户的~/.bashrc(使用vim ~/.bashrc编辑添加),则ES无法开机启动,错误为启动时没有JAVA环境变量。
③ES启动时有关于log4j的日志文件权限报错,因此将logs文件夹及其子目录权限设置为777(chmod -R 777 logs 针对所有人都可读可写可执行,是个懒方法),启动时不再有报错。
④一定程度地防止脑裂(无法发现部分节点)问题,因此ES配置文件中加入:
discovery.zen.minimum_master_nodes: 2 discovery.zen.ping_timeout: 10s
即最少需要2个节点才会选举master节点(即产生集群)。在配置文件的注释中看到官方的建议是,数字设置为【节点个数/2+1】,向上取整,本人的是3个节点,因此设置为2;
发现集群的超时时间为10s。
配置启用多播discovery.zen.ping.multicast.enabled: true,但无效,无法发现节点,因此使用单播,添加配置
discovery.zen.ping.unicast.hosts: [“10.10.2.143″, “10.10.2.144”, “10.10.2.145”, “10.10.2.10”]
如此配置之后,该节点便会访问列表中的几个IP,找到这几个IP的机器中的节点,组成集群。
(后查证为ES2.0之后版本已删除了多播功能,如果使用需要安装multicast插件)
本人使用ES也是新手,只是总结了一些自己的经验,文中如有错误、不准确、遗漏之处,希望各位不吝赐教指出,或者解答本人遇到的一些疑虑,以及共同讨论探讨,谢谢!
转载时请注明出处:
Ubuntu下Elasticsearch 2.1集群部署过程与遇到的问题及解决方法(开机自启动、root用户启动) - 张冬 - 博客园