asartear 2019-10-28
1.说一下es的分布式架构原理 / es是如何实现分布式的
核心思想就是在多台机器上启动多个 es 进程实例,组成了一个 es 集群。
创建一个index,index包含多个shard,每个shard都是一个最小工作单元,每个 shard 存储部分数据。
一个shard 的数据实际是有多个备份,就是说每个 shard 都有一个 primary shard ,接受写和读请求,但是还有几个 replica shard ,负责容错,以及承担读请求负载。 primary shard 写入数据之后,会将数据同步到其他几个 replica shard 上去。这样,每个 shard 的数据都有多个备份,如果某个机器宕机了,还有别的数据副本在别的机器上呢,这样就实现了高可用。
es 集群多个节点,会自动选举一个节点为 master 节点,这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、负责切换 primary shard 和 replica shard 身份等。要是 master 节点宕机了,那么会重新选举一个节点为 master 节点。
如果某个非 master 节点宕机了。那么此节点上的 primary shard 就没了。那好,master 会让 primary shard 对应的 replica shard(在其他机器上)切换为 primary shard。如果宕机的机器修复了,修复后的节点上的shard也不再是 primary shard,而是 replica shard。同步后续修改的数据之类的,让集群恢复正常。
上述就是 ElasticSearch 作为一个分布式搜索引擎最基本的一个架构设计。
2.说一下es的写入数据流程以及底层原理
1)客户端选择一个node (es节点)发送请求过去,这个node (es节点)就是coordinating node (协调节点),对document (文档)进行路由,将请求转发给对应的node 2)实际的node上的primary shard处理请求,然后将数据同步到replica node 3)coordinating node,如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端
es写入数据的原理
3.说一下es的读数据流程
读数据分为GET和Search,即查询一条 和 搜索操作。
查询:
查询操作,即GET某一条数据,写入了某个document,该document会自动给你分配一个全局唯一id-doc id,同时也是根据doc id进行hash路由到对应的primary shard上面去。当然也可以手动指定doc id,比如用订单id,用户id。
可以通过doc id来查询,会根据doc id进行hash,判断出当时把doc id分配到了哪个shard,从那个shard去查询
搜索:
4.为什么es集群至少需要三个节点
首先需要知道一点:es的配置文件中有一个配置:discovery.zen.minimum master nodes:2 ,默认是2,即选举Master时需要的节点数。
假设es有两个节点,master node 和 data node,即选举Master时锁需要的节点为 1,此时出现网络波动,导致 master node 和 data node出现短暂的断开连接,根据选举规则,data node将自己选举为master,当网络波动结束后,就会出现两个master,即我们所说的脑裂。
当es有三个节点,master node、data data(A)、data node(B),即选举Master时锁需要的节点为 2,此时出现网络波动,master node 和 A 、B断开连接,则 master node降级,A、B进行选举,假设选举为A为master,当网络恢复后,之前的 master node --> data node,之前的 data node(A)--> master node。
所以,通过配置 minimum master nodes 来防止出现脑裂,在生产过程中, 为了尽量保持集群高可用, 至少需要三台机器搭建集群。
end:如果你觉得本文对你有帮助的话,记得关注点赞转发,你的支持就是我更新动力。
最近,一个名叫 Magi 的搜索引擎成了重点关注对象,据称这个搜索引擎和我们常见的搜索引擎很不一样,有一种程序员们钟爱的 X 冷淡风格。于是我们打开 Magi 看了看。确实,这个页面看着就很让人舒爽。