概述
本书主要是对当前网站中使用到的分布式方案及其武器的介绍和简单使用, 列举了如:分布式缓存、持久化存储、分布式消息、搜索引擎、CDN系统、负载均衡、运维自动化、实时计算系统、离线计算系统、分布式文件系统、日子收集系统、监控系统、数据仓库等。
试读章节二,主要对分布式缓存memcache、分布式存储MySQL、HBase、Redis使用、分布式消息系统、垂直搜索引擎。
1.分布式缓存
1.1.memcache简介和安装
memchache是一个开源的高性能分布式对象缓存系统,可以在应用中减少对数据库的访问,提供应用的访问速度,并且降低数据库的负载,他使用key-value的存储形式,在内存中维护一张hash表,所以它对数据的检索时间复杂度是O(1),而数据的淘汰算法采用LRU即最近不常访问的数据淘汰。
安装省略...官网一堆。
1.2.memcache API和分布式
API我也不介绍了,总得一句话很丰富,具体参见memcache提供的API。
介绍下何谓'雪崩效应'及在分布式memcache是如何产生,由于缓存数据分布在在各个memcache服务器上,并且是根据key的hash进行路由,所以当 一台服务器down掉,或者缓存集群扩容重新分布key时,导致大量的key未命中而将流量导入数据库服务器,继而数据库就可想而知啦!
使用consistent Hash算法能够在一定程度上改善以上问题。它的原理是这样的,它将hash函数的值域空间组织成一个圆环,假设hash函数的值域空间为0~2^32-1即一个32bit的的整型,按圆环顺时针方向进行组织,然后对相应的服务器节点进行hash,将他们映射到hash环上。接下来使用相同的hash函数计算出key的hash值在环上对应的位置,根据consistent hash算法,按顺时针方向分布,那些在两个服务器节点间的key会被存储在顺时针下游的那个节点上,以此类推。
假设需要扩容时加入一个新的服务器节点,那么按hash函数计算他在环上的位置,然后加入该新节点,那么影响到的只有该新节点到它上游的节点的key,那些key会重新映射迁移到新的节点上,影响面非常有限,不像之前的整体的进行hash重新分布。
1.3.分布式session
传统的服务器如tomcat、jboss只是有基于单机的session管理机制。那么对于大型的网站需要很多web服务器节点进行服务,请求在不同的服务器间跳转,但是session是跳转不过去的,这样基于session很多服务都不可用,由此引入分布式session, 其实就是session不在web服务器上管理,而是提取出来在外面进行管理,web服务器需要使用时进行获取,用完进行保存。
memcached-session-manager是一个开源的高可用的tomcat session共享方案,顾名思义就是基于memcache的session管理,其中的一些配置使用还是省了。
2.持久化存储
2.1.MySQL扩展
mysql的扩展,有分表和分库,分表有业务分的横向分和数据分的纵向分,分库也差不多,根据数据分的话需要对id进行路由,在分库的情况下还要处理分布式事务的处理。还有读写分离的master-slave结构。
2.2.HBase
HBase是天使就能够支持海量数据的存储,它是Hadoop项目下的一个子项目,设计实现了高可靠、高扩展、实时读写的列存储数据库。它本质是一张稀疏大表,用来存储结构话数据,并且通过简单地增加节点进行系统的线性扩展。HBase基于HDFS之上,所以在pc server上就能搭建一个集群,具体的安装和使用api不具体阐述。
2.3.Redis
Redis是一个高性能的key-value数据库,支持strings, hashs、lists、sets、sorted sets等所以它并不是简单的key-value库。
它跟memcache有何不同呢?除了上面的支持类型广泛以外,它还支持master-slave的数据备份,并且还能将数据持久化到磁盘上这是最大的区别。
3.消息系统
3.1.ActiveMQ
ActiveMQ是完全采用Java实现的,所以他完全支持j2ee提出的jms规范。他提供消息创建、发送、接受、读取等服务,消息发布者发送完消息后,不需要灯带消息接受者就立即响应,这样的异步处理机制大大提高了分布式系统的协作效率。
JMS支持两种收发模型。一种为p2p点对点的消息收发;另一种是Pub\Sub的消息订阅模型,发布者只需要将消息发送到某个主题(消息传递中介),而消息订阅者则从主题订阅消息,因此发布者和订阅者保持独立,即为一种1对多的广播模式。
ActiveMQ支持集群部署来进行容错和避免单点故障,它提供的方案是Maseter-slave冷备,基于共享文件系统或是共享数据库。
4.搜索引擎
4.1.Lucence介绍
Lucence主要是用于满足用户对于全文搜索、模糊匹配的需求,解决数据库like查询的效率底下的问题,又能解决分布式环境下由于采用分库分表或使用NoSQL数据库,导致无法进行多表关联或者进行复杂查询的问题。
介绍几个概念:
倒排索引也称反向索引,它将文档中的词作为关键字,建立词与文档的映射关系,通过倒排索引的检索,可以快速地获取包含这个词的文档列表。
分词也称切词,就是将句子分隔,从中提取包含固定语义的词。对于英语来说很容易因为单词就是个体,单词间有空格、符号、段落进行分隔。但是中文以字为单位,所以分词不太容易。
停止词,即要被忽略的词,如a、the、and,中文有'在'、'这'、'了'等
排序,当对关键字进行搜索时,可能命中多个文档,一般相关度高的排在前面,以便用户能快速筛选有价值的文档,这时需要有排序算法,除了相关度外商业化的搜索引擎排序规则很复杂,还得考虑广告、竞价等因素。
文档(document),定义为一系列域(field)的组合,跟数据库的一行记录有点相似,一个文档它可能包含多个域或一个域。
域(field),按上面数据库的类比的话应该是相当于数据库中的字段。
词(Term),搜索的基本单元,与field对应,它包含搜索域的名称以及搜索的关键词,可以用来查询指定域中包含特定内容的文档。
查询(Query),查询可能包含一系列Term的条件组合,称为TermQuery,但也有可能是短语查询(PhraseQuery)、前缀查询(PrefixQuery)、范围查询(TermRageQuery、NumericRangeQuery)等。
分词器(Analyzer),用于分词的算法实例。
使用流程,构建docment然后往doc中添加各种field,构建IndexWriter顾名思义就是用来创建写入倒排索引的,然后用IndexWriter分析document就行了。然后查询的话,构建Query,通过IndexSearch执行Query进行搜索。可以看出其实理解以上的概念实际开始写代码也不难的。
具体如何使用API及安装省略...
4.2.Solr
Solr是一个基于Lucene功能强大的搜索引擎工具,注意它是一个工具,也就是说使用它来加强Lucence和使用的便捷,它提供了一系列功能强大的HTTP接口,支持通过Data Schema来定义字段、类型和设置文本分析,使得用户可以通过HTTP POST请求来创建Document和Query操作。它还提供强大的配置和功能完善的后台管理系统。
具体如何使用HTTP来操作Lucence的这里就不写了,有兴趣的可以去Solr官网看API。