学习思路:
- 名词解释
- 集群健康状况
- 集群扩展、故障转移
一、名词解释
- 集群(cluster):一个或多个cluster.name相同的节点(node)形成一个集群
- 节点(node):每启动一台elasticsearch实例就是一个节点,常用配置的节点有:master节点、data节点、client节点,默认配置node.master: true(可以被选举为主节点) ;node.data: true(可以存储数据);也就是传说中的主节点和数据节点混用
- 主节点(master):需要配置node.master: true ;node.data: false;这种节点不会存储数据,有被选举为master节点的资格,一旦选举为master其主要作用有:
- 索引的创建、删除
- 跟踪管理集群节点
- 分配分片对应的节点
- 数据节点(data):需要配置node.master: false;node.data: true;这种节点只存取数据,没有被选举为master的权限,其主要作用:
- 对数据的CRUD
- 聚合查询结果
- 客户端节点(client):需要配置node.master: false;node.data: false;这种节点不能被选举为master,也不能存储数据,其主要作用:
- 请求路由,分发索引进行搜索
- 分片:跟数据库分片概念类似,将数据按照一定的算法分配到不同的分片(机器),实现大规模数据的分布式存储,分为主分片和副本分片
总结:
- 节点默认配置node.master: true;node.data: true;生产中能用到elasticsearch那么足矣说明数据量已经不小,各节点功能应该隔离(主节点、数据节点、客户端节点应该分别部署)
- 主节点对CPU、内存等消耗一般,普通机器即可;数据节点需要CRUD,对查询结果聚合,对磁盘IO和内存要求较高;客户端节点主要是路由功能,普通机器即可;
- 主分片数量是在新建索引的时候确定的,一旦确定不可改变(数据分片算法默认是对主分片取模),因此要根据自己业务适当确定(7.0版本以下主分片默认5个),副本分片可以随时改变数量
- 分片数量过多:浪费资源影响性能;分片数量过少:单分片数据量过大,横向扩展时受阻,如果新增分片数量需要重新建立索引,重新洗数据
二、集群健康状况
实际中我们可以通过请求查看集群健康状况
GET /_cluster/health
集群健康状态分为3中:green、yellow、red;上图的status代表健康状态
三、集群扩展-故障转移
当我们要往elasticsearch里放数据时,需要先创建索引,创建索引时即指定了主分片数量,这个时候我们的集群虽然只有一个master但仍然能正常工作,但要遇到机器故障,那么整个集群将会瘫痪
因此我们要做的就是创建复制分片,做横向扩展,首先我们给megacorp指定3个主分片,1个复制分片
PUT /megacorp
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
因为我们只启动了一个节点,所以我们的三个分片都被分配到了一个节点上
我们现在启动第二个节点,注意cluster.name要保持一致
启动后我们的复制分片在节点2上创建,这就意味着如果其中一个Node挂机,数据还是完整的;
随着数据量的不断增长,单个node节点的资源(IO、内存)已成为瓶颈,我们来启动第三个节点
可见我们的分片已被重新分片,满足负载,实现故障转移
这里我们看到,如果一直横向扩展,最终实现每个node只有一个分片,并且数据量达到一定程度,再继续增加复制分片访问速度仍达不到我们要求,这也就达到了我们的扩展极限,那么只能从单机硬件或者重新修改主分片数量来解决,如果修改主分片数量那么要牵扯到重新创建索引,将数据重新清洗到分片存储,成本很高,所以我们在初期确定主分片数量时一定要根据业务预估好
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢