如何在自己的服务器上搭建ES集群

1,328 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

现在准备一步步教大家如何搭建自己的ES服务,并且条件允许的话搭建自己的ES集群

环境准备

集群介绍

image.png

这里我准备搭建两个节点,第一个节点由一台服务器组成一个单节点服务,第二个节点由两台服务器组成一个集群

环境配置

环境采用jdk1.8,es7.13.0,kibana7.13.0

开始安装

安装jdk(需要JDK1.8以上)

1、这里我们选择通过yum命令来安装jdk(无需配置环境变量,安装过程自动配置)

yum -y list java*  

执行成功后可以看到下图中的内容

2、选择一个需要安装的jdk的版本

  • 这里我选择安装的是java-1.8.0-openjdk-devel.x86_64, 这个根据自己的环境来判断因为我的系统是64位的,还有一个要注意一下,我选择的是带‘-devel’后缀的这个,因为这个安装的是jdk,而那个不带 -devel 的安装完了其实是jre。
  • 执行命令,等待日志输出完,就安装成功了
yum install -y java-1.8.0-openjdk-devel.x86_64


3、查看是否安装成功

java -version

显示下图的信息就表示安装成功了

安装ES

1、下载es版本包

这里我选择的是7.13版本,www.elastic.co/cn/download…

2、上传至服务器

下载完成后打开终端进入到文件所在的文件夹,通过scp命令将版本包上传到服务器

scp elasticsearch-7.13.0-linux-x86_64.tar.gz root@124.221.73.149:/var/local

这里提示下最好不要把文件上传到/root目录下,不然启动时候会报错。

3、解压文件

tar -zxvf elasticsearch-7.13.0-linux-x86_64.tar.gz

解压成功后进入到文件夹

这里介绍下ES的目录结构

目录名称描述
bin可执行脚本文件,包括启动es服务、插件管理、函数命令等
config配置文件目录,如es的配置、角色配置、jvm配置等
libes所依赖的java库
data默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境必须要求修改
logs默认的日志文件存储路径,生产环境务必修改
modules包含所有的es模块,如cluster、discovery、indices等
plugins已经安装的插件的目录
jdk/jdk.app7.0以后才有,自带的Java环境

4、启动前配置

修改配置文件

这里介绍下配置文件的核心参数

cluster.name集群名称,节点根据集群名称确定是否是同一个集群。
node.name节点名称,集群内唯一
node.roles[ data, master, voting_only ]配置集群的角色,不同的角色有不同的用途,不太明白如何配置的,可以参考下文档,这里我们注释掉不配置,这样默认拥有所有角色
network.host节点对外提供服务的地址以及集群内通信的ip地址
http.port对外提供服务的端口号
transport.port集群内部节点通信端口
discovery.seed_hosts集群初始化的种子节点,可配置部分或全部候选节点,大型集群可通过嗅探器发现剩余节点
cluster.initial_master_nodes节点初始active master节点, 必须是有master角色的节点,即必须是候选节点,但并不是必须配置所有候选节点。生产模式下启动新集群时,必须明确列出应在第一次选举中计算其选票的候选节点。第一次成功形成集群后,** cluster.initial_master_nodes从每个节点的配置中删除设置。重新启动集群或向现有集群添加新节点时,请勿使用此设置。
vim config/elasticsearch.yml


#输入以下配置
# 集群名称
cluster.name: cluster1
# # 初始主节点
cluster.initial_master_nodes: ["node-1"]
# # 节点名
node.name: node-1
#http端口号,默认9200
http.port: 9201
## 集群间通讯端口号
transport.port: 9920
# 节点的角色,这里我们注释掉,默认拥有全部角色
# node.roles: [master,data,remote_cluster_client]
# 对方暴露的公网ip地址
network.publish_host: 124.221.73.149
# 内网地址,使用虚拟机的用这个配置
network.host: 10.0.4.3
#单节点可不配置
discovery.seed_hosts: ['124.221.73.149']

这里记得给端口放开,我这里用的是云服务器,直接在云服务器防火墙上把9200端口放开就好

5、启动es

  1. 因为es不允许以root账号启动,所以需要提前创建一个其他账号
useradd -m elastic
  1. 设置密码
passwd elastic
  1. 给账号设置权限
chown  -R elastic:elastic elasticsearch-7.13.0
  1. 切换账号启动es
# 切换账号
su elastic

#启动es
# 前台启动: 
./bin/elasticsearch
# 后台启动: 
./bin/elasticsearch -d
# 推荐方式(不占用窗口,并且方便杀进程): 
## 启动:	
./bin/elasticsearch -d -p pid
## 关闭: 
kill `cat pid`	
## 查询进程号 指定用户名
ps -ef | grep -e '^elastic' | grep elasticsearch
  1. 启动成功,使用ip+端口号访问下,出现图上能容就表示启动成功

单机es服务就这样搭建好了

启动时容易遇到的错误

这里列出了一些启动时候可能遇到的问题,遇到相应情况了修改下配置即可

  1. 文件描述符

问题描述:引导检查报错:未开启内存锁

问题解释:Elasticsearch 使用了很多文件描述符或文件句柄。耗尽文件描述符可能是灾难性的,并且很可能会导致数据丢失。确保将运行 Elasticsearch 的用户的打开文件描述符数量限制增加到 65,536 或更高。

解决办法

#  root执行指令
vim /etc/security/limits.conf

# 文件最后添加
# * 表示所有用户, 
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
root soft nproc 65536
root hard nproc 65536
root soft nofile 65536
root hard nofile 65536

# 保存后重启
reboot
# 查看当前值
ulimit -Hn
  1. 虚拟内存

问题描述:引导检查报错 max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

问题解释:5.0版本以后ES使用mmapfs作为默认的文件系统存储类型。可以通过配置index.store.type来设置ES默认的文件系统存储类型。ES mmapfs默认使用一个目录来存储它的索引。操作系统对 mmap 计数的默认限制可能太低,这可能会导致内存不足异常.

解决办法

vim /etc/sysctl.conf
# 最后添加
vm.max_map_count=655360
 
# 保存后查看
sysctl -p
  1. 线程数

问题描述:max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]

问题解释:ES 使用多个线程池来进行不同类型的操作。重要的是它能够在需要时创建新线程。确保 Elasticsearch 用户可以创建的线程数至少为 4096。

解决办法

在启动es服务之前使用root账户执行
ulimit -u 4096

vim /etc/security/limits.conf
设置nproc为4096

vim /etc/security/limits.d/90-nproc.conf 
修改如下内容(注意星号):
* soft nproc 1024  =>  * soft nproc 4096
  1. 内存不足

问题描述:error='Cannot allocate memory'

问题解释:ES 5.x+堆内存大小默认配置为2G     ES 7.x+默认4G

解决办法

//JVM一般为物理内存一半
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"

或者

vim config/jvm.options

-Xms512m -Xmx512m

安装kibana

1、下载kibana版本包

保持kibana的版本和ES的一致,不然容易出问题,kibana7.13下载地址

2、上传至服务器

和前面ES的操作一样,这里我就不多介绍了

3、解压文件

4、启动前配置

vim config/kibana.yml


# 默认端口为5601
server.port: 5601
# 可有可无,至少我不配置也能启动
server.name: kibana2
elasticsearch.hosts: [ "http://122.112.155.85:9200"]

5、启动kibana

  1. 同样kibana也是不允许用root账号启动了,用刚才的elastic账号,并且将kibana安装目录的权限赋给他
chown  -R elastic:elastic kibana-7.13.0
  1. 开通5601端口
  2. 以elastic账户,启动kibana
./bin/kibana
  1. 测试,访问ip:5601,出现以下页面则部署成功

  1. 接下来就可以去devtool里面尽情发挥了

搭建ES集群

先按照安装的教程,操作至第四部,启动前配置,主要修改配置文件

1、修改节点1配置文件

vim config/elasticsearch.yml

# 集群名称
cluster.name: cluster1
# # 初始主节点
cluster.initial_master_nodes: ["node-1"]
# # 节点名
node.name: node-1
#http端口号,默认9200
http.port: 9201
## 集群间通讯端口号
transport.port: 9920
# 节点的角色,这里我们注释掉,默认拥有全部角色
# node.roles: [master,data,remote_cluster_client]
# 对方暴露的公网ip地址
network.publish_host: 124.221.73.149
# 内网地址,使用虚拟机的用这个配置
network.host: 10.0.4.3
discovery.seed_hosts: ['124.221.73.149','122.112.155.85']

2、修改节点2配置文件

vim config/elasticsearch.yml


# 集群名称
cluster.name: cluster1
# # # 初始主节点
cluster.initial_master_nodes: ["node-1"]
# # # 节点名
node.name: node-2
#http端口号,默认9200
http.port: 9200
# 集群间通讯端口号
transport.port: 9920
# # 节点的角色,这里我们注释掉,默认拥有全部角色
# # node.roles: [master,data,remote_cluster_client]
# # 对方暴露的公网ip地址
network.publish_host: 122.112.155.85
# # 内网地址,使用虚拟机的用这个配置
network.host: 192.168.0.24
discovery.seed_hosts: ['124.221.73.149','122.112.155.85']

3、分别启动两个节点

启动之后通过 _cat/nodes指令查看集群情况

http://122.112.155.85:9200/_cat/nodes

这时候显示图上的信息,就表示集群搭建好了,如果不指定这些信息代表什么意思,可以使用这个命令,表示使用VIP权限查看,就能看到对应的标题了,*的那个节点是主节点

http://122.112.155.85:9200/_cat/nodes?v

4、配置kibana

kibana的配置和上面的一样,修改下配置文件就好

vim config/kibana.yml


# 默认端口为5601
server.port: 5601
# 可有可无,至少我不配置也能启动
# server.name: kibana2
elasticsearch.hosts: [ "http://122.112.155.85:9200","http://http://124.221.73.149:9201"]

然后启动就好。


这样一个简单的ES单机服务,以及ES集群就搭建好了,后面再教大家怎么对ES集群进行权限配置