背景:
Centos7.3 Linux系统,服务器内网防火墙处于关闭状态;本次在三台服务器上安装ES集群(10.3.1.8、10.3.1.9、10.3.1.13),每台单实例,互相已配置SSH免密登录。服务器本身安装好了JDK1.8,配置好了环境变量。
ps:话说ES安装怎么这么多坑呢!网上资料多,但是很杂很乱很不全!还是自己总结靠谱点的全过程吧
一、官网下载
为了方便管理,我选择tar包安装;
下载地址:https://www.elastic.co/downloads/past-releases
我选择版本5.4.0,想着这版本发布一年了应该比较稳定…
二、安装ElasticSearch 5.4.0 集群
提示:最好严格按照步骤来,不要省!我会把坑一步步填上!
1.创建用户
该步骤的操作是在三台机器上都进行!
groupadd es
useradd es -g es -p es
并配置sudo免密:
[root@cdh1 elasticsearch-5.4.0]# vim /etc/sudoers
添加 es ALL=(ALL)NOPASSWD:ALL 一行
2.解压到指定目录
在10.3.1.8这台master机器上操作:
我将es目录放在es默认用户主目录下,即 /home/es
配置环境变量:
vim /etc/profile
添加:export ES_HOME=/home/es/elasticsearch-5.4.0
在PATH变量后添加:$ES_HOME/bin
修改完成后:source /etc/profile
3.更改配置文件
在10.3.1.8这台master机器上操作:
进入config目录,可以看到三个文件:
elasticsearch.yml 是es的基本配置文件;
jvm.options 是jvm相关配置文件;
logging.yml 是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了;
今天我们只完成es基本配置,优化自定义等后面会再写。
[root@cdh1 config]# vim elasticsearch.yml
添加配置:
cluster.name: es-cluster
node.name: es-1
path.data: /home/es/elasticsearch-5.4.0/data
path.logs: /home/es/elasticsearch-5.4.0/logs
network.host: 10.3.1.8
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["10.3.1.8"]
ES配置说明:
cluster.name:es-cluster
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
node.name:es-1
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。
node.master:true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
node.data:true
指定该节点是否存储索引数据,默认为true。
index.number_of_shards:5
设置默认索引分片个数,默认为5片。
index.number_of_replicas:1
设置默认索引副本个数,默认为1个副本。
path.conf:/path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。
path.data:/path/to/data
设置索引数据的存储路径,默认是es根目录下的data文件夹,
可以设置多个存储路径,用逗号隔开,例:
path.data:/path/to/data1,/path/to/data2
path.work:/path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。
path.logs:/path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins:/path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.mlockall:true
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit-l unlimited`命令。
network.bind_host:192.168.0.1
设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。
network.publish_host:192.168.0.1
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
network.host:192.168.0.1
这个参数是用来同时设置bind_host和publish_host上面两个参数。
transport.tcp.port:9300
设置节点间交互的tcp端口,默认是9300。
transport.tcp.compress:true
设置是否压缩tcp传输时的数据,默认为false,不压缩。
http.port:9200
设置对外服务的http端口,默认为9200。
http.max_content_length:100mb
设置内容的最大容量,默认100mb
http.enabled:false
是否使用http协议对外提供服务,默认为true,开启。
gateway.type:local
gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,Hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。
gateway.recover_after_nodes:1
设置集群中N个节点启动时进行数据恢复,默认为1。
gateway.recover_after_time:5m
设置初始化数据恢复进程的超时时间,默认是5分钟。
gateway.expected_nodes:2
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
cluster.routing.allocation.node_initial_primaries_recoveries:4
初始化数据恢复时,并发恢复线程的个数,默认为4。
cluster.routing.allocation.node_concurrent_recoveries:2
添加删除节点或负载均衡时并发恢复线程的个数,默认为4。
indices.recovery.max_size_per_sec:0
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
indices.recovery.concurrent_streams:5
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。
discovery.zen.minimum_master_nodes:1
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.ping.timeout:3s
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
discovery.zen.ping.multicast.enabled:false
设置是否打开多播发现节点,默认是true。
discovery.zen.ping.unicast.hosts:["host1", "host2:port","host3[portX-portY]"]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
4、将master上的es目录scp到其他两台机器并修改配置
在10.3.1.8这台master机器上操作:
scp -r /home/es/ root@10.3.1.9:/home/
scp -r /home/es/ root@10.3.1.13:/home/
配置各自的环境变量,同10.3.1.8
再修改各自配置文件:
vim /home/es/elasticsearch-5.4.0/config/elasticsearch.yml
10.3.1.9上修改为:
cluster.name: es-cluster
node.name: es-2
path.data: /home/es/elasticsearch-5.4.0/data
path.logs: /home/es/elasticsearch-5.4.0/logs
network.host: 10.3.1.9
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["10.3.1.8"]
10.3.1.13上修改为:
cluster.name: es-cluster
node.name: es-3
path.data: /home/es/elasticsearch-5.4.0/data
path.logs: /home/es/elasticsearch-5.4.0/logs
network.host: 10.3.1.13
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["10.3.1.8"]
5、将三台机器上的es目录配置es用户权限
三台都执行:
chown -R es /home/es
chgrp -R es /home/es
提示:此处是一个坑,如果不这样做,启动时会报:
2018-04-09 14:56:49,163 main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:585)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.checkMBeanTrustPermission(DefaultMBeanServerInterceptor.java:1848)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:322)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at org.apache.logging.log4j.core.jmx.Server.register(Server.java:389)
at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:167)
at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:140)
所以必须改变elasticsearch文件夹所有者到当前用户!
6、修改两个系统文件limits.conf和sysctl.conf
先在master机器上操作:
vim /etc/security/limits.conf
添加内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vim /etc/sysctl.conf
添加内容:
vm.max_map_count=655360
并执行命令:
sudo sysctl -p
然后scp到其他两台机器上:
scp /etc/security/limits.conf root@10.3.1.9:/etc/security/
scp /etc/security/limits.conf root@10.3.1.13:/etc/security/
scp /etc/sysctl.conf root@10.3.1.9:/etc/sysctl.conf
scp /etc/sysctl.conf root@10.3.1.13:/etc/sysctl.conf
并在两台机器上也执行:sudo sysctl -p
提示:此处是一个坑,如果不这样做,启动时会报:
ERROR: bootstrap checks failed
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
7、启动master节点下的elasticsearch
在10.3.1.8这台机器上操作:
先切换到es用户:
su es
由于配置了环境变量,所以可以在任意目录下输入elasticsearch,即可启动master节点,也可以直接cd到es的bin目录执行该命令。
注:elasticsearch 命令后可以加 -d,表示后台运行;详情输入–help查看:
可以看到启动成功!
提示:此处又一个坑,如果不切换es用户,启动时会报:
[2018-04-09T14:56:16,276][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [es-1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
必须切换非root用户!
8、启动非master节点下的elasticsearch
先别着急切换用户启动,我们看看这两台机器es目录下有没有 data 和 logs 两个文件夹;
这两个文件夹是属于master启动后生成的目录,如果严格按我的步骤来是应该不存在的。就怕有的人先启动master节点,再scp目录到另两台机器上,这样就会存在该目录了,启动就会报错如下:
[2018-04-09T16:12:04,017][INFO ][o.e.d.z.ZenDiscovery]
[es-2] failed to send join request to master [{es-1}{8FrQBZ-iRPy6Qh9iDG5tYg}{QCe-pTLBTyG274ra3Sx_0g}{10.3.1.8}{10.3.1.8:9300}], reason [RemoteTransportException[[es-1][10.3.1.8:9300][internal:discovery/zen/join]];
with the same id but is a different node instance]; ]
故检查一下,存在就删除!然后就可以切换用户直接启动了。
我们可以注意到:
先启动master节点,再启动slave节点后,在master的控制台会产生相关信息,表示master感应到了集群其他节点的启动!
9、浏览器查看
可以通过9200端口看到es的JSON信息,即表示成功启动:
三、安装 elasticsearch-head 插件
该插件是github上一个开源项目,提供一个UI界面对ES进行各种操作,如查询、删除、浏览索引等。
ps:安装ES其实没啥,但安装这个插件倒是真把我恶心到了…
head插件据说5.x版本和之前版本很不一样。之前版本可以输入命令自动下载安装,而5.x版本要手动下载,安装nodejs环境,启动这个nodejs项目…
我之前是没搞清楚用命令死活安不了,才发现该方法无效,又安装nodejs通过npm install编译启动,结果nodejs各种报错,换了3个版本解决几个bug才弄好哎。
不多说,直接上步骤吧!
1.下载head插件
在线下载:wget https://github.com/mobz/elasticsearch-head/archive/master.zip
unzip解压后就可以看到head目录:
或者到github手动下载再上传:https://github.com/mobz/elasticsearch-head
注:安装包随便放在哪个目录都行,因为这是单独启动的nodejs进程,不依赖于es.
2.安装node
由于head插件本质上还是一个nodejs工程,因此需要安装node,使用npm来安装依赖的包(npm可以理解为maven)
下载地址:wget https://npm.taobao.org/mirrors/node/latest-v6.x/node-v6.10.0-linux-x64.tar.gz
解压完后,配置环境变量!
然后可以测试一下node是否生效:
node -v
npm -v
3、安装grunt
grunt是一个很方便的构建工具,可以进行打包压缩、测试、执行等等的工作,5.x里的head插件就是通过grunt启动的。
到head目录安装:
cd /home/es/elasticsearch-5.4.0/elasticsearch-head-master/
npm install -g grunt-cli
npm install //执行后会生成node_modules文件夹
注:5.0以上,elasticsearch-head 不能放在elasticsearch的 plugins、modules 目录下,否则elasticsearch启动会报错
我执行 npm install 的时候报错了:
Error: Cannot find module '/home/es/elasticsearch-5.4.0/elasticsearch-head-master/node_modules/phantomjs-prebuilt/install.js'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
查询资料后解决方案:
再执行:
npm install phantomjs-prebuilt@2.1.16 --ignore-scripts
4、修改head源码
vim /home/es/elasticsearch-5.4.0/elasticsearch-head-master/Gruntfile.js
connect: {
server: {
options: {
port: 9100,
hostname: '*',
base: '.',
keepalive: true
}
}
}
增加hostname属性,设置为*
再修改连接地址:
vim /home/es/elasticsearch-5.4.0/elasticsearch-head-master/_site/app.js
修改head的连接地址,把localhost修改成你es的服务器地址:
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://10.3.1.8:9200";
建议通过vim搜索功能直接定位:
5、运行head
在head目录下直接执行:
grunt server
注:nohup grunt server &exit //后台运行,必须加exit退出当前ssh窗口
然后只需重启三个es节点就能在浏览器上通过http://10.3.1.8:9100/看到节点信息了:
注:关于如何停止es和停止head
我发现es好像没有自带stop命令。。
所以只能通过kill进程的方法来stop咯:
jps
//找到 15094 Elasticsearch
kill -9 15094
停止head:
ps aux|grep grunt
kill -9 64022
终于写完了这篇文档,好累。。
后续关于Logstash、Kibana的安装文档马上出!