手把手教你搭建一个Elasticsearch集群
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⼿把⼿教你搭建⼀个Elasticsearch集群
⼀、为何要搭建 Elasticsearch 集群
凡事都要讲究个为什么。
在搭建集群之前,我们⾸先先问⼀句,为什么我们需要搭建集群?它有什么优势呢?
(1)⾼可⽤性
Elasticsearch 作为⼀个搜索引擎,我们对它的基本要求就是存储海量数据并且可以在⾮常短的时间内查询到我们想要的信息。
所以第⼀步我们需要保证的就是 Elasticsearch 的⾼可⽤性,什么是⾼可⽤性呢?它通常是指,通过设计减少系统不能提供服务的时间。
假设系统⼀直能够提供服务,我们说系统的可⽤性是 100%。
如果系统在某个时刻宕掉了,⽐如某个⽹站在某个时间挂掉了,那么就可以它临时是不可⽤的。
所以,为了保证Elasticsearch 的⾼可⽤性,我们就应该尽量减少 Elasticsearch 的不可⽤时间。
那么怎样提⾼ Elasticsearch 的⾼可⽤性呢?这时集群的作⽤就体现出来了。
假如 Elasticsearch 只放在⼀台服务器上,即单机运⾏,假如这台主机突然断⽹了或者被攻击了,那么整个 Elasticsearch 的服务就不可⽤了。
但如果改成 Elasticsearch 集群的话,有⼀台主机宕机了,还有其他的主机可以⽀撑,这样就仍然可以保证服务是可⽤的。
那可能有的⼩伙伴就会说了,那假如⼀台主机宕机了,那么不就⽆法访问这台主机的数据了吗?那假如我要访问的数据正好存在这台主机上,那不就获取不到了吗?难道其他的主机⾥⾯也存了⼀份⼀模⼀样的数据?那这岂不是很浪费吗?
为了解答这个问题,这⾥就引出了 Elasticsearch 的信息存储机制了。
⾸先解答上⾯的问题,⼀台主机宕机了,这台主机⾥⾯存的数据依然是可以被访问到的,因为在其他的主机上也有备份,但备份的时候也不是整台主机备份,是分⽚备份的,那这⾥就⼜引出了⼀个概念——分⽚。
分⽚,英⽂叫做 Shard,顾名思义,分⽚就是对数据切分成了多个部分。
我们知道 Elasticsearch 中⼀个索引(Index)相当于是⼀个数据库,如存某⽹站的⽤户信息,我们就建⼀个名为 user 的索引。
但索引存储的时候并不是整个存⼀起的,它是被分⽚存储的,Elasticsearch 默认会把⼀个索引分成五个分⽚,当然这个数字是可以⾃定义的。
分⽚是数据的容器,数据保存在分⽚内,分⽚⼜被分配到集群内的各个节点⾥。
当你的集群规模扩⼤或者缩⼩时, Elasticsearch 会⾃动的在各节点中迁移分⽚,使得数据仍然均匀分布在集群⾥,所以相当于⼀份数据被分成了多份并保存在不同的主机上。
那这还是没解决问题啊,如果⼀台主机挂掉了,那么这个分⽚⾥⾯的数据不就⽆法访问了?别的主机都是存储的其他的分⽚。
其实是可以访问的,因为其他主机存储了这个分⽚的备份,叫做副本,这⾥就引出了另外⼀个概念——副本。
副本,英⽂叫做 Replica,同样顾名思义,副本就是对原分⽚的复制,和原分⽚的内容是⼀样的,Elasticsearch 默认会⽣成⼀份副本,所以相当于是五个原分⽚和五个分⽚副本,相当于⼀份数据存了两份,并分了⼗个分⽚,当然副本的数量也是可以⾃定义的。
这时我们只需要将某个分⽚的副本存在另外⼀台主机上,这样当某台主机宕机了,我们依然还可以从另外⼀台主机的副本中找到对应的数据。
所以从外部来看,数据结果是没有任何区别的。
⼀般来说,Elasticsearch 会尽量把⼀个索引的不同分⽚存储在不同的主机上,分⽚的副本也尽可能存在不同的主机上,这样可以提⾼容错率,从⽽提⾼⾼可⽤性。
但这时假如你只有⼀台主机,那不就没办法了吗?分⽚和副本其实是没意义的,⼀台主机挂掉了,就全挂掉了。
(2)健康状态
针对⼀个索引,Elasticsearch 中其实有专门的衡量索引健康状况的标志,分为三个等级:
green,绿⾊。
这代表所有的主分⽚和副本分⽚都已分配。
你的集群是 100% 可⽤的。
yellow,黄⾊。
所有的主分⽚已经分⽚了,但⾄少还有⼀个副本是缺失的。
不会有数据丢失,所以搜索结果依然是完整的。
不过,你的⾼可⽤性在某种程度上被弱化。
如果更多的分⽚消失,你就会丢数据了。
所以可把 yellow 想象成⼀个需要及时调查的警告。
red,红⾊。
⾄少⼀个主分⽚以及它的全部副本都在缺失中。
这意味着你在缺少数据:搜索只能返回部分数据,⽽分配到这个分⽚上的写⼊请求会返回⼀个异常。
如果你只有⼀台主机的话,其实索引的健康状况也是 yellow,因为⼀台主机,集群没有其他的主机可以防⽌副本,所以说,这就是⼀个不健康的状态,因此集群也是⼗分有必要的。
(3)存储空间
另外,既然是群集,那么存储空间肯定也是联合起来的,假如⼀台主机的存储空间是固定的,那么集群它相对于单个主机也有更多的存储空间,可存储的数据量也更⼤。
所以综上所述,我们需要⼀个集群!
⼆、详细了解 Elasticsearch 集群
接下来我们再来了解下集群的结构是怎样的。
⾸先我们应该清楚多台主机构成了⼀个集群,每台主机称作⼀个节点(Node)。
如图就是⼀个三节点的集群:
系统 节点名
称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
在图中,每个 Node 都有三个分⽚,其中 P 开头的代表 Primary 分⽚,即主分⽚,R 开头的代表 Replica 分⽚,即副本分⽚。
所以图中主分⽚ 1、2,副本分⽚ 0 储存在 1 号节点,副本分⽚ 0、1、2 储存在 2 号节点,主分⽚ 0 和副本分⽚ 1、2 储存在 3 号节点,⼀共是 3 个主分⽚和 6 个副本分⽚。
同时我们还注意到 1 号节点还有个 MASTER 的标识,这代表它是⼀个主节点,它相⽐其他的节点更加特殊,它有权限控制整个集群,⽐如资源的分配、节点的修改等等。
这⾥就引出了⼀个概念就是节点的类型,我们可以将节点分为这么四个类型:
主节点:即 Master 节点。
主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的⼀部分,并决定哪些分⽚分配给相关的节点。
稳定的主节点对集群的健康是⾮常重要的。
默认情况下任何⼀个集群中的节点都有可能被选为主节点。
索引数据和搜索查询等操作会占⽤⼤量的cpu ,内存,io 资源,为了确保⼀个集群的稳定,分离主节点和数据节点是⼀个⽐较好的选择。
虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使⽤这些专⽤的主节点。
⼀个重要的原则是,尽可能做尽量少的⼯作。
数据节点:即 Data 节点。
数据节点主要是存储索引数据的节点,主要对⽂档进⾏增删改查操作,聚合操作等。
数据节点对 CPU 、内存、IO 要求较⾼,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
负载均衡节点:也称作 Client 节点,也称作客户端节点。
当⼀个节点既不配置为主节点,也不配置为数据节点时,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。
独⽴的客户端节点在⼀个⽐较⼤的集群中是⾮常有⽤的,他协调主节点和数据节点,客户端节点加⼊集群可以得到集群的状态,根据集群的状态可以直接路由请求。
预处理节点:也称作 Ingest 节点,在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是⽀持 Ingest 操作的,也可以专门将某个节点配置为 Ingest 节点。
以上就是节点⼏种类型,⼀个节点其实可以对应不同的类型,如⼀个节点可以同时成为主节点和数据节点和预处理节点,但如果⼀个节点既不是主节点也不是数据节点,那么它就是负载均衡节点。
具体的类型可以通过具体的配置⽂件来设置。
三、怎样搭建 Elasticsearch 6.5.4集群
1-1、准备环境
采⽤三台CentOS6.5部署Elasticsearch 集群,部署Elasticsearch 集群就不得不提索引分⽚,以下是索引分⽚的简单介绍。
ES 集群中索引可能由多个分⽚构成,并且每个分⽚可以拥有多个副本。
通过将⼀个单独的索引分为多个分⽚,我们可以处理不能在⼀个单⼀的服务器上⾯运⾏的⼤型索引,简单的说就是索引的⼤⼩过⼤,导致效率问题。
不能运⾏的原因可能是内存也可能是存储。
由于每个分⽚可以有多个副本,通过将副本分配到多个服务器,可以提⾼查询的负载能⼒。
由于 Elasticsearch 6.5.4要求linux 内核版本要⾼于3.5+,所以我们先要将系统内核升级⾄
3.5+,详细请移步
1-2、Elasticsearch 集群搭建
1.安装JDK
Elasticsearch 是基于Java 开发是⼀个Java 程序,运⾏在Jvm 中,所以第⼀步要安装JDK
yum install -y java-1.8.0-openjdk-devel # 安装1.8或1.8以上版本2.下载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.集群配置
集群配置中最重要的两项是与network.host,每个节点都必须不同。
其中是节点名称主要是在Elasticsearch⾃⼰的⽇志加以区分每⼀个节点信息。
discovery.zen.ping.unicast.hosts是集群中的节点信息,可以使⽤IP地址、可以使⽤主机名(必须可以解析)。
vim /etc/elasticsearch/elasticsearch.yml
: my-els # 集群名称
: 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
press: true
discovery.zen.ping.unicast.hosts: ["192.168.60.201", "192.168.60.202","192.168.60.203"]
# 集群个节点IP地址,也可以使⽤els、等名称,需要各节点能够解析
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与-Xms1g JVM的最⼤最⼩内存。
如果太⼩会导致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"
⼆、安装head插件
Elasticsearch Head Plugin:head插件是⼀个ES集群的web前端⼯具,它提供可视化的页⾯⽅便⽤户查看节点信息,对ES进⾏各种操作,如查询、删除、浏览索引等。
1、安装相关依赖包
(1)安装head
由于head插件本质上还是⼀个nodejs的⼯程,因此需要安装node,使⽤来安装依赖的包。
(npm可以理解为maven)
wget https:///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=
(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的plugins、modules⽬录下,否则elasticsearch启动会报错。
(2)这⾥如果grunt没有安装成功也⽆所谓,可以通过其他⽅式启动elasticsearch-head插件(npm run start)。
2、安装elasticsearch-head
另外:5.0以前的版本可以通过elasticseach⾃带的命令安装elasticsearch-head,5.0以后不⽀持了。
只可以去下载elasticsearch-head对应的源码包去安装。
cd /usr/local/
git clone git:///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: "*"
配置完毕。
3、启动elasticsearch集群
在三台机器上,分别启动elasticsearch即可。
./bin/elasticsearch
4、启动elasticsearch-head
cd /usr/local/elasticsearch-head //先跳转到head⽬录下
grunt server //若想在后台运⾏,结尾追加“&”,也可以使⽤ npm run start启动
5、访问elasticsearch-head界⾯
http://192.168.60.200:9100
可以看到,三台机器组成了es集群。
集群的状态为绿⾊,健康状态。
带星标的节点els-node1为主节点(选举)。
还可以做⼀些增加/删除索引,查询等操作。
下⾯还有ik分词器的安装,未完待续。
参考⽂档:
https:///s/eyfApIiDeg3qv-BD9hBNvw https:///u/2403594/blog/2992908 https:///linch/blog/1816712。