蓝鲸ElasticSearch三节点集群水平扩容至九节点

本文主要讲述下,蓝鲸ES集群如何进行水平扩容,主要分以下几个方面。
  1. 前言

  2. ES常用API

  3. 大致扩容方案

  4. 前期准备工作

  5. 安装ES节点,修改配置文件

  6. 新节点加入集群

  7. ES集群数据迁移

  8. 参考命令,脚本

0x00. 前言

1. 此次ES扩容临危受命,故没有研究ES的很多知识,就着手扩容,故难免有疏漏,甚至错误之处,敬请指正。
2. 此次扩容耗时很长,主要受分片reroute,rebalance比较慢所致。
3. 此前没有在意ES集群的索引,文档的日增长量之类的数据,建议扩容前先估算数据再做方案。
4. 后续自己会继续研究ES的相关知识,也非常感谢其他人分享的经验。

0x01. ES常用API

ES提供了很多RestFul风格的API供我们使用,查看管理集群也少不了这些API接口。
在这不再贴具体的API的使用方法,管理查看集群最常用的是_cat, _cluster, _indices等。
在ES的官网上有详细的说明和使用方式,注意查看与自己版本相同的文档,官网文档链接
另外有相关的扩容问题也可以查询ES的社区,或许有你疑惑的问题。 ES中文社区

0x02. 大致扩容方案

先介绍下未扩容前的ES集群情况
1. 原集群节点与zk,kafka,redis_cluster混合部署,发生过几次ES导致宕机,进而引发整个蓝鲸平台不可用的事故。
2. 原集群采用垂直扩容的方式,扩容ES节点的内存和存储,这种方式饮鸩止渴,解决不了根本原因。
3. 原集群已经Red状态,不能提供服务,其中esb_api_log_community索引有1.1Tb之大,主副分片加起来有2.3Tb
4. 原集群共有3700+索引,有1w+的未分配分片,活动的分片数只有6k+,三个节点共计占用接近8Tb的磁盘空间
5. es进程占用的cpu资源非常高,es的bin目录下产生了高达300G的java_xxxpid.hprof内存溢出时的内核堆栈的记录信息
6. 执行查询类的API,返回数据很慢,执行操作类的如,关闭索引,删除索引等时,返回503,集群已经不能正常执行操作。
7. 上述可见原ES集群的负载非常大,集群已经不能提供正常的服务和处理集群间的事务。
大致的扩容方案
1. 原先三节点分别拥有所有角色,既master,data和协调器角色,分别参与集群master选举,数据存储,集群间事务处理。
2. 现在由原先三节点集群水平扩展为九节点集群,九节点分三组角色,
3. 一组为master和协调器角色,负责维护集群状态和响应client请求,集群内部事务,
4. 另一组为data和协调器角色,负责存储数据和辅助处理请求和内部事务。最后一组只有data角色,只负责储存数据。
扩容前后的节点配置角色对比
3.扩容前:
3节点 主节点 数据节点 协调器 资源配置
master1 12C/30GB/7TB
master2 12C/30GB/7TB
master3 12C/30GB/7TB
4. 扩容后
9节点 主节点 数据节点 协调器 资源配置
master1 ~ master3 × 12C/30GB/3TB
data4 ~ data6 × 12C/30GB/3TB
data7 ~ data9 × × 12C/30GB/3TB

0x03. 前期准备工作

1.通过命令或者脚本手动删除18年以前和三个月以前的索引,通过匹配索引名的日期。先降低集群的工作量和迁移数量。

2.通过脚本删除esb_api_log_community的一个月以前的数据,集群状态异常时可能删除不掉,陷入无响应,或者返回503超时。此时先不删除,等集群恢复处理能力后再删除。

3.关闭索引量较大的索引,关闭集群的Rebalance重平衡,关闭集群的reroute再路由

4.如果想加快集群的分片迁移速度可以将所有主分片的副本分片数量置为0,这样将可以减少一半的分片数量,风险是有可能丢失数据。

5.新加入的主机需要保持和蓝鲸安装时一样的主机环境,包括关闭防火墙,修改文件句柄数等等。

0x04. 安装ES节点,修改配置文件

1.备份中控机的install.config文件,并将新节点主机IP按照格式填入该文件中
2.修改es使用的JVM的参数,配置免密,执行预检,预检完成后,同步common,同步es
# 修改JVM参数
[root@nginx-1 install]# vim render.rc 
    : ${MAX_ES_MEM:=30}
    : ${MIN_ES_MEM:=30}
:wq
[root@nginx-1 install]# bash configure_ssh_without_pass

[root@nginx-1 install]# ./precheck

[root@nginx-1 install]# ./bkeec sync common

[root@nginx-1 install]# ./bkeec sync es
3.重新渲染安装es
# 修改JVM参数
[root@nginx-1 install]# ./bkeec render es

[root@nginx-1 install]# ./bkeec install es

4.安装完成后,不要启动es,逐个修改es配置文件。
5.原三节点的es配置文件先不用修改,discovery.zen.ping.unicast.hosts该配置项只渲染进了三个install.config文件中前三个,也就是原节点的IP。可以修改三原节点的node.name为es-master1,es-master2,es-master3便于区分。
6.剩余六个节点则按照,前三个和后三个来划分,前三个修改配置文件为node.master: false,node.ingest:true,node.name: es-data4,依次类推。后三个节点的与此类似但node.ingest: false,这样配置文件就修改完毕。
# 下面是data节点的配置
cluster.name: bkee-es
node.master: false
node.data: true
node.ingest: true
node.name: es-data4
node.attr.tag: cold
path.data: /data/bkee/public/es/data
path.logs: /data/bkee/logs/es
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: "data-IP4"
http.port: 10004
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["master1-IP", "master2-IP", "master3-IP"]
discovery.zen.minimum_master_nodes: 2
thread_pool.search.size: 1000
thread_pool.search.queue_size: 1000
thread_pool.bulk.queue_size: 1000
cluster.routing.allocation.same_shard.host: true
http.cors.enabled: true
http.cors.allow-origin: "*"

0x05. 新节点加入集群

1.修改完配置文件后,登录data节点所在主机,source control.rc后,执行start_es启动es,并等待该节点加入集群后,依次将其他节点加入集群中。

[root@nginx-1 install]# source control.rc 
[root@nginx-1 install]# 
[root@nginx-1 install]# start_es

2.此时因为关闭重平衡和重路由,所以不会往数据节点迁移数据。然后重新打开集群的重平衡和重路由,等待集群分片分配,此过程会很漫长。

[root@nginx-1 install]# curl -H "Content-Type: application/json" -XPUT "es.service.consul:10004/_cluster/settings" -d '{"transient":{"cluster.routing.allocation.enable":"all"}}'

[root@nginx-1 install]# curl -H "Content-Type: application/json" -XPUT "es.service.consul:10004/_cluster/settings" -d '{"transient":{"cluster.routing.rebalance.enable":"all"}}'

3.此时通过查看集群中的分片情况可以看到,分片正在往新节点上迁移,只是速度有点慢

[root@nginx-1 install]# curl -s "es.service.consul:10004/_cat/allocation?v&pretty"

0x06. ES集群数据迁移

1.等待集群中的分片重新分配完毕后,在原先三个节点上逐个禁止分片,通过设置cluster.routing.allocation.exclude._ip来禁止某IP参与数据分片。
curl -H "Content-Type: application/json" -XPUT es.service.consul:10004/_cluster/settings -d '{ "transient" : { "cluster.routing.allocation.exclude._ip" : "master1-IP" } }'
# 此时可以注意到该节点的分片数一点点减少
2.等待该IP上无分片,修改该IP的ES配置文件中的node.data:false,重启该节点,则该节点便不再作为数据节点。
3.对原三台ES节点轮流执行1,2步骤,直至三台节点重启完毕,集群恢复正常。
4.如果此前设置过副本分片数量为0,记得恢复过来。
5.此后该集群再加节点或者删除节点时,便不需要再重启任何节点了,灵活性很大。
6. 下图是集群正常后一些基础信息

基础信息
Overview
Nodes

7. 参考命令,脚本

批量删除2018年以前的索引
source    /data/install/utils.fc
index_names=$(curl -s "es.service.consul:10004/_cat/indices?v" |awk '{print $3}' |grep 2018)
for name in ${index_names}; do
    echo "Delete index ${name}"
    curl -XDELETE "es.service.consul:10004/${name}?pretty"
done
删除esb_api_log_community 90天以前的索引
#!/bin/bash
echo "Before esb_api_log_community delete:"
curl -s "es.service.consul:10004/_cat/indices/esb_api_log_community?v"

curl -XPOST "es.service.consul:10004/esb_api_log_community/_delete_by_query?pretty" -d '{
    "query": {
        "range": {
            "@timestamp": {
                "lt": "now-90d",
                "format": "epoch_millis"
            }
        }
    }
}'

echo -e "\n After esb_api_log_community delete_by_query:"
curl -s "es.service.consul:10004/_cat/indices/esb_api_log_community"
关闭集群Reroute,Rebalance
[root@nginx-1 install]# curl -H "Content-Type: application/json" -XPUT "es.service.consul:10004/_cluster/settings" -d '{"transient":{"cluster.routing.allocation.enable":"none"}}'

[root@nginx-1 install]# curl -H "Content-Type: application/json" -XPUT "es.service.consul:10004/_cluster/settings" -d '{"transient":{"cluster.routing.rebalance.enable":"none"}}'

关闭索引

curl -XPOST 'es.service.consul:10004/${index_name}/_close/' 

索引迁移

curl -H "Content-Type: application/json" -XPUT "es.service.consul:10004/_cluster/settings" -d '{ "transient" : { "cluster.routing.allocation.exclude._ip" : "IP" } }'

 上一篇
Apache+Apaxy搭建并美化目录浏览 Apache+Apaxy搭建并美化目录浏览
0x01 搭建背景1. 百度云上有些课程想下载下来供公司同事一起学习 2. 百度云下载太慢,用户体验很差。不如搭建个局域网的WEB服务供大家在线学习 3. 课程主要是有些PDF和视频,所以很方便使用Apache或者Nginx搭建个Web服务
2019-09-03
下一篇 
利用CDN内容分发网络加速Github的个人博客 利用CDN内容分发网络加速Github的个人博客
0x01 简述背景 在自己大三时,腾讯云搞活动,学生资格可以每月一元购买1C1G的50G存储的云主机,当时自己就买了一台,用到了现在。 当时感觉从事IT的好像都写博客,自己不是太喜欢写东西,但还是感觉有点意思,便跟着网上的教程,利用Word
2019-07-24