热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

分布式搜索引擎(二)

前面已经有一篇分布式搜索引擎了,主要介绍的是搜索引擎的索引分片和数据同步,实际上是解决的分布式的问题,最后我给出了一个图这个图最后出来的是

前面已经有一篇分布式搜索引擎了,主要介绍的是搜索引擎的索引分片和数据同步,实际上是解决的分布式的问题,最后我给出了一个图

图片描述

这个图最后出来的是一个可用的分布式搜索引擎,今天我们要解决的问题是把这个变成,今天这篇非常简单,没有任何高级技术,看完你就知道了。

1. 为什么会是低可用

我们得知道为什么这个系统会是一个低可用的系统?

  • 没有一个机制让所有节点知道其他节点的状态,按上面的架构图,只能是启动节点的时候通过配置文件告知节点其他节点的状态。

  • 新增或者移除一个节点,没有机制让其他节点感知到。

  • 同样的,如果某个节点挂了,其他节点也没有机制知道

2. 最简单的解决方案

首先,我们说一个最简单的解决方案

2.1 方案说明

如果我们在上图中加一个服务,叫Master服务的话,然后每个节点都和Master进行通讯,获取其他节点的信息,那么,这个问题就解决了,就像下图,紫色的部分就是我们说的Master

图片描述

Master都做什么事呢?怎么和各个节点交互呢?作为一个Master,至少需要做到下面这些个事情:

  • Master必须首先启动,然后往外广播他的地址和端口信息

  • Master必须打开一个端口,用来和各个节点通讯

  • 每新增加一个从节点,首先接收广播包,得到Master的地址和端口,然后连接上,在Master注册,注册信息包括本节点的职责和索引状态。

  • Master要为每个从节点启动一个协程进行连接的维护,保持和节点的心跳连接。

  • 每新增一个从节点,Master要负责通知其他节点有新节点上线并告知新节点的职责。

  • 如果有节点意外掉线或者正常下线,Master也要负责通知其他所有节点这个信息。

仔细一看,其实也没多少事情要做,这就是一个标准的状态机类型的服务,整个逻辑代码也很简单,配合一个安装在每个节点内部的客户端,就可以完成上面6个交互过程,这样的话,每个节点实际上都知道其他任意一个节点的状态,不管是在数据更新还是在搜索查询的时候都可以从容面对了。

2.1 性价比如何?

其实这是一个比较完美的解决方案,分布式方面的逻辑,需要多个节点配合的逻辑都可以在这个Master节点上来实现,但这个Master是个单点,如果他一挂了,就全挂了。

这算不上是高可用的解决方案,但是,我们来分析一下

  • 由于Master的逻辑其实比较简单,无非就是存储一些数据,然后把数据分发到所有节点上,再有一个就是定时检查每个节点是否在线,这样的逻辑写好了,通过了严格的测试的情况下,本身出问题的概率还是比较小的。

  • 搜索引擎都是部署在内网中,一般不跨机房的话,网络问题不会很大

所以,如果这个搜索引擎不是非常重要的业务场景,那么这么设计下来就可以了,没有必要为了一个不是非常非常重要的业务场景而把设计复杂化了,我实现的第一版就是这样的,先能用了再说。Master单点就单点吧。

稍微复杂点的解决方案

如果我们使用上一篇的Log大法,很容易将这个Master变成一个集群,那么单点挂了就不担心了,但是还需要解决以下几个问题。

  • 当主节点挂了以后,所有的节点需要把Master节点切换到从节点上。

    • 这个相对好解决,首先需要主节点把从节点的信息也分发给其他节点,告诉他们当本节点无响应的时候切换到从节点

    • 其次,只要其他节点和主节点保持一个心跳链接就互相知道是否还在线了。

  • 如果主节点只是暂时性休克了,所有节点已经把Master节点切换到从节点上了,结果这时候主节点复活了怎么弄?

    • 这个也比较好解决,当Master集群中的某台机器重新连接网络以后也要走注册流程,看是否已经有人代替了本身职能了。

  • Log同步不管怎么样都有延迟,所以一旦主节点挂了,有可能有些信息还没有同步到从节点上,这样会造成不可预知的错误。

    • 这个问题靠Log已经比较难解决了,只能放弃Log方式,用强同步模式,当主节点收到会影响整个集群的请求时,只有当每个从节点都同步以后才返回请求。

    • Log作用在这里退化成当有新的Master节点要加入Master集群的时候做数据重建使用。

我实现的搜索引擎最后也就用到了这个解决方案的程度,没有更深入了,最后整个FalconEngine的集群长成这样子。

图片描述

还有更好的办法吗?

有,当然有。为什么我最后没有用呢?

首先我们看看在一个搜索引擎一般的使用场景:

  • 搜索引擎主要是为了快速的数据检索。

  • 对数据的强一致性要求其实没有那么高,偶尔一两次搜索结果不太一样对整体的影响不大,只要你的数据不是错的,少一点数据一般感觉不到,当然,要是长期少了那还是不行的。

所以为了这个去实现一个强一致算法我个人认为没有太大的必要,毕竟这不是一个交易系统,不能出一点错。

至于更好的办法,下一篇会用一整篇的篇幅来说一下分布式系统中如何保持数据的一致性。

总结

这是分布式的第二篇,分布式的部分还有几篇文章没有出来,写完以后我目前写的这个搜索引擎,基本上所有的东西都讲得差不多了,目前代码还在整理,最近公司事情太忙了,暂时还没有全放出来,我整理完并做完性能测试以后会将在github上放出来,欢迎关注这个项目,我写了这么多篇文章,自己也不想自己做的东西太监掉。

最开始写第一篇文章的时候没有想到会写这么多,而且这写文章写下来也发现了很多人也比较感兴趣,所以我还是会一直写下去,因为搜索推荐广告能写的东西实在是太多了,也不怕没有东西写。

后面的文章会以一个一个点的模式来写,偶尔也会瞎扯一下,欢迎大家留言,欢迎互相交流。:)由于要工作,还要改代码,还要带两个娃,还要看书,所以写文章频度会慢一些,希望大家不要取消关注哦,后面还是有很多有意思的东西,提纲很多我都列好了只是还没动笔写。

最后,做个小调查,编程基础部分,架构部分,算法部分,搜索部分,推荐部分你希望看到哪些呢?可以在微信后台留言(留言请勿带数字,那样会变成自动回复,我就看不到了),或者在本篇文章下留言,就不做问卷调查了,我公众号上没那么多人。呵呵。。。


欢迎关注我的公众号,主要聊聊搜索,推荐,广告技术,还有瞎扯。。文章会在这里首先发出来:)扫描或者搜索微信号XJJ267或者搜索西加加语言就行
图片描述



推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
author-avatar
蒋军利
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有