今天我们来实现一台机器启动多个es实例
正式生产环境中,肯定都是分不同的服务器部署的,我们这里学习演示才是在一台机器上
我这里有个文件夹上elasticsearch-5.3.0
,需要复制一份:
cp -R elasticsearch-5.3.0 elasticsearch-5.3.0-v2
这样就有了2份elasticsearch了。
接下来为了防止数据冲突,我们需要把elasticsearch-5.3.0-v2/data/
目录下的文件情况(不是删除data目录)。
接下来修改配置文件
主配置文件是elasticsearch.yml
node.name 代表你当前运行节点名称(肯定需要多节点运行)
cluster.name 集群名称,es会自动发现在同一网段下的es
注:我们之后把elasticsearch-5.3.0
叫做第一个实例/实例1
,把elasticsearch-5.3.0-v2
叫做第二个实例/实例2
。
#修改node.name
实例1修改 node.name: mynode1
实例2修改 node.name: mynode2
#修改实例2的端口:
http.port: 9202
#因为我们是同一台机器部署2个实例,如果是不同机器可以一样
来到第二个实例
transport.tcp.port: 9400
多个节点的时候,机器会有同步的过程,节点和节点之间的交互需要有个tcp的端口,默认是9300
修改或加入
node.master: false(多机器环境不需要)
指定该节点是否有资格被成为node,默认时true,默认集群中的第一台机器为master
(注意一台机器默认只能有一个节点上master,因为我们是虚拟机环境,所以实例2这里设置为false)
discovery.zen.minmum_master_nodes: 1(暂时不加)
#elasticsearch-5.3.0-v2/config/elasticsearch.yml主要配置如下
node.name: mynode2
node.master: false
transport.tcp.port: 9400
继续配置(2台都要的配置)
discovery.zen.ping.unicast.hosts: [“127.0.0.1:9300”,”127.0.0.1:9400”]
es有自动发现机制(分为单播和多播)
多播:节点启动时会发送一个多播的ping请求到网段中,该请求只是用来通知所有能链接到的节点和集群它已经准备好加入到集群中
由于各种网络问题可能会超时,所以我们加入预先设置好的地址(当然也可以修改超时时间,暂时不做设置)
discovery.zen.ping.timeout: 3s (默认时3秒,实际部署时需要增加)
具体操作:
#打开实例2的配置文件
vi elasticsearch-5.3.0-v2/config/elasticsearch.yml
#加入这一行:
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9400"]
#打开实例1的配置文件
vi elasticsearch-5.3.0-v2/config/elasticsearch.yml
#加入这一行:
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9400"]
配置完成,启动2个实例
elasticsearch-5.3.0/bin/elasticsearch
#新开一个窗口
elasticsearch-5.3.0-v2/bin/elasticsearch
到现在我们启动es都是执行的bin
目录下的elasticsearch
命令,其实这个命令也是有参数的:
elasticsearch -d #这样启动就是在后台运行了
我们实例1启动完成了,再去启动实例2
发现:2个实例不能同时启动,实例2启动,实例1就自动停止了
实例1报如下错误:
Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[blog][4]] …]).
Killed
这个问题,我先查看es的日志文件,没有发现什么。后来各种百度,建议查看/var/log/messages
:
然后我觉得可能是内存不够了,瞬间想到我们是虚拟机环境,可以去配置内存大小:
vi config/jvm.options
#es目录中的配置文件
-Xms512m
-Xmx512m
#我们设置为512m,之前是1g
http://10.211.55.13:9200
是实例1,是master。
http://10.211.55.13:9202/
是实例2.
通过name
可以看出,是不同的节点,但是cluster_name
是同一个,也是一个集群,cluster_uuid
也是相同的。
接下来要看看效果了
看看到底有几个节点在运行了
https://www.elastic.co/guide/en/elasticsearch/reference/5.3/cat-nodes.html
查看集群情况
https://www.elastic.co/guide/en/elasticsearch/reference/5.3/cluster-state.html
然后我们看看数据有什么不同(有没有数据同步):
1、我们先给9202这个实例PUT
一条数据(创建索引)
如果已存在的数据,就是更新。
更新成功。
2、我们从9200这个实例获取
我们发现是我们刚才修改的内容。
3、同样在从9202上获取