热门标签 | 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手机。 ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
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社区 版权所有