上一篇主要学习了ES及其插件的安装,这一篇主要学习ES集群及其节点管理
一、ES集群概述
1、ES集群简介
ES就是为高可用和可扩展而生的,服务器的扩展可以通过购置性能更强的服务器(垂直扩展或者向上扩展,Vertical Scale/Scaling Up),亦或是通过购置更多的服务器(水平扩展或者向外扩展,Horizontal Scale/Scaling Out)来完成。尽管ES能够利用更强劲的硬件,垂直扩展毕竟还是有它的极限。真正的可扩展性来自于水平扩展 - 通过向集群中添加更多的节点来分布负载,增加可靠性。
在大多数数据库中,水平扩展通常都需要你对应用进行一次大的重构来利用更多的节点。
相反,ES天生就是分布式的:它知道如何管理多个节点来完成扩展和实现高可用性。这也意味着你的应用不需要在乎这一点。
2、ES集群的主节点
集群中的一个节点会被选为主节点(Master Node),它负责管理整个集群的变化,如创建或者删除一个索引(Index),向集群中添加或者删除节点。主节点并不需要参与到文档级别的变化或者搜索中,这意味着虽然只有一个主节点,但它并不会随着流量的增加而成为瓶颈。任何节点都可以成为主节点。在我们的例子中只有一个节点,所以它就承担了主节点的功能。
对于用户,可以和集群中的任意节点进行通信,包括主节点。每个节点都知道每份文档的存放位置,并且能够将请求转发到持有所需数据的节点。用户通信的节点会负责将需要的数据从各个节点收集起来,然后返回给用户。以上整个过程都会由ES透明地进行管理。
3、ES集群的状态
green 正常状态
所有的主分片(Primary Shard)和副本分片(Replica Shard)都处于活动状态(都可用)
red 不可用状态
不是所有的主分片都处于活动状态,基本的分片可用,但是备份不可用(也可能是没有备份)
yellow 修复状态
所有的主分片都处于活动状态,但是并不是所有的副本分片都处于活跃状态
部分的分片可用,表明分片有一部分损坏。此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好。
4、ES集群的特性
elasticsearch集群一旦建立起来以后,会选举出一个master,其他都为slave节点。
但是具体操作的时候,每个节点都提供写和读的操作。就是说,你不论往哪个节点中做写操作,这个数据也会分配到集群上的所有节点中。
这里有某个节点挂掉的情况,如果是slave节点挂掉了,那么首先关心,数据会不会丢呢?不会。如果你开启了replicate,那么这个数据一定在别的机器上是有备份的。
别的节点上的备份分片会自动升格为这份分片数据的主分片。这里要注意的是这里会有一小段时间的yellow状态时间。
如果是主节点挂掉怎么办呢?当从节点们发现和主节点连接不上了,那么他们会自己决定再选举出一个节点为主节点。
但是这里有个脑裂的问题,假设有5台机器,3台在一个机房,2台在另一个机房,当两个机房之间的联系断了之后,每个机房的节点会自己聚会,推举出一个主节点。
这个时候就有两个主节点存在了,当机房之间的联系恢复了之后,这个时候就会出现数据冲突了。
解决的办法就是设置参数:
discovery.zen.minimum_master_nodes
为3(超过一半的节点数),那么当两个机房的连接断了之后,就会以大于等于3的机房的master为主,另外一个机房的节点就停止服务了。
对于自发现动能这里不难看出,如果把节点直接暴露在外面,不管怎么切换master,必然会有单节点问题。所以一般我们会在可提供服务的节点前面加一个负载均衡。
5、ES集群的自动发现功能
elasticsearch的集群是内嵌自动发现功能的。
意思就是说,你只需要在每个节点配置好了集群名称,节点名称,互相通信的节点会根据es自定义的服务发现协议去按照多播的方式来寻找网络上配置在同样集群内的节点。
和其他的服务发现功能一样,es是支持多播和单播的。多播和单播的配置分别根据这几个参数:
discovery.zen.ping.multicast.enabled: false # 这个设置把组播的自动发现给关闭了,为了防止其他机器上的节点自动连入。 discovery.zen.fd.ping_timeout: 100 sdiscovery.zen.ping.timeout: 100 # 设置了节点与节点之间的连接ping时长 sdiscovery.zen.minimum_master_nodes: 2 # 这个设置为了避免脑裂。比如3个节点的集群,如果设置为2,那么当一台节点脱离后,不会自动成为master discovery.zen.ping.unicast.hosts: ["12.12.12.12:10801"] # 这个设置了自动发现的节点
多播是需要看服务器是否支持的,由于其安全性,其实现在基本的云服务(比如阿里云)是不支持多播的,所以即使你开启了多播模式,你也仅仅只能找到本机上的节点。
单播模式安全,也高效,但是缺点就是如果增加了一个新的机器的话,就需要每个节点上进行配置才生效了。
二、ES集群的管理
ES集群提供了Restful风格的访问接口API
ES访问接口:9200/tcp 基于http协议工作
1、Restful风格API
四类API:
检查集群、节点、索引等是否健康一级获取其相应状态
管理集群,节点、索引及元数据
执行CRUD操作
执行高级操作,例如paging,filtering等
语法格式:
curl -X <VERB> ‘<protocol>://HOST:PORT/<PATH>?<QUERY_STRING>‘ -d ‘<body>‘
VERB:
GET,PUT,DELETE等
PROTOCOL:
http,https
QUERY_STRING:
查询参数、例如:?pretty表示使用易读的JSON格式输出
BODY:
请求的主体
查看ES节点是否工作正常:
[[email protected] ~]# curl localhost:9200 { # JSON格式 "name" : "node2", "cluster_name" : "RK", "cluster_uuid" : "pwffDjOKQT6Ss2CRQLXt0g", "version" : { "number" : "5.3.0", "build_hash" : "3adb13b", "build_date" : "2017-03-23T03:31:50.652Z", "build_snapshot" : false, "lucene_version" : "6.4.1" }, "tagline" : "You Know, for Search" # 正常 }
Elasticsearch通过使用JSON来作为沟通的数据格式,这对于开发者来说很友好,因为很多程序都支持JSON格式。比如js就不说了,Java也有fastjson,ruby什么的都自带json。
1)_cat API
Elasticsearch中信息很多,如果单凭肉眼来寻找复杂数据之间的关系,是很困难的。因此cat命令应运而生,它帮助开发者快速查询Elasticsearch的相关信息。
查看_cat api的所有操作:
[[email protected] ~]# curl 192.168.10.7:9200/_cat =^.^= /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/master /_cat/nodes /_cat/tasks /_cat/indices /_cat/indices/{index} /_cat/segments /_cat/segments/{index} /_cat/count /_cat/count/{index} /_cat/recovery /_cat/recovery/{index} /_cat/health /_cat/pending_tasks /_cat/aliases /_cat/aliases/{alias} /_cat/thread_pool /_cat/thread_pool/{thread_pools} /_cat/plugins /_cat/fielddata /_cat/fielddata/{fields} /_cat/nodeattrs /_cat/repositories /_cat/snapshots/{repository} /_cat/templates
verbose
每个命令都支持使用?v参数,来显示详细的信息:
help
每个命令都支持使用help参数,来输出可以显示的列:
$ curl localhost:9200/_cat/master?help id | | node id host | h | host name ip | | ip address node | n | node name
headers
通过h参数,可以指定输出的字段:
$ curl localhost:9200/_cat/master?v id host ip node QG6QrX32QSi8C3-xQmrSoA 127.0.0.1 127.0.0.1 Manslaughter $ curl localhost:9200/_cat/master?h=host,ip,node 127.0.0.1 127.0.0.1 Manslaughter
[[email protected] ~]# curl 192.168.10.2:9200/_cat/master?v id host ip node bMAYDjb2Rsyfpn92Lnax3w 192.168.2.116 192.168.2.116 node7 [[email protected] ~]# curl 192.168.10.2:9200/_cat/master?help id | | node id host | h | host name ip | | ip address node | n | node name [[email protected] ~]# curl 192.168.10.2:9200/_cat/master?h=host,id,host 192.168.2.116 bMAYDjb2Rsyfpn92Lnax3w
数字类型的格式化
很多的命令都支持返回可读性的大小数字,比如使用mb或者kb来表示。
$ curl localhost:9200/_cat/indices?v health status index pri rep docs.count docs.deleted store.size pri.store.sizeyellow open test 5 1 3 0 9.kb 9.kb
例子:
查看ES集群的切片信息:
[[email protected] ~]# curl 192.168.10.7:9200/_cat/allocation 9 38.8mb 4.7gb 13gb 17.7gb 26 192.168.2.116 192.168.2.116 node7 9 38.8mb 9.1gb 8.6gb 17.7gb 51 192.168.2.114 192.168.2.114 node2 [[email protected] ~]# curl 192.168.10.7:9200/_cat/allocation?v # ?v表示显示详细信息(字段名) shards disk.indices disk.used disk.avail disk.total disk.percent host ip node 9 38.8mb 9.1gb 8.6gb 17.7gb 51 192.168.2.114 192.168.2.114 node2 9 38.8mb 4.7gb 13gb 17.7gb 26 192.168.2.116 192.168.2.116 node7
查看ES集群节点信息:
[[email protected] ~]# curl 192.168.10.7:9200/_cat/nodes?v ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 192.168.2.114 10 96 1 0.00 0.01 0.00 mdi - node2 192.168.2.116 3 100 0 0.00 0.00 0.00 mdi * node7
heap.percent:堆内存占的内存百分比
cpu:表示使用的cpu核心
node.role:表示节点能充当的角色主、数据 节点
master:表示当前是否为主节点,*表示当前为主
2)_Cluster API
集群相关的api接口