开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Clustering】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/75/detail/15837
Clustering(二)
内容介绍:
一、 建立集群的作用及目的
二、 建立集群的可靠性、可用性及可服务性
三、 集群可靠性的概率计算
四、 服务器状态维护及 httpsession 对象的寻找
五、 ngin x 的使用
六、 全文搜索的概念
五、 ngin x 的使用
1.ngin x 的策略配置
真正做负载均衡可以用这个 ngin x,这是俄罗斯开发的一个外部服务器,其可做负载均衡器。准确说它是个 http服务器,不能算是个外部服务器不能算不能去跑别的东西,基本上就把它当一个负载均衡器来做。2月份经查询其市场载衡率多于1/4。当 ngin x 下载之后,策略配置如何配可以是 ngin x 下载后去做一些转发。比如在 data/www 该地方,创建一个目录,并且往里面放进去一个页面 index.html, 然后把该页面里面相关的一些图片放到 /data/images 里面,在该页面上看。如何知道哪个在 URL 里会提示,当 URL 来的时候,如何去找?比如 URL 会
写202.12 0.4 0.1/就结束,这是 http ,如果该请求到达 ngin x 时,比如端口8080/, ngin x 会拿着//202.120.40.1/8080/这段相对于 ngin x 相对路径,也就是看到是/,其对应的路径就在该目录里。在后面如果写一个 hello.html 或者是上面写的 index. html,会到本地的一个叫做 /data/www 的目录里去找 hello.html 或者 index.html 这样的内容。底下的同样,如果看到的是 /images/ 这样的目录,在目录里面,所在本地有一个叫做data的目录,相对该目录来看,里面有一对 images 目录是配到一起的, root 指的是里面如果对应的是谁,把 /data/ 和 /images/ 这两段拼起来,上面就表示 data/www/ 。
在此处去找页面,也可以按照自己的方式去组织所有的页面资源,但在暴露出来之后,外部服务可以不是完全跟目录结构一样,可以通过这种方法做映射。相对于 localhost 路径后面 /images/example 的配置文件里面去决定文件去哪些地方找。所以 root 是指这里面这个对应的是谁把这两段拼起来。如果外部服务器暴露出来,不是跟自己本身的目录结构,完全一样,可以通过这种方式做映射。
2.代理服务器的配置
当配置一个代理服务器,代理服务器,要知道就为什么要去配代理,代理服务器就是说在访问的时候,会有一些东西不在自己所在的服务器里,可以把配置一个代理把它转发到某个地方去。在第一节课讲企业外部的应用架构会有专门的一台服务器去存储像 html 和 images 这样的静态资源。就是用这种代理服务器方式,当真正的一个请求发过来,可以让它到哪里去找东西,用户就不用去知道到后面有多少台服务器。
刚才说的负载均衡,这才是重点,刚才说的第一个是锦标赛方式,按照轮流的方式去发送请求,这种形式下它适用于所有的请求基本上都是等价的,也就是每一个请求被处理的时间以及需要占用的资源都差不多,这样平均第分布给所有的集群里的节点,负载就差不多一样,第二个,是说连接数最少,也就是下一个请求会发给当前跟服务器保持连接数最多最少的那台机器,也就是刚才说的负载最轻的。这种情况下相当于是所有的请求他们差异非常大,而且存在着明显的差异。这里讲的差异就是说一个请求可能要访问一张表里所有数据,另外一种就是在访问这里面的一点点数据,那么消耗的资源和需要执行的时间的差异都非常大。第三种就是ip-hash 的方式。他会根据用一个hash函数来决定你这个用户的请求应该调到哪一台机器上。一般来说它基于用户的IP地址,这样的话他针对的情况就是像我们说的 httpsession 这种会话粘滞性,也就是说客户端的请求需要在服务器端攒存一些数据。
该数据在下一次请求的时候,在该会话里是需要继续访问到的。这种情况下就用这种ip-hash的方式。这是所看到的配置负载均衡器中可以用到的三种方法。确定配置之后首先第一个是说清楚自己的集群有哪些服务器;主机名是什么?比如要提供一个服务,就叫做 srv. example.com。该服务器实际上背后有三台服务器,就是域名后面实际上有三台IP不同的服务器。什么样的服务器请求需要转发到该三台里面去,就是说当产生对URL要访问的时候,就要把请求负载均衡到三台服务器上,分别是:
{ srv1.example.com; srv2.example.com; srv3.example.com }
这时看到就像一个反向代理一样,就是说在宿舍里上网的时候,如果用代理是n个人通过代理,出去看到的就是一个人。反向代理是有一个请求进来,会不会发给这三台服务器的某一台,所以对该客户端来说,只要在浏览器里面输入一个域名 http://myapp1 ,该域名就被解析到了,该台机器就会根据刚才讲的三种策略中的某一种去转发这三台服务器的某一台,这对客户端这是透明的,该机器就像一个代理,代理了三台服务器,所以未来用客户端的浏览器里输入 http:myapp1, 因为还有端口号,所以凡是以80开头的请求,就全部都让它负载均衡的策略转发给这三台当中的某一个,这需要用到反向代理。
3.负载均衡的策略
负载均衡的策略是什么呢?在提到服务器没写,就默认用的是锦标赛方式。如果写了注意在 least-conn处,用的就是连接数最少了,也就是说负载最轻的那一个服务器是当前的请求,要去转发的服务器。ip-hash 中 hash 就相当于提到的要解决会话的粘滞性问题,每一个请求过来之后,对着IP做hash,所以用户在一个会话里面,只要 IP不发生变化其所有的请求就都会调度在同一台服务器上,
其 httpsession 就始终在一台服务器上。在它被调度的时候,像存储,所以就不存在 httpsession 找不到的情况。三台服务器,如果说各自的处理能力不一样,比如有一台特别强且可以通过设计权重的方式接收内容会更多。如果看到第一台服务器很强,对其位置假设是三,也就意味着未来有60%的请求会转发到该台机上,底下两个各占20%。
因为它是三,底下两个是一,均衡就会按照权重去转发请求,所以在一个集群里,没有说所有的服务器必须具有相同的配置。具有不同的配置,仍然可以满足物尽其用,把按照各自的能力去配置其不同的权重。在讲配置的时候就提到过可以去负载均衡http+ssl ,另外还提到 memcached 分布式缓存。
所以前面两种就相当于 Tomcat 。这样的用户现在做负载均衡底下这个慢慢开始,就是上节课讲的分布式缓存的。所覆盖均衡所以两者是有一些看起来有些差异。最重要的就是路径怎么配以及服务器的负载均衡的策略如何配?要知道这不只是在做负载均衡,这只是一个http server,如果没有像 java 代码复杂的编程语言需要编译的东西。比如 hml 静态的页面或者是 java 的脚本嵌在该页面里,这可以通过后台只放一个 nginx 跑,这就跟 apache 类似,作用一样。
如果网站做的都是纯静态资源的,或者里面只包含 jsp 没有像 java 后台这样的概念,可以作为服务器软件,不进去就可以去跑。就可看到 Java、Netflix、Drobox 这种类似网盘的系统都在用 engine X 来做后台的服务器。
六、全文搜索概念
1.全文搜索的理解
全文搜索指的是假如目录里面放了很文件,比如写了一部小说,这个目录里头放的是每一章的内容,目录里的文件可以去找比如小说的主人公 Tom, 找 Tom 出现在哪些文件,出现在这些文件里面第几行,第几个词,出现了多少次。这样的搜索像去便利所有的文件。
为了提高性能,数据库不用做其他简单的额外处理,把其他数据存进去之后,做搜索时直接扫描一个数据库就能找到任何想要的东西。为了提高搜索的效率,在数据库建立一个索引,首先索引尺寸比较小,其次,索引删了一定数据结构来存储,在数据库里面就会快速去定位到自己要找的资源。比如按照某一列表来查找,只要在上面做过索引,搜索数据就会加快,全文搜索也可以通过全文扫描得到自己想要的结果,但是效率会比较低。所以要找的就是能不能用一些工具来提高搜索的效率。
2.全文搜索的工具
全文搜索有很多工具,比如Lucene、Source、Elastic search这三个只是工具不同而已,其基本的原理是一类似的。 Lucene 实际找高性能以及可扩展之外来形容其特点,可称之为信息获取或信息抽取。信息获取就是在大量的信息里面得到自己想要的东西。大量信息指的就是大量的文本文件,或者大量的 PDF 文件,主要在里面来找到自己想要的东西,这就是执行的逻辑。如果不用任何的工具,直接去扫描所有文件里面的所有内容,效率不高,所以它就并列了一种建立索引进行搜索的能力。
3.搜索索引的建立
一旦提到建立搜索,就会有一个问题,就是不能把自己的内容存储到数据库里面,上面提到在所写的小说目录里面,小说的每一个章节都是一个文件,现在要建立一个什么样结构的关系处理或者才能支撑。比如想找主人公 Tom 出现在哪些文件里面,出现在文件里的什么位置,如果要做该操作的话,要思考数据户表要建立成什么样的。第一列可能是一个 ID 。
第二列可能是文档的名字,要知道文档叫什么。第三例,因为只有一对原始的 doc 文件,即第一段的内容是什么。每个文档的段数不一样,如果不知道后面是什么,可建立一个关联表。然后把 dip 作为外界来连到 docname 这边,这是 paragraph 的 ID。 也就是在 ID 有个1号文件,叫 introduction 。
在新建的关联表的ID列表中,1号文件的的理解为第一段内容是什么, 2号文件的第二段内容是什么,可能最多见到这样的程度。之后要清楚 Tom 出现在那些地方,必须扫描 dip 后面的这个列表,拿到该列表的每一个列表里面的内容之后就会知道 indexof( Tom) 位于哪些位置,如果是 >0 的说明内容里会出现 Tom 该名字, 但是该操作非常浪费时间,要扫描 dip 后的整个列表的所有内容,所以一个章节如果分了100段,100个章节就是一万段在列表里边,且有一万条记录,那就必须扫描一万个记录,每一条都需要列出。
在每一行当中都会使用一个循环,直到找不到,即<0 为止。此操作过于麻烦,关联一个数据库去做全文搜索,非常到位。
因此建立一种索引,此索引与关联型数据库不一样,这也叫一个反向索引,其设计原则是在一个目录里、数据库里、网上扒寻的用户的输入都可以作为“我的数据来源‘’。
拿到数据库之后去建立索引的方式,因此产生了索引。未来去提供一个对文档建立没有功能产生的“所以”,此索引可以为客户端通过搜索的策略去找到想要找的某个词。
比如要找到 Tom 就知道在哪些文件系统里面,在第几行。通过该词直接就可以找到想要的答案。问题就在不明白索引这个概念。
首先索引支持异构的文件,比如 HTML、PDF、 Word。如果有特殊的自定义类型文件,想把其内容来做全文搜索,只需要按照其提供的 Paser 接口去实现对应的文件的一个解析。然后把里面的内容取出即可。
通过 Paser 把里面存的,并且希望搜索到的文本内容拿出来,然后经过处理就可以写入到索引里面,最后该索引就可以被使用。
所以在文本里面建立任何一种搜索引擎,都需要建立一个高效的交叉引用查询表。 Lucene 里面也是这样做,只是 Lucene 的索引,即所谓的查询表和关型数据库的概念不一样、结果不一样。