[超详细] 手把手教你生产环境 ElasticSearch集群搭建 教程与问题记录

近期文章:Rocky Linux 9.3 源码编译安装 php8.3.3 以及扩展 redis 、gd和 sodium安装

项目背景

公司一个项目购买的阿里云ElasticSearch集群,但由于大环境不好,项目效益不好,但es集群每个月费用挺高,想优化成本,于是想着自建会不会比买阿里云 es集群便宜呢,于是就尝试买相同配置的 ECS机器,一对比发现,每个月省下1500

ElasticSearch集群搭建 详细过程如下

1、购买 ECS机器

我这里购买5 台 8c16G 100G磁盘的 ECS机器

search_elastic1192.168.7.69
search_elastic2192.168.7.70
search_elastic3192.168.7.71
search_elastic3192.168.7.72
search_elastic5192.168.7.73

2、新建 es集群用户

useradd elastic

3、系统参数优化

vim /etc/sysctl.conf新增下面配置

vm.max_map_count=655360

执行命令生效:

sysctl -p

vim /etc/security/limits.conf 新增下面配置

root soft nofile 65535
root hard nofile 65535
elastic soft nofile 65536
elastic hard nofile 65536
elastic  - memlock  unlimited

4、安Java JDK

mkdir /usr/local/data/
cd /usr/local/data/
yum install -y lrzsz
rz 选择上传jdk-8u171-linux-x64.tar.gz
tar zxvf jdk-8u171-linux-x64.tar.gz

4.1、 配置 java 环境变量

vim /etc/profile.d/jdk.sh
#!/bin/bash
export JAVA_HOME=/usr/local/data/jdk1.8.0_171
export JRE_HOME=/usr/local/data/jdk1.8.0_171//jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

4.2、使java环境变量生效

#
source /etc/profile.d/jdk.sh

#检查是否生效
java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

安装 java之后,接下来继续

5、elasticsearch 集群搭建

5.1、下载解压elasticsearch安装包

elasticsearch下载地址放在下方:

https://www.elastic.co/cn/downloads/past-releases#elasticsearch (根据需要选择版本哈)

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.16.zip
unzip elasticsearch-5.6.16.zip

5.2 修改elasticsearch集群配置

cluster.name: search_es 
node.name: search_elastic1 #注意修改这里为当前机器的主机名

#数据目录和日志保持默认
#path.data: /path/to/data
#path.logs: /path/to/logs

bootstrap.memory_lock: true
bootstrap.system_call_filter: false
transport.tcp.compress: true
http.port: 9200
network.host: 192.168.7.69
http.max_content_length: 100mb
http.enabled: true
discovery.zen.minimum_master_nodes: 1
discovery.zen.ping_timeout: 10s
discovery.zen.ping.unicast.hosts: ["192.168.7.69:9300","192.168.7.70:9300","192.168.7.71:9300","192.168.7.72:9300","192.168.7.73:9300"]

##head插件使用
http.cors.enabled: true
http.cors.allow-origin: "*"

5.3、修改jvm.options

机器购买的是 16G,给 es分配 8G,留一半给系统使用和资源分配

-Xms8g
-Xmx8g

6、elasticsearch 集群安装插件

6.1、安装 IK分词插件

安装IK分词插件最重的一点就是版本要跟elasticsearch一致,否则别想安装成功,

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.1/elasticsearch-analysis-ik-5.6.1.zip
#解压到analysis-ik目录
unzip  elasticsearch-analysis-ik-5.6.1.zip -d analysis-ik

6.2 安装payloadscore插件

将研发给的payloadscore-plus.zip包解压到 elasticsearch plugins目录下,如图所示

elasticsearch 集群安装插件

6.3 启动 elasticsearch 服务

chown -R elastic.elastic elasticsearch-5.6.16 elasticsearch
#重启
sudo -u elastic /usr/local/data/elasticsearch/bin/elasticsearch -d

打开浏览器访问:http://192.168.7.69:9200 或使用 curl http://192.168.7.69:9200

我这边由于elasticsearch集群是内网访问,也不需要开放端口哈,内部人员通过 vpn连接到内网,即可访问哈

6.4 添加进程检查脚本,挂掉自动重启

#!/bin/bash
#func:检测elaticsearch进程是否存在,并执行启动操作
set -x

export JAVA_HOME=/usr/local/data/jdk1.8.0_171
export JRE_HOME=/usr/local/data/jdk1.8.0_171//jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

es_id=`ps axu|grep -w elastic|grep -v grep|awk '{print $2}'`

if [[ $es_id ]];then
        echo "es进程存在,`date +%F-%H:%M:%S`" >>/var/log/es.log
else
        echo "es进程不存在,`date +%F-%H:%M:%S`, 开始启动es" >>/var/log/es.log
        su - elastic -c '/usr/local/data/elasticsearch/bin/elasticsearch -d'
fi

crontab中新增

*/1 * * * * /bin/bash /scripts/elastic_check_status.sh >/dev/null 2>&1

7、问题记录

7.1 问题 1:bootstrap check failure [1] of [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

解决方案

vim /etc/security/limits.conf
#添加以下内容,注意:elastic是es集群运行用户,你的不一定和我一样,
elastic hard nofile 65536
elastic soft nofile 65536

再次重启elasticsearch服务

7.2 问题 2:bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

内存权限太小错误,在启动时又报错了,这是因为elastic用户拥有的内存权限太小,至少需要262144。

解决方案

在root用户下,在/etc/sysctl.conf文件最后添加一行

vm.max_map_count=262144

执行命令生效:

/sbin/sysctl -p

再次重启就正常了

最后就是加 zabbix监控了,后面单独分享一下监控脚本和模板,以及扩容后的集群压力分布不均如何优化等内容

Comments

No comments yet. Why don’t you start the discussion?

发表评论