前面已经有一篇分布式搜索引擎了,主要介绍的是搜索引擎的索引分片和数据同步,实际上是解决的分布式的问题,最后我给出了一个图
这个图最后出来的是一个低可用的分布式搜索引擎,今天我们要解决的问题是把这个低变成高,今天这篇非常简单,没有任何高级技术,看完你就知道了。
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或者搜索西加加语言就行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。