手把手教你搭建一个Elasticsearch集群

1、为什么要搭建 Elasticsearch 集群

凡事都要讲究个为何。在搭建集群以前,咱们首先先问一句,为何咱们须要搭建集群?它有什么优点呢?前端

(1)高可用性

Elasticsearch 做为一个搜索引擎,咱们对它的基本要求就是存储海量数据而且能够在很是短的时间内查询到咱们想要的信息。因此第一步咱们须要保证的就是 Elasticsearch 的高可用性,什么是高可用性呢?它一般是指,经过设计减小系统不能提供服务的时间。假设系统一直可以提供服务,咱们说系统的可用性是 100%。若是系统在某个时刻宕掉了,好比某个网站在某个时间挂掉了,那么就能够它临时是不可用的。因此,为了保证 Elasticsearch 的高可用性,咱们就应该尽可能减小 Elasticsearch 的不可用时间。java

那么怎样提升 Elasticsearch 的高可用性呢?这时集群的做用就体现出来了。假如 Elasticsearch 只放在一台服务器上,即单机运行,假如这台主机忽然断网了或者被攻击了,那么整个 Elasticsearch 的服务就不可用了。但若是改为 Elasticsearch 集群的话,有一台主机宕机了,还有其余的主机能够支撑,这样就仍然能够保证服务是可用的。node

那可能有的小伙伴就会说了,那假如一台主机宕机了,那么不就没法访问这台主机的数据了吗?那假如我要访问的数据正好存在这台主机上,那不就获取不到了吗?难道其余的主机里面也存了一份如出一辙的数据?那这岂不是很浪费吗?linux

为了解答这个问题,这里就引出了 Elasticsearch 的信息存储机制了。首先解答上面的问题,一台主机宕机了,这台主机里面存的数据依然是能够被访问到的,由于在其余的主机上也有备份,但备份的时候也不是整台主机备份,是分片备份的,那这里就又引出了一个概念——分片。git

分片,英文叫作 Shard,顾名思义,分片就是对数据切分红了多个部分。咱们知道 Elasticsearch 中一个索引(Index)至关因而一个数据库,如存某网站的用户信息,咱们就建一个名为 user 的索引。但索引存储的时候并非整个存一块儿的,它是被分片存储的,Elasticsearch 默认会把一个索引分红五个分片,固然这个数字是能够自定义的。分片是数据的容器,数据保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里,因此至关于一份数据被分红了多份并保存在不一样的主机上。github

那这仍是没解决问题啊,若是一台主机挂掉了,那么这个分片里面的数据不就没法访问了?别的主机都是存储的其余的分片。实际上是能够访问的,由于其余主机存储了这个分片的备份,叫作副本,这里就引出了另一个概念——副本。web

副本,英文叫作 Replica,一样顾名思义,副本就是对原分片的复制,和原分片的内容是同样的,Elasticsearch 默认会生成一份副本,因此至关因而五个原分片和五个分片副本,至关于一份数据存了两份,并分了十个分片,固然副本的数量也是能够自定义的。这时咱们只须要将某个分片的副本存在另一台主机上,这样当某台主机宕机了,咱们依然还能够从另一台主机的副本中找到对应的数据。因此从外部来看,数据结果是没有任何区别的。数据库

通常来讲,Elasticsearch 会尽可能把一个索引的不一样分片存储在不一样的主机上,分片的副本也尽量存在不一样的主机上,这样能够提升容错率,从而提升高可用性。npm

但这时假如你只有一台主机,那不就没办法了吗?分片和副本实际上是没意义的,一台主机挂掉了,就全挂掉了。vim

(2)健康状态

针对一个索引,Elasticsearch 中其实有专门的衡量索引健康情况的标志,分为三个等级:

  • green,绿色。这表明全部的主分片和副本分片都已分配。你的集群是 100% 可用的。

  • yellow,黄色。全部的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,因此搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。若是更多的分片消失,你就会丢数据了。因此可把 yellow 想象成一个须要及时调查的警告。

  • red,红色。至少一个主分片以及它的所有副本都在缺失中。这意味着你在缺乏数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

若是你只有一台主机的话,其实索引的健康情况也是 yellow,由于一台主机,集群没有其余的主机能够防止副本,因此说,这就是一个不健康的状态,所以集群也是十分有必要的。

(3)存储空间

另外,既然是群集,那么存储空间确定也是联合起来的,假如一台主机的存储空间是固定的,那么集群它相对于单个主机也有更多的存储空间,可存储的数据量也更大。

因此综上所述,咱们须要一个集群!

2、详细了解 Elasticsearch 集群

接下来咱们再来了解下集群的结构是怎样的。

首先咱们应该清楚多台主机构成了一个集群,每台主机称做一个节点(Node)。

如图就是一个三节点的集群:

在图中,每一个 Node 都有三个分片,其中 P 开头的表明 Primary 分片,即主分片,R 开头的表明 Replica 分片,即副本分片。因此图中主分片 一、2,副本分片 0 储存在 1 号节点,副本分片 0、一、2 储存在 2 号节点,主分片 0 和副本分片 一、2 储存在 3 号节点,一共是 3 个主分片和 6 个副本分片。同时咱们还注意到 1 号节点还有个 MASTER 的标识,这表明它是一个主节点,它相比其余的节点更加特殊,它有权限控制整个集群,好比资源的分配、节点的修改等等。

这里就引出了一个概念就是节点的类型,咱们能够将节点分为这么四个类型:

  • 主节点:即 Master 节点。主节点的主要职责是和集群操做相关的内容,如建立或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是很是重要的。默认状况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操做会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也能够协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽量作尽可能少的工做。

  • 数据节点:即 Data 节点。数据节点主要是存储索引数据的节点,主要对文档进行增删改查操做,聚合操做等。数据节点对 CPU、内存、IO 要求较高,在优化的时候须要监控数据节点的状态,当资源不够的时候,须要在集群中添加新的节点。

  • 负载均衡节点:也称做 Client 节点,也称做客户端节点。当一个节点既不配置为主节点,也不配置为数据节点时,该节点只能处理路由请求,处理搜索,分发索引操做等,从本质上来讲该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是很是有用的,他协调主节点和数据节点,客户端节点加入集群能够获得集群的状态,根据集群的状态能够直接路由请求。

  • 预处理节点:也称做 Ingest 节点,在索引数据以前能够先对数据作预处理操做,全部节点其实默认都是支持 Ingest 操做的,也能够专门将某个节点配置为 Ingest 节点。

以上就是节点几种类型,一个节点其实能够对应不一样的类型,如一个节点能够同时成为主节点和数据节点和预处理节点,但若是一个节点既不是主节点也不是数据节点,那么它就是负载均衡节点。具体的类型能够经过具体的配置文件来设置。

 

3、怎样搭建 Elasticsearch 6.5.4集群

1-一、准备环境

采用三台CentOS6.5部署Elasticsearch集群,部署Elasticsearch集群就不得不提索引分片,如下是索引分片的简单介绍。

系统  节点名称 IP地址
      centos 6.5        els-node1       192.168.60.201     
      centos 6.5     els-node2      192.168.60.202
      centos 6.5     els-node3      192.168.60.203

 

 

 

 

ES集群中索引可能由多个分片构成,而且每一个分片能够拥有多个副本。经过将一个单独的索引分为多个分片,咱们能够处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,致使效率问题。不能运行的缘由多是内存也多是存储。因为每一个分片能够有多个副本,经过将副本分配到多个服务器,能够提升查询的负载能力。

因为 Elasticsearch 6.5.4要求linux 内核版本要高于3.5+,因此咱们先要将系统内核升级至3.5+,详细请移步

CentOS6.5升级内核至4.4

1-二、Elasticsearch集群搭建

1.安装JDK

Elasticsearch是基于Java开发是一个Java程序,运行在Jvm中,因此第一步要安装JDK

yum install -y java-1.8.0-openjdk-devel  # 安装1.8或1.8以上版本

2.下载elasticsearch

https://www.elastic.co/cn/downloads/elasticsearch,是ELasticsearch的官方站点,若是须要下载最新的版本,进入官网下载便可。能够下载到本地电脑而后再导入CentOS中,也能够直接在CentOS中下载。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.rpm

3.安装elasticsearch

rpm -ivh elasticsearch-6.5.4.rpm

4.配置目录

安装完毕后会生成不少文件,包括配置文件日志文件等等,下面几个是最主要的配置文件路径

/etc/elasticsearch/elasticsearch.yml                            # els的配置文件
/etc/elasticsearch/jvm.options                                  # JVM相关的配置,内存大小等等
/etc/elasticsearch/log4j2.properties                            # 日志系统定义

/usr/share/elasticsearch                                        # elasticsearch 默认安装目录
/var/lib/elasticsearch                                          # 数据的默认存放位置

5.建立用于存放数据与日志的目录

数据文件会随着系统的运行飞速增加,因此默认的日志文件与数据文件的路径不能知足咱们的需求,那么手动建立日志与数据文件路径,可使用NFS、可使用Raid等等方便之后的管理与扩展

mkdir -p /opt/elasticsearch/data
mkdir -p /opt/elasticsearch/log
chown -R elasticsearch.elasticsearch /opt/elasticsearch/*

6.集群配置

集群配置中最重要的两项是node.namenetwork.host,每一个节点都必须不一样。其中node.name是节点名称主要是在Elasticsearch本身的日志加以区分每个节点信息。
discovery.zen.ping.unicast.hosts是集群中的节点信息,可使用IP地址、可使用主机名(必须能够解析)。

vim /etc/elasticsearch/elasticsearch.yml

cluster.name: my-els                               # 集群名称
node.name: els-node1                               # 节点名称,仅仅是描述名称,用于在日志中区分

path.data: /opt/elasticsearch/data                 # 数据的默认存放路径
path.logs: /opt/elasticsearch/log                  # 日志的默认存放路径

network.host: 192.168.60.201                        # 当前节点的IP地址
http.port: 9200                                    # 对外提供服务的端口,9300为集群服务的端口
#添加以下内容
#culster transport port
transport.tcp.port: 9300
transport.tcp.compress: true

discovery.zen.ping.unicast.hosts: ["192.168.60.201", "192.168.60.202","192.168.60.203"]       
# 集群个节点IP地址,也可使用els、els.shuaiguoxia.com等名称,须要各节点可以解析

discovery.zen.minimum_master_nodes: 2              # 为了不脑裂,集群节点数最少为 半数+1

注意:不要在elasticsearch.yml中添加index开头的配置项。如

#index.number_of_shards: 5
#index.number_of_replicas: 1

7.JVM配置 

因为Elasticsearch是Java开发的,因此能够经过/etc/elasticsearch/jvm.options配置文件来设定JVM的相关设定。若是没有特殊需求按默认便可。
不过其中仍是有两项最重要的-Xmx1g-Xms1gJVM的最大最小内存。若是过小会致使Elasticsearch刚刚启动就马上中止。太大会拖慢系统自己。

vim /etc/elasticsearch/jvm.options

-Xms1g                                                  # JVM最大、最小使用内存
-Xmx1g

8.使用ROOT帐户执行如下命令

elasticsearch的相关配置已经完成,下面须要启动elasticsearch集群。可是因为安全的考虑,elasticsearch不容许使用root用户来启动,因此须要建立一个新的用户,并为这个帐户赋予相应的权限来启动elasticsearch集群。

建立ES运行用户

# 建立用户组
groupadd es
# 建立用户并添加至用户组
useradd es -g es 
# 更改用户密码(输入 123123)
passwd es

修改ES目录权限

chown -R es:es  /etc/share/elasticsearch/
chown -R es:es  /usr/share/elasticsearch/
chown -R es:es  /var/log/elasticsearch/      # 以上操做都是为了赋予es用户操做权限

启动服务

# 需切换为es用户
su es
# 启动服务(当前的路径为:/usr/share/elasticsearch/)
./bin/elasticsearch

后台运行ES

能够加入-p 命令 让es在后台运行, -p 参数 记录进程ID为一个文件

# 设置后台启动
./bin/elasticsearch -p /tmp/elasticsearch-pid -d

结束进程

# 查看运行的pid
cat /tmp/elasticsearch-pid && echo
# 结束进程
kill -SIGTERM {pid}

验证一下服务是否正常

curl -i "http://192.168.60.200:9200"

 

2、安装head插件

Elasticsearch Head Plugin:head插件是一个ES集群的web前端工具,它提供可视化的页面方便用户查看节点信息,对ES进行各类操做,如查询、删除、浏览索引等。

一、安装相关依赖包

(1)安装head

因为head插件本质上仍是一个nodejs的工程,所以须要安装node,使用npm来安装依赖的包。(npm能够理解为maven)

wget https://nodejs.org/dist/v9.3.0/node-v9.3.0-linux-x64.tar.xz  # 下载nodejs最新的bin包
xz -d node-v9.3.0-linux-x64.tar.xz  # 解压包
tar -xf node-v9.3.0-linux-x64.tar  # 解压包
ln -s ~/node-v9.3.0-linux-x64/bin/node /usr/bin/node # 部署bin文件,先肯定nodejs的bin路径
ln -s ~/node-v9.3.0-linux-x64/bin/npm /usr/bin/npm

测试:

node -v npm

npm加速 全局安装cnpm 指定来源淘宝镜像

npm install -g cnpm --registry=https://registry.npm.taobao.org

(2)安装grunt(安装完elasticsearch-head后安装)

grunt是一个很方便的构建工具,能够进行打包压缩、测试、执行等等的工做,5.0里的head插件就是经过grunt启动的。所以须要安装一下grunt:

cd  /usr/local/elasticsearch-head
npm install -g grunt-cli  //执行后会生成node_modules文件夹
npm install

注:

(1)5.0以上,elasticsearch-head 不能放在elasticsearch的 pluginsmodules 目录下,不然elasticsearch启动会报错。

(2)这里若是grunt没有安装成功也无所谓,能够经过其余方式启动elasticsearch-head插件(npm run start)。

 

二、安装elasticsearch-head

另外:5.0之前的版本能够经过elasticseach自带的plugin命令 安装elasticsearch-head,5.0之后不支持了。只能够去下载elasticsearch-head对应的源码包去安装。

cd /usr/local/
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install

配置:

vi _site/app.js

# 修改 this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";   # 在文件的4354行附近
# 这里的 localhost 是指进入elasticsearch-head页面时默认访问的ES集群地址,把她修改成其中一台ES节点的地址便可
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.60.200:9200";

还要修改Head主目录下的Gruntfile.js,因为默认文件中是没有hostname属性的,咱们须要手动添加:

 

为何须要修改配置文件: head插件链接elasticsearch须要注意的点: 由于head插件是一个独立进程,启动后是一个独立的服务器外加端口,好比个人虚拟机ip地址:http://192.168.0.111:9100/ 而elasticsearch启动后也是一个独立的进程,ip地址:http://192.168.0.111:9200/ 这样两个独立进程,虽然服务器ip地址相同,可是端口不一样,此时会发生跨域的状况。。 因而官方给出这样一段话,咱们在对elasticsearch启动的时候追加两个配置文件属性便可防止跨域。

即:在elasticsearch.yml文件的最后,添加以下内容:

http.cors.enabled: true http.cors.allow-origin: "*"

配置完毕。

三、启动elasticsearch集群

在三台机器上,分别启动elasticsearch便可。

./bin/elasticsearch

四、启动elasticsearch-head

cd /usr/local/elasticsearch-head //先跳转到head目录下 grunt server //若想在后台运行,结尾追加“&”,也可使用 npm run start启动

五、访问elasticsearch-head界面

http://192.168.60.200:9100

能够看到,三台机器组成了es集群。集群的状态为绿色,健康状态。带星标的节点els-node1为主节点(选举)。还能够作一些增长/删除索引,查询等操做。

下面还有ik分词器的安装,未完待续。。。

 

参考文档:

https://mp.weixin.qq.com/s/eyfApIiDeg3qv-BD9hBNvw

https://my.oschina.net/u/2403594/blog/2992908

https://my.oschina.net/linch/blog/1816712

相关文章
相关标签/搜索