前言
前面介绍了ES的插件安装,ELK的准备工作就已经做完了,现在开始学习搭建ES集群。看了网上的大神总结出来的经验,自己也开始照葫芦画瓢,咿咿呀呀学起来。不多说往下看。
简介
elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展),Elasticsearch能从更强大的硬件中获得更好的性能,但是纵向扩展也有一定的局限性。真正的扩展应该是横向的,它通过增加节点来传播负载和增加可靠性。对于大多数数据库而言,横向扩展意味着你的程序将做非常大的改动来利用这些新添加的设备。对比来说,Elasticsearch天生是分布式的:它知道如何管理节点来提供高扩展和高可用。这意味着你的程序不需要关心这些。对于大多数数据库而言,横向扩展意味着你的程序将做非常大的改动来利用这些新添加的设备。对比来说,Elasticsearch天生是分布式的:它知道如何管理节点来提供高扩展和高可用。这意味着你的程序不需要关心这些。
集群和节点
节点(node)是你运行的Elasticsearch实例。一个集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当有新的节点加入或者删除节点,集群就会感知到并平衡数据。集群中一个节点会被选举为主节点(master),它用来管理集群中的一些变更,例如新建或删除索引、增加或移除节点等;当然一个节点也可以组成一个集群。
节点通信
我们能够与集群中的任何节点通信,包括主节点。任何一个节点互相知道文档存在于哪个节点上,它们可以转发请求到我们需要数据所在的节点上。我们通信的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch透明的管理。
分片与副本分片
分片用于Elasticsearch在你的集群中分配数据。想象把分片当作数据的容器。文档存储在分片中,然后分片分配给你集群中的节点上。
当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。
一个分片(shard)是一个最小级别的“工作单元(worker unit)”,它只是保存索引中所有数据的一小片.我们的文档存储和被索引在分片中,但是我们的程序不知道如何直接与它们通信。取而代之的是,他们直接与索引通信.Elasticsearch中的分片分为主分片和副本分片,复制分片只是主分片的一个副本,它用于提供数据的冗余副本,在硬件故障之后提供数据保护,同时服务于像搜索和检索等只读请求,主分片的数量和复制分片的数量都可以通过配置文件配置。但是主切片的数量只能在创建索引时定义且不能修改.相同的分片不会放在同一个节点上。
1)分片算法:
shard = hash(routing) % number_of_primary_shards
routing值是一个任意字符串,它默认是_id但也可以自定义,这个routing字符串通过哈希函数生成一个数字,然后除以主切片的数量得到一个余数(remainder),余数的范围永远是0到number_of_primary_shards - 1,这个数字就是特定文档所在的分片。
这也解释了为什么主切片的数量只能在创建索引时定义且不能修改:如果主切片的数量在未来改变了,所有先前的路由值就失效了,文档也就永远找不到了。
所有的文档API(get、index、delete、bulk、update、mget)都接收一个routing参数,它用来自定义文档到分片的映射。自定义路由值可以确保所有相关文档.比如用户的文章,按照用户账号路由,就可以实现属于同一用户的文档被保存在同一分片上。
2)分片和副本交互:
新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上,下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
1、客户端给Node 1发送新建、索引或删除请求。
2、节点使用文档的_id确定文档属于分片0。它转发请求到Node 3,分片0位于这个节点上。
3、Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node 2的复制节点上。当所有的复制节点报告成功,Node 3报告成功到请求的节点,请求的节点再报告给客户端。
客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片。你的修改生效了。
3)副本分片复制时的相关的参数说明:
replication:
复制默认的值是sync。这将导致主分片得到复制分片的成功响应后才返回,如果你设置replication为async,请求在主分片上被执行后就会返回给客户端。它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。
默认的sync复制允许Elasticsearch强制反馈传输。async复制可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。
consistency:
默认主分片在尝试写入时需要**规定数量(quorum)**或过半的分片(可以是主节点或复制节点)可用。这是防止数据被写入到错的网络分区。规定的数量计算公式如下:
int( (primary + number_of_replicas) / 2 ) + 1
consistency允许的值为one(只有一个主分片),all(所有主分片和复制分片)或者默认的quorum或过半分片。
注意number_of_replicas是在索引中的的设置,用来定义复制分片的数量,而不是现在活动的复制节点的数量。如果你定义了索引有3个复制节点,那规定数量是:int( (primary + 3 replicas) / 2 ) + 1 = 3
但如果你只有2个节点,那你的活动分片不够规定数量,也就不能索引或删除任何文档。
注意: 新索引默认有1个复制分片,这意味着为了满足quorum的要求**需要**两个活动的分片。当然,这个默认设置将阻止我们在单一节点集群中进行操作。为了避开这个问题,规定数量只有在number_of_replicas大于一时才生效。
timeout:
当分片副本不足时Elasticsearch会等待更多的分片出现。默认等待一分钟。如果需要,你可以设置timeout参数让它终止的更早:100表示100毫秒,30s表示30秒。
集群生态:
1.同集群中节点之间可以扩容缩容,
2.主分片的数量会在其索引创建完成后修正,但是副本分片的数量会随时变化。
3.相同的分片不会放在同一个节点上.
集群健康:
在Elasticsearch集群中可以监控统计很多信息,但是只有一个是最重要的时集群健康(cluster health)。Es中用三种颜色状态表示:green,yellow,red.
Green:所有主分片和副本分片都可用
Yellow:所有主分片可用,但不是所有副本分片都可用
Red:不是所有的主分片都可用;
这些我们可以在ES-Head插件中看到。
Elasticsearch5.x的多机集群配置
这里主要针对基于Elasticsearch5.x的多机集群配置
ELasticsearch 5.3要求JDK版本最低为1.8,master机子安装ELK,data机子安装Elasticsearch,安装详见【ELK搭建日记一】安装和配置》。
要求按照配置修改系统参数,确保系统有足够资源启动ES。
elasticsearch集群配置信息 elasticsearch-5.3.1/config/elasticsearch.yml
主机master配置:
cluster.name: XXX #配置集群名称
node.name: "es-node1" #配置节点名称
node.master: true #允许这个节点被选举为一个主节点(默认允许)
node.data: true #允许这个节点存储数据(默认允许)
network.host: 0.0.0.0 #允许其他机子访问
path.data: /home/parallels/Desktop/data/elk/data #存储数据路径
path.logs: /home/parallels/Desktop/data/elk/logs #存放数据日志
http.port: 9200 #端口号
discovery.zen.ping.unicast.hosts: ["es-node1", "es-node2"] #设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
http.cors.enabled: true
http.cors.allow-origin: "*" #允许插件访问集群
节点data配置:
cluster.name: XXX #配置集群名称
node.name: "es-node2” #配置节点名称
node.master: false #允许这个节点被选举为一个主节点(默认允许)
node.data: true #允许这个节点存储数据(默认允许)
network.host: 0.0.0.0 #允许其他机子访问
path.data: /home/parallels/Desktop/data/elk/data #存储数据路径
path.logs: /home/parallels/Desktop/data/elk/logs #存放数据日志
http.port: 9200 #端口号
discovery.zen.ping.unicast.hosts: [“本机ip地址”, “主机ip地址”] #设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
http.cors.enabled: true
http.cors.allow-origin: "*" #允许插件访问集群
完成配置后确保所有节点在同一网段下
启动主节点./elasticsearch
启动elasticsearch head 插件 http://192.168.23.230:9100
es新建索引 默认把数据分为5个分片和1副本分片
我们通过logstash导入数据(启动方法在ELK安装和配置中),如果不做配置的情况下也将是按照es中默认分片数来创建索引
./logstash -f ../config/logstash-simple.conf
可以看到集群健康值是yellow,因为通过logstash默认生成的索引是有一份副本文件的,而这个副本文件没有被节点分配。我们按照前面的数据节点配置启动一个data节点即可完成分配,即变为绿色。
但是当节点数超过副本数+1的时候,就有可能出现数据丢失的风险如下图
这种情况虽然健康值为绿色,但是当中两个节点宕机的极端情况下,会出现数据丢失的风险。
可以通过elasticsearch-kopf插件进行修改副本分片数达到所有节点分片数一致。
修改number_of_replicas
修改后
如果想自定义导入数据时的分片数量,可以在logstash目录下新建/config/logstash-simple.conf文件,对output到es的数据格式进行自定义。通过新建json配置文件来对索引格式自定义。
"number_of_replicas":"4", 对应副本分片数(可更改)
"number_of_shards":"4" 对应主分片数(索引创建就无法更改)
分布式多集群进阶
在上文es的配置中,所有节点均为数据节点,也可以是主节点,当主节点宕机时,其余的节点会自动选举出新的主节点,但在实际的项目中,这种方式并不推荐使用,这表示这个节点即有成为主节点的资格,又存储数据,这个时候如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。elasticsearch默认每个节点都是这样的配置,在测试环境下这样做没问题。实际工作中建议不要这样设置,这样相当于主节点和数据节点的角色混合到一块了。
如何配置多集群中的节点,实现负载均衡,可以参考elasticsearch负载均衡节点。
部分文献出处