凡事都要讲究个为何。在搭建集群以前,咱们首先先问一句,为何咱们须要搭建集群?它有什么优点呢?html
Elasticsearch 做为一个搜索引擎,咱们对它的基本要求就是存储海量数据而且能够在很是短的时间内查询到咱们想要的信息。因此第一步咱们须要保证的就是 Elasticsearch 的高可用性,什么是高可用性呢?它一般是指,经过设计减小系统不能提供服务的时间。假设系统一直可以提供服务,咱们说系统的可用性是 100%。若是系统在某个时刻宕掉了,好比某个网站在某个时间挂掉了,那么就能够它临时是不可用的。因此,为了保证 Elasticsearch 的高可用性,咱们就应该尽可能减小 Elasticsearch 的不可用时间。java
那么怎样提升 Elasticsearch 的高可用性呢?这时集群的做用就体现出来了。假如 Elasticsearch 只放在一台服务器上,即单机运行,假如这台主机忽然断网了或者被攻击了,那么整个 Elasticsearch 的服务就不可用了。但若是改为 Elasticsearch 集群的话,有一台主机宕机了,还有其余的主机能够支撑,这样就仍然能够保证服务是可用的。node
那可能有的小伙伴就会说了,那假如一台主机宕机了,那么不就没法访问这台主机的数据了吗?那假如我要访问的数据正好存在这台主机上,那不就获取不到了吗?难道其余的主机里面也存了一份如出一辙的数据?那这岂不是很浪费吗?git
为了解答这个问题,这里就引出了 Elasticsearch 的信息存储机制了。首先解答上面的问题,一台主机宕机了,这台主机里面存的数据依然是能够被访问到的,由于在其余的主机上也有备份,但备份的时候也不是整台主机备份,是分片备份的,那这里就又引出了一个概念——分片。github
分片,英文叫作 Shard,顾名思义,分片就是对数据切分红了多个部分。咱们知道 Elasticsearch 中一个索引(Index)至关因而一个数据库,如存某网站的用户信息,咱们就建一个名为 user 的索引。但索引存储的时候并非整个存一块儿的,它是被分片存储的,Elasticsearch 默认会把一个索引分红五个分片,固然这个数字是能够自定义的。分片是数据的容器,数据保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里,因此至关于一份数据被分红了多份并保存在不一样的主机上。数据库
那这仍是没解决问题啊,若是一台主机挂掉了,那么这个分片里面的数据不就没法访问了?别的主机都是存储的其余的分片。实际上是能够访问的,由于其余主机存储了这个分片的备份,叫作副本,这里就引出了另一个概念——副本。bootstrap
副本,英文叫作 Replica,一样顾名思义,副本就是对原分片的复制,和原分片的内容是同样的,Elasticsearch 默认会生成一份副本,因此至关因而五个原分片和五个分片副本,至关于一份数据存了两份,并分了十个分片,固然副本的数量也是能够自定义的。这时咱们只须要将某个分片的副本存在另一台主机上,这样当某台主机宕机了,咱们依然还能够从另一台主机的副本中找到对应的数据。因此从外部来看,数据结果是没有任何区别的。ubuntu
通常来讲,Elasticsearch 会尽可能把一个索引的不一样分片存储在不一样的主机上,分片的副本也尽量存在不一样的主机上,这样能够提升容错率,从而提升高可用性。segmentfault
但这时假如你只有一台主机,那不就没办法了吗?分片和副本实际上是没意义的,一台主机挂掉了,就全挂掉了。浏览器
针对一个索引,Elasticsearch 中其实有专门的衡量索引健康情况的标志,分为三个等级:
green,绿色。这表明全部的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow,黄色。全部的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,因此搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。若是更多的分片消失,你就会丢数据了。因此可把 yellow 想象成一个须要及时调查的警告。
red,红色。至少一个主分片以及它的所有副本都在缺失中。这意味着你在缺乏数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
若是你只有一台主机的话,其实索引的健康情况也是 yellow,由于一台主机,集群没有其余的主机能够防止副本,因此说,这就是一个不健康的状态,所以集群也是十分有必要的。
另外,既然是群集,那么存储空间确定也是联合起来的,假如一台主机的存储空间是固定的,那么集群它相对于单个主机也有更多的存储空间,可存储的数据量也更大。
因此综上所述,咱们须要一个集群!
接下来咱们再来了解下集群的结构是怎样的。
首先咱们应该清楚多台主机构成了一个集群,每台主机称做一个节点(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 节点。
以上就是节点几种类型,一个节点其实能够对应不一样的类型,如一个节点能够同时成为主节点和数据节点和预处理节点,但若是一个节点既不是主节点也不是数据节点,那么它就是负载均衡节点。具体的类型能够经过具体的配置文件来设置。
好,接下来咱们就来动手搭建一个集群吧。
这里我一共拥有七台 Linux 主机,系统是 Ubuntu 16.04,都链接在一个内网中,IP 地址为:
10.0.0.4
10.0.0.5
10.0.0.6
10.0.0.7
10.0.0.8
10.0.0.9
10.0.0.10
复制代码
每台主机的存储空间是 1TB,内存是 13GB。
下面咱们来一步步介绍如何用这几台主机搭建一个 Elasticsearch 集群,这里使用的 Elasticsearch 版本是 6.3.2,另外咱们还须要安装 Kibana 用来可视化监控和管理 Elasticsearch 的相关配置和数据,使得集群的管理更加方便。
环境配置以下所示:
名称 | 内容 |
---|---|
主机台数 | 7 |
主机内存 | 13GB |
主机系统 | Ubuntu 16.04 |
存储空间 | 1TB |
Elasticsearch 版本 | 6.3.2 |
Java 版本 | 1.8 |
Kibana 版本 | 6.3.2 |
Elasticsearch 是基于 Lucene 的,而 Lucene 又是基于 Java 的。因此第一步咱们就须要在每台主机上安装 Java。
首先更新 Apt 源:
sudo apt-get update
复制代码
而后安装 Java:
sudo apt-get install default-jre
复制代码
安装好了以后能够检查下 Java 的版本:
java -version
复制代码
这里的版本是 1.8,相似输出以下:
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
复制代码
若是看到上面的内容就说明安装成功了。
注意必定要每台主机都要安装。
接下来咱们来安装 Elasticsearch,一样是每台主机都须要安装。
首先须要添加 Apt-Key:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
复制代码
而后添加 Elasticsearch 的 Repository 定义:
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
复制代码
接下来安装 Elasticsearch 便可:
sudo apt-get update
sudo apt-get install elasticsearch
复制代码
运行完毕以后咱们就完成了 Elasticsearch 的安装,注意仍是要每台主机都要安装。
这时咱们只是每台主机都安装好了 Elasticsearch,接下来咱们还须要将它们联系在一块儿构成一个集群。
安装完以后,Elasticsearch 的配置文件是 /etc/elasticsearch/elasticsearch.yml,接下来让咱们编辑一下配置文件:
集群的名称
经过 cluster.name
能够配置集群的名称,集群是一个总体,所以名称都要一致,全部主机都配置成相同的名称,配置示例:
cluster.name: germey-es-clusters
复制代码
节点的名称
经过 node.name
能够配置每一个节点的名称,每一个节点都是集群的一部分,每一个节点名称都不要相同,能够按照顺序编号,配置示例:
node.name: es-node-1
复制代码
其余的主机能够配置为 es-node-2
、es-node-3
等。
是否有资格成为主节点
经过 node.master
能够配置该节点是否有资格成为主节点,若是配置为 true,则主机有资格成为主节点,配置为 false 则主机就不会成为主节点,能够去当数据节点或负载均衡节点。注意这里是有资格成为主节点,不是必定会成为主节点,主节点须要集群通过选举产生。这里我配置全部主机均可以成为主节点,所以都配置为 true,配置示例:
node.master: true
复制代码
是不是数据节点
经过 node.data
能够配置该节点是否为数据节点,若是配置为 true,则主机就会做为数据节点,注意主节点也能够做为数据节点,当 node.master
和 node.data
均为 false,则该主机会做为负载均衡节点。这里我配置全部主机都是数据节点,所以都配置为 true,配置示例:
node.data: true
复制代码
数据和日志路径
经过 path.data
和 path.logs
能够配置 Elasticsearch 的数据存储路径和日志存储路径,能够指定任意位置,这里我指定存储到 1T 硬盘对应的路径下,另外注意一下写入权限问题,配置示例:
path.data: /datadrive/elasticsearch/data
path.logs: /datadrive/elasticsearch/logs
复制代码
设置访问的地址和端口
咱们须要设定 Elasticsearch 运行绑定的 Host,默认是没法公开访问的,若是设置为主机的公网 IP 或 0.0.0.0
就是能够公开访问的,这里咱们能够都设置为公开访问或者部分主机公开访问,若是是公开访问就配置为:
network.host: 0.0.0.0
复制代码
若是不想被公开访问就不用配置。
另外还能够配置访问的端口,默认是 9200:
http.port: 9200
复制代码
集群地址设置
经过 discovery.zen.ping.unicast.hosts
能够配置集群的主机地址,配置以后集群的主机之间能够自动发现,这里我配置的是内网地址,配置示例:
discovery.zen.ping.unicast.hosts: ["10.0.0.4", "10.0.0.5", "10.0.0.6", "10.0.0.7", "10.0.0.8", "10.0.0.9", "10.0.0.10"]
复制代码
这里请改为你的主机对应的 IP 地址。
节点数目相关配置
为了防止集群发生“脑裂”,即一个集群分裂成多个,一般须要配置集群最少主节点数目,一般为 (可成为主节点的主机数目 / 2) + 1,例如我这边能够成为主节点的主机数目为 7,那么结果就是 4,配置示例:
discovery.zen.minimum_master_nodes: 4
复制代码
另外还能够配置当最少几个节点回复以后,集群就正常工做,这里我设置为 4,能够酌情修改,配置示例:
gateway.recover_after_nodes: 4
复制代码
其余的暂时先不须要配置,保存便可。注意每台主机都须要配置。
配置完成以后就能够在每台主机上分别启动 Elasticsearch 服务了,命令以下:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
复制代码
全部主机都启动以后,咱们在任意主机上就能够查看到集群状态了,命令行以下:
curl -XGET 'http://localhost:9200/_cluster/state?pretty'
复制代码
相似的输出以下:
{
"cluster_name": "germey-es-clusters",
"compressed_size_in_bytes": 20799,
"version": 658,
"state_uuid": "a64wCwPnSueKRtVuKx8xRw",
"master_node": "73BQvOC2TpSXcr-IXBcDdg",
"blocks": {},
"nodes": {
"I2M80AP-T7yVP_AZPA0bpA": {
"name": "es-node-1",
"ephemeral_id": "KpCG4jNvTUGKNHNwKKoMrA",
"transport_address": "10.0.0.4:9300",
"attributes": {
"ml.machine_memory": "7308464128",
"ml.max_open_jobs": "20",
"xpack.installed": "true",
"ml.enabled": "true"
}
},
"73BQvOC2TpSXcr-IXBcDdg": {
"name": "es-node-7",
"ephemeral_id": "Fs9v2XTASnGbqrM8g7IhAQ",
"transport_address": "10.0.0.10:9300",
"attributes": {
"ml.machine_memory": "14695202816",
"ml.max_open_jobs": "20",
"xpack.installed": "true",
"ml.enabled": "true"
}
},
....
复制代码
能够看到这里输出了集群的相关信息,同时 nodes 字段里面包含了每一个节点的详细信息,这样一个基本的集群就构建完成了。
接下来咱们须要安装一个 Kibana 来帮助可视化管理 Elasticsearch,依然仍是经过 Apt 安装,只须要任意一台主机安装便可,由于集群是一体的,因此 Kibana 在任意一台主机只要能链接到 Elasticsearch 便可,安装命令以下:
sudo apt-get install kibana
复制代码
安装以后修改 /etc/kibana/kibana.yml,设置公开访问和绑定的端口:
server.port: 5601
server.host: "0.0.0.0"
复制代码
而后启动服务:
sudo systemctl daemon-reload
sudo systemctl enable kibana.service
sudo systemctl start kibana.service
复制代码
这样咱们能够在浏览器输入该台主机的 IP 加端口,查看 Kibana 管理页面了,相似以下:
这样 Kibana 可视化管理就配置成功了。
如今集群已经初步搭建完成了,可是如今集群很危险,若是咱们配置了可公网访问,那么它是能够被任何人操做的,好比储存数据,增删节点等,这是很是危险的,因此咱们必需要设置访问权限。
在 Elasticsearch 中,配置认证是经过 X-Pack 插件实现的,幸运的是,咱们不须要额外安装了,在 Elasticsearch 6.3.2 版本中,该插件是默认集成到 Elasticsearch 中的,因此咱们只须要更改一部分设置就能够了。
首先咱们须要升级 License,只有修改了高级版 License 才能使用 X-Pack 的权限认证功能。
在 Kibana 中访问 Management -> Elasticsearch -> License Management,点击右侧的升级 License 按钮,能够免费试用 30 天的高级 License,升级完成以后页面会显示以下:
另外还可使用 API 来更新 License,详情能够参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/update-license.html。
而后每台主机须要修改 /etc/elasticsearch/elasticsearch.yml 文件,开启 Auth 认证功能:
xpack.security.enabled: true
复制代码
随后设置 elastic、kibana、logstash_system 三个用户的密码,任意一台主机修改以后,一台修改,多台生效,命令以下:
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
复制代码
运行以后会依次提示设置这三个用户的密码并确认,一共须要输入六次密码,完成以后就成功设置好了密码了。
修改完成以后重启 Elasticsearch 和 Kibana 服务:
sudo systemctl restart elasticsearch.service
sudo systemctl restart kibana.service
复制代码
这时再访问 Kibana 就会跳转到登陆页面了:
可使用 elastic 用户登陆,它的角色是超级管理员,登陆以后就能够从新进入 Kibana 的管理页面。
咱们还能够自行修改和添加帐户,在 Management -> Security -> User/Roles 里面:
例如这里添加一个超级管理员的帐户:
这样之后咱们就可使用新添加的用户来登陆和访问了。
另外修改权限认证以后,Elasticsearch 也不能直接访问了,咱们也必须输入用户密码才能够访问和调用其 API,保证了安全性。
系统默认会进行内存交换,这样会致使 Elasticsearch 的性能变差,咱们查看下内存锁定状态,在任意一台主机上的访问 http://ip:port/_nodes?filter_path=**.mlockall
:
能够看到以下结果:
{
"nodes": {
"73BQvOC2TpSXcr-IXBcDdg": {
"process": {
"mlockall": false
}
},
"9tRr4nFDT_2rErLLQB2dIQ": {
"process": {
"mlockall": false
}
},
"hskSDv_JQlCUnjp_INI8Kg": {
"process": {
"mlockall": false
}
},
"LgaRuqXBTZaBdDGAktFWJA": {
"process": {
"mlockall": false
}
},
"ZcsZgowERzuvpqVbYOgOEA": {
"process": {
"mlockall": false
}
},
"I2M80AP-T7yVP_AZPA0bpA": {
"process": {
"mlockall": false
}
},
"_mSmfhUtQiqhzTKZ7u75Dw": {
"process": {
"mlockall": true
}
}
}
}
复制代码
这表明内存交换没有开启,会影响 Elasticsearch 的性能,因此咱们须要开启内存物理地址锁定,每台主机须要修改 /etc/elasticsearch/elasticsearch.yml 文件,修改以下配置:
bootstrap.memory_lock: true
复制代码
但这样修改以后从新启动是会报错的,Elasticsearch 没法正常启动,查看日志,报错以下:
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
复制代码
这里须要修改两个地方,第一个是 /etc/security/limits.conf,添加以下内容:
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* hard memlock unlimited
* soft memlock unlimited
复制代码
另外还须要修改 /etc/systemd/system.conf,修改以下内容:
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
复制代码
详细的解释能够参考:https://segmentfault.com/a/1190000014891856。
修改以后重启 Elasticsearch 服务:
sudo systemctl restart elasticsearch.service
复制代码
从新访问刚才的地址,便可发现每台主机的物理地址锁定都被打开了:
{
"nodes": {
"73BQvOC2TpSXcr-IXBcDdg": {
"process": {
"mlockall": true
}
},
"9tRr4nFDT_2rErLLQB2dIQ": {
"process": {
"mlockall": true
}
},
"hskSDv_JQlCUnjp_INI8Kg": {
"process": {
"mlockall": true
}
},
"LgaRuqXBTZaBdDGAktFWJA": {
"process": {
"mlockall": true
}
},
"ZcsZgowERzuvpqVbYOgOEA": {
"process": {
"mlockall": true
}
},
"I2M80AP-T7yVP_AZPA0bpA": {
"process": {
"mlockall": true
}
},
"_mSmfhUtQiqhzTKZ7u75Dw": {
"process": {
"mlockall": true
}
}
}
}
复制代码
这样咱们就又解决了性能的问题。
另外还推荐安装中文分词插件,这样能够对中文进行全文索引,安装命令以下:
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip
复制代码
安装完以后须要重启 Elasticsearch 服务:
sudo systemctl restart elasticsearch.service
复制代码
到此为止,咱们的 Elasticsearch 集群就搭建完成了。
最后咱们看下 Kibana 的部分功能,看下整个 Elasticsearch 有没有在正常工做。
访问 Kibana,打开 Management -> Elasticsearch ->Index Management,便可看到当前有的一些索引和状态:
打开 Monitoring,能够查看 Elasticsearch 和 Kibana 的状态:
进一步点击 Nodes,能够查看各个节点的状态:
打开任意节点,能够查看当前资源情况变化:
另外还有一些其余的功能如可视化、图表、搜索等等,这里就再也不一一列举了,更多功能能够详细了解 Kibana。
以上都是本身在安装过程当中的记录和趟过的坑,若有疏漏,还望指正。
还有更多的 Elasticsearch 相关的内容能够参考官方文档:https://www.elastic.co/guide/index.html。
https://www.elastic.co/guide/en/x-pack/current/security-getting-started.html
https://segmentfault.com/a/1190000014891856
https://blog.csdn.net/a19860903/article/details/72467996
https://logz.io/blog/elasticsearch-cluster-tutorial/
https://es.xiaoleilu.com/020_Distributed_Cluster/30_Scale_more.html
https://blog.csdn.net/archer119/article/details/76589189
你们好,我是崔庆才,微软中国大数据工程师,在微软小冰部门。固然这是个人职业,我平时还会从事网络爬虫、Web开发、深度学习等方向的研究和开发工做。
我我的比较喜欢总结和分享,此次很荣幸在掘金的平台把本身的爬虫相关经验分享给你们,包括爬取、解析、防反爬、加速等等部分,但愿你们听完以后有所收获。
本周日(10月21日)我会作客掘金Bilibili直播间为你们作一场《健壮高效的网络爬虫》的直播【网页连接】。直播中我也会抽出 5 名小伙伴赠送各赠送一本《Python3网络爬虫开发实战》书籍一本,但愿你们能够支持。