现状描述
目前使用的是单节点部署的es ,存在单点隐患,性能瓶颈,数据冗余等问题,所以需要集群模式部署。
解决方案
停止业务写入,把单点es 数据压缩。新建一个节点配置为单节点运行,把数据复制到新节点的data 目录下面,启动节点查看数据是否正常,然后再逐步一台一台加入,最终扩展为三节点的集群。一个master,两个node ,三个节点都是数据节点。
操作步骤
单点es 操作
1、通知相关业务人员停止数据写入,通过9200 查看数据分片状态是否正常,若正常则停止es 服务。
2、打包压缩数据 cd /data_es/es/data&&tar -zcf data.tgz node
3、把压缩包传输到新节点相应目录下
新节点操作
一、新建一个节点
1、新建一个单节点,配置如下
cat es-1/config/elasticsearch.yml
cluster.name: "docker-cluster-es-1"
network.host: 0.0.0.0
node.name: es-1
network.publish_host: 172.31.6.81
discovery.zen.minimum_master_nodes: 1
transport.tcp.port: 9900 #集群之间通讯端口,默认是9300
transport.tcp.compress: true
http.cors.enabled: true
http.cors.allow-origin: "*"
######## Start OpenDistro for Elasticsearch Security Demo Configuration ########
cluster.routing.allocation.disk.threshold_enabled: false
node.max_local_storage_nodes: 3
######## End OpenDistro for Elasticsearch Security Demo Configuration ########
2、把压缩包解压到 es-1/data/目录下面
3、启动节点启动脚本如下
#!/bin/bash
docker stop aws-es-1
docker rm aws-es-1
docker run --name aws-es-1 -p 9800:9200 -p 9900:9900
-v /data_es/es-1/data:/usr/share/elasticsearch/data
-v /data_es/es-1/logs:/usr/share/elasticsearch/logs
-v /data_es/es-1/config:/usr/share/elasticsearch/config
-v /data_es/es-1/config/ik:/usr/share/elasticsearch/plugins/ik
--log-opt max-size=10m --log-opt max-file=5
-d elasticsearch:6.8.10
4、通过head 插件查看数据状态是否正常
二、加入第二个节点
1、更改节点1的配置
elasticsearch.yml 添加内容如下,第一个ip 是待加入的新节点IP,第二个是节点1的IP
discovery.zen.ping.unicast.hosts: ["172.31.9.27:9900", "172.31.6.81:9900"]
2、新加入节点配置如下(data logs 等目录为空)
cluster.name: "docker-cluster-es-1" #集群名字必须都一样
network.host: 0.0.0.0
node.name: es-3 #节点名字每个节点都是唯一的
network.publish_host: 172.31.9.27
discovery.zen.ping.unicast.hosts: ["172.31.9.27:9900", "172.31.6.81:9900"] #组播的地址池,里面的IP 是节点1和自己的
discovery.zen.minimum_master_nodes: 1 #跟节点1保持一致
transport.tcp.port: 9900
transport.tcp.compress: true
http.cors.enabled: true
http.cors.allow-origin: "*"
######## Start OpenDistro for Elasticsearch Security Demo Configuration ########
cluster.routing.allocation.disk.threshold_enabled: false
node.max_local_storage_nodes: 3
######## End OpenDistro for Elasticsearch Security Demo Configuration ########
3、启动节点2,重启节点1
4、通过head查看分配状态,待所有数据分配完毕加入第三个节点
三、加入第三个节点
1、新节点配置如下
cluster.name: "docker-cluster-es-1"
network.host: 0.0.0.0
node.name: es-2 #自己名字
network.publish_host: 172.31.12.145 #自己IP
discovery.zen.ping.unicast.hosts: ["172.31.9.27:9900", "172.31.6.81:9900", "172.31.12.145:9900"] #加入自己的IP
discovery.zen.minimum_master_nodes: 2 #由1 变为2,三节点设置为2,防止脑裂。
transport.tcp.port: 9900
transport.tcp.compress: true
http.cors.enabled: true
http.cors.allow-origin: "*"
######## Start OpenDistro for Elasticsearch Security Demo Configuration ########
cluster.routing.allocation.disk.threshold_enabled: false
node.max_local_storage_nodes: 3
######## End OpenDistro for Elasticsearch Security Demo Configuration ########
2、第二节点配置
3、第三节点配置变动如下
discovery.zen.ping.unicast.hosts: ["172.31.9.27:9900", "172.31.6.81:9900", "172.31.12.145:9900"] #加入新节点的IP
discovery.zen.minimum_master_nodes: 2 #由1 变为2,三节点设置为2,防止脑裂。
4、第一个节点配置变更同上。
5、重启节点一,二,启动节点三
6、查看数据分配状态
维护调优
1、jvm 配置
堆内存最大最小值要相同,最大配置不能超过32G,一般配置为宿主机的内存的一半(剩余的留给lucen),配置地点 config/jvm.options
2、节点宕机
集群中有一台节点宕机或者网络故障时,无论此节点是master 还是node 都没关系,数据分片有 Unassigned状态,过段时间,就会把故障节点数据调度到其它两个节点,而后数据分片状态恢复正常。注意,如果故障节点不能够短时间恢复,需要更改现有两个节点的配置为 discovery.zen.minimum_master_nodes: 1 ,这样现有两个节点其中一个故障,集群依然存活,否则discovery.zen.minimum_master_nodes: 2 的时候,要求最少存在两个节点且具有选举为master 的资格的节点。
当只能正常运行两个节点的时候,如果其中一个挂了(无论主备),只剩下唯一的一个节点,discovery.zen.minimum_master_nodes: 1 的配置下,集群可以启动,会有Unassigned分片,且在故障节点无法恢复的前提下,此状态分片不会消失,原因:集群的副本数量为1,也就是存在两份相同数据,如果只有一个节点存活,那么两份相同数据无法分配给一个节点,所以就会有一个数据处于Unassigned,知道有新的节点加入集群,无论此节点是之前宕机的哪个节点。
3、调试
集群创建索引 kzf : curl -XPUT 'http://localhost:9800/kzf?pretty'