Windows环境下安装ES
ES软件下载
官网下载:https://www.elastic.co/cn/downloads/elasticsearch
elasticsearch是使用java开发的,且本版本的ES需要的jdk版本要是1.8以上,所以安装elasticsearch之前保证jdk1.8以上安装完毕,并正确的配置好jdk变量环境(JAVA_HOME),否则启动elasticsearch失败。
ES与JDK的版本对应:https://www.elastic.co/cn/support/matrix#matrix_jvm
我这里下载的是elasticsearch-7.10.2-windows-x86_64.zip。
ES程序包默认打包jdk,以至于7.x版本的程序包大小突然变成300MB+,对比6.x发现,包大了200MB+, 正是JDK的大小
安装ES服务
Window版的ElasticSearch的安装很简单,类似Window版的Tomcat,解压开即安装完毕,解压后的ElasticSearch的目录结构如下:
- bin:可执行的二进制文件
- config:配置信息目录
- jdk:内置的jdk目录
- lib:jar存放目录
- logs:日志存放目录
- modules:模块存在目录
- plugins:插件安装目录
启动ES服务
1、修改elasticsearch配置文件,config/elasticsearch.yml文件,增加文件内容如下:
http.cors.enabled: true
http.cors.allow-origin: "*"
添加该配置是为了允许elasticsearch跨域访问。
2、(不使用自带的,可以跳过)平时用jdk8,但运行es7无法启动。在elasticsearch7以上的版本中会自带jdk。需要修改elasticsearch-env配置文件,就可以使用自带jdk版本,不影响其他java项目。
linux:
if [ ! -z "$JAVA_HOME" ]; then
JAVA="$JAVA_HOME/bin/java"
JAVA_TYPE="JAVA_HOME"
else
if [ "$(uname -s)" = "Darwin" ]; then
# macOS has a different structure
JAVA="$ES_HOME/jdk.app/Contents/Home/bin/java"
else
JAVA="$ES_HOME/jdk/bin/java"
fi
JAVA_TYPE="bundled jdk"
fi
改成
if [ "$(uname -s)" = "Darwin" ]; then
# macOS has a different structure
JAVA="$ES_HOME/jdk.app/Contents/Home/bin/java"
else
JAVA="$ES_HOME/jdk/bin/java"
fi
JAVA_TYPE="bundled jdk"
windows:打开 elasticsearch-env.bat文件
if defined JAVA_HOME (
set JAVA="%JAVA_HOME%\bin\java.exe"
) else (
set JAVA="%ES_HOME%\jdk\bin\java.exe"
set JAVA_HOME="%ES_HOME%\jdk"
)
改成
set JAVA="%ES_HOME%\jdk\bin\java.exe"
set JAVA_HOME="%ES_HOME%\jdk"
注意:不推荐使用自带的jdk(默认会读取JAVA_HOME配置的JDK),平时我们开发的时候需要注意以下几点
- 在使用java代码操作es集群的时候:要保证本地使用的es的版本和集群上es的版本保持一致
- 保证集群中每个节点的JDK版本和es基本配置一致
- es集群中jdk版本不一致,可能会导致这个问题:org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream
- jdk别用linux系统自带的openjdk。
3、点击elasticsearch下的bin目录下的elasticsearch.bat启动服务
9300是tcp通讯端口,集群间和TCPClient都执行该端口,9200是http协议的RESTful接口。
浏览器访问elasticsearch服务器localhost:9200,启动成功后的内容如下(Chrome我装了JSON-handle插件):
(1)启动后如果出现以下错误:
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
可以这样解决:打开jvm.options,修改 (大概在35行)
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
改成
-XX:+UseG1GC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
(2)启动elasticsearch.bat时,如果一闪而过,修改配置如下:Elasticsearch默认会配置2G的JVM堆的初始值和最大值,该jvm参数被配置在/config/jvm.options里,可以将JVM参数改小:
-Xms512M
-Xmx512M
安装ES的图形化界面插件
head插件
elasticsearch不同于Solr自带图形化界面,我们可以通过安装elasticsearch的head插件,完成图形化界面的效果,完成索引数据的查看。安装插件的方式有两种,在线安装和本地安装。
下载head插件:https://github.com/mobz/elasticsearch-head
如果下载不下来,可以下载附件,然后在chrom中安装插件:es-head附件
将压缩包解压到任意目录下,但是要和elasticsearch的安装目录区分开
打开浏览器,输入http://localhost:9200/,页面效果如下:
elasticHD
ElasticHD 是一款 ElasticSearch的可视化应用。不依赖ES的插件安装,更便捷;导航栏直接填写对应的ES IP和端口就可以操作Es了。目前支持如下功能:
- ES 实时搜索
- ES DashBoard 数据可视化
- ES Index Template (在线修改、查看、上传)
- SQL Converts to DSL
- ES 基本查询文档
下载地址:https://github.com/qax-os/ElasticHD/releases
下载解压后,就会有一个ElasticHD.exe 的可执行文件,怎么运行呢?官方说明:
Step1: Download the corresponding elasticHD version,Double click zip package to unzip
Step2: exec elastichd ./ElasticHD -p 127.0.0.1:9800
意思是说我们要用cmd命令去启动它,在启动的时候去指定它的访问端口。
CMD命令的代码:
cd D:\Eshome\esHD (这里替换掉你下载解压后的文件夹目录)
ElasticHD -p 127.0.0.1:9800
如果你觉得每次都这样启动麻烦,可以用个记事本写下来,然后把记事本后缀名改成.bat ,这样就双击启动了。
然后,我们浏览器访问下(如果你启动的服务想要别的电脑访问,就不要使用127.0.0.1 ,要使用局域网IP或者外网的固定IP)
当然,这个工具还有其它的一些特色功能。
配置ES集群
我是在自己电脑上配置成三个node节点。
1、首先复制三份es安装包,并重命名文件为node1、node2、node3
2、进入config/elasticsearch.yml下配置
node1的配置:
cluster.name: my-application
node.name: node-yao
node.master: true
## 设置为true
node.data: true
node.ingest: false
network.host: localhost
http.port: 9200
transport.tcp.port: 9300
#增加参数,使head插件可以跨域访问es
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
cluster.initial_master_nodes: ["node-yao"]
node2的配置:
cluster.name: my-application
node.name: node-chun
node.master: true
node.data: true
node.ingest: false
network.host: localhost
http.port: 9201
transport.tcp.port: 9301
#增加参数,使head插件可以跨域访问es
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
node3的配置:
cluster.name: my-application
node.name: node-hui
node.master: true
node.data: true
node.ingest: false
network.host: localhost
http.port: 9202
transport.tcp.port: 9302
#增加参数,使head插件可以跨域访问es
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["localhost:9300", "localhost:9301", "localhost:9302"]
重点参数解释:
(1)cluster.name
集群名字,三台集群的集群名字都必须一致,这样才能构成一个集群。
(2)node.name
节点名字,三台ES节点字都必须不一样。
(3)node.master
该节点是否有资格选举为master,只要配了node master为true的ES服务器数正在运行的数量不少于master_node的配置数,则整个集群继续可用。master服务器主要管理集群状态,负责元数据处理,比如索引增加删除分片分配等,数据存储和查询都不会走主节点,压力较小,jvm内存可分配较低一。
(4)node.data
存储索引数据,三台都设为true即可。
(5)network.host
设置访问的地址。默认仅绑定在回环地址 127.0.0.1和 [::1]。如果需要从其他服务器上访问以及多态机器搭建集群,我们需要设定 ES 运行绑定的 Host,节点需要绑定非回环的地址。建议设置为主机的公网 IP 或0.0.0.0:
network.host: 0.0.0.0
(6)http.port
http.port 默认端口是 9200
注意:这是指 http 端口,如果采用 REST API 对接 ES,那么就是采用的 http 协议。
(7)transport.port
REST 客户端通过 HTTP 将请求发送到您的 Elasticsearch 集群,但是接收到客户端请求的节点不能总是单独处理它,通常必须将其传递给其他节点以进行进一步处理。它使用传输网络层(transport networking layer)执行此操作。传输层用于集群中节点之间的所有内部通信,与远程集群节点的所有通信,以及 Elasticsearch Java API 中的 TransportClient。
transport.port 绑定端口范围。默认为 9300-9400。
因为要在一台机器上创建是三个 ES 实例,这里明确指定每个实例的端口。
(8) discovery.seed_hosts
发现设置。有两种重要的发现和集群形成配置,以便集群中的节点能够彼此发现并且选择一个主节点。
discovery.seed_hosts是组件集群时比较重要的配置,用于启动当前节点时,发现其他节点的初始列表。
开箱即用,无需任何网络配置, ES 将绑定到可用的环回地址,并将扫描本地端口 9300 - 9305,以尝试连接到同一服务器上运行的其他节点。 这无需任何配置即可提供自动群集的体验。
如果要与其他主机上的节点组成集群,则必须设置 discovery.seed_hosts,用来提供集群中的其他主机列表(它们是符合主机资格要求的master-eligible并且可能处于活动状态的且可达的,以便寻址发现过程)。此设置应该是群集中所有符合主机资格的节点的地址的列表。 每个地址可以是 IP 地址,也可以是通过 DNS 解析为一个或多个 IP 地址的主机名(hostname)。
当一个已经加入过集群的节点重启时,如果他无法与之前集群中的节点通信,很可能就会报这个错误 master not discovered or elected yet, an election requires at least 2 nodes with ids from。
因此,我在一台服务器上模拟三个 ES 实例时,这个配置我明确指定了端口号。
配置集群的主机地址,配置之后集群的主机之间可以自动发现(可以带上端口,例如 127.0.0.1:9300):
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301"]
(9)cluster.initial_master_nodes
初始的候选 master 节点列表。初始主节点应通过其node.name标识,默认为其主机名。确保 cluster.initial_master_nodes中的值与 node.name完全匹配。
首次启动全新的 ES 集群时,会出现一个集群引导/集群选举/cluster bootstrapping步骤,该步骤确定了在第一次选举中的符合主节点资格的节点集合。在开发模式下,如果没有进行发现设置,此步骤由节点本身自动执行。由于这种自动引导从本质上讲是不安全的,因此当您在生产模式下第一次启动全新的群集时,你必须显式列出符合资格的主节点。也就是说,需要使用 cluster.initial_master_nodes 来设置该主节点列表。重新启动集群或将新节点添加到现有集群时,你不应使用此设置。
在新版 7.x 的 ES 中,对 ES 的集群发现系统做了调整,不再有 discovery.zen.minimum_master_nodes 这个控制集群脑裂的配置,转而由集群自主控制,并且新版在启动一个新的集群的时候需要有 cluster.initial_master_nodes 初始化集群主节点列表。如果一个集群一旦形成,你不该再设置该配置项,应该移除它。该配置项仅仅是集群第一次创建时设置的!集群形成之后,这个配置也会被忽略的!
cluster.initial_master_nodes 该配置项并不是需要每个节点设置保持一致,设置需谨慎,如果其中的主节点关闭了,可能会导致其他主节点也会关闭。因为一旦节点初始启动时设置了这个参数,它下次启动时还是会尝试和当初指定的主节点链接,当链接失败时,自己也会关闭!
因此,为了保证可用性,预备做主节点的节点不用每个上面都配置该配置项!保证有的主节点上就不设置该配置项,这样当有主节点故障时,还有可用的主节点不会一定要去寻找初始节点中的主节点!
如果本地仅是简单测试使用,上文中的 node.master/node.data/node.ingest不用配置也没影响。
3、启动集群
先启动 node01 节点,因为它设置了初始主节点的列表。这时候就可以使用 http://
注意:搭建过程中,如果集群有问题,修改后可能起不来,这时看看需不需要将每个节点下的data目录清空下。
4、然后用es-head访问
首先进入es-head页面,在chrome安装完插件后会有一个小图标,单击进去
其次用es-head连接node节点(随便一个端口)