elasticsearch(二)集群读写原理
master具体作用
- 负责跟踪集群的所有节点。
- 负责索引的创建和删除。
- 负责吧集群中的节点、索引、分片、副本等信息同步给各个节点。
master选举
什么时候选举
- 当集群初始化的时候。
- master候选节点会定时ping其他候选节点,当一定数量的候选节点无法ping通则发起选举。(一定数量是指:选举票数) 。
选举算法
Gossip算法,有兴趣可以了解下 Gossip算法
选举要注意的问题
避免脑裂问题的产生,有效选举票数必须大于:N/2+1(N是具备选举资格的节点数)。
具体参数: discovery.zen.minimum_master_nodes。
分片和副本的指定与修改
分片
索引的分片数在创建索引时指定,且无法修改。
原因是写入索引的过程中,负载均衡算法是根据document_id进行hash取余,将具体的请求路由到分片对应的机器上,如果在副本变更的过程中对集群进行读写,则会出现路由不正确的情况。
副本
副本是可以随时更改的。
连接集群、读写LB
在es cluster中,任何一个节点,都是一个协调节点(Coordinating Node),在上面“master 作用”中描述,master会将集群中节点、分片和副本的信息同步给集群内所有的机器,所以客户端可以连接任意一个或者N个协调节点对集群进行访问。
如果我们连接信息中写多个节点的地址,则在客户端就形成了一个Load balance;当然也可以让集群维护一个VIP提供客户端访问。
写入过程
- 找到分片位置
由于集群内任何一台机器都由master节点同步了集群中的信息。所以任何一个节点都可以根据固定的路由算法,将写入索引的请求路由到指定的机器上。
具体算法:hash(dockement_id)%分片数 。
- 写入主分片Transcation Log
- 写入系统内存
- 定时将内存刷新到Fs cache
默认定时1s将内存中的的索引数据刷新到Fs cache中,此时产生句柄,由于句柄的产生,估此时就能被es搜索到,所以ES可以实现近乎实时的查询效果。当然这里也提供API进行手动刷新。
- 持久化
默认情况下每隔30s 会将 FS cache中的 index 以及 Transaction Log 一并写入磁盘中。当然这里也提供API进行手动刷新。
- 写入副本
主分片写完之后,会根据副本数量,开始写副本,副本的写一致性支持支持三种策略,quorum、one和 all(和kafka一样呢),默认为 quorum(超过半数副本写入即可返回成功)。
对应参数 :wait_for_active_shards。
读取过程
协调节点接受到读请求,并将请求分配到相应的分片上;默认情况下,每个分片创建10个结果(仅包含 document_id 和 Scores)的优先级队列,并以相关性排序,返回给协调节点。
读主分片还是幅?
查询阶段如果不特殊指定,落入的分片有可能是主也有可能是副,这个根据协调节点的负载均衡算法来确定。
如果要指定查询主副,可以在参数中配置preference:GET /_search?preference=*****。
- _primary:只查询主分片。
- primary_first:优先读取主分片,如果主分片无效或者失败,则会读取其他副本
- _replica:只查副本
- _replica_first:优先查询副本,如果副本无效就查询其他的分片
当然还有其他的,详见:search-request-preference
文档删除
文档并不会进行删除,只是会记录删除标记。
索引的扩容
我们知道,索引创建时就指定了分片数且不能更改,那么当我们单机的索引达到峰值该如何处理?
官方推荐我们:重新索引数据
mapping 字段新增
mapping 字段新增
以上是 elasticsearch(二)集群读写原理 的全部内容, 来源链接: utcz.com/z/515912.html